From fdd89300a15a40f0acc435292f3c0fe7c8f7dfe5 Mon Sep 17 00:00:00 2001 From: Stephen Mulyadi Date: Mon, 25 Sep 2023 15:18:07 +0700 Subject: [PATCH] [Frontend][API][Update] Lexicon V2.0.0 (#53) * sync latest version 2 changes (alpha) * Bug fix: Fix an error with the Topic and Post image URL when using a shortUrl as the source. * Bug fix: Post preview with a short URL uploads an image as the source. * add tool version, fixing nodejs to version 16 * fix quickstart command * fix react version due to expo request * Sync latest version 2 (alpha) * Sync latest version 2 (alpha) * Sync latest version 2 (alpha) * Sync latest version 2 (alpha) * Sync latest version 2 (alpha) * Sync latest version 2 (alpha) * Sync latest version 2 (alpha) * Sync latest version 2 (alpha) * Ensure that Github Actions runs on alpha-v2 as well (#46) Co-authored-by: Kinostrome * Improve Chinese Language Support & Fix Issue with Asset File Names (#47) * fix assets name * fix getting poster ditails for different language --------- Co-authored-by: jinqi.wei * Sync latest version 2 (alpha) * Sync latest version 2 (alpha) * Sync latest version 2 (alpha) * Sync latest version 2 (beta) * Sync latest version 2 --------- Co-authored-by: Simon Biggs Co-authored-by: Gabriella Putri Co-authored-by: Kinostrome <69828658+Kinostrome@users.noreply.github.com> Co-authored-by: Kinostrome Co-authored-by: ShiChangshan Co-authored-by: jinqi.wei --- .easignore | 18 + .expo/settings.json | 8 - .github/ISSUE_TEMPLATE/bug_report.md | 9 + .github/pull_request_template.md | 10 +- .github/workflows/main.yml | 12 +- .tool-versions | 1 + PROJECT.md | 63 + README.md | 62 +- api/.gitignore | 1 + api/deploy/Dockerfile | 4 +- api/docs/logging.md | 49 + api/docs/typescript.md | 14 + api/package.json | 40 +- api/reset.d.ts | 2 + api/src/__tests__/api.ts | 21 + api/src/__tests__/getPosterTypeDetails.ts | 133 + api/src/__tests__/getTopicAuthor.ts | 100 + api/src/__tests__/getTopicPostPath.ts | 32 +- api/src/__tests__/getUpdatedLikedTopic.ts | 30 + api/src/__tests__/processRawContent.ts | 140 +- api/src/__tests__/resolvers/utils.ts | 119 + api/src/client.ts | 54 +- api/src/constants/api.ts | 26 +- api/src/constants/discourse.ts | 10 + api/src/constants/errorMessage.ts | 2 + api/src/constants/index.ts | 1 + api/src/constants/server.ts | 8 +- api/src/helpers/auth.ts | 37 +- api/src/helpers/cookiesStringify.ts | 10 +- api/src/helpers/customErrors.ts | 15 + api/src/helpers/errorHandler.ts | 30 +- api/src/helpers/fetchLikeActivities.ts | 42 + api/src/helpers/fetchPost.ts | 21 + api/src/helpers/getModifiedUserAgent.ts | 26 + api/src/helpers/getPosterTypeDetails.ts | 41 + api/src/helpers/getTopicAuthor.ts | 20 + api/src/helpers/getTopicPostPath.ts | 9 - api/src/helpers/getUpdatedLikedTopic.ts | 18 + api/src/helpers/index.ts | 7 +- api/src/helpers/likeErroHandler.ts | 53 + api/src/helpers/processRawContent.ts | 118 +- api/src/helpers/topicDetail.ts | 71 + api/src/locale/index.ts | 48 + api/src/logger.ts | 39 + api/src/middlewares/permission.ts | 41 - .../resolvers/auth/changePasswordMutation.ts | 4 +- api/src/resolvers/auth/loginMutation.ts | 17 +- api/src/resolvers/auth/logoutMutation.ts | 46 +- api/src/resolvers/auth/refreshTokenQuery.ts | 5 +- api/src/resolvers/auth/registerMutation.ts | 4 +- api/src/resolvers/email/addEmailMutation.ts | 6 +- .../resolvers/email/changeEmailMutation.ts | 6 +- .../resolvers/email/deleteEmailMutation.ts | 6 +- .../email/setPrimaryEmailMutation.ts | 6 +- api/src/resolvers/health/healthQuery.ts | 40 + api/src/resolvers/index.ts | 5 +- .../notifications/markReadMutation.ts | 4 +- .../notifications/notificationQuery.ts | 4 +- .../notifications/pushNotificationMutation.ts | 30 +- api/src/resolvers/site/aboutQuery.ts | 2 +- api/src/resolvers/site/siteQuery.ts | 10 +- .../resolvers/topics/bookmarkPostMutation.ts | 11 +- api/src/resolvers/topics/categoryQuery.ts | 2 +- api/src/resolvers/topics/editPostMutation.ts | 6 +- api/src/resolvers/topics/editTopicMutation.ts | 6 +- api/src/resolvers/topics/flagPostMutation.ts | 15 +- .../resolvers/topics/leaveMessageMutation.ts | 9 +- api/src/resolvers/topics/likePostMutation.ts | 86 - .../topics/likeTopicOrPostMutation.ts | 139 + .../topics/newPrivateMessageMutation.ts | 3 +- api/src/resolvers/topics/newTopicMutation.ts | 4 +- api/src/resolvers/topics/postQuery.ts | 24 +- api/src/resolvers/topics/postRawQuery.ts | 29 +- .../topics/privateMessageDetailQuery.ts | 45 + .../resolvers/topics/privateMessageQuery.ts | 6 +- api/src/resolvers/topics/repliesQuery.ts | 7 +- api/src/resolvers/topics/replyMutation.ts | 25 +- api/src/resolvers/topics/replyingToQuery.ts | 6 +- api/src/resolvers/topics/searchQuery.ts | 8 +- api/src/resolvers/topics/searchTagsQuery.ts | 18 +- api/src/resolvers/topics/timingsMutation.ts | 6 +- api/src/resolvers/topics/topicDetailQuery.ts | 81 +- api/src/resolvers/topics/topicsQuery.ts | 64 +- api/src/resolvers/upload/lookupUrlsQuery.ts | 8 +- api/src/resolvers/upload/uploadMutation.ts | 17 +- api/src/resolvers/user/badgeQuery.ts | 2 +- .../resolvers/user/changeUsernameMutation.ts | 6 +- api/src/resolvers/user/editProfileMutation.ts | 11 +- .../user/saveProfilePictureMutation.ts | 7 +- api/src/resolvers/user/searchUserQuery.ts | 4 +- api/src/resolvers/user/singleBadgeQuery.ts | 4 +- api/src/resolvers/user/userActivityQuery.ts | 71 +- api/src/resolvers/user/userProfileQuery.ts | 11 +- api/src/resolvers/utils.ts | 48 + api/src/scalars/BookmarkReminderEnum.ts | 2 +- api/src/scalars/File.ts | 18 + api/src/scalars/LikeOutputUnion.ts | 11 + api/src/scalars/LoginOutputUnion.ts | 14 +- api/src/scalars/NotificationDataType.ts | 36 +- api/src/scalars/TopPeriodEnum.ts | 2 +- api/src/scalars/TopicsSortEnum.ts | 2 +- api/src/scalars/Upload.ts | 3 - api/src/scalars/UploadTypeEnum.ts | 2 +- api/src/scalars/UserUnion.ts | 14 +- api/src/scalars/index.ts | 3 +- api/src/schema.ts | 6 +- api/src/server/banner.ts | 24 +- api/src/server/graphql.ts | 26 - api/src/server/graphql/index.ts | 86 + api/src/server/graphql/plugins.ts | 99 + api/src/server/index.ts | 33 +- api/src/typeSchemas/About.ts | 2 +- api/src/typeSchemas/ActionPostNotification.ts | 8 +- api/src/typeSchemas/ActionSummary.ts | 12 +- api/src/typeSchemas/AdminMessageInvitation.ts | 2 +- .../typeSchemas/AdminMessageNotification.ts | 2 +- api/src/typeSchemas/AssociatedAccounts.ts | 2 +- api/src/typeSchemas/Badge.ts | 8 +- api/src/typeSchemas/BadgeGroupings.ts | 12 +- api/src/typeSchemas/BadgeNotification.ts | 6 +- api/src/typeSchemas/BadgeOutput.ts | 8 +- api/src/typeSchemas/BadgeType.ts | 2 +- api/src/typeSchemas/BasicTopic.ts | 2 +- api/src/typeSchemas/BookmarkOutput.ts | 2 +- api/src/typeSchemas/Categories.ts | 16 +- api/src/typeSchemas/CategoryList.ts | 8 +- api/src/typeSchemas/ChangeUsernameOutput.ts | 2 +- api/src/typeSchemas/EditPostInput.ts | 8 +- api/src/typeSchemas/EditProfileInput.ts | 12 +- api/src/typeSchemas/EditTopicInput.ts | 10 +- api/src/typeSchemas/Group.ts | 22 +- api/src/typeSchemas/GroupUser.ts | 6 +- api/src/typeSchemas/GroupUsers.ts | 2 +- api/src/typeSchemas/GroupedSearchResult.ts | 20 +- api/src/typeSchemas/HealthCheck.ts | 10 + api/src/typeSchemas/InviteeAccept.ts | 2 +- api/src/typeSchemas/LikedTopic.ts | 12 + api/src/typeSchemas/LinkCount.ts | 2 +- api/src/typeSchemas/LoginOutput.ts | 12 +- api/src/typeSchemas/LookupUrl.ts | 10 +- api/src/typeSchemas/MessageParticipant.ts | 8 +- api/src/typeSchemas/NotificationDetail.ts | 10 +- api/src/typeSchemas/Notifications.ts | 12 +- api/src/typeSchemas/Participant.ts | 23 +- api/src/typeSchemas/Post.ts | 80 +- api/src/typeSchemas/PostInput.ts | 24 +- api/src/typeSchemas/PostRaw.ts | 6 +- api/src/typeSchemas/PostStream.ts | 7 +- .../typeSchemas/PrivateMessageDetailOutput.ts | 10 + api/src/typeSchemas/PrivateMessageOutput.ts | 6 +- .../typeSchemas/PrivateMessagePostStream.ts | 9 + api/src/typeSchemas/RefreshTokenOutput.ts | 4 +- api/src/typeSchemas/RegisterInput.ts | 10 +- api/src/typeSchemas/RegisterOutput.ts | 2 +- api/src/typeSchemas/RemindersFrequency.ts | 2 +- api/src/typeSchemas/SearchGroup.ts | 4 +- api/src/typeSchemas/SearchOutput.ts | 6 +- api/src/typeSchemas/SearchPost.ts | 15 +- api/src/typeSchemas/SearchTopic.ts | 30 +- api/src/typeSchemas/SearchUser.ts | 15 +- api/src/typeSchemas/SearchUserOutput.ts | 8 +- api/src/typeSchemas/SecondFactorRequired.ts | 2 +- api/src/typeSchemas/SingleBadgeOutput.ts | 4 +- api/src/typeSchemas/SiteSetting.ts | 12 +- api/src/typeSchemas/Tag.ts | 4 +- api/src/typeSchemas/TagFilter.ts | 2 +- api/src/typeSchemas/Topic.ts | 78 +- api/src/typeSchemas/TopicDetail.ts | 8 +- api/src/typeSchemas/TopicDetailOutput.ts | 90 +- api/src/typeSchemas/TopicFlagTypes.ts | 10 +- api/src/typeSchemas/TopicList.ts | 14 +- api/src/typeSchemas/TopicPoster.ts | 8 +- api/src/typeSchemas/TopicsOutput.ts | 6 +- api/src/typeSchemas/UpdateProfile.ts | 8 +- api/src/typeSchemas/UploadOutput.ts | 8 +- api/src/typeSchemas/UserActions.ts | 41 +- api/src/typeSchemas/UserAuthToken.ts | 2 +- api/src/typeSchemas/UserAuthTokens.ts | 2 +- api/src/typeSchemas/UserBadge.ts | 8 +- api/src/typeSchemas/UserDetail.ts | 106 +- api/src/typeSchemas/UserFeaturedTopic.ts | 22 +- api/src/typeSchemas/UserIcon.ts | 15 +- api/src/typeSchemas/UserIconStatus.ts | 17 +- api/src/typeSchemas/UserLite.ts | 67 +- api/src/typeSchemas/UserOption.ts | 4 +- api/src/typeSchemas/UserOptions.ts | 8 +- api/src/typeSchemas/UserProfileOutput.ts | 12 +- api/src/typeSchemas/UserTopic.ts | 2 +- api/src/typeSchemas/index.ts | 4 + api/src/types/dataTypes.ts | 59 +- api/src/types/serverTypes.ts | 1 + api/tsconfig.json | 4 +- api/yarn.lock | 5873 ++++++----- documentation/beta_docs/discourse-features.md | 51 + documentation/docs/app-store.md | 182 +- documentation/docs/concepts.md | 16 +- documentation/docs/dedicated.md | 4 +- documentation/docs/discourse-features.md | 63 +- documentation/docs/discourse-plugin-enable.md | 34 + .../docs/discourse-plugin-installation.md | 82 + documentation/docs/discourse-plugin.md | 15 + .../docs/email-deep-linking/intro.md | 9 + .../setup/enable-email-deep-linking.md | 25 + .../setup/verify-email-deep-linking.md | 49 + documentation/docs/env-mobile.md | 115 +- documentation/docs/play-store.md | 140 +- .../docs/push-notifications/introduction.md | 8 + .../push-notifications/plugin-interaction.md | 31 + .../setup/enable-push-notifications.md | 32 + .../setup/verify-push-notifications.md | 33 + documentation/docs/quick-start.md | 16 +- documentation/docs/rationale.md | 8 +- documentation/docs/setup.md | 233 +- documentation/docs/technologies.md | 2 + documentation/docs/troubleshooting-build.md | 128 + documentation/docs/tutorial/building.md | 152 + documentation/docs/tutorial/install-prose.md | 6 +- documentation/docs/tutorial/intro.md | 6 +- documentation/docs/tutorial/publishing.md | 97 + .../docs/tutorial/setup-cloud-server.md | 2 +- documentation/docs/tutorial/setup-mobile.md | 109 +- documentation/docs/tutorial/setup.md | 35 +- documentation/docs/tutorial/updating.md | 68 + documentation/docs/tutorial/white-label.md | 22 +- documentation/docusaurus.config.js | 21 +- documentation/sidebars.js | 31 +- documentation/src/pages/index.js | 6 + .../img/guides/playStore/build-artifact.png | Bin 0 -> 55559 bytes .../static/img/guides/playStore/builds.png | Bin 0 -> 38268 bytes .../img/guides/playStore/expo-build.png | Bin 93251 -> 0 bytes .../img/guides/testFlight/build-artifact.png | Bin 27621 -> 56098 bytes .../static/img/guides/testFlight/builds.png | Bin 66964 -> 36765 bytes .../static/img/lexicon-architecture.png | Bin 150279 -> 176898 bytes .../static/img/lexicon-architecture.svg | 63 + .../push-notifications-flowchart.svg | 1 + .../Discourse-Plugin-Email-notification.png | Bin 0 -> 67703 bytes ...ourse-Plugin-EmailDeepLinking-Settings.png | Bin 0 -> 138504 bytes .../screenshot/Discourse-Plugin-Enable.png | Bin 0 -> 129927 bytes .../Discourse-Plugin-PushNotif-Settings.png | Bin 0 -> 133301 bytes .../screenshot/Discourse-Plugin-Settings.png | Bin 0 -> 107801 bytes .../screenshot/Mobile-PushNotification.png | Bin 0 -> 265625 bytes .../Please_connect_network_error.png | Bin 0 -> 204960 bytes .../static/img/screenshot/playground.png | Bin 189804 -> 519673 bytes .../versioned_docs/version-1.0.0/app-store.md | 276 + .../versioned_docs/version-1.0.0/assets.md | 47 + .../version-1.0.0/commercial-support.md | 9 + .../versioned_docs/version-1.0.0/concepts.md | 63 + .../version-1.0.0/contributing.md | 131 + .../versioned_docs/version-1.0.0/customize.md | 28 + .../versioned_docs/version-1.0.0/dedicated.md | 300 + .../version-1.0.0/deployment.md | 86 + .../version-1.0.0/discourse-features.md | 52 + .../version-1.0.0/env-mobile.md | 119 + .../versioned_docs/version-1.0.0/env-prose.md | 15 + .../versioned_docs/version-1.0.0/intro.md | 148 + .../version-1.0.0/lexicon-updates.md | 17 + .../versioned_docs/version-1.0.0/optimal.md | 89 + .../version-1.0.0/play-store.md | 162 + .../version-1.0.0/publish-app.md | 11 + .../version-1.0.0/quick-start.md | 66 + .../versioned_docs/version-1.0.0/rationale.md | 73 + .../versioned_docs/version-1.0.0/setup.md | 362 + .../version-1.0.0/supported-devices.md | 29 + .../version-1.0.0/technologies.md | 23 + .../versioned_docs/version-1.0.0/theming.md | 247 + .../version-1.0.0/troubleshooting-build.md | 128 + .../version-1.0.0/tutorial/building.md | 152 + .../version-1.0.0/tutorial/install-prose.md | 360 + .../version-1.0.0/tutorial/intro.md | 45 + .../version-1.0.0/tutorial/publishing.md | 97 + .../tutorial/setup-cloud-server.md | 27 + .../version-1.0.0/tutorial/setup-discourse.md | 306 + .../version-1.0.0/tutorial/setup-mobile.md | 120 + .../version-1.0.0/tutorial/setup.md | 98 + .../version-1.0.0/tutorial/updating.md | 68 + .../version-1.0.0/tutorial/white-label.md | 82 + .../version-1.0.0/white-labeling.md | 13 + .../version-2.0.0-beta/app-store.md | 282 + .../version-2.0.0-beta/assets.md | 47 + .../version-2.0.0-beta/commercial-support.md | 9 + .../version-2.0.0-beta/concepts.md | 68 + .../version-2.0.0-beta/contributing.md | 131 + .../version-2.0.0-beta/customize.md | 28 + .../version-2.0.0-beta/dedicated.md | 300 + .../version-2.0.0-beta/deployment.md | 86 + .../version-2.0.0-beta/discourse-features.md | 54 + .../discourse-plugin-enable.md | 34 + .../discourse-plugin-installation.md | 82 + .../version-2.0.0-beta/discourse-plugin.md | 15 + .../email-deep-linking/intro.md | 9 + .../setup/enable-email-deep-linking.md | 33 + .../setup/verify-email-deep-linking.md | 51 + .../version-2.0.0-beta/env-mobile.md | 119 + .../version-2.0.0-beta/env-prose.md | 15 + .../version-2.0.0-beta/intro.md | 142 + .../version-2.0.0-beta/lexicon-updates.md | 17 + .../version-2.0.0-beta/optimal.md | 98 + .../version-2.0.0-beta/play-store.md | 166 + .../version-2.0.0-beta/publish-app.md | 11 + .../push-notifications/introduction.md | 8 + .../push-notifications/plugin-interaction.md | 31 + .../setup/enable-push-notifications.md | 32 + .../setup/verify-push-notifications.md | 33 + .../version-2.0.0-beta/quick-start.md | 65 + .../version-2.0.0-beta/rationale.md | 73 + .../version-2.0.0-beta/setup.md | 376 + .../version-2.0.0-beta/supported-devices.md | 33 + .../version-2.0.0-beta/technologies.md | 21 + .../version-2.0.0-beta/theming.md | 247 + .../troubleshooting-build.md | 128 + .../version-2.0.0-beta/tutorial/building.md | 152 + .../tutorial/install-prose.md | 360 + .../version-2.0.0-beta/tutorial/intro.md | 47 + .../version-2.0.0-beta/tutorial/publishing.md | 97 + .../tutorial/setup-cloud-server.md | 27 + .../tutorial/setup-discourse.md | 306 + .../tutorial/setup-mobile.md | 120 + .../version-2.0.0-beta/tutorial/setup.md | 98 + .../version-2.0.0-beta/tutorial/updating.md | 68 + .../tutorial/white-label.md | 82 + .../version-2.0.0-beta/white-labeling.md | 13 + .../version-1.0.0-sidebars.json | 39 + .../version-2.0.0-beta-sidebars.json | 57 + documentation/versions.json | 1 + documentation/yarn.lock | 54 +- frontend/.env.example | 2 - frontend/.gitignore | 5 + frontend/Config.ts | 70 + frontend/apollo.config.js | 9 + frontend/app.json | 19 +- .../icons/{adminPanel.svg => AdminPanel.svg} | 0 frontend/assets/icons/NoConnection.svg | 6 + frontend/assets/icons/NotificationActive.svg | 3 + frontend/assets/icons/Online.svg | 4 + .../icons/{settings.svg => Settings.svg} | 0 frontend/assets/icons/Unreachable.svg | 4 + frontend/babel.config.js | 16 +- frontend/codegen.ts | 34 + frontend/codegen.yml | 24 - frontend/docs/DeepLinkRedirect.md | 76 + frontend/docs/authentication.md | 28 + frontend/docs/expoExperienceId.md | 392 + frontend/eas.json | 51 + frontend/index.js | 5 + frontend/metro.config.js | 29 +- frontend/package.json | 128 +- .../@react-navigation+stack+6.2.2.patch | 20 + ...ative-markdown-display+7.0.0-alpha.2.patch | 46 + ...ct-native-skeleton-placeholder+5.2.4.patch | 58 + frontend/src/App.tsx | 75 +- frontend/src/__mocks__/mockData.ts | 46 +- frontend/src/__mocks__/setupLinking.ts | 8 + frontend/src/components/Author.tsx | 4 +- .../CustomFlatList/CustomFlatList.tsx | 244 + .../src/components/CustomFlatList/index.ts | 1 + frontend/src/components/LoadingOrError.tsx | 34 +- frontend/src/components/Markdown.tsx | 96 +- frontend/src/components/MentionList.tsx | 6 +- frontend/src/components/Metrics/Metrics.tsx | 288 +- frontend/src/components/NestedComment.tsx | 232 +- .../src/components/PostItem/HomePostItem.tsx | 119 + .../PostItem/PostDetailHeaderItem.tsx | 174 + .../src/components/PostItem/PostHidden.tsx | 2 +- frontend/src/components/PostItem/PostItem.tsx | 133 +- .../components/PostItem/PostItemFooter.tsx | 2 + .../components/PostItem/SearchPostItem.tsx | 84 + .../PostItem/UserInformationPostItem.tsx | 85 + frontend/src/components/PostItem/index.ts | 4 + frontend/src/components/PostList.tsx | 112 +- frontend/src/components/RepliedPost.tsx | 96 +- frontend/src/components/RequestError.tsx | 122 + frontend/src/components/ShowImageModal.tsx | 28 +- frontend/src/components/Toast.tsx | 66 + frontend/src/components/index.ts | 3 + .../__tests__/getProseEndpoint.test.ts | 39 + frontend/src/constants/app.ts | 58 +- frontend/src/constants/defaultValues.ts | 25 +- frontend/src/constants/errorTypes.ts | 31 + frontend/src/constants/index.ts | 4 + frontend/src/constants/links.ts | 48 + frontend/src/constants/regex.ts | 6 + frontend/src/constants/route.ts | 105 + frontend/src/constants/theme/colors.ts | 10 + frontend/src/core-ui/CachedImage.tsx | 6 +- frontend/src/core-ui/ChatBubble.tsx | 9 +- frontend/src/core-ui/CustomImage.tsx | 28 +- frontend/src/core-ui/Icon.tsx | 2 +- frontend/src/core-ui/Link.tsx | 30 + frontend/src/core-ui/index.ts | 1 + frontend/src/graphql/client.ts | 223 +- frontend/src/graphql/server/auth.ts | 4 +- frontend/src/graphql/server/getTopicDetail.ts | 118 +- frontend/src/graphql/server/health.ts | 11 + frontend/src/graphql/server/likePost.ts | 43 +- frontend/src/graphql/server/message.ts | 38 + frontend/src/graphql/server/notification.ts | 16 + frontend/src/graphql/server/postRaw.ts | 5 +- frontend/src/graphql/server/reply.ts | 22 +- frontend/src/graphql/server/search.ts | 52 +- frontend/src/graphql/server/site.ts | 2 + frontend/src/graphql/server/topics.ts | 19 +- frontend/src/graphql/server/upload.ts | 2 +- frontend/src/graphql/server/userActivity.ts | 28 +- frontend/src/helpers/PrivateTopicAlert.ts | 21 + .../PushNotificationsSetupFailAlert.ts | 12 + .../helpers/__tests__/checkImageFile.test.ts | 13 + .../__tests__/deleteQuoteBbCode.test.ts | 63 + .../helpers/__tests__/emojiHandler.test.ts | 18 + .../__tests__/existingPostIsValid.test.ts | 18 +- .../helpers/__tests__/experienceId.test.ts | 13 + .../__tests__/extractAttributes.test.ts | 33 + .../helpers/__tests__/getUserImage.test.ts | 2 + .../src/helpers/__tests__/linking.test.ts | 45 + .../__tests__/paginationHandler.test.ts | 108 + .../postDetailContentHandler.test.ts | 2 + .../__tests__/processRawContent.test.ts | 55 + .../replaceQuotesWithMarkdown.test.ts | 122 + .../src/helpers/__tests__/updateLike.test.ts | 127 + frontend/src/helpers/bottomMenu.ts | 43 +- frontend/src/helpers/checkImageFile.ts | 4 + frontend/src/helpers/clampWorklet.ts | 13 + frontend/src/helpers/createReactNativeFile.ts | 17 +- frontend/src/helpers/deleteQuoteBbCode.ts | 34 + frontend/src/helpers/emojiHandler.ts | 5 + frontend/src/helpers/errorHandler.ts | 68 +- frontend/src/helpers/errorMessage.ts | 1 + frontend/src/helpers/existingPostIsValid.ts | 31 +- frontend/src/helpers/experienceId.ts | 50 + frontend/src/helpers/extractAttributes.ts | 16 + .../src/helpers/findChannelByCategoryId.ts | 15 + .../src/helpers/getExpoPushTokenHandler.ts | 84 + frontend/src/helpers/getFetchMorePostIds.ts | 45 + .../getTopicDetailOutputCacheBehavior.ts | 17 + frontend/src/helpers/handleDuplicate.ts | 19 - frontend/src/helpers/handleDuplicates.ts | 39 + frontend/src/helpers/imageUploadHandler.ts | 34 +- frontend/src/helpers/index.ts | 18 +- frontend/src/helpers/isFlatList.ts | 9 + frontend/src/helpers/linking.ts | 158 + frontend/src/helpers/localStorage.tsx | 10 +- frontend/src/helpers/messageDetailHandler.ts | 174 +- frontend/src/helpers/notificationHandler.ts | 50 +- frontend/src/helpers/paginationHandler.ts | 196 +- frontend/src/helpers/parser.ts | 4 + frontend/src/helpers/pickImage.ts | 2 +- .../src/helpers/postDetailContentHandler.ts | 165 +- frontend/src/helpers/processRawContent.ts | 35 +- .../src/helpers/replaceQuotesWithMarkdown.ts | 71 + frontend/src/helpers/storage.ts | 2 +- frontend/src/helpers/transformTopicToPost.ts | 69 + frontend/src/helpers/updateLike.ts | 71 + frontend/src/hooks/auth/useLogin.ts | 20 +- frontend/src/hooks/auth/useLogout.ts | 27 +- .../src/hooks/auth/usePushNotifications.ts | 120 + frontend/src/hooks/auth/useRefreshToken.ts | 12 +- frontend/src/hooks/auth/useRegister.ts | 18 +- frontend/src/hooks/index.ts | 5 +- frontend/src/hooks/post/useActivity.ts | 21 +- frontend/src/hooks/post/useEditPost.ts | 18 +- frontend/src/hooks/post/useEditTopic.ts | 14 +- frontend/src/hooks/post/useFlagPost.ts | 22 +- frontend/src/hooks/post/useLikePost.ts | 46 - frontend/src/hooks/post/useLikeTopicOrPost.ts | 224 + frontend/src/hooks/post/useLoadMorePost.ts | 99 + frontend/src/hooks/post/useLookupUrls.ts | 19 +- frontend/src/hooks/post/useMention.ts | 13 +- frontend/src/hooks/post/useMessageDetail.ts | 24 + frontend/src/hooks/post/useMessageList.ts | 10 +- frontend/src/hooks/post/useNewMessage.ts | 10 +- frontend/src/hooks/post/useNewTopic.ts | 18 +- frontend/src/hooks/post/usePostRaw.ts | 18 +- frontend/src/hooks/post/useReplyPost.ts | 10 +- frontend/src/hooks/post/useReplyTopic.ts | 18 +- frontend/src/hooks/post/useSearchPost.ts | 10 +- frontend/src/hooks/post/useTiming.ts | 22 +- frontend/src/hooks/post/useTopicDetail.ts | 10 +- frontend/src/hooks/post/useTopicList.ts | 19 +- .../src/hooks/profile/useChangePassword.ts | 14 +- frontend/src/hooks/profile/useEmail.ts | 48 +- frontend/src/hooks/profile/useNotification.ts | 25 +- frontend/src/hooks/profile/useProfile.ts | 37 +- frontend/src/hooks/site/useAbout.ts | 5 +- frontend/src/hooks/site/useChannels.ts | 8 +- frontend/src/hooks/site/useSearchUsers.ts | 14 +- frontend/src/hooks/site/useSingleBadge.ts | 22 +- frontend/src/hooks/site/useSiteSettings.ts | 27 +- frontend/src/hooks/site/useTags.ts | 10 +- frontend/src/hooks/useInitialLoad.tsx | 46 + frontend/src/hooks/useUpload.ts | 69 +- frontend/src/icons.ts | 12 +- frontend/src/navigation/AppNavigator.tsx | 106 +- frontend/src/navigation/NavigationService.tsx | 31 + .../src/navigation/RootStackNavigator.tsx | 275 +- frontend/src/navigation/StackNavigator.tsx | 131 - frontend/src/reactiveVars/index.tsx | 1 + frontend/src/reactiveVars/tokenReactive.tsx | 25 + frontend/src/screens/Activity.tsx | 90 +- frontend/src/screens/AddEmail.tsx | 16 +- frontend/src/screens/Channels/Channels.tsx | 18 +- frontend/src/screens/EditProfile.tsx | 53 +- .../components/EmailAddressItem.tsx | 14 +- frontend/src/screens/Home/Home.tsx | 414 +- frontend/src/screens/Hyperlink.tsx | 32 +- frontend/src/screens/InstanceLoading.tsx | 20 +- frontend/src/screens/Login.tsx | 36 +- .../screens/MessageDetail/ImagePreview.tsx | 8 +- .../screens/MessageDetail/MessageDetail.tsx | 271 +- .../MessageDetail/components/MessageItem.tsx | 14 +- .../components/ReplyInputField.tsx | 8 + .../Messages/Components/MessageCard.tsx | 10 +- frontend/src/screens/Messages/Messages.tsx | 7 +- frontend/src/screens/NewMessage.tsx | 48 +- frontend/src/screens/NewMessagePreview.tsx | 10 +- frontend/src/screens/NewPost.tsx | 257 +- .../screens/Notifications/Notifications.tsx | 85 +- frontend/src/screens/PostDetail.tsx | 750 -- .../src/screens/PostDetail/PostDetail.tsx | 622 ++ .../PostDetail/PostDetailSkeletonLoading.tsx | 94 + .../src/screens/PostDetail/hooks/index.tsx | 1 + .../hooks/useNotificationScroll.tsx | 32 + frontend/src/screens/PostDetail/index.tsx | 1 + frontend/src/screens/PostImagePreview.tsx | 4 +- frontend/src/screens/PostPreview.tsx | 121 +- frontend/src/screens/PostReply.tsx | 143 +- .../src/screens/Preferences/Preferences.tsx | 5 + .../screens/Preferences/PushNotifications.tsx | 85 + .../Preferences/components/SettingsSwitch.tsx | 50 + frontend/src/screens/Profile/Profile.tsx | 45 +- frontend/src/screens/Register.tsx | 15 +- frontend/src/screens/Search.tsx | 78 +- .../src/screens/SelectUser/SelectUser.tsx | 60 +- frontend/src/screens/Tags/Tags.tsx | 56 +- frontend/src/screens/Troubleshoot.tsx | 152 + frontend/src/screens/TwoFactorAuth.tsx | 33 +- frontend/src/screens/UserInformation.tsx | 106 +- frontend/src/screens/index.ts | 8 +- frontend/src/theme/theme.ts | 9 + frontend/src/types/Form.ts | 14 + frontend/src/types/Navigation.ts | 73 +- frontend/src/types/Post.ts | 22 +- frontend/src/types/Types.ts | 61 +- frontend/src/types/imports.d.ts | 5 - frontend/src/types/index.ts | 3 + frontend/src/utils/AuthProvider.tsx | 188 + frontend/src/utils/ModalProvider.tsx | 2 +- .../src/utils/OngoingLikedTopicProvider.tsx | 54 + frontend/src/utils/PostProvider.tsx | 100 - .../src/utils/PushNotificationsProvider.tsx | 45 + frontend/src/utils/RedirectProvider.tsx | 56 + frontend/src/utils/UserEventProvider.tsx | 53 - frontend/src/utils/index.ts | 5 +- frontend/yarn.lock | 8913 +++++++++-------- yarn.lock | 6 +- 553 files changed, 28984 insertions(+), 12652 deletions(-) create mode 100644 .easignore delete mode 100644 .expo/settings.json create mode 100644 .tool-versions create mode 100644 PROJECT.md create mode 100644 api/docs/logging.md create mode 100644 api/docs/typescript.md create mode 100644 api/reset.d.ts create mode 100644 api/src/__tests__/api.ts create mode 100644 api/src/__tests__/getPosterTypeDetails.ts create mode 100644 api/src/__tests__/getTopicAuthor.ts create mode 100644 api/src/__tests__/getUpdatedLikedTopic.ts create mode 100644 api/src/__tests__/resolvers/utils.ts create mode 100644 api/src/constants/discourse.ts create mode 100644 api/src/helpers/customErrors.ts create mode 100644 api/src/helpers/fetchLikeActivities.ts create mode 100644 api/src/helpers/fetchPost.ts create mode 100644 api/src/helpers/getModifiedUserAgent.ts create mode 100644 api/src/helpers/getPosterTypeDetails.ts create mode 100644 api/src/helpers/getTopicAuthor.ts delete mode 100644 api/src/helpers/getTopicPostPath.ts create mode 100644 api/src/helpers/getUpdatedLikedTopic.ts create mode 100644 api/src/helpers/likeErroHandler.ts create mode 100644 api/src/helpers/topicDetail.ts create mode 100644 api/src/locale/index.ts create mode 100644 api/src/logger.ts delete mode 100644 api/src/middlewares/permission.ts create mode 100644 api/src/resolvers/health/healthQuery.ts delete mode 100644 api/src/resolvers/topics/likePostMutation.ts create mode 100644 api/src/resolvers/topics/likeTopicOrPostMutation.ts create mode 100644 api/src/resolvers/topics/privateMessageDetailQuery.ts create mode 100644 api/src/resolvers/utils.ts create mode 100644 api/src/scalars/File.ts create mode 100644 api/src/scalars/LikeOutputUnion.ts delete mode 100644 api/src/scalars/Upload.ts delete mode 100644 api/src/server/graphql.ts create mode 100644 api/src/server/graphql/index.ts create mode 100644 api/src/server/graphql/plugins.ts create mode 100644 api/src/typeSchemas/HealthCheck.ts create mode 100644 api/src/typeSchemas/LikedTopic.ts create mode 100644 api/src/typeSchemas/PrivateMessageDetailOutput.ts create mode 100644 api/src/typeSchemas/PrivateMessagePostStream.ts create mode 100644 documentation/beta_docs/discourse-features.md create mode 100644 documentation/docs/discourse-plugin-enable.md create mode 100644 documentation/docs/discourse-plugin-installation.md create mode 100644 documentation/docs/discourse-plugin.md create mode 100644 documentation/docs/email-deep-linking/intro.md create mode 100644 documentation/docs/email-deep-linking/setup/enable-email-deep-linking.md create mode 100644 documentation/docs/email-deep-linking/setup/verify-email-deep-linking.md create mode 100644 documentation/docs/push-notifications/introduction.md create mode 100644 documentation/docs/push-notifications/plugin-interaction.md create mode 100644 documentation/docs/push-notifications/setup/enable-push-notifications.md create mode 100644 documentation/docs/push-notifications/setup/verify-push-notifications.md create mode 100644 documentation/docs/troubleshooting-build.md create mode 100644 documentation/docs/tutorial/building.md create mode 100644 documentation/docs/tutorial/publishing.md create mode 100644 documentation/docs/tutorial/updating.md create mode 100644 documentation/src/pages/index.js create mode 100644 documentation/static/img/guides/playStore/build-artifact.png create mode 100644 documentation/static/img/guides/playStore/builds.png delete mode 100644 documentation/static/img/guides/playStore/expo-build.png create mode 100644 documentation/static/img/lexicon-architecture.svg create mode 100644 documentation/static/img/push-notifications/push-notifications-flowchart.svg create mode 100644 documentation/static/img/screenshot/Discourse-Plugin-Email-notification.png create mode 100644 documentation/static/img/screenshot/Discourse-Plugin-EmailDeepLinking-Settings.png create mode 100644 documentation/static/img/screenshot/Discourse-Plugin-Enable.png create mode 100644 documentation/static/img/screenshot/Discourse-Plugin-PushNotif-Settings.png create mode 100644 documentation/static/img/screenshot/Discourse-Plugin-Settings.png create mode 100644 documentation/static/img/screenshot/Mobile-PushNotification.png create mode 100644 documentation/static/img/screenshot/Please_connect_network_error.png create mode 100644 documentation/versioned_docs/version-1.0.0/app-store.md create mode 100644 documentation/versioned_docs/version-1.0.0/assets.md create mode 100644 documentation/versioned_docs/version-1.0.0/commercial-support.md create mode 100644 documentation/versioned_docs/version-1.0.0/concepts.md create mode 100644 documentation/versioned_docs/version-1.0.0/contributing.md create mode 100644 documentation/versioned_docs/version-1.0.0/customize.md create mode 100644 documentation/versioned_docs/version-1.0.0/dedicated.md create mode 100644 documentation/versioned_docs/version-1.0.0/deployment.md create mode 100644 documentation/versioned_docs/version-1.0.0/discourse-features.md create mode 100644 documentation/versioned_docs/version-1.0.0/env-mobile.md create mode 100644 documentation/versioned_docs/version-1.0.0/env-prose.md create mode 100644 documentation/versioned_docs/version-1.0.0/intro.md create mode 100644 documentation/versioned_docs/version-1.0.0/lexicon-updates.md create mode 100644 documentation/versioned_docs/version-1.0.0/optimal.md create mode 100644 documentation/versioned_docs/version-1.0.0/play-store.md create mode 100644 documentation/versioned_docs/version-1.0.0/publish-app.md create mode 100644 documentation/versioned_docs/version-1.0.0/quick-start.md create mode 100644 documentation/versioned_docs/version-1.0.0/rationale.md create mode 100644 documentation/versioned_docs/version-1.0.0/setup.md create mode 100644 documentation/versioned_docs/version-1.0.0/supported-devices.md create mode 100644 documentation/versioned_docs/version-1.0.0/technologies.md create mode 100644 documentation/versioned_docs/version-1.0.0/theming.md create mode 100644 documentation/versioned_docs/version-1.0.0/troubleshooting-build.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/building.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/install-prose.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/intro.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/publishing.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/setup-cloud-server.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/setup-discourse.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/setup-mobile.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/setup.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/updating.md create mode 100644 documentation/versioned_docs/version-1.0.0/tutorial/white-label.md create mode 100644 documentation/versioned_docs/version-1.0.0/white-labeling.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/app-store.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/assets.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/commercial-support.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/concepts.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/contributing.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/customize.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/dedicated.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/deployment.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/discourse-features.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-enable.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-installation.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/discourse-plugin.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/intro.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/enable-email-deep-linking.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/verify-email-deep-linking.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/env-mobile.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/env-prose.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/intro.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/lexicon-updates.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/optimal.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/play-store.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/publish-app.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/push-notifications/introduction.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/push-notifications/plugin-interaction.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/enable-push-notifications.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/verify-push-notifications.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/quick-start.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/rationale.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/setup.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/supported-devices.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/technologies.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/theming.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/troubleshooting-build.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/building.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/install-prose.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/intro.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/publishing.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-cloud-server.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-discourse.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-mobile.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/setup.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/updating.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/tutorial/white-label.md create mode 100644 documentation/versioned_docs/version-2.0.0-beta/white-labeling.md create mode 100644 documentation/versioned_sidebars/version-1.0.0-sidebars.json create mode 100644 documentation/versioned_sidebars/version-2.0.0-beta-sidebars.json create mode 100644 documentation/versions.json delete mode 100644 frontend/.env.example create mode 100644 frontend/Config.ts create mode 100644 frontend/apollo.config.js rename frontend/assets/icons/{adminPanel.svg => AdminPanel.svg} (100%) create mode 100644 frontend/assets/icons/NoConnection.svg create mode 100644 frontend/assets/icons/NotificationActive.svg create mode 100644 frontend/assets/icons/Online.svg rename frontend/assets/icons/{settings.svg => Settings.svg} (100%) create mode 100644 frontend/assets/icons/Unreachable.svg create mode 100644 frontend/codegen.ts delete mode 100644 frontend/codegen.yml create mode 100644 frontend/docs/DeepLinkRedirect.md create mode 100644 frontend/docs/authentication.md create mode 100644 frontend/docs/expoExperienceId.md create mode 100644 frontend/eas.json create mode 100644 frontend/index.js create mode 100644 frontend/patches/@react-navigation+stack+6.2.2.patch create mode 100644 frontend/patches/react-native-markdown-display+7.0.0-alpha.2.patch create mode 100644 frontend/patches/react-native-skeleton-placeholder+5.2.4.patch create mode 100644 frontend/src/__mocks__/setupLinking.ts create mode 100644 frontend/src/components/CustomFlatList/CustomFlatList.tsx create mode 100644 frontend/src/components/CustomFlatList/index.ts create mode 100644 frontend/src/components/PostItem/HomePostItem.tsx create mode 100644 frontend/src/components/PostItem/PostDetailHeaderItem.tsx create mode 100644 frontend/src/components/PostItem/SearchPostItem.tsx create mode 100644 frontend/src/components/PostItem/UserInformationPostItem.tsx create mode 100644 frontend/src/components/RequestError.tsx create mode 100644 frontend/src/components/Toast.tsx create mode 100644 frontend/src/constants/__tests__/getProseEndpoint.test.ts create mode 100644 frontend/src/constants/errorTypes.ts create mode 100644 frontend/src/constants/links.ts create mode 100644 frontend/src/constants/regex.ts create mode 100644 frontend/src/constants/route.ts create mode 100644 frontend/src/core-ui/Link.tsx create mode 100644 frontend/src/graphql/server/health.ts create mode 100644 frontend/src/helpers/PrivateTopicAlert.ts create mode 100644 frontend/src/helpers/PushNotificationsSetupFailAlert.ts create mode 100644 frontend/src/helpers/__tests__/checkImageFile.test.ts create mode 100644 frontend/src/helpers/__tests__/deleteQuoteBbCode.test.ts create mode 100644 frontend/src/helpers/__tests__/emojiHandler.test.ts create mode 100644 frontend/src/helpers/__tests__/experienceId.test.ts create mode 100644 frontend/src/helpers/__tests__/extractAttributes.test.ts create mode 100644 frontend/src/helpers/__tests__/linking.test.ts create mode 100644 frontend/src/helpers/__tests__/paginationHandler.test.ts create mode 100644 frontend/src/helpers/__tests__/replaceQuotesWithMarkdown.test.ts create mode 100644 frontend/src/helpers/__tests__/updateLike.test.ts create mode 100644 frontend/src/helpers/checkImageFile.ts create mode 100644 frontend/src/helpers/clampWorklet.ts create mode 100644 frontend/src/helpers/deleteQuoteBbCode.ts create mode 100644 frontend/src/helpers/emojiHandler.ts create mode 100644 frontend/src/helpers/experienceId.ts create mode 100644 frontend/src/helpers/extractAttributes.ts create mode 100644 frontend/src/helpers/findChannelByCategoryId.ts create mode 100644 frontend/src/helpers/getExpoPushTokenHandler.ts create mode 100644 frontend/src/helpers/getFetchMorePostIds.ts create mode 100644 frontend/src/helpers/getTopicDetailOutputCacheBehavior.ts delete mode 100644 frontend/src/helpers/handleDuplicate.ts create mode 100644 frontend/src/helpers/handleDuplicates.ts create mode 100644 frontend/src/helpers/isFlatList.ts create mode 100644 frontend/src/helpers/linking.ts create mode 100644 frontend/src/helpers/parser.ts create mode 100644 frontend/src/helpers/replaceQuotesWithMarkdown.ts create mode 100644 frontend/src/helpers/transformTopicToPost.ts create mode 100644 frontend/src/helpers/updateLike.ts create mode 100644 frontend/src/hooks/auth/usePushNotifications.ts delete mode 100644 frontend/src/hooks/post/useLikePost.ts create mode 100644 frontend/src/hooks/post/useLikeTopicOrPost.ts create mode 100644 frontend/src/hooks/post/useLoadMorePost.ts create mode 100644 frontend/src/hooks/post/useMessageDetail.ts create mode 100644 frontend/src/hooks/useInitialLoad.tsx create mode 100644 frontend/src/navigation/NavigationService.tsx delete mode 100644 frontend/src/navigation/StackNavigator.tsx create mode 100644 frontend/src/reactiveVars/index.tsx create mode 100644 frontend/src/reactiveVars/tokenReactive.tsx delete mode 100644 frontend/src/screens/PostDetail.tsx create mode 100644 frontend/src/screens/PostDetail/PostDetail.tsx create mode 100644 frontend/src/screens/PostDetail/PostDetailSkeletonLoading.tsx create mode 100644 frontend/src/screens/PostDetail/hooks/index.tsx create mode 100644 frontend/src/screens/PostDetail/hooks/useNotificationScroll.tsx create mode 100644 frontend/src/screens/PostDetail/index.tsx create mode 100644 frontend/src/screens/Preferences/PushNotifications.tsx create mode 100644 frontend/src/screens/Preferences/components/SettingsSwitch.tsx create mode 100644 frontend/src/screens/Troubleshoot.tsx create mode 100644 frontend/src/types/Form.ts create mode 100644 frontend/src/utils/AuthProvider.tsx create mode 100644 frontend/src/utils/OngoingLikedTopicProvider.tsx delete mode 100644 frontend/src/utils/PostProvider.tsx create mode 100644 frontend/src/utils/PushNotificationsProvider.tsx create mode 100644 frontend/src/utils/RedirectProvider.tsx delete mode 100644 frontend/src/utils/UserEventProvider.tsx diff --git a/.easignore b/.easignore new file mode 100644 index 00000000..2a5ce273 --- /dev/null +++ b/.easignore @@ -0,0 +1,18 @@ +node_modules/**/* +npm-debug.* + +.expo/* +*/coverage +*/.env +*/playstore_secret.json + +frontend/web-build/ +frontend/dist + +api/lib + +# macOS +.DS_Store + +# Ignoring other directories +/documentation diff --git a/.expo/settings.json b/.expo/settings.json deleted file mode 100644 index 92bc513b..00000000 --- a/.expo/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "hostType": "lan", - "lanType": "ip", - "dev": true, - "minify": false, - "urlRandomness": null, - "https": false -} diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 86c2ad04..7022ec5e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,3 +1,12 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + --- name: Troubleshooting or Bug Report about: Create a report to help us improve diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d1c1ace9..a3834879 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,10 +1,10 @@ # Type of PR -- [ ] Bug fix (_non-breaking change which fixes an issue_) -- [ ] New feature (_adding a feature following a feature-request issue_) -- [ ] Improvement (_improving an existing feature - includes `style:` and `perf:`commits_) -- [ ] Refactor (_rewriting existing code without any feature change_) -- [ ] (!) This change is or requires a documentation update +- [ ] 🐞 Bug fix (_non-breaking change which fixes an issue_) +- [ ] 🧙‍♂️ New feature (_adding a feature following a feature-request issue_) +- [ ] 🔨 Improvement (_improving an existing feature - includes `style:` and `perf:`commits_) +- [ ] 🏗️ Refactor (_rewriting existing code without any feature change_) +- [ ] ✍️ (!) This change is or requires a documentation update # Description diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7dc90a4b..3fb0781e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,25 +2,25 @@ name: CI on: push: - branches: [master, alpha-v2] + branches: [master, v2.0.0-beta] pull_request: - branches: [master, alpha-v2] + branches: [master, v2.0.0-beta] jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v3 with: node-version: '16.x' - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - - uses: actions/cache@v1 + - uses: actions/cache@v3 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 00000000..4df66bbf --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +nodejs 16.20.0 \ No newline at end of file diff --git a/PROJECT.md b/PROJECT.md new file mode 100644 index 00000000..7c053e7a --- /dev/null +++ b/PROJECT.md @@ -0,0 +1,63 @@ +# Internal Project Documentation + +## Usage of `git` + +As of Monday, July 3, 2023, usage of `rebase` and force pushing are no longer permitted on this project. + +`git merge` is the acceptable approach for resolving conflicts. + +### Example Scenario + +Typically what you'll do is `merge` the current branch with another branch (often `master`). + +For example, let's suppose you've been working on a feature branch named `feature/push-notifications`. + +Since you started making changes, `master` has received quite a few commits (from other PRs being merged in). + +In fact, you even need to incorporate some of those changes into your branch. + +_This approach is step-by-step and very explicit. There are shortcuts to accomplish this. In this case, we list out every step just to be clear._ + +#### Step 1: Checkout `master` and pull down the latest changes + +You need to ensure your local copy of `master` is up-to-date with what's on the remote. + +``` +git checkout master && git pull +``` + +#### Step 2: Switch back to your branch + +Now that `master` is up-to-date, switch back to `feature/push-notifications`. + +``` +git checkout feature/push-notifications +``` + +#### Step 3: Merge with `master` to synchronize your branch with it + +``` +git merge master +``` + +#### Step 4: Resolve any merge conflicts and commit the changes + +If there are no [conflicts](https://www.atlassian.com/git/tutorials/using-branches/merge-conflicts), the `merge` command will automatically reconcile the differences between the two branches with a specific merge strategy it selects. + +If there are changes that need to be resolved, it depends on your development environment. If you're using VS Code, it will automatically parse the files with [conflict markers](https://wincent.com/wiki/Understanding_Git_conflict_markers) and give you a basic UI on top of them to help decide which changes to keep. + +Note that sometimes, you may need to accept both changes and make further revisions manually to ensure that the final merged code is correct and hasn't broken anything / erased any changes. + +When making a manual merge, you will need to commit the changes you have made to perform the merge. Make sure this is done before attempting to push. + +#### Step 5: Push the updated branch + +Check `git log` (or a similar interface in your IDE) to view the most recent commit, and ensure it contains all of the latest merged changes. + +Once you have verified this, you can push your updated branch to the remote. It should now be synchronized with `master`. + +``` +git push +``` + +_Note, if you have not configured a default remote, this command may be something like `git push origin feature/push-notifications`._ diff --git a/README.md b/README.md index d5446558..11a3ebe0 100644 --- a/README.md +++ b/README.md @@ -50,11 +50,13 @@ This will simultaneously launch two processes: - The Prose GraphQL API Server - The local Expo dev server, which will enable you to launch the React Native app from your device -The `quickstart` commands are designed to point at an existing Discourse server, [Discourse Meta](https://meta.discourse.org). +The `quickstart` commands are designed to point at an existing **public** Discourse server, [Discourse Meta](https://meta.discourse.org). Configuring it to point at your own Discourse site will take additional configuration. -You can learn more about this in the [Lexicon Documentation](https://docs.lexicon.is/quick-start). +We guide you through the basics of this in the next section below. + +You can also learn more about this process in detail in the [Lexicon Documentation](https://docs.lexicon.is/quick-start). ## Example: Specifying a custom Discourse Site URL @@ -62,36 +64,52 @@ This is a brief example to demonstrate how to quickly point the project at a cus In the example below, we'll use the [Rust Users forum](https://users.rust-lang.org). -If you'd like, simply change that URL to the URL for your Discourse site in order to follow along with your own site. +You can also follow along using your own site if you'd like. After running `yarn && yarn generate` from the project root, execute the following: ``` $ echo "PROSE_DISCOURSE_HOST=https://users.rust-lang.org" > api/.env -$ echo "MOBILE_PROSE_URL=http://localhost" > frontend/.env ``` -The above statements setup the required environment variables for the Prose GraphQL API and the frontend. +The above command sets the required environment variable for the Prose GraphQL API. + +Next, open up `frontend/Config.ts`, and set the value at `config.localDevelopment.proseUrl` to `http://localhost`. + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost', + }, + // ... +}; +``` + +This instructs the frontend to attempt to connect to a Prose GraphQL API running at `http://localhost`. -- The API (via `PROSE_DISCOURSE_HOST`) has been instructed to attempt to connect to a Discourse instance at `https://users.rust-lang.org`. +To bring it all together: -- The frontend (via `MOBILE_HOST_PROSE`) has been instructed to attempt to connect to a Prose GraphQL API running at `http://localhost` (port 80). +- The frontend (via `localDevelopment.proseUrl`) has been instructed to connect to a Prose GraphQL API running at `http://localhost` (port 80). + +- The Prose GraphQL API (via `PROSE_DISCOURSE_HOST`) has been instructed to connect to a Discourse instance at `https://users.rust-lang.org`. + +- When you launch the Mobile App via [Expo Go](https://expo.dev/client), it will reach out to the API running at `http://localhost`, which will contact the Discourse server at `https://users.rust-lang.org`, and the content of that server will appear in the Mobile App. ### Important Notes -The API default config instructs the server to listen on a hostname of `0.0.0.0` (the public interface) and port 80. +The API's default config instructs the server to listen on a hostname of `0.0.0.0` (the public interface) and port 80. -
The frontend takes some additional steps so that you can use the app on your mobile device... (Read More) +
The frontend takes some additional steps so that you can test the app with Expo Go on your mobile device... (Read More) This may seem confusing at first, but it actually saves you a bit of time. -In this scenario, the frontend app is running on your mobile device via Expo Go, and the Prose GraphQL API is running on your development machine (e.g. laptop). +In this scenario, the frontend app is running on your mobile device via Expo Go, and the Prose GraphQL API is running on your development machine (e.g., your laptop). So, how could we expect the mobile app to be able to locate a server running on a different device, when we have only told the frontend app to attempt to connect to the API on `localhost`? The API isn't running on your mobile device. The traditional way to deal with this is to force you to manually lookup your local IP address on the network that your mobile device is also connected to. It would be a value like `192.168.0.53`. -Then, you'd have to update `frontend/.env` with that value. +Then, you'd have to update `frontend/Config.ts` with that value. Even worse, if your local IP address ever changes, everything would break, and you'd have to update the environment variable again. @@ -126,7 +144,7 @@ forwarding Discourse requests to https://users.rust-lang.org 💡 🧘 Yoga - Running GraphQL Server at http://0.0.0.0:8999/graphql ``` -### Start Expo to run the frontend app +### Start Expo Go to run the frontend app After that, **in a separate shell**, start Expo to run the frontend app: @@ -173,23 +191,3 @@ If you'd like to contribute to it, or just want to browse it locally, you can ru yarn docs:install yarn docs:start ``` - -### Note: Node 16 required - -Our tooling, Docusaurus v2, requires Node version 16 in order to work with it. - -You can check your current Node version by running the following command: - -``` -$ node --version -v14.17.0 -``` - -In order to make this process simpler, we recommend installing [nvm](https://github.com/nvm-sh/nvm) (Node version manager) onto your development machine. - -Then you'll be able to quickly switch between versions without issue: - -``` -$ nvm use 14 -Now using node v14.17.0 (npm v8.15.1) -``` diff --git a/api/.gitignore b/api/.gitignore index a918b7e4..d705776d 100644 --- a/api/.gitignore +++ b/api/.gitignore @@ -3,3 +3,4 @@ node_modules/**/* coverage/ src/generated/ .env +logs/ diff --git a/api/deploy/Dockerfile b/api/deploy/Dockerfile index 14be7558..beef3819 100644 --- a/api/deploy/Dockerfile +++ b/api/deploy/Dockerfile @@ -1,4 +1,4 @@ -FROM keymetrics/pm2:12-alpine +FROM keymetrics/pm2:16-alpine WORKDIR /app @@ -13,6 +13,8 @@ RUN yarn COPY tsconfig.json ./ COPY ./src ./src +RUN yarn generate + RUN yarn build COPY pm2.json . diff --git a/api/docs/logging.md b/api/docs/logging.md new file mode 100644 index 00000000..f0d23d52 --- /dev/null +++ b/api/docs/logging.md @@ -0,0 +1,49 @@ +# Basic Logger + +Last updated: 2023/08/28 + +## Motivation + +The Prose API needs a proper logging solution so that users of Lexicon who deploy it can monitor the service for issues. Based on our research, we decided to use Winston for our logger. Winston logger offers a versatile and efficient solution for logging. With support for multiple transport options, customizable log formatting, and different log levels, Winston provides developers with the flexibility to tailor their logging to specific needs. + +## Setup + +Winston is just a single dependency with the package name [winston](https://github.com/winstonjs/winston), so we added it to the project with `yarn add winston` from within the `api/` directory. + +## Transports + +In logging, a transport is a destination where logs are stored or displayed, such as a file, console, database, etc. In our logging setup, we mainly use the file transport. But during development, we also add the console transport. We chose the file transport because it offers a simple setup that logs directly into a file. We chose this over transports like [Http and Stream](https://github.com/winstonjs/winston/blob/master/docs/transports.md#built-in-to-winston) because server logs can sometimes contains sensitive information, so we don't want expose the logs on the open internet. + +We set up the file transport using a library called [winston-daily-rotate-file](https://github.com/winstonjs/winston-daily-rotate-file), which rotates the log file based on time. In addition to configuring the rotation frequency, we can also specify the maximum file size, the maximum number of files to retain, the number of days to keep files, and more. + +Referring to the guidance provided by the [OWASP Logging Cheatsheet](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html), there are some important points to consider when storing logs in a file system: + +1. It is preferable to use a separate partition than those used by the operating system, other application files and user generated content. +2. Apply strict permissions concerning which users can access the directories, and the permissions of files within the directories. +3. In web applications, the logs should not be exposed in web-accessible locations, and if done so, should have restricted access and be configured with a plain text MIME type (not HTML). + +## Approach + +We make logging easier by directly connecting the logger to the `GraphQL Yoga` instance using a plugin called `useLogger`, which helps us keep all log calls in one central place. + +``` +useLogger({ + logFn: (eventName, events) => { + // Event could be `execute-start` / `execute-end` / `subscribe-start` / `subscribe-end` + // `args` will include the arguments passed to execute/subscribe (in case of "start" event) + // and additional result in case of "end" event. + switch (eventName) { + case 'execute-end': + case 'subscribe-end': + // Do logging + break; + } + }, +}) +``` + +We categorize our logs into two distinct files, one exclusively for 'error' level logs, and the other for a compilation of logs across all levels. + +## Future Improvement + +At the moment, our loggers are mainly used to catch any GraphQL errors that are thrown on the server side. But in the future, we're thinking about logging additional types of server errors, like runtime or network issues. diff --git a/api/docs/typescript.md b/api/docs/typescript.md new file mode 100644 index 00000000..7b582678 --- /dev/null +++ b/api/docs/typescript.md @@ -0,0 +1,14 @@ +# Typescript Usage + +The Prose GraphQL makes use of Typescript in multiple ways: + +- Nexus for schema generation, which generates Typescript types for use in the resolvers +- Manual type definitions +- As of Tuesday, August 15, 2023, we began incrementally adopting usage of [zod](https://github.com/colinhacks/zod) for type definitions and validation +- @ts-reset for additional type safety checks + +Generally, this codebase strives to be as type-safe as possible, and we are always improving upon this. + +The original implementation was not very careful with types, and as such there are still cases of implicit any, type assertions, and other bad practices. + +Our adoption of tools like zod and @ts-reset are intended to help progressively address lingering type saftey issues. diff --git a/api/package.json b/api/package.json index eca1edb6..3f57cdc3 100644 --- a/api/package.json +++ b/api/package.json @@ -3,49 +3,63 @@ "version": "1.0.0", "scripts": { "start": "yarn build && node lib/index.js", - "quickstart": "yarn generate && env PROSE_DISCOURSE_HOST=https://meta.discourse.org PROSE_APP_HOSTNAME=0.0.0.0 PROSE_APP_PORT=8929 ts-node-dev --no-notify --respawn --transpile-only src/index.ts", + "quickstart": "yarn generate && cross-env PROSE_DISCOURSE_HOST=https://meta.discourse.org PROSE_APP_HOSTNAME=0.0.0.0 PROSE_APP_PORT=8929 ts-node-dev --no-notify --respawn --transpile-only src/index.ts", "dev": "yarn generate && ts-node-dev --no-notify --respawn --transpile-only src/index.ts", "typecheck": "tsc --noEmit -p .", "format": "prettier --write \"src/**/*.{ts,tsx}\"", "format:check": "prettier --check \"src/**/*.{ts,tsx}\"", - "generate:schema": "env SKIP_VALIDATION=true ts-node --transpile-only src/schema.ts", + "generate:schema": "cross-env SKIP_VALIDATION=true ts-node --transpile-only src/schema.ts", "generate": "yarn generate:schema", "lint": "eslint --max-warnings 0 \"src/**/*.{ts,tsx}\"", - "jest": "env PROSE_DISCOURSE_HOST=https://meta.discourse.org jest --coverage --passWithNoTests", + "jest": "cross-env PROSE_DISCOURSE_HOST=https://meta.discourse.org jest --coverage --passWithNoTests", "test": "yarn lint && yarn typecheck && yarn format:check && yarn build && yarn jest", "build": "tsc --outDir lib/" }, "dependencies": { - "@nexus/schema": "^0.15.0", + "@envelop/core": "^1.0.3", + "@graphql-authz/core": "^1.2.1", + "@graphql-authz/envelop-plugin": "^1.0.3", + "@graphql-yoga/node": "^2.13.8", "axios": "^0.21.2", "axios-cookiejar-support": "^1.0.0", "camelcase-keys": "^6.2.2", "dotenv": "^8.2.0", - "form-data": "^3.0.0", - "graphql-shield": "6.1.0", - "graphql-upload": "8.0.7", - "graphql-yoga": "^1.18.3", + "form-data": "^4.0.0", + "graphql": "^16.5.0", + "nexus": "^1.4.0-next.11", "querystring": "^0.2.0", + "set-cookie-parser": "^2.5.1", "snakecase-keys": "^3.2.0", - "tough-cookie": "^4.0.0" + "tough-cookie": "^4.1.3", + "winston": "^3.10.0", + "winston-daily-rotate-file": "^4.7.1", + "zod": "^3.22.0" }, "devDependencies": { + "@total-typescript/ts-reset": "^0.4.2", "@types/form-data": "^2.5.0", - "@types/graphql-upload": "^8.0.3", "@types/jest": "^26.0.9", "@types/node": "^14.0.27", + "@types/set-cookie-parser": "^2.4.2", "@types/tough-cookie": "^4.0.0", "@types/ws": "^7.2.6", + "cross-env": "^7.0.3", "eslint": "^7.6.0", - "eslint-config-kodefox": "^0.2.2", + "eslint-config-kodefox": "^1.2.0", "jest": "^26.2.2", "prettier": "^2.0.5", "ts-jest": "^26.1.4", "ts-node-dev": "^1.0.0-pre.56", - "typescript": "^3.9.7" + "typescript": "4.7.4" }, "eslintConfig": { - "extends": "kodefox" + "extends": "kodefox", + "rules": { + "operator-assignment": [ + "warn", + "always" + ] + } }, "prettier": { "singleQuote": true, diff --git a/api/reset.d.ts b/api/reset.d.ts new file mode 100644 index 00000000..faedef42 --- /dev/null +++ b/api/reset.d.ts @@ -0,0 +1,2 @@ +// Do not add any other lines of code to this file! +import '@total-typescript/ts-reset'; diff --git a/api/src/__tests__/api.ts b/api/src/__tests__/api.ts new file mode 100644 index 00000000..46b5c501 --- /dev/null +++ b/api/src/__tests__/api.ts @@ -0,0 +1,21 @@ +import { DEFAULT_PROSE_APP_PORT, getAppPort } from '../constants'; + +describe('getAppPort', () => { + it('should return the default port value when the params are undefined', () => { + expect(getAppPort(undefined, undefined)).toEqual(DEFAULT_PROSE_APP_PORT); + }); + it('should return one of the params in number when the other one is undefined', () => { + expect(getAppPort('8929', undefined)).toEqual(8929); + expect(getAppPort(undefined, '8929')).toEqual(8929); + }); + it('should return the first param in number when both params are provided', () => { + expect(getAppPort('8929', '1234')).toEqual(8929); + }); + it('should return the number param when the other one is not a number', () => { + expect(getAppPort('8929', 'lexicon')).toEqual(8929); + expect(getAppPort('lexicon', '1234')).toEqual(1234); + }); + it('should return the default port value when both params are not numbers', () => { + expect(getAppPort('lexicon', 'cool')).toEqual(DEFAULT_PROSE_APP_PORT); + }); +}); diff --git a/api/src/__tests__/getPosterTypeDetails.ts b/api/src/__tests__/getPosterTypeDetails.ts new file mode 100644 index 00000000..b391bb45 --- /dev/null +++ b/api/src/__tests__/getPosterTypeDetails.ts @@ -0,0 +1,133 @@ +import { getPosterTypeDetails } from '../helpers/getPosterTypeDetails'; + +describe('getPosterTypeDetails', () => { + describe('English', () => { + it('handles a string where original poster is not first', () => { + const result = getPosterTypeDetails('Frequent Poster, Original Poster'); + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: true, + isMostRecentPoster: false, + }); + }); + it('handles uppercase', () => { + const result = getPosterTypeDetails('ORIGINAL POSTER'); + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: false, + isMostRecentPoster: false, + }); + }); + it('handles lowercase', () => { + const result = getPosterTypeDetails( + 'original poster, most recent poster', + ); + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: false, + isMostRecentPoster: true, + }); + }); + it('handles empty string', () => { + const result = getPosterTypeDetails(''); + expect(result).toEqual({ + isAuthor: false, + isFrequentPoster: false, + isMostRecentPoster: false, + }); + }); + it('handles all three types', () => { + const result = getPosterTypeDetails( + 'original poster, most recent poster, frequent poster', + ); + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: true, + isMostRecentPoster: true, + }); + }); + it('handles multiple spaces between entries', () => { + const result = getPosterTypeDetails( + ' original poster, most recent poster, frequent poster ', + ); + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: true, + isMostRecentPoster: true, + }); + }); + + it('handles empty string', () => { + const result = getPosterTypeDetails(''); + expect(result).toEqual({ + isAuthor: false, + isFrequentPoster: false, + isMostRecentPoster: false, + }); + }); + }); + describe('Simplified Chinese', () => { + it('handles a string where original poster is not first', () => { + const result = getPosterTypeDetails('频繁发帖人、原始发帖人'); + + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: true, + isMostRecentPoster: false, + }); + }); + + it('handles all three types', () => { + const result = getPosterTypeDetails( + '原始发帖人、 最新发帖人、 频繁发帖人', + ); + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: true, + isMostRecentPoster: true, + }); + }); + it('handles multiple spaces between entries', () => { + const result = getPosterTypeDetails( + ' 原始发帖人、 最新发帖人、 频繁发帖人 ', + ); + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: true, + isMostRecentPoster: true, + }); + }); + }); + describe('Traditional Chinese', () => { + it('handles a string where original poster is not first', () => { + const result = getPosterTypeDetails('頻繁發文者、原始作者'); + + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: true, + isMostRecentPoster: false, + }); + }); + + it('handles all three types', () => { + const result = getPosterTypeDetails( + '原始作者、 當前大部分貼文作者、 頻繁發文者', + ); + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: true, + isMostRecentPoster: true, + }); + }); + it('handles multiple spaces between entries', () => { + const result = getPosterTypeDetails( + ' 原始作者、 當前大部分貼文作者、 頻繁發文者 ', + ); + expect(result).toEqual({ + isAuthor: true, + isFrequentPoster: true, + isMostRecentPoster: true, + }); + }); + }); +}); diff --git a/api/src/__tests__/getTopicAuthor.ts b/api/src/__tests__/getTopicAuthor.ts new file mode 100644 index 00000000..4f693d69 --- /dev/null +++ b/api/src/__tests__/getTopicAuthor.ts @@ -0,0 +1,100 @@ +import { + getTopicAuthor, + getTopicAuthorUserId, +} from '../helpers/getTopicAuthor'; +import { TopicPoster } from '../types'; + +function getUserWithId( + userId: number | null, + description: string, +): TopicPoster { + return { + userId, + description, + extras: null, + user: null, + }; +} + +function getUserWithObject(userId: number, description: string): TopicPoster { + return { + ...getUserWithId(null, description), + user: { + id: userId, + username: 'bill', + name: 'Bill', + avatarTemplate: 'avatar.jpg', + }, + }; +} + +describe('getTopicAuthor', () => { + it('returns the author of the topic when present', () => { + const posters: Array = [ + getUserWithId(1, 'Frequent Poster'), + getUserWithId(2, 'Most Recent Poster'), + getUserWithId(3, 'Frequent Poster, Original Poster'), + ]; + + expect(getTopicAuthor(posters)).toEqual(posters[2]); + }); + + it('returns the first author when multiple are somehow present', () => { + const posters: Array = [ + getUserWithId(1, 'Original Poster'), + getUserWithId(2, 'Most Recent Poster'), + getUserWithId(3, 'Frequent Poster, Original Poster'), + ]; + + expect(getTopicAuthor(posters)).toEqual(posters[0]); + }); + + it('returns undefined when no author is present', () => { + const posters: Array = [ + getUserWithId(1, 'Frequent Poster'), + getUserWithId(2, 'Frequent Poster'), + getUserWithId(3, 'Frequent Poster, Most Recent Poster'), + ]; + + expect(getTopicAuthor(posters)).toBeUndefined(); + }); + + it('returns undefined for an empty array', () => { + expect(getTopicAuthor([])).toBeUndefined(); + }); +}); + +describe('getTopicAuthorUserId', () => { + it(`returns the author's userId when present`, () => { + const posters: Array = [ + getUserWithId(1, 'Frequent Poster'), + getUserWithId(2, 'Most Recent Poster'), + getUserWithId(3, 'Frequent Poster, Original Poster'), + ]; + expect(getTopicAuthorUserId(posters)).toEqual(3); + }); + + it(`returns the author's user.id when present`, () => { + const posters: Array = [ + getUserWithId(1, 'Frequent Poster'), + getUserWithId(2, 'Most Recent Poster'), + getUserWithObject(3, 'Frequent Poster, Original Poster'), + ]; + expect(getTopicAuthorUserId(posters)).toEqual(3); + }); + + it(`prefers the author's userId when the user object is set too`, () => { + const posters: Array = [ + getUserWithId(1, 'Frequent Poster'), + getUserWithId(2, 'Most Recent Poster'), + { + ...getUserWithObject( + Number.MAX_VALUE, + 'Frequent Poster, Original Poster', + ), + userId: 3, + }, + ]; + expect(getTopicAuthorUserId(posters)).toEqual(3); + }); +}); diff --git a/api/src/__tests__/getTopicPostPath.ts b/api/src/__tests__/getTopicPostPath.ts index 42bb0d8c..214f8f0c 100644 --- a/api/src/__tests__/getTopicPostPath.ts +++ b/api/src/__tests__/getTopicPostPath.ts @@ -1,33 +1,13 @@ import { getTopicPostPath } from '../helpers'; -it('Have input post and pointer', () => { - const inputPost = [2, 3, 4]; - const postPointer = 2; - const expectedOutput = '/posts'; - let topicUrl = getTopicPostPath(inputPost, postPointer); - expect(topicUrl).toEqual(expectedOutput); +it('should return posts when the input is array of numbers', () => { + expect(getTopicPostPath([2, 3, 4])).toEqual('/posts'); }); -it('Have input post without pointer', () => { - const inputPost = [2, 3, 4]; - const postPointer = undefined; - const expectedOutput = '/posts'; - let topicUrl = getTopicPostPath(inputPost, postPointer); - expect(topicUrl).toEqual(expectedOutput); +it('should return post pointer when the input is number', () => { + expect(getTopicPostPath(2)).toEqual('/2'); }); -it('Have input post pointer', () => { - const inputPost = undefined; - const postPointer = 2; - const expectedOutput = '/2'; - let topicUrl = getTopicPostPath(inputPost, postPointer); - expect(topicUrl).toEqual(expectedOutput); -}); - -it('Does not have input', () => { - const inputPost = undefined; - const postPointer = undefined; - const expectedOutput = ''; - let topicUrl = getTopicPostPath(inputPost, postPointer); - expect(topicUrl).toEqual(expectedOutput); +it('should return empty string when the input is undefined', () => { + expect(getTopicPostPath(undefined)).toEqual(''); }); diff --git a/api/src/__tests__/getUpdatedLikedTopic.ts b/api/src/__tests__/getUpdatedLikedTopic.ts new file mode 100644 index 00000000..df01eea1 --- /dev/null +++ b/api/src/__tests__/getUpdatedLikedTopic.ts @@ -0,0 +1,30 @@ +import { getUpdatedLikedTopic } from '../helpers'; + +const likeCount = 5; +const currentLikedTopicResponse = { + id: 12, + topicId: 1, + liked: false, + postId: 2, + likeCount, +}; + +it('should increase likeCount and return data in LikedTopic response', () => { + expect( + getUpdatedLikedTopic({ currentLikedTopicResponse, isLiked: true }), + ).toEqual({ + ...currentLikedTopicResponse, + liked: true, + likeCount: likeCount + 1, + }); +}); + +it('should decrease likeCount and return data in LikedTopic response', () => { + expect( + getUpdatedLikedTopic({ currentLikedTopicResponse, isLiked: false }), + ).toEqual({ + ...currentLikedTopicResponse, + liked: false, + likeCount: likeCount - 1, + }); +}); diff --git a/api/src/__tests__/processRawContent.ts b/api/src/__tests__/processRawContent.ts index 076a62e0..beebca59 100644 --- a/api/src/__tests__/processRawContent.ts +++ b/api/src/__tests__/processRawContent.ts @@ -1,24 +1,26 @@ -import { getPostImageUrl } from '../helpers'; +import { + generateMarkdownContent, + getCompleteImageVideoUrls, + getEmojiImageUrls, +} from '../helpers'; -describe('getPostImageUrl return image urls from html tags', () => { - it('should return last url from srcset in img tag', () => { +describe('getCompleteImageUrls return image urls from html tags', () => { + it('should return the last url from srcset in img tag if any', () => { expect( - getPostImageUrl( + getCompleteImageVideoUrls( ` \"capacitor-example.jpg\" - \"capacitor-example.jpg\" `, ), ).toEqual([ 'https://wiki.kfox.io/uploads/default/optimized/example_2_666x1000.jpeg', - 'https://wiki.kfox.io/uploads/default/optimized/example_2_666x1000.jpg', ]); }); it('should return image url in anchor tag if no srcset found', () => { expect( - getPostImageUrl( + getCompleteImageVideoUrls( ` \"capacitor-example.jpg\" @@ -44,7 +46,7 @@ describe('getPostImageUrl return image urls from html tags', () => { }); it('should return image url in img tag if no anchor tag found', () => { expect( - getPostImageUrl( + getCompleteImageVideoUrls( `

capacitor-example.jpg\ @@ -61,4 +63,126 @@ describe('getPostImageUrl return image urls from html tags', () => { 'https://wiki.kfox.io/example.png', ]); }); + it('should return one image url for each image tag. The url will be from srcset if any, or from href tag if any, or from img src', () => { + expect( + getCompleteImageVideoUrls( + ` +

+ \"download\" +

+
+ + \"sky\" + +
+

+ `, + ), + ).toEqual([ + 'https://wiki.kfox.io/uploads/default/original.jpeg', + 'https://wiki.kfox.io/uploads/default/optimized/1X/test_2_1380x828.jpeg', + 'https://wiki.kfox.io/uploads/default/original/test2.jpeg', + ]); + }); +}); + +describe('generateMarkdownContent returns markdown content with complete urls, obtained from cooked content', () => { + const rawContent = 'Hello Lexicon! ![image](upload://shortUrl.com)'; + const shortImageUrl = '![image](upload://shortUrl.com)'; + const cookedContent = + '

Hello Lexicon!

'; + const markdownContent = + 'Hello Lexicon! ![image](https://wiki.kfox.io/example.png)'; + + it('should return raw content when there are no image urls in cooked content', () => { + expect(generateMarkdownContent(rawContent, '

Hello Lexicon!

')).toBe( + rawContent, + ); + }); + it('should return raw content when there is no short url in raw content', () => { + const rawContentWithNoImage = 'Hello Lexicon!'; + expect(generateMarkdownContent(rawContentWithNoImage, cookedContent)).toBe( + rawContentWithNoImage, + ); + }); + + it('should return raw content with short urls and complete urls when the total number of short urls is more than the complete urls in the cooked data', () => { + expect( + generateMarkdownContent(`${rawContent} ${shortImageUrl}`, cookedContent), + ).toBe(`${markdownContent} ${shortImageUrl}`); + }); + it('should return raw content with no short url when the total number of short urls is less than the complete urls in cooked data', () => { + const completeImageUrl = + ''; + expect( + generateMarkdownContent( + rawContent, + `${cookedContent} ${completeImageUrl}`, + ), + ).toBe(markdownContent); + }); + + it('should return raw content with no short url when the total number of short urls is the same as the complete urls in the cooked data', () => { + expect(generateMarkdownContent(rawContent, cookedContent)).toBe( + markdownContent, + ); + }); + it('should only replace short urls and return raw content with complete urls when there are short and complete urls in raw data', () => { + const completeImageUrl = + '![second image](https://wiki.kfox.io/secondExample.png)'; + const secondCompleteUrlInCooked = + ''; + const secondCompleteUrlInMarkdown = + '![image](https://wiki.kfox.io/example3.png)'; + expect( + generateMarkdownContent( + `${rawContent} ${completeImageUrl} ${shortImageUrl}`, + `${cookedContent} ${secondCompleteUrlInCooked}`, + ), + ).toBe( + `${markdownContent} ${completeImageUrl} ${secondCompleteUrlInMarkdown}`, + ); + }); +}); + +describe('generate emoji url from image tag', () => { + it('it should return image url from image tags', () => { + const content = + ':smile:'; + const content2 = + '

Test. :high_heel: :man:t5:

'; + + const content3 = + ':high_heel:'; + + expect(getEmojiImageUrls(content)).toEqual([ + { + emojiTitle: ':smile:', + emojiUrl: + 'https://kflounge-staging.kfox.io/images/emoji/twitter/smile.png', + }, + ]); + expect(getEmojiImageUrls(content2)).toEqual([ + { + emojiTitle: ':high_heel:', + emojiUrl: + 'https://kflounge-staging.kfox.io/images/emoji/twitter/high_heel.png', + }, + { + emojiTitle: ':man:t5:', + emojiUrl: + 'https://kflounge-staging.kfox.io/images/emoji/twitter/man/5.png', + }, + ]); + expect(getEmojiImageUrls(content3)).toEqual([]); + }); }); diff --git a/api/src/__tests__/resolvers/utils.ts b/api/src/__tests__/resolvers/utils.ts new file mode 100644 index 00000000..ca0226ef --- /dev/null +++ b/api/src/__tests__/resolvers/utils.ts @@ -0,0 +1,119 @@ +import { PROSE_DISCOURSE_HOST } from '../../constants'; +import { + getNormalizedUrlTemplate, + NormalizedUrlTemplateVariant, +} from '../../resolvers/utils'; + +describe('getNormalizedUrlTemplate', () => { + const tests: Array<[string, NormalizedUrlTemplateVariant]> = [ + ['avatarTemplate', 'regularAvatar'], + ['actingAvatarTemplate', 'actingAvatar'], + ['systemAvatarTemplate', 'systemAvatar'], + ['url', 'url'], + ]; + + tests.forEach(([property, variant]) => { + /** + * Helper function to make Typescript happy. Without this, it complains + * about the object not containing at least one of the expected keys. + * + * This occurs even if we annote tests like: + * ``` + * type TemplateField = 'avatarTemplate' | 'actingAvatarTemplate' | ...; + * const tests: [TemplateField, NormalizedUrlTemplateVariant][] = [ ... ]; + * ``` + * + * So instead, we check each case and fallback to the last case of `url` if + * none of the others matched. + */ + function getParameter(url: string) { + if (property === 'avatarTemplate') { + return { avatarTemplate: url }; + } + + if (property === 'actingAvatarTemplate') { + return { actingAvatarTemplate: url }; + } + + if (property === 'systemAvatarTemplate') { + return { systemAvatarTemplate: url }; + } + + return { url }; + } + + describe(property, () => { + it('does not append host when http is already present', () => { + const input = 'https://discourse.host/site/images/1.jpg'; + const parameter = getParameter(input); + + const result = getNormalizedUrlTemplate(parameter, variant); + expect(result).toStrictEqual(input); + }); + + it('appends host when http is not present', () => { + const input = '/thumbnails/32x32/user-5.jpg'; + const parameter = getParameter(input); + + const result = getNormalizedUrlTemplate(parameter, variant); + + expect(result).toStrictEqual(`${PROSE_DISCOURSE_HOST}${input}`); + }); + }); + }); + + it('returns an empty URL when no URL field was provided', () => { + // Justification: ignore the fact that TS won't let us pass an empty + // object just to double-check how it behaves. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const result = getNormalizedUrlTemplate({}, 'url'); + expect(result).toStrictEqual(''); + }); + + it('returns an empty URL when an empty URL was provided', () => { + const result = getNormalizedUrlTemplate({ url: '' }, 'url'); + expect(result).toStrictEqual(''); + }); + + it('returns an empty URL when the variant does not match the URL field', () => { + const input = '/images/1.jpg'; + const result = getNormalizedUrlTemplate( + { systemAvatarTemplate: input }, + 'actingAvatar', + ); + expect(result).toStrictEqual(''); + }); + + it('defaults the variant to regularAvatar when no variant is provided', () => { + const input = '/images/1.jpg'; + const result = getNormalizedUrlTemplate({ avatarTemplate: input }); + expect(result).toStrictEqual(`${PROSE_DISCOURSE_HOST}${input}`); + }); + + /** PRURLS (Protocol-relative URLs) allow specifying a URL without the protocol. + * For example, https://google.com might be specified as `//google.com`. It is a + * method for linking to a website that offers both HTTP and HTTPS. + * + * The test below tests for what is basically a bug. If we later want to + * support these URLs, we should revamp the function to support checking for + * PRURLs as well. For now, this just serves as an example of how it would + * behave if we encountered one. + */ + it('poorly appends the path for PRURLs', () => { + const result = getNormalizedUrlTemplate( + { url: '//discourse.host/site/images/1.jpg' }, + 'url', + ); + expect(result).toStrictEqual( + 'https://meta.discourse.org//discourse.host/site/images/1.jpg', + ); + }); + + it('handles http:// as expected', () => { + const avatarTemplate = 'http://meta.discourse.org/site/images/1.png'; + const result = getNormalizedUrlTemplate({ avatarTemplate }); + + expect(result).toStrictEqual(avatarTemplate); + }); +}); diff --git a/api/src/client.ts b/api/src/client.ts index 0ac0104d..b9f9e546 100644 --- a/api/src/client.ts +++ b/api/src/client.ts @@ -1,9 +1,17 @@ +import { ServerResponse } from 'http'; + import axios, { AxiosResponse } from 'axios'; import axiosCookieJarSupport from 'axios-cookiejar-support'; import { CookieJar } from 'tough-cookie'; +import setCookie from 'set-cookie-parser'; -import { PROSE_DISCOURSE_HOST } from './constants'; -import { getCsrfSession } from './helpers/auth'; +import { CUSTOM_HEADER_TOKEN, PROSE_DISCOURSE_HOST } from './constants'; +import { + cookiesStringify, + generateToken, + getCsrfSession, + getModifiedUserAgent, +} from './helpers'; export const discourseClient = axios.create({ baseURL: PROSE_DISCOURSE_HOST, @@ -13,8 +21,22 @@ export const discourseClient = axios.create({ axiosCookieJarSupport(discourseClient); discourseClient.defaults.jar = new CookieJar(); -export async function getClient(cookies?: string) { +type GetClientParams = { + cookies?: string; + userAgent?: string; + context: { + request: Request; + response: ServerResponse; + }; +}; + +export async function getClient(params: GetClientParams) { + const { cookies, userAgent, context } = params; let client = discourseClient; + client.defaults.headers = { + 'User-Agent': getModifiedUserAgent(userAgent), + }; + if (cookies) { let { csrf } = await getCsrfSession(cookies); client = axios.create({ @@ -26,10 +48,12 @@ export async function getClient(cookies?: string) { client.defaults.jar = new CookieJar(); client.defaults.headers = { Cookie: cookies, - 'x-csrf-token': csrf, withCredentials: true, + 'User-Agent': getModifiedUserAgent(userAgent), + 'x-csrf-token': csrf, }; } + client.interceptors.response.use( // eslint-disable-next-line @typescript-eslint/no-explicit-any (response: AxiosResponse) => { @@ -38,6 +62,28 @@ export async function getClient(cookies?: string) { throw new Error('Not found or private.'); } + let cookies = response.headers['set-cookie']; + + /** + * This condition is used to check if there is a valid cookie. + * For the cookie to be refreshed, it must contain an _t cookie and + * it ensures that the cookie format is correct, excluding cookies from the login API, + * which uses the `session.json` endpoint. + */ + + if ( + cookies && + // eslint-disable-next-line no-underscore-dangle + setCookie.parse(cookies, { map: true })._t && + !response.request.path.includes('session.json') + ) { + let stringCookie = cookiesStringify(cookies); + let token = generateToken(stringCookie); + + if (!context.response.headersSent) { + context.response.setHeader(CUSTOM_HEADER_TOKEN, token); + } + } return response; }, ); diff --git a/api/src/constants/api.ts b/api/src/constants/api.ts index bc14341e..54d72532 100644 --- a/api/src/constants/api.ts +++ b/api/src/constants/api.ts @@ -10,7 +10,7 @@ import { EXIT_CODE_INVALID_ARGUMENT } from './exitCodes'; const shouldValidate = process.env.SKIP_VALIDATION === undefined; const DEFAULT_PROSE_APP_HOSTNAME = '0.0.0.0'; -const DEFAULT_PROSE_APP_PORT = 80; +export const DEFAULT_PROSE_APP_PORT = 80; // Per Express's requirement, ensure that the hostname does not have the scheme (http://, etc.) // included in it. @@ -38,21 +38,33 @@ if (shouldValidate) { } } -function getAppPort() { - const { PROSE_APP_PORT } = process.env; - if (!PROSE_APP_PORT) { +export function getAppPort(nodePort?: string, prosePort?: string) { + const definedPort = nodePort ?? prosePort; + if (!definedPort) { return DEFAULT_PROSE_APP_PORT; } - const parsed = Number.parseInt(PROSE_APP_PORT, 10); - if (Number.isNaN(parsed)) { + let parsed = Number.parseInt(definedPort, 10); + if (!Number.isNaN(parsed)) { + return parsed; + } + + // Check prose port if the definedPort value is different from prose port + if (!prosePort || definedPort === prosePort) { return DEFAULT_PROSE_APP_PORT; } + parsed = Number.parseInt(prosePort, 10); + if (Number.isNaN(parsed)) { + return DEFAULT_PROSE_APP_PORT; + } return parsed; } -export const PROSE_APP_PORT = getAppPort(); +export const PROSE_APP_PORT = getAppPort( + process.env.PORT, + process.env.PROSE_APP_PORT, +); export const PROSE_APP_HOSTNAME = process.env.PROSE_APP_HOSTNAME ?? DEFAULT_PROSE_APP_HOSTNAME; diff --git a/api/src/constants/discourse.ts b/api/src/constants/discourse.ts new file mode 100644 index 00000000..e723bf3a --- /dev/null +++ b/api/src/constants/discourse.ts @@ -0,0 +1,10 @@ +export const FIRST_POST_NUMBER = 1; +export const LIKE_ACTION_ID = 2; +export const UNCATEGORIZED_CATEGORY_ID = 1; + +export const errorTypes = { + invalidAccess: 'invalid_access', + unauthenticatedAccess: 'not_logged_in', +}; + +export const REFRESH_TOKEN_COOKIE_FIELD = '_t='; diff --git a/api/src/constants/errorMessage.ts b/api/src/constants/errorMessage.ts index 76184e93..d476702a 100644 --- a/api/src/constants/errorMessage.ts +++ b/api/src/constants/errorMessage.ts @@ -1,3 +1,5 @@ export const EditPostError = 'That post was created too long ago. It can no longer be edited or deleted.'; export const ChangeUsernameError = 'Username must be unique'; +export const privateTopic = + 'The topic cannot be accessed as it is a private topic.'; diff --git a/api/src/constants/index.ts b/api/src/constants/index.ts index c3ba396d..2f7adb64 100644 --- a/api/src/constants/index.ts +++ b/api/src/constants/index.ts @@ -1,4 +1,5 @@ export * from './api'; +export * from './discourse'; export * from './errorMessage'; export * from './exitCodes'; export * from './server'; diff --git a/api/src/constants/server.ts b/api/src/constants/server.ts index dd9170aa..e84b3600 100644 --- a/api/src/constants/server.ts +++ b/api/src/constants/server.ts @@ -5,5 +5,11 @@ config(); const ACCEPTED_LANGUAGE = 'en-US'; const CONTENT_FORM_URLENCODED = 'application/x-www-form-urlencoded'; const CONTENT_JSON = 'application/json'; +const CUSTOM_HEADER_TOKEN = 'X-Prose-Latest-Token'; -export { ACCEPTED_LANGUAGE, CONTENT_FORM_URLENCODED, CONTENT_JSON }; +export { + ACCEPTED_LANGUAGE, + CONTENT_FORM_URLENCODED, + CONTENT_JSON, + CUSTOM_HEADER_TOKEN, +}; diff --git a/api/src/helpers/auth.ts b/api/src/helpers/auth.ts index 07fa43de..a266a5a5 100644 --- a/api/src/helpers/auth.ts +++ b/api/src/helpers/auth.ts @@ -8,6 +8,7 @@ import { discourseClient } from '../client'; import { CONTENT_FORM_URLENCODED } from '../constants'; import { cookiesStringify } from './cookiesStringify'; +import { SessionExpiredError } from './customErrors'; async function getCsrfSession(cookies?: string) { let { @@ -29,7 +30,7 @@ type Credentials = { secondFactorToken?: string | null; }; type CsrfSession = { csrf: string; initialSessionCookie: string }; -type AuthRequest = Credentials & CsrfSession; +type AuthRequest = Credentials & CsrfSession & { client: AxiosInstance }; function generateToken(cookies: string) { const buffer = Buffer.from(cookies); @@ -38,11 +39,12 @@ function generateToken(cookies: string) { return token; } -function decodeToken(token?: string) { +function decodeToken(token: string | null) { if (!token) { return ''; } - const base64TokenRegex = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/; + const base64TokenRegex = + /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/; let isValidToken = base64TokenRegex.test(token); if (!isValidToken) { return ''; @@ -61,6 +63,7 @@ async function authenticate(authRequest: AuthRequest) { login, password, secondFactorToken, + client, } = authRequest; let config = { @@ -80,11 +83,7 @@ async function authenticate(authRequest: AuthRequest) { } let body = stringify({ login, password, ...secondFactorLogin }); - let { data, headers } = await discourseClient.post( - '/session.json', - body, - config, - ); + let { data, headers } = await client.post('/session.json', body, config); let { error, failed } = data; if (failed) { return { @@ -116,19 +115,13 @@ async function getHpChallenge(csrfSession: CsrfSession) { }; let data; let headers; - let { - data: oldVersionData, - headers: oldVersionHeaders, - } = await discourseClient.get('/users/hp.json', config); - let { - errors: oldVersionErrors, - error_type: oldVersionErrorType, - } = oldVersionData; + let { data: oldVersionData, headers: oldVersionHeaders } = + await discourseClient.get('/users/hp.json', config); + let { errors: oldVersionErrors, error_type: oldVersionErrorType } = + oldVersionData; if (oldVersionErrors && oldVersionErrorType === 'not_found') { - let { - data: newVersionData, - headers: newVersionHeaders, - } = await discourseClient.get('/session/hp.json', config); + let { data: newVersionData, headers: newVersionHeaders } = + await discourseClient.get('/session/hp.json', config); data = newVersionData; headers = newVersionHeaders; } else { @@ -151,7 +144,7 @@ async function getHpChallenge(csrfSession: CsrfSession) { async function checkSession(authClient: AxiosInstance) { let sessionCookie: string = authClient.defaults.headers.Cookie; if (!sessionCookie) { - throw new Error('Session not found.'); + throw new SessionExpiredError(); } try { let { data, headers } = await authClient.get('/session/current.json'); @@ -173,7 +166,7 @@ async function checkSession(authClient: AxiosInstance) { token, }; } catch (e) { - throw new Error('Session not found.'); + throw new SessionExpiredError(); } } diff --git a/api/src/helpers/cookiesStringify.ts b/api/src/helpers/cookiesStringify.ts index bbe36780..d6d8cc7f 100644 --- a/api/src/helpers/cookiesStringify.ts +++ b/api/src/helpers/cookiesStringify.ts @@ -1,12 +1,18 @@ +import setCookie from 'set-cookie-parser'; + export function cookiesStringify(cookies: Array) { let cookieString = ''; if (Array.isArray(cookies)) { for (let cookie of cookies) { - cookieString = cookieString + cookie + ';'; + cookieString = cookieString + joinCookieString(cookie) + ';'; } } if (typeof cookies === 'string') { - cookieString = cookies; + cookieString = joinCookieString(cookies); } return cookieString; } + +function joinCookieString(cookie: string): string { + return setCookie.splitCookiesString(cookie).join(';'); +} diff --git a/api/src/helpers/customErrors.ts b/api/src/helpers/customErrors.ts new file mode 100644 index 00000000..58219f0c --- /dev/null +++ b/api/src/helpers/customErrors.ts @@ -0,0 +1,15 @@ +export class AuthorizationError extends Error { + constructor() { + super('Authorization Failed'); + } +} +export class SessionExpiredError extends Error { + constructor() { + super('Session Expired'); + } +} +export class InvalidAccessError extends Error { + constructor() { + super('Invalid Access'); + } +} diff --git a/api/src/helpers/errorHandler.ts b/api/src/helpers/errorHandler.ts index 2a55e5f8..7ccf7016 100644 --- a/api/src/helpers/errorHandler.ts +++ b/api/src/helpers/errorHandler.ts @@ -1,21 +1,39 @@ import { AxiosError } from 'axios'; -import { ChangeUsernameError, EditPostError } from '../constants'; +import { ChangeUsernameError, EditPostError, errorTypes } from '../constants'; -export function errorHandler(e: AxiosError) { +import { + AuthorizationError, + SessionExpiredError, + InvalidAccessError, +} from './customErrors'; + +export function errorHandler(unknownError: unknown) { + const e = unknownError as AxiosError; let status = e.response?.status; let errors = e.response?.data?.errors; + let errorType = e.response?.data?.error_type; let failed = e.response?.data?.failed; + let cookie = e.response?.config.headers.Cookie; if (errors) { - if (errors === EditPostError) { - throw new Error( - 'This post can no longer be edited because it was created more than 30 days ago.', - ); + if (errors[0] === EditPostError) { + throw new Error("You've passed the time limit to edit this post."); } if (Array.isArray(errors) && errors[0] === ChangeUsernameError) { throw new Error('This username is already taken'); } + const { invalidAccess, unauthenticatedAccess } = errorTypes; + if (errorType === invalidAccess) { + throw new InvalidAccessError(); + } + if (errorType === unauthenticatedAccess) { + // If the token was provided and we encountered one of these errors, it means the token was invalid + if (cookie?.includes('_t=')) { + throw new SessionExpiredError(); + } + throw new AuthorizationError(); + } throw new Error(errors); } if (failed) { diff --git a/api/src/helpers/fetchLikeActivities.ts b/api/src/helpers/fetchLikeActivities.ts new file mode 100644 index 00000000..c42233a0 --- /dev/null +++ b/api/src/helpers/fetchLikeActivities.ts @@ -0,0 +1,42 @@ +import camelcaseKeys from 'camelcase-keys'; +import { AxiosInstance } from 'axios'; + +import { UserAction } from '../types'; + +type Params = { + username: string; + client: AxiosInstance; +}; + +export const USER_ACTIONS_URL = '/user_actions.json'; +const LIKE_POST_FILTER = '1'; +const PAGE_SIZE = 30; + +export async function fetchLikeActivities(params: Params) { + const { username, client } = params; + + let hasMore = true; + let userActions: Array = []; + let currentOffset = 0; + + while (hasMore) { + const fetchConfig = { + params: { + username, + filter: LIKE_POST_FILTER, + offset: currentOffset, + }, + }; + const { data: userActivityResult } = await client.get( + USER_ACTIONS_URL, + fetchConfig, + ); + const currentUserActions = userActivityResult.user_actions; + currentOffset += PAGE_SIZE; + userActions = [...userActions, ...currentUserActions]; + if (currentUserActions.length < PAGE_SIZE) { + hasMore = false; + } + } + return camelcaseKeys(userActions, { deep: true }); +} diff --git a/api/src/helpers/fetchPost.ts b/api/src/helpers/fetchPost.ts new file mode 100644 index 00000000..f288e4a6 --- /dev/null +++ b/api/src/helpers/fetchPost.ts @@ -0,0 +1,21 @@ +import { AxiosInstance } from 'axios'; +import camelcaseKeys from 'camelcase-keys'; + +import { ACCEPTED_LANGUAGE } from '../constants'; + +type Params = { + client: AxiosInstance; + postId: number; +}; + +const config = { + headers: { 'Accept-Language': ACCEPTED_LANGUAGE }, + params: { include_raw: true }, +}; + +export async function fetchPost(params: Params) { + const { client, postId } = params; + let url = `/posts/${postId}.json`; + let { data } = await client.get(url, config); + return camelcaseKeys(data, { deep: true }); +} diff --git a/api/src/helpers/getModifiedUserAgent.ts b/api/src/helpers/getModifiedUserAgent.ts new file mode 100644 index 00000000..b108fafe --- /dev/null +++ b/api/src/helpers/getModifiedUserAgent.ts @@ -0,0 +1,26 @@ +const mobileDevices = ['Android', 'Mobile', 'iPad', 'iPhone', 'iPod']; + +/** + * Returns a string for the `User Agent` header. + * Discourse uses the `User Agent` header to log recently used + * devices in the Discourse web app. The `User Agent` header + * contains information about the browser, the OS, and the device. + * We set the browser default fallback to `DiscourseHub`, because + * it isn't provided when a request is received from the mobile app. + * `DiscourseHub` is chosen because it is what Discourse's mobile app + * uses, and it is the closest `User Agent` string supported by Discourse. + * + * @param originalUserAgent - The original `User Agent` value from the request header + * @returns Modified `User Agent` + */ + +export function getModifiedUserAgent(originalUserAgent?: string) { + if (!originalUserAgent) { + return ''; + } + + let isMobile = mobileDevices.some((device) => + originalUserAgent?.includes(device), + ); + return `${originalUserAgent} ${isMobile ? 'DiscourseHub' : ''}`; +} diff --git a/api/src/helpers/getPosterTypeDetails.ts b/api/src/helpers/getPosterTypeDetails.ts new file mode 100644 index 00000000..fd5154b8 --- /dev/null +++ b/api/src/helpers/getPosterTypeDetails.ts @@ -0,0 +1,41 @@ +import { z } from 'zod'; + +import { getPosterType, i18nSeparatorsRegex } from '../locale'; +import { + FrequentPoster, + MostRecentPoster, + OriginalPoster, + UnknownPosterType, +} from '../types'; + +export const PosterTypeDetails = z.object({ + isAuthor: z.boolean(), + isFrequentPoster: z.boolean(), + isMostRecentPoster: z.boolean(), +}); +export type PosterTypeDetails = z.infer; + +export function getPosterTypeDetails(description: string): PosterTypeDetails { + if (!description) { + return { + isAuthor: false, + isFrequentPoster: false, + isMostRecentPoster: false, + }; + } + + const items = description.split(i18nSeparatorsRegex); + + const posterTypes = items.map((item) => { + const lowercased = item.toLowerCase().trim(); + const knownMatch = getPosterType(lowercased); + + return knownMatch ?? UnknownPosterType.value; + }); + + return { + isAuthor: posterTypes.includes(OriginalPoster.value), + isFrequentPoster: posterTypes.includes(FrequentPoster.value), + isMostRecentPoster: posterTypes.includes(MostRecentPoster.value), + }; +} diff --git a/api/src/helpers/getTopicAuthor.ts b/api/src/helpers/getTopicAuthor.ts new file mode 100644 index 00000000..54a275e5 --- /dev/null +++ b/api/src/helpers/getTopicAuthor.ts @@ -0,0 +1,20 @@ +import { TopicPoster } from '../types'; + +import { getPosterTypeDetails } from './getPosterTypeDetails'; + +export function getTopicAuthor( + posters: Readonly>, +): TopicPoster | undefined { + return posters.find((poster) => { + const { isAuthor } = getPosterTypeDetails(poster.description); + return isAuthor; + }); +} + +export function getTopicAuthorUserId( + posters: Readonly>, +): number | undefined { + const author = getTopicAuthor(posters); + + return author?.userId ?? author?.user?.id; +} diff --git a/api/src/helpers/getTopicPostPath.ts b/api/src/helpers/getTopicPostPath.ts deleted file mode 100644 index 49c5ecba..00000000 --- a/api/src/helpers/getTopicPostPath.ts +++ /dev/null @@ -1,9 +0,0 @@ -export function getTopicPostPath( - post?: Array | null, - postPointer?: number | null, -) { - if (post) { - return '/posts'; - } - return postPointer ? `/${postPointer}` : ''; -} diff --git a/api/src/helpers/getUpdatedLikedTopic.ts b/api/src/helpers/getUpdatedLikedTopic.ts new file mode 100644 index 00000000..5e19c697 --- /dev/null +++ b/api/src/helpers/getUpdatedLikedTopic.ts @@ -0,0 +1,18 @@ +import { LikedTopic } from '../types'; + +type Params = { + currentLikedTopicResponse: LikedTopic; + isLiked: boolean; +}; + +export function getUpdatedLikedTopic(params: Params) { + const { currentLikedTopicResponse, isLiked: liked } = params; + + const { likeCount: prevLikeCount } = currentLikedTopicResponse; + const likeCount = liked ? prevLikeCount + 1 : prevLikeCount - 1; + return { + ...currentLikedTopicResponse, + likeCount, + liked, + }; +} diff --git a/api/src/helpers/index.ts b/api/src/helpers/index.ts index 489732e0..66448a4a 100644 --- a/api/src/helpers/index.ts +++ b/api/src/helpers/index.ts @@ -1,8 +1,13 @@ export * from './auth'; export * from './cookiesStringify'; +export * from './customErrors'; export * from './errorHandler'; -export * from './getTopicPostPath'; +export * from './fetchLikeActivities'; +export * from './fetchPost'; +export * from './getModifiedUserAgent'; export * from './getTopicTimings'; +export * from './getUpdatedLikedTopic'; export * from './parseTopicUrl'; export * from './privateMessagesMerger'; export * from './processRawContent'; +export * from './topicDetail'; diff --git a/api/src/helpers/likeErroHandler.ts b/api/src/helpers/likeErroHandler.ts new file mode 100644 index 00000000..19bbbe96 --- /dev/null +++ b/api/src/helpers/likeErroHandler.ts @@ -0,0 +1,53 @@ +import { AxiosError } from 'axios'; + +import { LIKE_ACTION_ID } from '../constants'; +import { ActionsSummary } from '../types'; + +export type LikableEntity = 'post' | 'topic'; +type Params = { + actionsSummary: ActionsSummary | null; + likableEntity: LikableEntity; + like: boolean; +}; + +/** + * Custom Like Error Handler- + * Discourse provides unhelpful error message for this matter. + * This function checks the actions summary of the post + * to find the reason why the like action failed. + */ +export function likeErrorHandler(e: AxiosError, params: Params) { + let { actionsSummary, likableEntity, like } = params; + + const likeActionSummary = actionsSummary?.find( + (actionSummary: { id: number }) => actionSummary.id === LIKE_ACTION_ID, + ); + + // Like action summary is not provided for the post author + if (!likeActionSummary) { + throw new Error( + `You're not permitted to do like actions to your own ${likableEntity}.`, + ); + } + + const { acted: prevLiked = false, canUndo: canUnlike = false } = + likeActionSummary; + + // Proposed action and current like state is the same + if (like === prevLiked) { + throw new Error( + like + ? `You've liked this ${likableEntity} before.` + : `You can't unlike a ${likableEntity} you haven't liked before.`, + ); + } + // Already passed the time limit to unlike + if (!like && !canUnlike) { + throw new Error( + `You've passed the time limit to unlike this ${likableEntity}.`, + ); + } + + // Throw handled error from Discourse, such as too many actions error + throw e; +} diff --git a/api/src/helpers/processRawContent.ts b/api/src/helpers/processRawContent.ts index b1c58e22..7656dae1 100644 --- a/api/src/helpers/processRawContent.ts +++ b/api/src/helpers/processRawContent.ts @@ -1,10 +1,20 @@ +import '@total-typescript/ts-reset'; + import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; -const imageRegex = //g; -const anchoredImageRegex = //g; +const imageRegex = //g; const srcSetRegex = /srcset="(.+?)"/g; const imageUrlRegex = /(https?:\/\/[^ ]*\.(?:jpe?g|png|gif|heic|heif))/g; const mentionRegex = /@(.*?)<\/a>/g; +const imageMarkdownRegex = /(!\[.*?\]\()(upload:\/\/\S*)(\))/g; +const imageVideoTagRegex = + /(?:]*src(?:set)?=")(.+?)"|(?:]* href="(https?:\/\/[^ ]*\.(?:jpe?g|png|gif|heic|heif|mov|mp4|webm|avi|wmv|flv|webp))")([^$]+?)<\/a>/g; + +const emojiBBCodeRegex = /(?<=^|\s):\w+:(?:t\d+:)?/g; +const emojiImageTagRegex = //g; +const emojiTitleRegex = /title="([^"]+)"/g; function handleRegexResult( result: RegExpMatchArray, @@ -26,7 +36,7 @@ function handleRegexResult( }); return optimizedUrl.map((item) => item.replace(transparantRegex, '')); } else if ( - regex === anchoredImageRegex || + regex === anchoredImageVideoRegex || regex === imageRegex || regex === mentionRegex ) { @@ -35,26 +45,118 @@ function handleRegexResult( } } +export function getCompleteImageVideoUrls( + content: string, + host: string = PROSE_DISCOURSE_UPLOAD_HOST, +): Array | undefined { + // Get all image tags in content + let imageVideoTags = content.match(imageVideoTagRegex); + // Get complete url from each image tag + return imageVideoTags?.map((imageVideoTag) => + getPostImageUrl(imageVideoTag, host), + ); +} + export function getPostImageUrl( content: string, host: string = PROSE_DISCOURSE_UPLOAD_HOST, -): Array | undefined { +): string | undefined { + // Return only the first element of array because only one url is found let result = content.match(srcSetRegex) ?? undefined; + if (result) { - return handleRegexResult(result, host, srcSetRegex); + return handleRegexResult(result, host, srcSetRegex)?.[0]; } - result = content.match(anchoredImageRegex) ?? undefined; + result = content.match(anchoredImageVideoRegex) ?? undefined; if (result) { - return handleRegexResult(result, host, anchoredImageRegex); + return handleRegexResult(result, host, anchoredImageVideoRegex)?.[0]; } result = content.match(imageRegex) ?? undefined; + if (result) { - return handleRegexResult(result, host, imageRegex); + return handleRegexResult(result, host, imageRegex)?.[0]; } } +type EmojiResult = { emojiUrl: string; emojiTitle: string }; + +/** + * Converts list of emoji image tags into an array of objects containing the URL and name of each emoji image. + * Example: + * Input: ":smile:" + * Output: [{emojiUrl: "https://kflounge-staging.kfox.io/images/emoji/twitter/smile.png",emojiTitle: ":smile:"}] + * + * @param {string} content - The input string containing img tags for emoji images. + * @returns {Array<{emojiUrl: string, emojiTitle: string}>} - An array of objects, each with properties for the URL and name of an emoji. + */ + +export function getEmojiImageUrls(content: string): Array { + let emojiTags = content.match(emojiImageTagRegex); + + let maybeEmojiResults = + emojiTags?.map((item) => { + const emojiUrl = item.match(imageUrlRegex)?.[0]; + const emojiTitle = item.match(emojiTitleRegex)?.[0]; + if (!emojiUrl || !emojiTitle) { + return undefined; + } + let valueEmojiTitle = emojiTitle.split('=')[1]; + const replaceValueEmojiTitle = valueEmojiTitle + ? valueEmojiTitle.replace(/"/g, '') + : undefined; + return { + emojiUrl, + emojiTitle: replaceValueEmojiTitle || '', + }; + }) ?? []; + + let emojiResults = maybeEmojiResults?.filter(Boolean); + + return emojiResults; +} + +export function generateMarkdownContent(raw: string, cooked: string) { + const imageUrls = getCompleteImageVideoUrls(cooked) ?? []; + + const emojiBBcode = raw.match(emojiBBCodeRegex); + + if (emojiBBcode?.length) { + const emojiUrls = getEmojiImageUrls(cooked); + raw = raw.replace(emojiBBCodeRegex, (name: string) => { + let url = emojiUrls.find((value) => value.emojiTitle.includes(name)); + + return url?.emojiUrl ? `![emoji-${name}](${url.emojiUrl})` : name; + }); + } + + const validImageUrls = imageUrls.filter((item) => item); + if (!validImageUrls.length) { + return raw; + } + + let imageCount = 0; + const markdown = raw.replace( + imageMarkdownRegex, + ( + _: string, + imageName: string, + shortUrl: string, + closeParenthesis: string, + ) => { + const modifiedImageMarkdown = `${imageName}${ + validImageUrls?.[imageCount] ?? shortUrl + }${closeParenthesis}`; + imageCount += 1; + + return modifiedImageMarkdown; + }, + ); + + return markdown; +} + export function getMention( content: string, host: string = PROSE_DISCOURSE_UPLOAD_HOST, diff --git a/api/src/helpers/topicDetail.ts b/api/src/helpers/topicDetail.ts new file mode 100644 index 00000000..f20e8433 --- /dev/null +++ b/api/src/helpers/topicDetail.ts @@ -0,0 +1,71 @@ +import { AxiosInstance } from 'axios'; +import camelcaseKeys from 'camelcase-keys'; +import { intArg, list, nullable } from 'nexus'; + +import { ACCEPTED_LANGUAGE } from '../constants'; + +type FetchTopicDetailParams = { + client: AxiosInstance; + postIds?: Array | null; + postNumber?: number | null; + topicId: number; +}; + +type TopicDetailOptionalArgs = { + postIds?: Array | null; + postNumber?: number | null; + includeFirstPost?: boolean | null; +}; + +export function getTopicPostPath(postIdsOrPostNumber?: number | Array) { + if (!postIdsOrPostNumber) { + return ''; + } + + if (Array.isArray(postIdsOrPostNumber)) { + return '/posts'; + } + + const postNumber = postIdsOrPostNumber; + return `/${postNumber}`; +} + +export async function fetchTopicDetail(params: FetchTopicDetailParams) { + const { client, postIds, postNumber, topicId } = params; + + const config = { + headers: { 'Accept-Language': ACCEPTED_LANGUAGE }, + params: { post_ids: postIds, include_raw: true, track_visit: true }, + }; + + let postPath = getTopicPostPath(postIds ?? postNumber ?? undefined); + let url = `/t/${topicId}${postPath}.json`; + let { data } = await client.get(url, config); + + return camelcaseKeys(data, { deep: true }); +} + +export function getTopicDetailBaseArgs() { + return { + postIds: nullable(list(intArg())), + topicId: intArg(), + postNumber: nullable(intArg()), + }; +} + +export function validateTopicDetailOptionalArgs( + params: TopicDetailOptionalArgs, +) { + const { postIds, postNumber, includeFirstPost } = params; + if (postIds && postNumber) { + throw new Error( + 'Please provide either only the post IDs or the post number', + ); + } + + if (postIds && includeFirstPost) { + throw new Error( + 'The first post cannot be included when post IDs are provided', + ); + } +} diff --git a/api/src/locale/index.ts b/api/src/locale/index.ts new file mode 100644 index 00000000..cb72a3e7 --- /dev/null +++ b/api/src/locale/index.ts @@ -0,0 +1,48 @@ +import { + FrequentPoster, + MostRecentPoster, + OriginalPoster, + PosterType, +} from '../types'; + +// source: github.com:discourse/discourse -> config/locales/server.en.yml +// source: github.com:discourse/discourse -> config/locales/server.zh_CN.yml +// key: `poster_description_joiner` +export const i18nSeparatorsRegex = /,|、/; + +const i18nPosterTypes = { + // source: github.com:discourse/discourse -> config/locales/server.en.yml + en: { + 'original poster': OriginalPoster.value, + 'most recent poster': MostRecentPoster.value, + 'frequent poster': FrequentPoster.value, + }, + // source: github.com:discourse/discourse -> config/locales/server.zh_CN.yml + zh: { + 原始发帖人: OriginalPoster.value, + 最新发帖人: MostRecentPoster.value, + 频繁发帖人: FrequentPoster.value, + }, + zh_cn: { + 原始发帖人: OriginalPoster.value, + 最新发帖人: MostRecentPoster.value, + 频繁发帖人: FrequentPoster.value, + }, + // source: github.com:discourse/discourse -> config/locales/server.zh_TW.yml + zh_tw: { + 原始作者: OriginalPoster.value, + 當前大部分貼文作者: MostRecentPoster.value, + 頻繁發文者: FrequentPoster.value, + }, +}; + +const posterTypeMap: Record = { + ...i18nPosterTypes.en, + ...i18nPosterTypes.zh, + ...i18nPosterTypes.zh_cn, + ...i18nPosterTypes.zh_tw, +}; + +export const getPosterType = (type: string): PosterType | undefined => { + return posterTypeMap[type]; +}; diff --git a/api/src/logger.ts b/api/src/logger.ts new file mode 100644 index 00000000..04317b7e --- /dev/null +++ b/api/src/logger.ts @@ -0,0 +1,39 @@ +import { createLogger, format, transports } from 'winston'; +import DailyRotateFile from 'winston-daily-rotate-file'; + +// +// This transport will rotate files on a daily basis +// and store each file for a maximum of 14 days. +// +// The date pattern is the indicator of the frequency. +// YYYY-MM-DD means it will rotate every day. +// YYYY-MM-DD-HH meand is will rotate every hour and so on. +// +const rotateFileTransport: DailyRotateFile = new DailyRotateFile({ + filename: 'logs/errors-%DATE%.log', + datePattern: 'YYYY-MM-DD', + zippedArchive: true, + maxFiles: '14d', + level: 'error', +}); + +export const logger = createLogger({ + level: 'info', + format: format.combine(format.splat(), format.simple()), + transports: [ + new transports.File({ filename: 'logs/combined.log' }), + rotateFileTransport, + ], +}); + +// +// If we're not in production then log to the `console` with the format: +// `${info.level}: ${info.message} JSON.stringify({ ...rest }) ` +// +if (process.env.NODE_ENV !== 'production') { + logger.add( + new transports.Console({ + format: format.simple(), + }), + ); +} diff --git a/api/src/middlewares/permission.ts b/api/src/middlewares/permission.ts deleted file mode 100644 index 1d3a8d70..00000000 --- a/api/src/middlewares/permission.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { rule, shield } from 'graphql-shield'; - -import { Context } from '../types'; - -let isAuthenticated = rule()(async (_, __, ctx: Context) => { - return ctx.isAuth; -}); - -let permissions = shield( - { - Query: { - notification: isAuthenticated, - privateMessage: isAuthenticated, - badge: isAuthenticated, - }, - Mutation: { - timings: isAuthenticated, - newPrivateMessage: isAuthenticated, - newTopic: isAuthenticated, - reply: isAuthenticated, - editPost: isAuthenticated, - editTopic: isAuthenticated, - addEmail: isAuthenticated, - changeEmail: isAuthenticated, - deleteEmail: isAuthenticated, - setPrimaryEmail: isAuthenticated, - bookmarkPost: isAuthenticated, - changeUsername: isAuthenticated, - flagPost: isAuthenticated, - likePost: isAuthenticated, - upload: isAuthenticated, - editProfile: isAuthenticated, - saveProfilePicture: isAuthenticated, - }, - }, - { - fallbackError: 'You need to be logged in to do that.', - }, -); - -export { permissions }; diff --git a/api/src/resolvers/auth/changePasswordMutation.ts b/api/src/resolvers/auth/changePasswordMutation.ts index fdfca382..f659a843 100644 --- a/api/src/resolvers/auth/changePasswordMutation.ts +++ b/api/src/resolvers/auth/changePasswordMutation.ts @@ -1,4 +1,4 @@ -import { FieldResolver, mutationField, stringArg } from '@nexus/schema'; +import { FieldResolver, mutationField, stringArg } from 'nexus'; import { CONTENT_JSON } from '../../constants'; import { errorHandler, getCsrfSession } from '../../helpers'; @@ -39,7 +39,7 @@ export let changePasswordResolver: FieldResolver< export let changePasswordMutation = mutationField('changePassword', { type: 'String', args: { - login: stringArg({ required: true }), + login: stringArg(), }, resolve: changePasswordResolver, }); diff --git a/api/src/resolvers/auth/loginMutation.ts b/api/src/resolvers/auth/loginMutation.ts index 19dcda50..84f6687d 100644 --- a/api/src/resolvers/auth/loginMutation.ts +++ b/api/src/resolvers/auth/loginMutation.ts @@ -1,11 +1,12 @@ -import { FieldResolver, mutationField, stringArg } from '@nexus/schema'; +import { FieldResolver, mutationField, nullable, stringArg } from 'nexus'; import { authenticate, getCsrfSession } from '../../helpers'; +import { Context } from '../../types'; export let loginMutationResolver: FieldResolver<'Mutation', 'login'> = async ( _, { email, password, secondFactorToken }, - __, + { client }: Context, ) => { try { let csrfSession = await getCsrfSession(); @@ -14,8 +15,10 @@ export let loginMutationResolver: FieldResolver<'Mutation', 'login'> = async ( login: email, password, secondFactorToken, + client, }); - } catch (error) { + } catch (unknownError) { + const error = unknownError as Error; throw new Error(`LoginError: ${error.message}`); } }; @@ -23,9 +26,11 @@ export let loginMutationResolver: FieldResolver<'Mutation', 'login'> = async ( export let loginMutation = mutationField('login', { type: 'LoginOutputUnion', args: { - email: stringArg({ required: true }), - password: stringArg({ required: true }), - secondFactorToken: stringArg(), + email: stringArg(), + password: stringArg(), + + // 2FA must be enabled individually by each user, so it must be nullable. + secondFactorToken: nullable(stringArg()), }, resolve: loginMutationResolver, }); diff --git a/api/src/resolvers/auth/logoutMutation.ts b/api/src/resolvers/auth/logoutMutation.ts index e54ed01c..e7e26747 100644 --- a/api/src/resolvers/auth/logoutMutation.ts +++ b/api/src/resolvers/auth/logoutMutation.ts @@ -1,12 +1,51 @@ -import { FieldResolver, mutationField, stringArg } from '@nexus/schema'; +import { FieldResolver, mutationField, stringArg, nullable } from 'nexus'; import { Context } from '../../types'; +import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; +import { logger } from '../../logger'; export let logoutMutationResolver: FieldResolver<'Mutation', 'logout'> = async ( _, - { username }, + { username, pushNotificationsToken }, context: Context, ) => { + if (pushNotificationsToken) { + try { + const config = { + headers: { + 'Accept-Language': ACCEPTED_LANGUAGE, + 'Content-Type': CONTENT_JSON, + }, + }; + await context.client.post( + `/lexicon/push_notifications/delete_subscribe.json`, + { + push_notifications_token: pushNotificationsToken, + }, + config, + ); + } catch (error) { + /** + * No action is taken when an error occurs + * No action is required because we want the session to be successfully deleted even if there are errors when hitting the API to delete the token in the plugin. + * For example, if we haven't installed the plugin, it will result in a 404 error when attempting to hit the delete_subscribe API. + * Similarly, if there is an internal issue with the plugin, it may lead to a 500 error. + */ + + if (error instanceof Error) { + logger.log( + 'Error', + `Error when hit delete token plugin API ====> ${error.message}`, + ); + } else { + logger.log( + 'Error', + `Unknown error when hit delete token plugin API ====> ${error}`, + ); + } + } + } + try { await context.client.delete(`/session/${username}.json`); return 'success'; @@ -18,7 +57,8 @@ export let logoutMutationResolver: FieldResolver<'Mutation', 'logout'> = async ( export let logoutMutation = mutationField('logout', { type: 'String', args: { - username: stringArg({ required: true }), + username: stringArg(), + pushNotificationsToken: nullable(stringArg()), }, resolve: logoutMutationResolver, }); diff --git a/api/src/resolvers/auth/refreshTokenQuery.ts b/api/src/resolvers/auth/refreshTokenQuery.ts index 0327bcbb..db872f88 100644 --- a/api/src/resolvers/auth/refreshTokenQuery.ts +++ b/api/src/resolvers/auth/refreshTokenQuery.ts @@ -1,4 +1,4 @@ -import { FieldResolver, queryField } from '@nexus/schema'; +import { FieldResolver, queryField } from 'nexus'; import { checkSession } from '../../helpers'; import { Context } from '../../types'; @@ -12,7 +12,8 @@ export let refreshTokenQueryResolver: FieldResolver< throw new Error('Not authorized'); } return checkSession(context.client); - } catch (error) { + } catch (unknownError) { + const error = unknownError as Error; throw new Error(`Session not found: ${error.message}`); } }; diff --git a/api/src/resolvers/auth/registerMutation.ts b/api/src/resolvers/auth/registerMutation.ts index db6d82dc..fc1c823e 100644 --- a/api/src/resolvers/auth/registerMutation.ts +++ b/api/src/resolvers/auth/registerMutation.ts @@ -2,7 +2,7 @@ import { stringify } from 'querystring'; import camelcaseKeys from 'camelcase-keys'; import snakecaseKeys from 'snakecase-keys'; -import { FieldResolver, mutationField, arg } from '@nexus/schema'; +import { FieldResolver, mutationField, arg, nullable } from 'nexus'; import { discourseClient } from '../../client'; import { CONTENT_FORM_URLENCODED } from '../../constants'; @@ -42,7 +42,7 @@ export let registerMutationResolver: FieldResolver< export let registerMutation = mutationField('register', { type: 'RegisterOutput', args: { - registerInput: arg({ type: 'RegisterInput' }), + registerInput: nullable(arg({ type: 'RegisterInput' })), }, resolve: registerMutationResolver, }); diff --git a/api/src/resolvers/email/addEmailMutation.ts b/api/src/resolvers/email/addEmailMutation.ts index 4b167510..3b1120f3 100644 --- a/api/src/resolvers/email/addEmailMutation.ts +++ b/api/src/resolvers/email/addEmailMutation.ts @@ -1,6 +1,6 @@ import { stringify } from 'querystring'; -import { FieldResolver, mutationField, stringArg } from '@nexus/schema'; +import { FieldResolver, mutationField, stringArg } from 'nexus'; import { CONTENT_FORM_URLENCODED } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -34,8 +34,8 @@ export let addEmailMutation: FieldResolver<'Mutation', 'addEmail'> = async ( export let addEmail = mutationField('addEmail', { type: 'String', args: { - email: stringArg({ required: true }), - username: stringArg({ required: true }), + email: stringArg(), + username: stringArg(), }, resolve: addEmailMutation, }); diff --git a/api/src/resolvers/email/changeEmailMutation.ts b/api/src/resolvers/email/changeEmailMutation.ts index 23510c2f..8e15c404 100644 --- a/api/src/resolvers/email/changeEmailMutation.ts +++ b/api/src/resolvers/email/changeEmailMutation.ts @@ -1,4 +1,4 @@ -import { FieldResolver, mutationField, stringArg } from '@nexus/schema'; +import { FieldResolver, mutationField, stringArg } from 'nexus'; import { CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -25,8 +25,8 @@ export let changeEmailResolver: FieldResolver< export let changeEmailMutation = mutationField('changeEmail', { type: 'String', args: { - newEmail: stringArg({ required: true }), - username: stringArg({ required: true }), + newEmail: stringArg(), + username: stringArg(), }, resolve: changeEmailResolver, }); diff --git a/api/src/resolvers/email/deleteEmailMutation.ts b/api/src/resolvers/email/deleteEmailMutation.ts index b89ab7ce..1d592ff5 100644 --- a/api/src/resolvers/email/deleteEmailMutation.ts +++ b/api/src/resolvers/email/deleteEmailMutation.ts @@ -1,4 +1,4 @@ -import { FieldResolver, mutationField, stringArg } from '@nexus/schema'; +import { FieldResolver, mutationField, stringArg } from 'nexus'; import { CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -32,8 +32,8 @@ export let deleteEmailResolver: FieldResolver< export let deleteEmailMutation = mutationField('deleteEmail', { type: 'String', args: { - selectedEmail: stringArg({ required: true }), - username: stringArg({ required: true }), + selectedEmail: stringArg(), + username: stringArg(), }, resolve: deleteEmailResolver, }); diff --git a/api/src/resolvers/email/setPrimaryEmailMutation.ts b/api/src/resolvers/email/setPrimaryEmailMutation.ts index d5bc429f..681603b2 100644 --- a/api/src/resolvers/email/setPrimaryEmailMutation.ts +++ b/api/src/resolvers/email/setPrimaryEmailMutation.ts @@ -1,4 +1,4 @@ -import { FieldResolver, mutationField, stringArg } from '@nexus/schema'; +import { FieldResolver, mutationField, stringArg } from 'nexus'; import { CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -33,8 +33,8 @@ export let setPrimaryEmailResolver: FieldResolver< export let setPrimaryEmailMutation = mutationField('setPrimaryEmail', { type: 'String', args: { - selectedEmail: stringArg({ required: true }), - username: stringArg({ required: true }), + selectedEmail: stringArg(), + username: stringArg(), }, resolve: setPrimaryEmailResolver, }); diff --git a/api/src/resolvers/health/healthQuery.ts b/api/src/resolvers/health/healthQuery.ts new file mode 100644 index 00000000..2f88475c --- /dev/null +++ b/api/src/resolvers/health/healthQuery.ts @@ -0,0 +1,40 @@ +import { FieldResolver, queryField } from 'nexus'; +import { AxiosError } from 'axios'; + +import { Context } from '../../types'; +import { PROSE_DISCOURSE_HOST } from '../../constants'; +import { logger } from '../../logger'; + +let healthQueryResolver: FieldResolver<'Query', 'health'> = async ( + _, + __, + context: Context, +) => { + let discourseError: Error | undefined; + let isDiscourseReachable = true; + try { + await context.client.get('/site.json'); + } catch (error) { + let e = error as AxiosError; + discourseError = e; + if (e.response === undefined) { + isDiscourseReachable = false; + } + logger.log( + 'error', + discourseError?.toString() ?? 'An unknown Discourse error occurred', + ); + } + return { + isDiscourseReachable, + discourseError: discourseError?.toString(), + discourseHost: PROSE_DISCOURSE_HOST, + }; +}; + +let healthQuery = queryField('health', { + type: 'HealthCheck', + resolve: healthQueryResolver, +}); + +export { healthQuery }; diff --git a/api/src/resolvers/index.ts b/api/src/resolvers/index.ts index 684e2294..4acdf36a 100644 --- a/api/src/resolvers/index.ts +++ b/api/src/resolvers/index.ts @@ -22,11 +22,12 @@ export * from './topics/editPostMutation'; export * from './topics/editTopicMutation'; export * from './topics/flagPostMutation'; export * from './topics/leaveMessageMutation'; -export * from './topics/likePostMutation'; +export * from './topics/likeTopicOrPostMutation'; export * from './topics/newPrivateMessageMutation'; export * from './topics/newTopicMutation'; export * from './topics/postQuery'; export * from './topics/postRawQuery'; +export * from './topics/privateMessageDetailQuery'; export * from './topics/privateMessageQuery'; export * from './topics/repliesQuery'; export * from './topics/replyingToQuery'; @@ -48,3 +49,5 @@ export * from './user/searchUserQuery'; export * from './user/singleBadgeQuery'; export * from './user/userActivityQuery'; export * from './user/userProfileQuery'; + +export * from './health/healthQuery'; diff --git a/api/src/resolvers/notifications/markReadMutation.ts b/api/src/resolvers/notifications/markReadMutation.ts index 93528f13..f1b5e687 100644 --- a/api/src/resolvers/notifications/markReadMutation.ts +++ b/api/src/resolvers/notifications/markReadMutation.ts @@ -1,4 +1,4 @@ -import { FieldResolver, mutationField, intArg } from '@nexus/schema'; +import { FieldResolver, mutationField, intArg, nullable } from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -30,7 +30,7 @@ export let markReadMutation: FieldResolver<'Mutation', 'markRead'> = async ( export let markRead = mutationField('markRead', { type: 'String', args: { - notificationId: intArg(), + notificationId: nullable(intArg()), }, resolve: markReadMutation, }); diff --git a/api/src/resolvers/notifications/notificationQuery.ts b/api/src/resolvers/notifications/notificationQuery.ts index 54382236..3caaf2f0 100644 --- a/api/src/resolvers/notifications/notificationQuery.ts +++ b/api/src/resolvers/notifications/notificationQuery.ts @@ -1,5 +1,5 @@ import camelcaseKeys from 'camelcase-keys'; -import { FieldResolver, queryField, intArg } from '@nexus/schema'; +import { FieldResolver, queryField, intArg } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; @@ -32,7 +32,7 @@ let notificationQueryResolver: FieldResolver<'Query', 'notification'> = async ( let notificationQuery = queryField('notification', { type: 'Notifications', args: { - page: intArg({ required: true }), + page: intArg(), }, resolve: notificationQueryResolver, }); diff --git a/api/src/resolvers/notifications/pushNotificationMutation.ts b/api/src/resolvers/notifications/pushNotificationMutation.ts index 6b3353d6..9ce4b446 100644 --- a/api/src/resolvers/notifications/pushNotificationMutation.ts +++ b/api/src/resolvers/notifications/pushNotificationMutation.ts @@ -1,14 +1,18 @@ -/* eslint-disable @typescript-eslint/camelcase */ -import { FieldResolver, mutationField, stringArg } from '@nexus/schema'; +import axios from 'axios'; +import { FieldResolver, mutationField, stringArg } from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; -export let pushNotificationMutation: FieldResolver< +export let pushNotificationsMutation: FieldResolver< 'Mutation', - 'pushNotification' -> = async (_, { expoPnToken, applicationName, platform }, context: Context) => { + 'pushNotifications' +> = async ( + _, + { PushNotificationsToken, applicationName, platform, experienceId }, + context: Context, +) => { const config = { headers: { 'Accept-Language': ACCEPTED_LANGUAGE, @@ -17,26 +21,32 @@ export let pushNotificationMutation: FieldResolver< }; try { await context.client.post( - `/expo_pn/subscribe.json`, + `/lexicon/push_notifications/subscribe.json`, { - expo_pn_token: expoPnToken, + push_notifications_token: PushNotificationsToken, application_name: applicationName, platform: platform, + experience_id: experienceId, }, config, ); return 'success'; } catch (e) { + if (axios.isAxiosError(e) && e.response?.status === 404) { + // mean discourse instance doesn't have lexicon plugin + return 'lexicon plugin not installed'; + } throw errorHandler(e); } }; -export let pushNotification = mutationField('pushNotification', { +export let pushNotification = mutationField('pushNotifications', { type: 'String', args: { - expoPnToken: stringArg(), + PushNotificationsToken: stringArg(), + experienceId: stringArg(), applicationName: stringArg(), platform: stringArg(), }, - resolve: pushNotificationMutation, + resolve: pushNotificationsMutation, }); diff --git a/api/src/resolvers/site/aboutQuery.ts b/api/src/resolvers/site/aboutQuery.ts index 3ae9fb7a..aa76e836 100644 --- a/api/src/resolvers/site/aboutQuery.ts +++ b/api/src/resolvers/site/aboutQuery.ts @@ -1,4 +1,4 @@ -import { FieldResolver, queryField } from '@nexus/schema'; +import { FieldResolver, queryField } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; diff --git a/api/src/resolvers/site/siteQuery.ts b/api/src/resolvers/site/siteQuery.ts index d766292d..9dd8d742 100644 --- a/api/src/resolvers/site/siteQuery.ts +++ b/api/src/resolvers/site/siteQuery.ts @@ -1,8 +1,9 @@ import camelcaseKey from 'camelcase-keys'; -import { FieldResolver, queryField } from '@nexus/schema'; +import { FieldResolver, queryField } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; +import { UNCATEGORIZED_CATEGORY_ID } from '../../constants'; let siteResolver: FieldResolver<'Query', 'site'> = async ( _, @@ -17,6 +18,8 @@ let siteResolver: FieldResolver<'Query', 'site'> = async ( can_tag_topics: canTagTopics, topic_flag_types: topicFlagTypes, post_action_types: postActionTypes, + uncategorized_category_id: + uncategorizedCategoryId = UNCATEGORIZED_CATEGORY_ID, ...siteData }, } = await context.client.get(siteUrl); @@ -50,6 +53,8 @@ let siteResolver: FieldResolver<'Query', 'site'> = async ( min_username_length: minUsernameLength = 0, min_password_length: minPasswordLength = 0, full_name_required: fullNameRequired = false, + default_composer_category: defaultComposerCategory = '', + allow_uncategorized_topics: allowUncategorizedTopics = false, }, } = await context.client.get(siteSettingsUrl); @@ -68,6 +73,9 @@ let siteResolver: FieldResolver<'Query', 'site'> = async ( fullNameRequired, topicFlagTypes, postActionTypes, + defaultComposerCategory, + allowUncategorizedTopics, + uncategorizedCategoryId, ...camelcaseKey(siteData, { deep: true }), }; } catch (error) { diff --git a/api/src/resolvers/topics/bookmarkPostMutation.ts b/api/src/resolvers/topics/bookmarkPostMutation.ts index 59d0e7cd..46f73e4b 100644 --- a/api/src/resolvers/topics/bookmarkPostMutation.ts +++ b/api/src/resolvers/topics/bookmarkPostMutation.ts @@ -7,7 +7,8 @@ import { arg, intArg, stringArg, -} from '@nexus/schema'; + nullable, +} from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_FORM_URLENCODED } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -39,10 +40,10 @@ export let bookmarkPostResolver: FieldResolver< export let bookmarkPostMutation = mutationField('bookmarkPost', { type: 'BookmarkOutput', args: { - postId: intArg({ required: true }), - reminderType: arg({ type: 'BookmarkReminderEnum' }), - reminderAt: stringArg(), - name: stringArg(), + postId: intArg(), + reminderType: nullable(arg({ type: 'BookmarkReminderEnum' })), + reminderAt: nullable(stringArg()), + name: nullable(stringArg()), }, resolve: bookmarkPostResolver, }); diff --git a/api/src/resolvers/topics/categoryQuery.ts b/api/src/resolvers/topics/categoryQuery.ts index ae163b3c..8dca06b2 100644 --- a/api/src/resolvers/topics/categoryQuery.ts +++ b/api/src/resolvers/topics/categoryQuery.ts @@ -1,5 +1,5 @@ import camelcaseKeys from 'camelcase-keys'; -import { FieldResolver, queryField } from '@nexus/schema'; +import { FieldResolver, queryField } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; diff --git a/api/src/resolvers/topics/editPostMutation.ts b/api/src/resolvers/topics/editPostMutation.ts index d76feb35..f2d7d2ff 100644 --- a/api/src/resolvers/topics/editPostMutation.ts +++ b/api/src/resolvers/topics/editPostMutation.ts @@ -1,6 +1,6 @@ import camelcaseKey from 'camelcase-keys'; import snakecaseKey from 'snakecase-keys'; -import { FieldResolver, mutationField, arg, intArg } from '@nexus/schema'; +import { FieldResolver, mutationField, arg, intArg } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; @@ -33,8 +33,8 @@ export let editPostResolver: FieldResolver<'Mutation', 'editPost'> = async ( export let editPostMutation = mutationField('editPost', { type: 'Post', args: { - postId: intArg({ required: true }), - postInput: arg({ type: 'EditPostInput', required: true }), + postId: intArg(), + postInput: arg({ type: 'EditPostInput' }), }, resolve: editPostResolver, }); diff --git a/api/src/resolvers/topics/editTopicMutation.ts b/api/src/resolvers/topics/editTopicMutation.ts index f530a2f8..9ec9a054 100644 --- a/api/src/resolvers/topics/editTopicMutation.ts +++ b/api/src/resolvers/topics/editTopicMutation.ts @@ -1,6 +1,6 @@ import camelcaseKey from 'camelcase-keys'; import snakecaseKey from 'snakecase-keys'; -import { FieldResolver, mutationField, arg, intArg } from '@nexus/schema'; +import { FieldResolver, mutationField, arg, intArg } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; @@ -33,8 +33,8 @@ export let editTopicMutation: FieldResolver<'Mutation', 'editTopic'> = async ( export let editTopic = mutationField('editTopic', { type: 'BasicTopic', args: { - topicInput: arg({ type: 'EditTopicInput', required: true }), - topicId: intArg({ required: true }), + topicInput: arg({ type: 'EditTopicInput' }), + topicId: intArg(), }, resolve: editTopicMutation, }); diff --git a/api/src/resolvers/topics/flagPostMutation.ts b/api/src/resolvers/topics/flagPostMutation.ts index 4e04a2db..f8b5542a 100644 --- a/api/src/resolvers/topics/flagPostMutation.ts +++ b/api/src/resolvers/topics/flagPostMutation.ts @@ -1,7 +1,13 @@ import { stringify } from 'querystring'; import camelcaseKeys from 'camelcase-keys'; -import { FieldResolver, mutationField, intArg, stringArg } from '@nexus/schema'; +import { + FieldResolver, + mutationField, + intArg, + stringArg, + nullable, +} from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_FORM_URLENCODED } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -20,7 +26,6 @@ export let flagPostResolver: FieldResolver<'Mutation', 'flagPost'> = async ( }; let body = { id: postId, - // eslint-disable-next-line @typescript-eslint/camelcase post_action_type_id: postActionTypeId, }; try { @@ -38,9 +43,9 @@ export let flagPostResolver: FieldResolver<'Mutation', 'flagPost'> = async ( export let flagPostMutation = mutationField('flagPost', { type: 'Post', args: { - postId: intArg({ required: true }), - postActionTypeId: intArg({ required: true }), - message: stringArg(), + postId: intArg(), + postActionTypeId: intArg(), + message: nullable(stringArg()), //you can add flagTopic in args }, resolve: flagPostResolver, diff --git a/api/src/resolvers/topics/leaveMessageMutation.ts b/api/src/resolvers/topics/leaveMessageMutation.ts index 088fa4d3..a0ecdecd 100644 --- a/api/src/resolvers/topics/leaveMessageMutation.ts +++ b/api/src/resolvers/topics/leaveMessageMutation.ts @@ -4,7 +4,8 @@ import { booleanArg, intArg, stringArg, -} from '@nexus/schema'; + nullable, +} from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -41,9 +42,9 @@ export let leaveMessageResolver: FieldResolver< export let leaveMessageMutation = mutationField('leaveMessage', { type: 'String', args: { - topicId: intArg({ required: true }), - owner: booleanArg(), - username: stringArg({ required: true }), + topicId: intArg(), + owner: nullable(booleanArg()), + username: stringArg(), }, resolve: leaveMessageResolver, }); diff --git a/api/src/resolvers/topics/likePostMutation.ts b/api/src/resolvers/topics/likePostMutation.ts deleted file mode 100644 index 6d4baee6..00000000 --- a/api/src/resolvers/topics/likePostMutation.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { stringify } from 'querystring'; - -import camelcaseKeys from 'camelcase-keys'; -import { - FieldResolver, - mutationField, - booleanArg, - intArg, -} from '@nexus/schema'; - -import { ACCEPTED_LANGUAGE, CONTENT_FORM_URLENCODED } from '../../constants'; -import { errorHandler } from '../../helpers'; -import { Context } from '../../types'; - -export let likePostResolver: FieldResolver<'Mutation', 'likePost'> = async ( - _, - { postId, unlike, postList }, - context: Context, -) => { - let body = { - // eslint-disable-next-line @typescript-eslint/camelcase - post_action_type_id: 2, - }; - const config = { - headers: { - 'Accept-Language': ACCEPTED_LANGUAGE, - 'Content-Type': CONTENT_FORM_URLENCODED, - }, - params: unlike && body, - }; - - const postConfig = { - headers: { - 'Accept-Language': ACCEPTED_LANGUAGE, - }, - // eslint-disable-next-line @typescript-eslint/camelcase - params: { post_ids: null, include_raw: true }, - }; - - try { - if (postList) { - let url = `/t/${postId}.json`; - let { data: topicDetailResult } = await context.client.get( - url, - postConfig, - ); - let selectedTopic = camelcaseKeys(topicDetailResult, { deep: true }); - let post = selectedTopic.postStream.posts[0]; - postId = post.id; - let { canUndo, acted } = post.actionsSummary.find( - (actionSummary: { id: number }) => actionSummary.id === 2, - ); - if (!canUndo && acted) { - throw new Error('Already passed the time limit to unlike'); - } - } - if (unlike) { - let { data } = await context.client.delete( - `/post_actions/${postId}.json`, - config, - ); - return camelcaseKeys(data, { deep: true }); - } else { - Object.assign(body, { id: postId }); - let { data } = await context.client.post( - `/post_actions.json`, - stringify(body), - config, - ); - return camelcaseKeys(data, { deep: true }); - } - } catch (e) { - errorHandler(e); - } -}; - -export let likePostMutation = mutationField('likePost', { - type: 'Post', - args: { - postId: intArg({ required: true }), - unlike: booleanArg(), - postList: booleanArg(), - //you can add flagTopic in args - }, - resolve: likePostResolver, -}); diff --git a/api/src/resolvers/topics/likeTopicOrPostMutation.ts b/api/src/resolvers/topics/likeTopicOrPostMutation.ts new file mode 100644 index 00000000..08bc32a0 --- /dev/null +++ b/api/src/resolvers/topics/likeTopicOrPostMutation.ts @@ -0,0 +1,139 @@ +import { + FieldResolver, + mutationField, + booleanArg, + intArg, + nullable, +} from 'nexus'; +import camelcaseKeys from 'camelcase-keys'; +import { AxiosError } from 'axios'; + +import { + ACCEPTED_LANGUAGE, + CONTENT_JSON, + errorTypes, + LIKE_ACTION_ID, +} from '../../constants'; +import { + errorHandler, + getUpdatedLikedTopic, + fetchTopicDetail, + fetchPost, +} from '../../helpers'; +import { LikableEntity, likeErrorHandler } from '../../helpers/likeErroHandler'; +import { ActionsSummary, Context, LikedTopic } from '../../types'; + +export let likeTopicOrPostResolver: FieldResolver< + 'Mutation', + 'likeTopicOrPost' +> = async (_, { postId, topicId, unlike }, { client }: Context) => { + const body = { + post_action_type_id: LIKE_ACTION_ID, + }; + const config = { + headers: { + 'Accept-Language': ACCEPTED_LANGUAGE, + 'Content-Type': CONTENT_JSON, + }, + params: unlike ? body : undefined, + }; + + try { + if ((!postId && !topicId) || (postId && topicId)) { + throw new Error('Please provide either only the post ID or the topic ID'); + } + + let likableEntity: LikableEntity = 'post'; + let currentLikedTopicResponse: LikedTopic | null = null; + let actionsSummary: ActionsSummary | null = null; + + // Get the first post actions summary and ID of the topic + if (topicId) { + const { likeCount, postStream } = await fetchTopicDetail({ + topicId, + client, + }); + likableEntity = 'topic'; + const post = postStream.posts[0]; + postId = post.id; + if (!postId) { + throw new Error('Unable to find the first post of this topic'); + } + actionsSummary = post.actionsSummary; + currentLikedTopicResponse = { + postId, + topicId, + likeCount, + id: postId, + liked: !unlike, + }; + } + + // Try-catch block to handle like mutation error + try { + // Unliking topic or post + if (unlike) { + let { data } = await client.delete( + `/post_actions/${postId}.json`, + config, + ); + + if (topicId && currentLikedTopicResponse) { + return getUpdatedLikedTopic({ + currentLikedTopicResponse, + isLiked: false, + }); + } + return camelcaseKeys(data, { deep: true }); + } + + // Liking topic or post + let likeRequestData = { ...body, id: postId }; + let { data } = await client.post( + `/post_actions.json`, + likeRequestData, + config, + ); + + if (topicId && currentLikedTopicResponse) { + return getUpdatedLikedTopic({ + currentLikedTopicResponse, + isLiked: true, + }); + } + return camelcaseKeys(data, { deep: true }); + } catch (unknownError) { + const e = unknownError as AxiosError; + let errorType = e?.response?.data?.error_type; + // Let the error handler handle this + if (errorType === errorTypes.unauthenticatedAccess) { + throw e; + } + + /** + * Get actions summary from the specified post ID + * only when content type is post, because we already have + * the actionsSummary from topic detail when content + * type is topic + */ + if (likableEntity === 'post' && postId) { + const post = await fetchPost({ client, postId }); + actionsSummary = post.actionsSummary; + } + likeErrorHandler(e, { actionsSummary, likableEntity, like: !unlike }); + } + } catch (e) { + errorHandler(e); + } +}; + +export let likeTopicOrPostMutation = mutationField('likeTopicOrPost', { + type: 'LikeOutputUnion', + args: { + postId: nullable(intArg()), + topicId: nullable(intArg()), + unlike: nullable(booleanArg()), + //you can add flagTopic in args + }, + resolve: likeTopicOrPostResolver, +}); diff --git a/api/src/resolvers/topics/newPrivateMessageMutation.ts b/api/src/resolvers/topics/newPrivateMessageMutation.ts index 7ad2dd1a..a4d9aecd 100644 --- a/api/src/resolvers/topics/newPrivateMessageMutation.ts +++ b/api/src/resolvers/topics/newPrivateMessageMutation.ts @@ -2,7 +2,7 @@ import { stringify } from 'querystring'; import camelcaseKey from 'camelcase-keys'; import snakecaseKey from 'snakecase-keys'; -import { FieldResolver, mutationField, arg } from '@nexus/schema'; +import { FieldResolver, mutationField, arg } from 'nexus'; import { CONTENT_FORM_URLENCODED } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -39,7 +39,6 @@ export let newPrivateMessageMutation = mutationField('newPrivateMessage', { args: { newPrivateMessageInput: arg({ type: 'NewPrivateMessageInput', - required: true, }), }, resolve: newPrivateMessageResolver, diff --git a/api/src/resolvers/topics/newTopicMutation.ts b/api/src/resolvers/topics/newTopicMutation.ts index 87c08f50..5d0d9538 100644 --- a/api/src/resolvers/topics/newTopicMutation.ts +++ b/api/src/resolvers/topics/newTopicMutation.ts @@ -1,6 +1,6 @@ import camelcaseKey from 'camelcase-keys'; import snakecaseKey from 'snakecase-keys'; -import { FieldResolver, mutationField, arg } from '@nexus/schema'; +import { FieldResolver, mutationField, arg } from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -36,7 +36,7 @@ export let newTopicResolver: FieldResolver<'Mutation', 'newTopic'> = async ( export let newTopicMutation = mutationField('newTopic', { type: 'Post', args: { - newTopicInput: arg({ type: 'NewTopicInput', required: true }), + newTopicInput: arg({ type: 'NewTopicInput' }), }, resolve: newTopicResolver, }); diff --git a/api/src/resolvers/topics/postQuery.ts b/api/src/resolvers/topics/postQuery.ts index f5f4d84a..5dad44be 100644 --- a/api/src/resolvers/topics/postQuery.ts +++ b/api/src/resolvers/topics/postQuery.ts @@ -1,29 +1,15 @@ -import camelcaseKey from 'camelcase-keys'; -import { FieldResolver, queryField, intArg } from '@nexus/schema'; +import { FieldResolver, queryField, intArg } from 'nexus'; -import { errorHandler } from '../../helpers'; +import { errorHandler, fetchPost } from '../../helpers'; import { Context } from '../../types'; -import { ACCEPTED_LANGUAGE } from '../../constants'; export let postQueryResolver: FieldResolver<'Query', 'post'> = async ( _, { postId }, - context: Context, + { client }: Context, ) => { - const config = { - headers: { - 'Accept-Language': ACCEPTED_LANGUAGE, - }, - params: { - // eslint-disable-next-line @typescript-eslint/camelcase - include_raw: true, - }, - }; try { - let url = `/posts/${postId}.json`; - let { data: postResult } = await context.client.get(url, config); - - return camelcaseKey(postResult, { deep: true }); + return await fetchPost({ client, postId }); } catch (error) { throw errorHandler(error); } @@ -32,7 +18,7 @@ export let postQueryResolver: FieldResolver<'Query', 'post'> = async ( let postQuery = queryField('post', { type: 'Post', args: { - postId: intArg({ required: true }), + postId: intArg(), }, resolve: postQueryResolver, }); diff --git a/api/src/resolvers/topics/postRawQuery.ts b/api/src/resolvers/topics/postRawQuery.ts index b51db485..3f761828 100644 --- a/api/src/resolvers/topics/postRawQuery.ts +++ b/api/src/resolvers/topics/postRawQuery.ts @@ -1,7 +1,10 @@ -import camelcaseKey from 'camelcase-keys'; -import { FieldResolver, queryField, intArg } from '@nexus/schema'; +import { FieldResolver, queryField, intArg } from 'nexus'; -import { errorHandler, getMention, getPostImageUrl } from '../../helpers'; +import { + errorHandler, + generateMarkdownContent, + getMention, +} from '../../helpers'; import { Context } from '../../types'; import { ACCEPTED_LANGUAGE } from '../../constants'; @@ -11,13 +14,8 @@ export const postRawQueryResolver: FieldResolver<'Query', 'postRaw'> = async ( context: Context, ) => { const config = { - headers: { - 'Accept-Language': ACCEPTED_LANGUAGE, - }, - params: { - // eslint-disable-next-line @typescript-eslint/camelcase - include_raw: true, - }, + headers: { 'Accept-Language': ACCEPTED_LANGUAGE }, + params: { include_raw: true }, }; try { @@ -29,12 +27,9 @@ export const postRawQueryResolver: FieldResolver<'Query', 'postRaw'> = async ( data: { cooked }, } = await context.client.get(urlCooked); - let listOfCooked = getPostImageUrl(cooked) ?? []; - let listOfMention = getMention(cooked) ?? []; - - let postResult = { raw, listOfCooked, listOfMention }; - - return camelcaseKey(postResult, { deep: true }); + const markdownContent = generateMarkdownContent(raw, cooked); + const mentions = getMention(cooked) ?? []; + return { raw, markdownContent, mentions }; } catch (error) { throw errorHandler(error); } @@ -42,6 +37,6 @@ export const postRawQueryResolver: FieldResolver<'Query', 'postRaw'> = async ( export const postRawQuery = queryField('postRaw', { type: 'PostRaw', - args: { postId: intArg({ required: true }) }, + args: { postId: intArg() }, resolve: postRawQueryResolver, }); diff --git a/api/src/resolvers/topics/privateMessageDetailQuery.ts b/api/src/resolvers/topics/privateMessageDetailQuery.ts new file mode 100644 index 00000000..24570506 --- /dev/null +++ b/api/src/resolvers/topics/privateMessageDetailQuery.ts @@ -0,0 +1,45 @@ +import { FieldResolver, queryField } from 'nexus'; + +import { + validateTopicDetailOptionalArgs, + errorHandler, + fetchTopicDetail, + getTopicDetailBaseArgs, +} from '../../helpers'; +import { Context } from '../../types'; + +// TODO: Move message detail handler from frontend to this endpoint #837 +let privateMessageDetailQueryResolver: FieldResolver< + 'Query', + 'privateMessageDetail' +> = async (_, { topicId, postIds, postNumber }, { client }: Context) => { + try { + validateTopicDetailOptionalArgs({ postIds, postNumber }); + return await fetchTopicDetail({ + client, + topicId, + postIds, + postNumber, + }); + } catch (error) { + throw errorHandler(error); + } +}; + +/** + * By specifying postNumber, Discourse API will return posts + * with the following conditions: + * if total post < 20: all posts + * else if postNumber <= 5: the first 20 posts + * else if postNumber > total post - 20 + 5: 20 latest posts + * else if postNumber > 5: 20 posts starting from postNumber - 5 + * Note that 20 is the maximum post counts per fetch + * and 5 is the value from Discourse + */ +let privateMessageDetailQuery = queryField('privateMessageDetail', { + type: 'PrivateMessageDetailOutput', + args: getTopicDetailBaseArgs(), + resolve: privateMessageDetailQueryResolver, +}); + +export { privateMessageDetailQuery }; diff --git a/api/src/resolvers/topics/privateMessageQuery.ts b/api/src/resolvers/topics/privateMessageQuery.ts index 7e117c59..9136500f 100644 --- a/api/src/resolvers/topics/privateMessageQuery.ts +++ b/api/src/resolvers/topics/privateMessageQuery.ts @@ -1,5 +1,5 @@ import camelcaseKeys from 'camelcase-keys'; -import { FieldResolver, queryField, intArg, stringArg } from '@nexus/schema'; +import { FieldResolver, queryField, intArg, stringArg, nullable } from 'nexus'; import { errorHandler, privateMessagesMerger } from '../../helpers'; import { Context, PMOutput } from '../../types'; @@ -46,8 +46,8 @@ let privateMessageQueryResolver: FieldResolver< let privateMessageQuery = queryField('privateMessage', { type: 'PrivateMessageOutput', args: { - username: stringArg({ required: true }), - page: intArg(), + username: stringArg(), + page: nullable(intArg()), }, resolve: privateMessageQueryResolver, }); diff --git a/api/src/resolvers/topics/repliesQuery.ts b/api/src/resolvers/topics/repliesQuery.ts index 5f0200ba..8ecb5c55 100644 --- a/api/src/resolvers/topics/repliesQuery.ts +++ b/api/src/resolvers/topics/repliesQuery.ts @@ -1,4 +1,4 @@ -import { FieldResolver, queryField, intArg } from '@nexus/schema'; +import { FieldResolver, queryField, intArg, list } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; @@ -33,10 +33,9 @@ let repliesQueryResolver: FieldResolver<'Query', 'replies'> = async ( }; let repliesQuery = queryField('replies', { - type: 'Post', - list: true, + type: list('Post'), args: { - postId: intArg({ required: true }), + postId: intArg(), }, resolve: repliesQueryResolver, }); diff --git a/api/src/resolvers/topics/replyMutation.ts b/api/src/resolvers/topics/replyMutation.ts index f3b73665..b08cc3de 100644 --- a/api/src/resolvers/topics/replyMutation.ts +++ b/api/src/resolvers/topics/replyMutation.ts @@ -3,7 +3,7 @@ import { stringify } from 'querystring'; import FormData from 'form-data'; import camelcaseKey from 'camelcase-keys'; import snakecaseKey from 'snakecase-keys'; -import { FieldResolver, mutationField, arg, intArg } from '@nexus/schema'; +import { FieldResolver, mutationField, arg, intArg, nullable } from 'nexus'; import { CONTENT_FORM_URLENCODED } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -16,9 +16,7 @@ export let replyResolver: FieldResolver<'Mutation', 'reply'> = async ( ) => { let replyInputSnake = snakecaseKey({ ...replyInput, archetype: 'regular' }); const config = { - headers: { - 'Content-Type': CONTENT_FORM_URLENCODED, - }, + headers: { 'Content-Type': CONTENT_FORM_URLENCODED }, }; try { @@ -27,18 +25,17 @@ export let replyResolver: FieldResolver<'Mutation', 'reply'> = async ( throw new Error('Upload avatar must include user id.'); } const form = new FormData(); - let { createReadStream } = await file; - let fileStream = createReadStream(); - form.append('files[]', fileStream); + + const fileBuffer = Buffer.from(await file.arrayBuffer()); + + form.append('files[]', fileBuffer, file.name); form.append('type', type); if (userId) { form.append('user_id', userId); } const config = { - headers: { - ...form.getHeaders(), - }, + headers: form.getHeaders(), }; let url = `/uploads.json`; let { data } = await context.client.post(url, form, config); @@ -67,10 +64,10 @@ export let replyResolver: FieldResolver<'Mutation', 'reply'> = async ( export let replyMutation = mutationField('reply', { type: 'Post', args: { - replyInput: arg({ type: 'ReplyInput', required: true }), - file: arg({ type: 'Upload' }), - type: arg({ type: 'UploadTypeEnum' }), - userId: intArg(), + replyInput: arg({ type: 'ReplyInput' }), + file: nullable(arg({ type: 'File' })), + type: nullable(arg({ type: 'UploadTypeEnum' })), + userId: nullable(intArg()), }, resolve: replyResolver, }); diff --git a/api/src/resolvers/topics/replyingToQuery.ts b/api/src/resolvers/topics/replyingToQuery.ts index b9a50a49..10b5d725 100644 --- a/api/src/resolvers/topics/replyingToQuery.ts +++ b/api/src/resolvers/topics/replyingToQuery.ts @@ -1,4 +1,4 @@ -import { FieldResolver, queryField, intArg } from '@nexus/schema'; +import { FieldResolver, queryField, intArg, nullable } from 'nexus'; import { ACCEPTED_LANGUAGE } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -17,7 +17,6 @@ let replyingToQueryResolver: FieldResolver<'Query', 'replyingTo'> = async ( 'Accept-Language': ACCEPTED_LANGUAGE, }, params: { - // eslint-disable-next-line @typescript-eslint/camelcase max_replies: 1, }, }; @@ -45,7 +44,8 @@ let replyingToQueryResolver: FieldResolver<'Query', 'replyingTo'> = async ( let replyingToQuery = queryField('replyingTo', { type: 'Post', args: { - postId: intArg({ required: true }), + postId: intArg(), + replyToPostId: nullable(intArg()), //unused args on backend but needed as FE workaround to fetch local state }, resolve: replyingToQueryResolver, }); diff --git a/api/src/resolvers/topics/searchQuery.ts b/api/src/resolvers/topics/searchQuery.ts index 6fbe7d97..13279879 100644 --- a/api/src/resolvers/topics/searchQuery.ts +++ b/api/src/resolvers/topics/searchQuery.ts @@ -1,5 +1,5 @@ import camelcaseKey from 'camelcase-keys'; -import { FieldResolver, queryField, intArg, stringArg } from '@nexus/schema'; +import { FieldResolver, queryField, intArg, stringArg, nullable } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; @@ -41,9 +41,9 @@ let searchQueryResolver: FieldResolver<'Query', 'search'> = async ( let searchQuery = queryField('search', { type: 'SearchOutput', args: { - search: stringArg({ required: true }), - page: intArg({ required: true }), - order: stringArg(), + search: stringArg(), + page: intArg(), + order: nullable(stringArg()), }, resolve: searchQueryResolver, }); diff --git a/api/src/resolvers/topics/searchTagsQuery.ts b/api/src/resolvers/topics/searchTagsQuery.ts index cf10f0df..09a006e2 100644 --- a/api/src/resolvers/topics/searchTagsQuery.ts +++ b/api/src/resolvers/topics/searchTagsQuery.ts @@ -1,6 +1,13 @@ import camelcaseKey from 'camelcase-keys'; import snakecaseKeys from 'snakecase-keys'; -import { FieldResolver, queryField, intArg, stringArg } from '@nexus/schema'; +import { + FieldResolver, + queryField, + intArg, + stringArg, + list, + nullable, +} from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; @@ -36,12 +43,11 @@ let searchTagResolver: FieldResolver<'Query', 'searchTag'> = async ( }; let searchTagQuery = queryField('searchTag', { - type: 'Tag', - list: true, + type: list('Tag'), args: { - q: stringArg({ required: true }), - limit: intArg(), - selectedTags: stringArg({ list: true }), + q: stringArg(), + limit: nullable(intArg()), + selectedTags: nullable(list(stringArg())), }, resolve: searchTagResolver, }); diff --git a/api/src/resolvers/topics/timingsMutation.ts b/api/src/resolvers/topics/timingsMutation.ts index c6682cdf..eca79949 100644 --- a/api/src/resolvers/topics/timingsMutation.ts +++ b/api/src/resolvers/topics/timingsMutation.ts @@ -1,5 +1,5 @@ import snakecaseKey from 'snakecase-keys'; -import { FieldResolver, mutationField, intArg } from '@nexus/schema'; +import { FieldResolver, mutationField, intArg, list } from 'nexus'; import { errorHandler, getTopicTimings } from '../../helpers'; import { Context } from '../../types'; @@ -31,8 +31,8 @@ export let timingsResolver: FieldResolver<'Mutation', 'timings'> = async ( export let timingsMutation = mutationField('timings', { type: 'String', args: { - postNumbers: intArg({ list: true, required: true }), - topicId: intArg({ required: true }), + postNumbers: list(intArg()), + topicId: intArg(), }, resolve: timingsResolver, }); diff --git a/api/src/resolvers/topics/topicDetailQuery.ts b/api/src/resolvers/topics/topicDetailQuery.ts index c8f2abe9..9d1f1354 100644 --- a/api/src/resolvers/topics/topicDetailQuery.ts +++ b/api/src/resolvers/topics/topicDetailQuery.ts @@ -1,40 +1,77 @@ -/* eslint-disable @typescript-eslint/camelcase */ -import camelcaseKey from 'camelcase-keys'; -import { FieldResolver, queryField, intArg } from '@nexus/schema'; +import { FieldResolver, queryField, booleanArg, nullable } from 'nexus'; -import { errorHandler, getTopicPostPath } from '../../helpers'; +import { FIRST_POST_NUMBER, LIKE_ACTION_ID } from '../../constants'; +import { + validateTopicDetailOptionalArgs, + errorHandler, + fetchPost, + fetchTopicDetail, + getTopicDetailBaseArgs, +} from '../../helpers'; import { Context } from '../../types'; -import { ACCEPTED_LANGUAGE } from '../../constants'; let topicDetailQueryResolver: FieldResolver<'Query', 'topicDetail'> = async ( _, - { topicId, posts, postPointer }, - context: Context, + { topicId, postIds, postNumber, includeFirstPost }, + { client }: Context, ) => { - const config = { - headers: { - 'Accept-Language': ACCEPTED_LANGUAGE, - }, - params: { post_ids: posts, include_raw: true }, - }; - try { - let postPath = getTopicPostPath(posts, postPointer); - let url = `/t/${topicId}${postPath}.json`; - let { data: topicDetailResult } = await context.client.get(url, config); + validateTopicDetailOptionalArgs({ postIds, postNumber, includeFirstPost }); + const data = await fetchTopicDetail({ + client, + topicId, + postIds, + postNumber, + }); + const firstPostOfData = data.postStream.posts[0]; + if (firstPostOfData) { + let isLiked = !!firstPostOfData.actionsSummary.find( + ({ id }: { id: number }) => { + return id === LIKE_ACTION_ID; + }, + )?.acted; + data.liked = isLiked; + } + + if (firstPostOfData.postNumber === FIRST_POST_NUMBER) { + data.postStream.posts = data.postStream.posts.slice(1); + if (includeFirstPost) { + data.postStream.firstPost = firstPostOfData; + } + return data; + } + + if (!includeFirstPost) { + return data; + } - return camelcaseKey(topicDetailResult, { deep: true }); - } catch (error) { + const firstPostId = data.postStream.stream?.[0]; + if (!firstPostId) { + throw new Error('First post ID is not provided in topic stream'); + } + const firstPostOfTopic = await fetchPost({ client, postId: firstPostId }); + data.postStream.firstPost = firstPostOfTopic; + return data; + } catch (error: unknown) { throw errorHandler(error); } }; +/** + * By specifying postNumber, Discourse API will return posts + * with the following conditions: + * if total post <= 20: all posts + * else if postNumber <= 5: the first 20 posts + * else if postNumber > total post - 20 + 5: 20 latest posts + * else if postNumber > 5: 20 posts starting from postNumber - 5 + * Note that 20 is the maximum post counts per fetch + * and 5 is the value from Discourse + */ let topicDetailQuery = queryField('topicDetail', { type: 'TopicDetailOutput', args: { - posts: intArg({ list: true }), - topicId: intArg({ required: true }), - postPointer: intArg(), + ...getTopicDetailBaseArgs(), + includeFirstPost: nullable(booleanArg()), }, resolve: topicDetailQueryResolver, }); diff --git a/api/src/resolvers/topics/topicsQuery.ts b/api/src/resolvers/topics/topicsQuery.ts index 1170bf4c..4ae4e685 100644 --- a/api/src/resolvers/topics/topicsQuery.ts +++ b/api/src/resolvers/topics/topicsQuery.ts @@ -5,16 +5,21 @@ import { arg, intArg, stringArg, -} from '@nexus/schema'; + nullable, +} from 'nexus'; -import { errorHandler, parseTopicUrl } from '../../helpers'; -import { Context } from '../../types'; -import { ACCEPTED_LANGUAGE } from '../../constants'; +import { + errorHandler, + fetchLikeActivities, + parseTopicUrl, +} from '../../helpers'; +import { Context, Topic, UserIcon } from '../../types'; +import { ACCEPTED_LANGUAGE, FIRST_POST_NUMBER } from '../../constants'; let topicsQueryResolver: FieldResolver<'Query', 'topics'> = async ( _, - { page, ...filterInput }, - context: Context, + { page, username, ...filterInput }, + { client, isAuth }: Context, ) => { const config = { headers: { @@ -25,12 +30,44 @@ let topicsQueryResolver: FieldResolver<'Query', 'topics'> = async ( }, }; try { - let { data: topicResult } = await context.client.get( + let { data: topicResult } = await client.get( `/${parseTopicUrl(filterInput)}.json`, config, ); - return camelcaseKey(topicResult, { deep: true }); + const topics = camelcaseKey(topicResult, { deep: true }); + if (isAuth && username) { + // Determine `liked` value based on whether users like the first post of the topic + const activities = await fetchLikeActivities({ username, client }); + + // TODO: Do more research to find the best solution #783 + const likedFirstPostInTopics = new Set(); + activities.forEach(({ postNumber, topicId }) => { + if (postNumber === FIRST_POST_NUMBER) { + likedFirstPostInTopics.add(topicId); + } + }); + topics.topicList.topics = topics.topicList.topics.map((topic: Topic) => { + const { id, liked } = topic; + + let updatedLiked = liked ? likedFirstPostInTopics.has(id) : false; + return { ...topic, liked: updatedLiked }; + }); + } + + let { users }: { users: Array } = topics; + topics.topicList.topics = topics.topicList.topics.map((topic: Topic) => { + const { posters } = topic; + let postersWithUser = posters.map((poster) => { + return { + ...poster, + user: poster.user ?? users.find(({ id }) => id === poster.userId), + }; + }); + return { ...topic, posters: postersWithUser }; + }); + + return topics; } catch (error) { throw errorHandler(error); } @@ -39,11 +76,12 @@ let topicsQueryResolver: FieldResolver<'Query', 'topics'> = async ( let topicsQuery = queryField('topics', { type: 'TopicsOutput', args: { - sort: arg({ type: 'TopicsSortEnum', required: true }), - categoryId: intArg(), - topPeriod: arg({ type: 'TopPeriodEnum' }), - tag: stringArg(), - page: intArg(), + sort: arg({ type: 'TopicsSortEnum' }), + categoryId: nullable(intArg()), + topPeriod: nullable(arg({ type: 'TopPeriodEnum' })), + tag: nullable(stringArg()), + page: nullable(intArg()), + username: nullable(stringArg()), }, resolve: topicsQueryResolver, }); diff --git a/api/src/resolvers/upload/lookupUrlsQuery.ts b/api/src/resolvers/upload/lookupUrlsQuery.ts index 5d8f6d6c..413416bc 100644 --- a/api/src/resolvers/upload/lookupUrlsQuery.ts +++ b/api/src/resolvers/upload/lookupUrlsQuery.ts @@ -1,5 +1,5 @@ import camelcaseKeys from 'camelcase-keys'; -import { FieldResolver, queryField, stringArg } from '@nexus/schema'; +import { FieldResolver, list, queryField, stringArg } from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -11,7 +11,6 @@ let lookupUrlsQueryResolver: FieldResolver<'Query', 'lookupUrls'> = async ( context: Context, ) => { let body = { - // eslint-disable-next-line @typescript-eslint/camelcase short_urls: shortUrls, }; const config = { @@ -35,10 +34,9 @@ let lookupUrlsQueryResolver: FieldResolver<'Query', 'lookupUrls'> = async ( }; let lookupUrlsQuery = queryField('lookupUrls', { - type: 'LookupUrl', - list: true, + type: list('LookupUrl'), args: { - shortUrls: stringArg({ required: true, list: true }), + shortUrls: list(stringArg()), }, resolve: lookupUrlsQueryResolver, }); diff --git a/api/src/resolvers/upload/uploadMutation.ts b/api/src/resolvers/upload/uploadMutation.ts index 6f5dacc0..790fed4e 100644 --- a/api/src/resolvers/upload/uploadMutation.ts +++ b/api/src/resolvers/upload/uploadMutation.ts @@ -1,6 +1,6 @@ import camelcaseKeys from 'camelcase-keys'; import FormData from 'form-data'; -import { FieldResolver, mutationField, arg, intArg } from '@nexus/schema'; +import { FieldResolver, mutationField, arg, intArg, nullable } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; @@ -14,9 +14,10 @@ export let uploadResolver: FieldResolver<'Mutation', 'upload'> = async ( throw new Error('Upload avatar must include user id.'); } const form = new FormData(); - let { createReadStream } = await file; - let fileStream = createReadStream(); - form.append('files[]', fileStream); + + const fileBuffer = Buffer.from(await file.arrayBuffer()); + + form.append('files[]', fileBuffer, file.name); form.append('type', type); if (userId) { form.append('user_id', userId); @@ -41,10 +42,10 @@ export let uploadResolver: FieldResolver<'Mutation', 'upload'> = async ( export let uploadMutation = mutationField('upload', { type: 'UploadOutput', args: { - file: arg({ type: 'Upload', required: true }), - type: arg({ type: 'UploadTypeEnum', required: true }), - userId: intArg(), - token: intArg(), + file: arg({ type: 'File' }), + type: arg({ type: 'UploadTypeEnum' }), + userId: nullable(intArg()), + token: nullable(intArg()), }, resolve: uploadResolver, }); diff --git a/api/src/resolvers/user/badgeQuery.ts b/api/src/resolvers/user/badgeQuery.ts index 7493e120..3bfe8b39 100644 --- a/api/src/resolvers/user/badgeQuery.ts +++ b/api/src/resolvers/user/badgeQuery.ts @@ -1,5 +1,5 @@ import camelcaseKeys from 'camelcase-keys'; -import { FieldResolver, queryField } from '@nexus/schema'; +import { FieldResolver, queryField } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; diff --git a/api/src/resolvers/user/changeUsernameMutation.ts b/api/src/resolvers/user/changeUsernameMutation.ts index d712302c..c199fbae 100644 --- a/api/src/resolvers/user/changeUsernameMutation.ts +++ b/api/src/resolvers/user/changeUsernameMutation.ts @@ -1,7 +1,7 @@ import { stringify } from 'querystring'; import snakecaseKeys from 'snakecase-keys'; -import { FieldResolver, mutationField, stringArg } from '@nexus/schema'; +import { FieldResolver, mutationField, stringArg } from 'nexus'; import { CONTENT_FORM_URLENCODED } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -32,8 +32,8 @@ export let changeUsernameResolver: FieldResolver< export let changeUsernameMutation = mutationField('changeUsername', { type: 'ChangeUsernameOutput', args: { - newUsername: stringArg({ required: true }), - oldUsername: stringArg({ required: true }), + newUsername: stringArg(), + oldUsername: stringArg(), }, resolve: changeUsernameResolver, }); diff --git a/api/src/resolvers/user/editProfileMutation.ts b/api/src/resolvers/user/editProfileMutation.ts index 8cded8a4..2eb86754 100644 --- a/api/src/resolvers/user/editProfileMutation.ts +++ b/api/src/resolvers/user/editProfileMutation.ts @@ -6,7 +6,8 @@ import { arg, intArg, stringArg, -} from '@nexus/schema'; + nullable, +} from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -67,10 +68,10 @@ export let editProfileMutation: FieldResolver< export let editProfile = mutationField('editProfile', { type: 'UserDetail', args: { - editProfileInput: arg({ type: 'EditProfileInput' }), - username: stringArg({ required: true }), - newUsername: stringArg(), - uploadId: intArg(), + editProfileInput: nullable(arg({ type: 'EditProfileInput' })), + username: stringArg(), + newUsername: nullable(stringArg()), + uploadId: nullable(intArg()), }, resolve: editProfileMutation, }); diff --git a/api/src/resolvers/user/saveProfilePictureMutation.ts b/api/src/resolvers/user/saveProfilePictureMutation.ts index 90a05e1b..cee364ab 100644 --- a/api/src/resolvers/user/saveProfilePictureMutation.ts +++ b/api/src/resolvers/user/saveProfilePictureMutation.ts @@ -1,4 +1,4 @@ -import { FieldResolver, mutationField, intArg, stringArg } from '@nexus/schema'; +import { FieldResolver, mutationField, intArg, stringArg } from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -15,7 +15,6 @@ export let saveProfilePictureResolver: FieldResolver< }, }; let body = { - // eslint-disable-next-line @typescript-eslint/camelcase upload_id: uploadId, type: 'uploaded', }; @@ -34,8 +33,8 @@ export let saveProfilePictureResolver: FieldResolver< export let saveProfilePictureMutation = mutationField('saveProfilePicture', { type: 'String', args: { - uploadId: intArg({ required: true }), - username: stringArg({ required: true }), + uploadId: intArg(), + username: stringArg(), }, resolve: saveProfilePictureResolver, }); diff --git a/api/src/resolvers/user/searchUserQuery.ts b/api/src/resolvers/user/searchUserQuery.ts index c39e1d06..1c0d227b 100644 --- a/api/src/resolvers/user/searchUserQuery.ts +++ b/api/src/resolvers/user/searchUserQuery.ts @@ -1,6 +1,6 @@ import camelcaseKey from 'camelcase-keys'; import snakecaseKeys from 'snakecase-keys'; -import { FieldResolver, queryField, stringArg } from '@nexus/schema'; +import { FieldResolver, queryField, stringArg } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; @@ -42,7 +42,7 @@ let searchUserQueryResolver: FieldResolver<'Query', 'searchUser'> = async ( let searchUserQuery = queryField('searchUser', { type: 'SearchUserOutput', args: { - search: stringArg({ required: true }), + search: stringArg(), }, resolve: searchUserQueryResolver, }); diff --git a/api/src/resolvers/user/singleBadgeQuery.ts b/api/src/resolvers/user/singleBadgeQuery.ts index 08e5f157..dd23fd53 100644 --- a/api/src/resolvers/user/singleBadgeQuery.ts +++ b/api/src/resolvers/user/singleBadgeQuery.ts @@ -1,5 +1,5 @@ import camelcaseKeys from 'camelcase-keys'; -import { FieldResolver, queryField, intArg } from '@nexus/schema'; +import { FieldResolver, queryField, intArg } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; @@ -21,7 +21,7 @@ let singleBadgeQueryResolver: FieldResolver<'Query', 'singleBadge'> = async ( let singleBadgeQuery = queryField('singleBadge', { type: 'SingleBadgeOutput', args: { - id: intArg({ required: true }), + id: intArg(), }, resolve: singleBadgeQueryResolver, }); diff --git a/api/src/resolvers/user/userActivityQuery.ts b/api/src/resolvers/user/userActivityQuery.ts index 81c504de..5564cc2a 100644 --- a/api/src/resolvers/user/userActivityQuery.ts +++ b/api/src/resolvers/user/userActivityQuery.ts @@ -1,8 +1,15 @@ import camelcaseKeys from 'camelcase-keys'; -import { FieldResolver, queryField, intArg, stringArg } from '@nexus/schema'; - -import { errorHandler } from '../../helpers'; -import { Context, UserAction } from '../../types'; +import { + FieldResolver, + queryField, + intArg, + stringArg, + list, + nullable, +} from 'nexus'; + +import { errorHandler, USER_ACTIONS_URL } from '../../helpers'; +import { Context } from '../../types'; let userActivityQueryResolver: FieldResolver<'Query', 'userActivity'> = async ( _, @@ -21,64 +28,34 @@ let userActivityQueryResolver: FieldResolver<'Query', 'userActivity'> = async ( offset, username, filter, - // eslint-disable-next-line @typescript-eslint/camelcase no_results_help_key: 'user_activity.no_default', }; const config = { params: body, }; - let url = '/user_actions.json'; - try { - if (filter === '1') { - let fetchAll = true; - let userAction: Array = []; - let fetchAllOffset = 0; - - while (fetchAll) { - let fetchAllBody = { - offset: fetchAllOffset, - username, - filter, - }; - - const fetchAllConfig = { - params: fetchAllBody, - }; - let { data: userActivityResult } = await context.client.get( - url, - fetchAllConfig, - ); - let tempUserAction = userActivityResult.user_actions; - fetchAllOffset = fetchAllOffset + 30; - userAction = [...userAction, ...tempUserAction]; - if (tempUserAction.length < 30) { - fetchAll = false; - } - } - return camelcaseKeys(userAction, { deep: true }); - } else { - let { data: userActivityResult } = await context.client.get(url, config); - let userAction = userActivityResult.user_actions; - if (!userAction) { - return []; - } else { - return camelcaseKeys(userAction, { deep: true }); - } + let { data: userActivityResult } = await context.client.get( + USER_ACTIONS_URL, + config, + ); + let userActions = userActivityResult.user_actions; + if (!userActions) { + return []; } + + return camelcaseKeys(userActions, { deep: true }); } catch (error) { throw errorHandler(error); } }; let userActivityQuery = queryField('userActivity', { - type: 'UserActions', - list: true, + type: list('UserActions'), args: { - username: stringArg({ required: true }), - offset: intArg({ required: true }), - filter: stringArg(), + username: stringArg(), + offset: intArg(), + filter: nullable(stringArg()), }, resolve: userActivityQueryResolver, }); diff --git a/api/src/resolvers/user/userProfileQuery.ts b/api/src/resolvers/user/userProfileQuery.ts index 7959b26e..ff1f8dce 100644 --- a/api/src/resolvers/user/userProfileQuery.ts +++ b/api/src/resolvers/user/userProfileQuery.ts @@ -1,6 +1,6 @@ import { AxiosResponse } from 'axios'; import camelcaseKey from 'camelcase-keys'; -import { FieldResolver, queryField, stringArg } from '@nexus/schema'; +import { FieldResolver, queryField, stringArg } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context, NotificationOutput } from '../../types'; @@ -17,11 +17,8 @@ let userProfileQueryResolver: FieldResolver<'Query', 'userProfile'> = async ( let thereIsUnreadNotif = false; if (camelcasedData.user.hasOwnProperty('email')) { - let { - data: notifData, - }: AxiosResponse = await context.client.get( - '/notifications.json?filter=unread&limit=30', - ); + let { data: notifData }: AxiosResponse = + await context.client.get('/notifications.json?filter=unread&limit=30'); thereIsUnreadNotif = !!notifData.notifications.length; } @@ -34,7 +31,7 @@ let userProfileQueryResolver: FieldResolver<'Query', 'userProfile'> = async ( let userProfileQuery = queryField('userProfile', { type: 'UserProfileOutput', args: { - username: stringArg({ required: true }), + username: stringArg(), }, resolve: userProfileQueryResolver, }); diff --git a/api/src/resolvers/utils.ts b/api/src/resolvers/utils.ts new file mode 100644 index 00000000..073ad094 --- /dev/null +++ b/api/src/resolvers/utils.ts @@ -0,0 +1,48 @@ +import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; + +export type WithUrlTemplate = + | { avatarTemplate: string } + | { actingAvatarTemplate: string } + | { systemAvatarTemplate: string } + | { url: string }; + +export type NormalizedUrlTemplateVariant = + | 'regularAvatar' + | 'actingAvatar' + | 'systemAvatar' + | 'url'; + +export function getNormalizedUrlTemplate( + instance: WithUrlTemplate, + variant: NormalizedUrlTemplateVariant = 'regularAvatar', +) { + let urlTemplate = ''; + + if (variant === 'regularAvatar') { + if ('avatarTemplate' in instance) { + urlTemplate = instance.avatarTemplate; + } + } else if (variant === 'actingAvatar') { + if ('actingAvatarTemplate' in instance) { + urlTemplate = instance.actingAvatarTemplate; + } + } else if (variant === 'url') { + if ('url' in instance) { + urlTemplate = instance.url; + } + } else { + if ('systemAvatarTemplate' in instance) { + urlTemplate = instance.systemAvatarTemplate; + } + } + + if (!urlTemplate) { + // TODO: #764 Add a Basic Logger + // console.debug('url template was empty for instance', instance); + return ''; + } + + return urlTemplate.includes('http') + ? urlTemplate + : PROSE_DISCOURSE_UPLOAD_HOST.concat(urlTemplate); +} diff --git a/api/src/scalars/BookmarkReminderEnum.ts b/api/src/scalars/BookmarkReminderEnum.ts index ed628d3a..2ae85ff4 100644 --- a/api/src/scalars/BookmarkReminderEnum.ts +++ b/api/src/scalars/BookmarkReminderEnum.ts @@ -1,4 +1,4 @@ -import { enumType } from '@nexus/schema'; +import { enumType } from 'nexus'; export let BookmarkReminderEnum = enumType({ name: 'BookmarkReminderEnum', diff --git a/api/src/scalars/File.ts b/api/src/scalars/File.ts new file mode 100644 index 00000000..814c6592 --- /dev/null +++ b/api/src/scalars/File.ts @@ -0,0 +1,18 @@ +import { GraphQLError } from 'graphql'; +import { scalarType } from 'nexus'; + +export const FileScalar = scalarType({ + name: 'File', + asNexusMethod: 'file', + description: 'The `File` scalar type represents a file upload.', + sourceType: 'File', + parseValue(value) { + return value; + }, + parseLiteral(node) { + throw new GraphQLError('Upload literal unsupported.', { nodes: node }); + }, + serialize() { + throw new GraphQLError('Upload serialization unsupported.'); + }, +}); diff --git a/api/src/scalars/LikeOutputUnion.ts b/api/src/scalars/LikeOutputUnion.ts new file mode 100644 index 00000000..c31d06c8 --- /dev/null +++ b/api/src/scalars/LikeOutputUnion.ts @@ -0,0 +1,11 @@ +import { unionType } from 'nexus'; + +export const LikeOutputUnion = unionType({ + name: 'LikeOutputUnion', + definition(t) { + t.members('LikedTopic', 'Post'); + }, + resolveType: (item) => { + return item.hasOwnProperty('actionsSummary') ? 'Post' : 'LikedTopic'; + }, +}); diff --git a/api/src/scalars/LoginOutputUnion.ts b/api/src/scalars/LoginOutputUnion.ts index 85f85e9d..258fa50d 100644 --- a/api/src/scalars/LoginOutputUnion.ts +++ b/api/src/scalars/LoginOutputUnion.ts @@ -1,14 +1,14 @@ -import { unionType } from '@nexus/schema'; +import { unionType } from 'nexus'; export let LoginOutputUnion = unionType({ name: 'LoginOutputUnion', definition(t) { t.members('LoginOutput', 'SecondFactorRequired'); - t.resolveType((item) => { - if (item.hasOwnProperty('secondFactorRequired')) { - return 'SecondFactorRequired'; - } - return 'LoginOutput'; - }); + }, + resolveType: (item) => { + if (item.hasOwnProperty('secondFactorRequired')) { + return 'SecondFactorRequired'; + } + return 'LoginOutput'; }, }); diff --git a/api/src/scalars/NotificationDataType.ts b/api/src/scalars/NotificationDataType.ts index a81f520c..971a020f 100644 --- a/api/src/scalars/NotificationDataType.ts +++ b/api/src/scalars/NotificationDataType.ts @@ -1,10 +1,10 @@ -import { objectType, unionType } from '@nexus/schema'; +import { objectType, unionType } from 'nexus'; export const UnknownNotification = objectType({ // This will handle if notif data are unknown name: 'UnknownNotification', definition(t) { - t.string('text', { nullable: true }); + t.nullable.string('text'); }, }); @@ -19,21 +19,21 @@ export let NotificationDataType = unionType({ 'InviteeAccept', 'UnknownNotification', ); - t.resolveType((item) => { - switch (true) { - case item.hasOwnProperty('badgeId'): - return 'BadgeNotification'; - case item.hasOwnProperty('originalPostId'): - return 'ActionPostNotification'; - case item.hasOwnProperty('groupId'): - return 'AdminMessageNotification'; - case item.hasOwnProperty('topicTitle'): - return 'AdminMessageInvitation'; - case item.hasOwnProperty('displayUsername'): - return 'InviteeAccept'; - default: - return 'UnknownNotification'; - } - }); + }, + resolveType: (item) => { + switch (true) { + case item.hasOwnProperty('badgeId'): + return 'BadgeNotification'; + case item.hasOwnProperty('originalPostId'): + return 'ActionPostNotification'; + case item.hasOwnProperty('groupId'): + return 'AdminMessageNotification'; + case item.hasOwnProperty('topicTitle'): + return 'AdminMessageInvitation'; + case item.hasOwnProperty('displayUsername'): + return 'InviteeAccept'; + default: + return 'UnknownNotification'; + } }, }); diff --git a/api/src/scalars/TopPeriodEnum.ts b/api/src/scalars/TopPeriodEnum.ts index 8bffcff2..5fde0fe0 100644 --- a/api/src/scalars/TopPeriodEnum.ts +++ b/api/src/scalars/TopPeriodEnum.ts @@ -1,4 +1,4 @@ -import { enumType } from '@nexus/schema'; +import { enumType } from 'nexus'; export let TopPeriodEnum = enumType({ name: 'TopPeriodEnum', diff --git a/api/src/scalars/TopicsSortEnum.ts b/api/src/scalars/TopicsSortEnum.ts index a6b08fc6..aeca1086 100644 --- a/api/src/scalars/TopicsSortEnum.ts +++ b/api/src/scalars/TopicsSortEnum.ts @@ -1,4 +1,4 @@ -import { enumType } from '@nexus/schema'; +import { enumType } from 'nexus'; export let TopicsSortEnum = enumType({ name: 'TopicsSortEnum', diff --git a/api/src/scalars/Upload.ts b/api/src/scalars/Upload.ts deleted file mode 100644 index d6c45407..00000000 --- a/api/src/scalars/Upload.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { GraphQLUpload } from 'graphql-upload'; - -export const Upload = GraphQLUpload; diff --git a/api/src/scalars/UploadTypeEnum.ts b/api/src/scalars/UploadTypeEnum.ts index 2f4b2384..b68ec3fa 100644 --- a/api/src/scalars/UploadTypeEnum.ts +++ b/api/src/scalars/UploadTypeEnum.ts @@ -1,4 +1,4 @@ -import { enumType } from '@nexus/schema'; +import { enumType } from 'nexus'; export let UploadTypeEnum = enumType({ name: 'UploadTypeEnum', diff --git a/api/src/scalars/UserUnion.ts b/api/src/scalars/UserUnion.ts index d7c53c38..fbca1e95 100644 --- a/api/src/scalars/UserUnion.ts +++ b/api/src/scalars/UserUnion.ts @@ -1,14 +1,14 @@ -import { unionType } from '@nexus/schema'; +import { unionType } from 'nexus'; export let UserUnion = unionType({ name: 'UserUnion', definition(t) { t.members('UserLite', 'UserDetail'); - t.resolveType((item) => { - if (item.hasOwnProperty('email')) { - return 'UserDetail'; - } - return 'UserLite'; - }); + }, + resolveType: (item) => { + if (item.hasOwnProperty('email')) { + return 'UserDetail'; + } + return 'UserLite'; }, }); diff --git a/api/src/scalars/index.ts b/api/src/scalars/index.ts index bae19fce..8287d081 100644 --- a/api/src/scalars/index.ts +++ b/api/src/scalars/index.ts @@ -1,8 +1,9 @@ export * from './BookmarkReminderEnum'; +export * from './LikeOutputUnion'; export * from './LoginOutputUnion'; export * from './NotificationDataType'; export * from './TopicsSortEnum'; export * from './TopPeriodEnum'; -export * from './Upload'; +export * from './File'; export * from './UploadTypeEnum'; export * from './UserUnion'; diff --git a/api/src/schema.ts b/api/src/schema.ts index 710fd800..a3c2d29f 100644 --- a/api/src/schema.ts +++ b/api/src/schema.ts @@ -1,12 +1,16 @@ import * as path from 'path'; -import { makeSchema } from '@nexus/schema'; +import { makeSchema } from 'nexus'; import * as Resolvers from './resolvers'; import * as Scalars from './scalars'; import * as Types from './typeSchemas'; let schema = makeSchema({ + nonNullDefaults: { + output: true, + input: true, + }, types: [Resolvers, Types, Scalars], outputs: { schema: __dirname + '/generated/schema.graphql', diff --git a/api/src/server/banner.ts b/api/src/server/banner.ts index d7d2201e..32333b36 100644 --- a/api/src/server/banner.ts +++ b/api/src/server/banner.ts @@ -1,31 +1,11 @@ -import { - PROSE_DISCOURSE_HOST, - PROSE_APP_PORT, - PROSE_APP_HOSTNAME, -} from '../constants'; +import { PROSE_DISCOURSE_HOST } from '../constants'; export function getServerBanner() { const messageTitle = '-- Prose GraphQL Discourse API --'; - let scheme = 'http://'; - - // Don't append a port suffix to the server banner unless one is set. - let portSuffix = PROSE_APP_PORT ? `:${PROSE_APP_PORT}` : ''; - - // If `PROSE_APP_PORT` is 443, don't print it in the banner. - // `https://myprosehost.com` looks better than `https://myprosehost.com:443`. - if (PROSE_APP_PORT === 443) { - scheme = 'https://'; - portSuffix = ''; - } - - // Compose the host we're listening on as the provided hostname followed by the port suffix. - const displayHost = `${scheme}${PROSE_APP_HOSTNAME}${portSuffix}`; - - const messageListening = `listening at ${displayHost}`; const messageForwarding = `forwarding Discourse requests to ${PROSE_DISCOURSE_HOST}`; - const lines = [messageTitle, messageListening, messageForwarding]; + const lines = [messageTitle, messageForwarding]; return lines.join('\n'); } diff --git a/api/src/server/graphql.ts b/api/src/server/graphql.ts deleted file mode 100644 index ec6c2201..00000000 --- a/api/src/server/graphql.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { GraphQLServer } from 'graphql-yoga'; -import { ContextParameters } from 'graphql-yoga/dist/types'; - -import { getClient } from '../client'; -import { decodeToken } from '../helpers/auth'; -import { permissions } from '../middlewares/permission'; -import { schema } from '../schema'; - -export const graphQLServer = new GraphQLServer({ - schema, - context: async ({ request }: ContextParameters) => { - let authorization = request.header('Authorization'); - let cookie = decodeToken(authorization); - if (cookie.includes('_t=')) { - return { - client: await getClient(cookie), - isAuth: true, - }; - } - return { - client: await getClient(), - isAuth: false, - }; - }, - middlewares: [permissions], -}); diff --git a/api/src/server/graphql/index.ts b/api/src/server/graphql/index.ts new file mode 100644 index 00000000..15a21fa4 --- /dev/null +++ b/api/src/server/graphql/index.ts @@ -0,0 +1,86 @@ +import { + createServer as createYogaServer, + useLogger, +} from '@graphql-yoga/node'; + +import { getClient } from '../../client'; +import { decodeToken } from '../../helpers/auth'; +import { schema } from '../../schema'; +import { Context } from '../../types'; +import { errorHandler } from '../../helpers'; +import { logger } from '../../logger'; +import { REFRESH_TOKEN_COOKIE_FIELD } from '../../constants'; + +import { authPlugin } from './plugins'; + +export function createServer(hostname: string, port: number) { + const graphQLServer = createYogaServer({ + schema, + hostname, + port, + + // The default behavior of GraphQL Yoga is to mask error messages. + // However, the Lexicon frontend makes use of these, and Discourse has several + // useful error messages, so here we instruct GraphQL Yoga to not mask the errors. + maskedErrors: false, + + context: async ({ request, res }): Promise => { + try { + let authorization = request.headers.get('Authorization'); + let cookie = decodeToken(authorization); + const userAgent = request.headers.get('User-Agent') ?? ''; + + if (cookie.includes(REFRESH_TOKEN_COOKIE_FIELD)) { + return { + client: await getClient({ + cookies: cookie, + userAgent, + context: { request, response: res }, + }), + isAuth: true, + }; + } + + return { + client: await getClient({ + userAgent, + context: { request, response: res }, + }), + isAuth: false, + }; + } catch (error) { + errorHandler(error); + throw error; // avoid no return type, this shouldn't be reachable as errorHandler already throw + } + }, + endpoint: '/', + plugins: [ + authPlugin, + useLogger({ + skipIntrospection: true, + logFn: (eventName, events) => { + switch (eventName) { + case 'execute-end': + case 'subscribe-end': + if ((events.result.errors?.length ?? 0) < 1) { + break; + } + for (let error of events.result.errors) { + const dateTime = new Date(); + logger.log( + 'error', + '[%s] [%s] %s', + dateTime.toUTCString(), + error.path[0], + error.message, + ); + } + break; + } + }, + }), + ], + }); + + return graphQLServer; +} diff --git a/api/src/server/graphql/plugins.ts b/api/src/server/graphql/plugins.ts new file mode 100644 index 00000000..361a90ca --- /dev/null +++ b/api/src/server/graphql/plugins.ts @@ -0,0 +1,99 @@ +import { AuthSchema, preExecRule } from '@graphql-authz/core'; +import { authZEnvelopPlugin } from '@graphql-authz/envelop-plugin'; + +import { Context } from '../../types'; + +/** + * ## About the `plugins.ts` file + * + * `plugins` are intended to be used with our GraphQL server, GraphQL Yoga, which + * internally leverages Envelop for its plugin system. + * + * Envelop is a library that serves as a GraphQL plugin system. + * + * `graphql-authz` is one such plugin that is compatible with Envelop. It provides a + * powerful and flexible authorization solution. + * + * `graphql-authz` works by wrapping the GraphQL execution phase. This allows you to run + * authorization logic before and after this phase, via Pre-exec Rules and Post-exec Rules. + * + * - The pre-execution phase is for static auth rules based on context & input. + * - The post-execution phase is for flexible auth rules based on the execution result. + * + * This is currently the only plugin that we require for this project. We use it to ensure + * that the user is authenticated in order to perform certain queries and mutations. + * + * When a request does not include authenticated information for one of these operations, + * it returns a simple message "You need to be logged in to do that." + * + * This mirrors the message that Discourse returns in this situation, so it may not + * be necessary. But it may be allowing us to provide a more uniform response. It is a + * topic that can be investigated if necessary. + * + * All of the authenticated queries and mutations are specified below. + * + * These primarily consist of mutations, since those are typically the only operations + * in Discourse that require an authenticated user. The exceptions to this are the queries + * for notifications, private messages, and badges (which don't make sense for an anonymous + * user). + * + * Also, the `login` mutation does not require an authenticated user, as that is + * the way in which a user becomes authenticated. + */ + +// Create our Rule, which simply checks the context to see if the user is authenticated. +// If they are not, return `unauthenticatedMessage` as the error message. +const unauthenticatedMessage = 'You need to be logged in to do that.'; +const configureRule = preExecRule({ error: unauthenticatedMessage }); +const IsAuthenticated = configureRule(({ isAuth }: Context) => isAuth); + +// This function generates the necessary boilerplate for the authzEnvelopPlugin +// so that we can generate the `authSchema` that it expects. +// +// `authZEnvelopPlugin` allows us to reference our rule by its string-literal +// representation, which is mapped when we declare the `rules` variable below. +function getAuthenticatedSchema(keys: Array) { + return keys.reduce( + (accumulator, current) => ({ + ...accumulator, + [current]: { __authz: { rules: ['IsAuthenticated'] } }, + }), + {}, + ); +} + +// Below we define the queries and mutations that require authentication. +const guardedQueries = ['notification', 'privateMessage', 'badge']; +const guardedMutations = [ + 'timings', + 'newPrivateMessage', + 'newTopic', + 'reply', + 'editPost', + 'editTopic', + 'addEmail', + 'changeEmail', + 'deleteEmail', + 'setPrimaryEmail', + 'bookmarkPost', + 'changeUsername', + 'flagPost', + 'likeTopicOrPost', + 'upload', + 'editProfile', + 'saveProfilePicture', +]; + +const authenticatedSchema: AuthSchema = { + Mutation: getAuthenticatedSchema(guardedMutations), + Query: getAuthenticatedSchema(guardedQueries), +}; + +// Define the rules for our `authZEnvelopPlugin`, in this case just +// our `IsAuthenticated` rule from above. +const rules = { IsAuthenticated } as const; + +export const authPlugin = authZEnvelopPlugin({ + rules, + authSchema: authenticatedSchema, +}); diff --git a/api/src/server/index.ts b/api/src/server/index.ts index cab6320a..462f8779 100644 --- a/api/src/server/index.ts +++ b/api/src/server/index.ts @@ -1,36 +1,16 @@ /* eslint-disable no-console */ -import { Server } from 'http'; - import { PROSE_APP_PORT, PROSE_APP_HOSTNAME } from '../constants'; import { checkDiscourseReachability } from './validate'; -import { graphQLServer } from './graphql'; +import { createServer } from './graphql'; import { getServerBanner } from './banner'; -// `graphql-yoga` doesn't seem to support providing a custom hostname to Express (in its latest published release). -// Here, we write a helper function to use the underlying parts of `graphql-yoga` to pass -// the correct parameters to Express. -// -// Note: `graphql-yoga` has recently changed maintainers, and they don't seem to intend to make any releases, -// even with the existing useful changes, until they have done a huge refactor based around their tool, Envelop. -let httpServer: Server; -function start() { - httpServer = graphQLServer.createHttpServer({ port: PROSE_APP_PORT }); - - httpServer.listen(PROSE_APP_PORT, PROSE_APP_HOSTNAME, () => - console.log(getServerBanner()), - ); -} - -function stop() { - if (!httpServer) { - return; - } +const server = createServer(PROSE_APP_HOSTNAME, PROSE_APP_PORT); +async function stop() { console.log('\nProse GraphQL: Waiting for open requests to finish...'); - httpServer.close(() => { - console.log('Stopping the Prose GraphQL Server.'); - }); + await server.stop(); + console.log('Stopping the Prose GraphQL Server.'); } export async function run() { @@ -38,5 +18,6 @@ export async function run() { process.on('SIGTERM', stop); process.on('SIGHUP', stop); - start(); + console.log('\n', getServerBanner(), '\n'); + await server.start(); } diff --git a/api/src/typeSchemas/About.ts b/api/src/typeSchemas/About.ts index e9f0479d..d24aedeb 100644 --- a/api/src/typeSchemas/About.ts +++ b/api/src/typeSchemas/About.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let About = objectType({ name: 'About', diff --git a/api/src/typeSchemas/ActionPostNotification.ts b/api/src/typeSchemas/ActionPostNotification.ts index c7ed2f0e..b442e38f 100644 --- a/api/src/typeSchemas/ActionPostNotification.ts +++ b/api/src/typeSchemas/ActionPostNotification.ts @@ -1,14 +1,14 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let ActionPostNotification = objectType({ name: 'ActionPostNotification', definition(t) { t.string('topicTitle'); t.int('originalPostId'); - t.int('originalPostType', { nullable: true }); + t.nullable.int('originalPostType'); t.string('originalUsername'); - t.int('revisionNumber', { nullable: true }); + t.nullable.int('revisionNumber'); t.string('displayUsername'); - t.string('count', { nullable: true }); + t.nullable.string('count'); }, }); diff --git a/api/src/typeSchemas/ActionSummary.ts b/api/src/typeSchemas/ActionSummary.ts index 4a67ed94..5ad89e77 100644 --- a/api/src/typeSchemas/ActionSummary.ts +++ b/api/src/typeSchemas/ActionSummary.ts @@ -1,13 +1,13 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let ActionSummary = objectType({ name: 'ActionSummary', definition(t) { t.int('id'); - t.boolean('hidden', { nullable: true }); - t.int('count', { nullable: true }); - t.boolean('canAct', { nullable: true }); - t.boolean('acted', { nullable: true }); - t.boolean('canUndo', { nullable: true }); + t.nullable.boolean('hidden'); + t.nullable.int('count'); + t.nullable.boolean('canAct'); + t.nullable.boolean('acted'); + t.nullable.boolean('canUndo'); }, }); diff --git a/api/src/typeSchemas/AdminMessageInvitation.ts b/api/src/typeSchemas/AdminMessageInvitation.ts index cbedd79a..950cb4ef 100644 --- a/api/src/typeSchemas/AdminMessageInvitation.ts +++ b/api/src/typeSchemas/AdminMessageInvitation.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let AdminMessageInvitation = objectType({ name: 'AdminMessageInvitation', diff --git a/api/src/typeSchemas/AdminMessageNotification.ts b/api/src/typeSchemas/AdminMessageNotification.ts index 0e3b7743..09a21f13 100644 --- a/api/src/typeSchemas/AdminMessageNotification.ts +++ b/api/src/typeSchemas/AdminMessageNotification.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let AdminMessageNotification = objectType({ name: 'AdminMessageNotification', diff --git a/api/src/typeSchemas/AssociatedAccounts.ts b/api/src/typeSchemas/AssociatedAccounts.ts index c76bca2e..5b739cb6 100644 --- a/api/src/typeSchemas/AssociatedAccounts.ts +++ b/api/src/typeSchemas/AssociatedAccounts.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let AssociatedAccounts = objectType({ name: 'AssociatedAccounts', diff --git a/api/src/typeSchemas/Badge.ts b/api/src/typeSchemas/Badge.ts index e73265c1..f7691844 100644 --- a/api/src/typeSchemas/Badge.ts +++ b/api/src/typeSchemas/Badge.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let Badge = objectType({ name: 'Badge', @@ -10,7 +10,7 @@ export let Badge = objectType({ t.boolean('allowTitle'); t.boolean('multipleGrant'); t.string('icon'); - t.string('image', { nullable: true }); + t.nullable.string('image'); t.boolean('listable'); t.boolean('enabled'); t.int('badgeGroupingId'); @@ -18,7 +18,7 @@ export let Badge = objectType({ t.string('slug'); t.boolean('manuallyGrantable'); t.int('badgeTypeId'); - t.boolean('hasBadge', { nullable: true }); - t.string('longDescription', { nullable: true }); + t.nullable.boolean('hasBadge'); + t.nullable.string('longDescription'); }, }); diff --git a/api/src/typeSchemas/BadgeGroupings.ts b/api/src/typeSchemas/BadgeGroupings.ts index df9906d5..64b05ca9 100644 --- a/api/src/typeSchemas/BadgeGroupings.ts +++ b/api/src/typeSchemas/BadgeGroupings.ts @@ -1,12 +1,12 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let BadgeGroupings = objectType({ name: 'BadgeGroupings', definition(t) { - t.string('description', { nullable: true }), - t.int('id'), - t.string('name'), - t.int('position'), - t.boolean('system'); + t.nullable.string('description'); + t.int('id'); + t.string('name'); + t.int('position'); + t.boolean('system'); }, }); diff --git a/api/src/typeSchemas/BadgeNotification.ts b/api/src/typeSchemas/BadgeNotification.ts index ec56ded6..61fa2253 100644 --- a/api/src/typeSchemas/BadgeNotification.ts +++ b/api/src/typeSchemas/BadgeNotification.ts @@ -1,12 +1,12 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let BadgeNotification = objectType({ name: 'BadgeNotification', definition(t) { t.int('badgeId'); t.string('badgeName'); - t.string('badgeSlug', { nullable: true }); - t.boolean('badgeTitle', { nullable: true }); + t.nullable.string('badgeSlug'); + t.nullable.boolean('badgeTitle'); t.string('username'); }, }); diff --git a/api/src/typeSchemas/BadgeOutput.ts b/api/src/typeSchemas/BadgeOutput.ts index f4a2ef5e..686ad399 100644 --- a/api/src/typeSchemas/BadgeOutput.ts +++ b/api/src/typeSchemas/BadgeOutput.ts @@ -1,10 +1,10 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let BadgeOutput = objectType({ name: 'BadgeOutput', definition(t) { - t.field('badgeGroupings', { type: 'BadgeGroupings', list: true }); - t.field('badgeTypes', { type: 'BadgeType', list: true }); - t.field('badges', { type: 'Badge', list: true }); + t.list.field('badgeGroupings', { type: 'BadgeGroupings' }); + t.list.field('badgeTypes', { type: 'BadgeType' }); + t.list.field('badges', { type: 'Badge' }); }, }); diff --git a/api/src/typeSchemas/BadgeType.ts b/api/src/typeSchemas/BadgeType.ts index 368434f7..7fe576ff 100644 --- a/api/src/typeSchemas/BadgeType.ts +++ b/api/src/typeSchemas/BadgeType.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let BadgeType = objectType({ name: 'BadgeType', diff --git a/api/src/typeSchemas/BasicTopic.ts b/api/src/typeSchemas/BasicTopic.ts index e59078b0..c05d726c 100644 --- a/api/src/typeSchemas/BasicTopic.ts +++ b/api/src/typeSchemas/BasicTopic.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let BasicTopic = objectType({ name: 'BasicTopic', diff --git a/api/src/typeSchemas/BookmarkOutput.ts b/api/src/typeSchemas/BookmarkOutput.ts index ddff5952..ba4f103b 100644 --- a/api/src/typeSchemas/BookmarkOutput.ts +++ b/api/src/typeSchemas/BookmarkOutput.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let BookmarkOutput = objectType({ name: 'BookmarkOutput', diff --git a/api/src/typeSchemas/Categories.ts b/api/src/typeSchemas/Categories.ts index 3a2eb102..ed7062a3 100644 --- a/api/src/typeSchemas/Categories.ts +++ b/api/src/typeSchemas/Categories.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let Categories = objectType({ name: 'Categories', @@ -6,10 +6,10 @@ export let Categories = objectType({ t.string('color'); t.string('defaultListFilter'); t.string('defaultTopPeriod'); - t.string('defaultView', { nullable: true }); + t.nullable.string('defaultView'); t.string('description'); t.string('descriptionExcerpt'); - t.string('descriptionText', { nullable: true }); + t.nullable.string('descriptionText'); t.boolean('hasChildren'); t.int('id'); t.int('minimunRequiredTags'); @@ -23,19 +23,19 @@ export let Categories = objectType({ t.boolean('readRestricted'); t.boolean('showSubcategoryList'); t.string('slug'); - t.boolean('sortAscending', { nullable: true }); - t.boolean('sortOrder', { nullable: true }); + t.nullable.boolean('sortAscending'); + t.nullable.boolean('sortOrder'); t.string('subcategoryListStyle'); t.string('textColor'); t.int('topicCount'); - t.string('topicTemplate', { nullable: true }); + t.nullable.string('topicTemplate'); t.string('topicUrl'); t.int('topicsAllTime'); t.int('topicsDay'); t.int('topicsMonth'); t.int('topicsWeek'); t.int('topicsYear'); - t.int('uploadedBackground', { nullable: true }); - t.int('uploadedLogo', { nullable: true }); + t.nullable.int('uploadedBackground'); + t.nullable.int('uploadedLogo'); }, }); diff --git a/api/src/typeSchemas/CategoryList.ts b/api/src/typeSchemas/CategoryList.ts index 0ad4ca92..30f2c3cc 100644 --- a/api/src/typeSchemas/CategoryList.ts +++ b/api/src/typeSchemas/CategoryList.ts @@ -1,13 +1,13 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let CategoryList = objectType({ name: 'CategoryList', definition(t) { t.boolean('canCreateCategory'); t.boolean('canCreateTopic'); - t.field('categories', { type: 'Categories', list: true }); - t.boolean('draft', { nullable: true }); + t.list.field('categories', { type: 'Categories' }); + t.nullable.boolean('draft'); t.string('draftKey'); - t.int('draftSequence', { nullable: true }); + t.nullable.int('draftSequence'); }, }); diff --git a/api/src/typeSchemas/ChangeUsernameOutput.ts b/api/src/typeSchemas/ChangeUsernameOutput.ts index 1700a127..7dbae91a 100644 --- a/api/src/typeSchemas/ChangeUsernameOutput.ts +++ b/api/src/typeSchemas/ChangeUsernameOutput.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let ChangeUsernameOutput = objectType({ name: 'ChangeUsernameOutput', diff --git a/api/src/typeSchemas/EditPostInput.ts b/api/src/typeSchemas/EditPostInput.ts index bed2ac72..95a87b4f 100644 --- a/api/src/typeSchemas/EditPostInput.ts +++ b/api/src/typeSchemas/EditPostInput.ts @@ -1,10 +1,10 @@ -import { inputObjectType } from '@nexus/schema'; +import { inputObjectType } from 'nexus'; export let EditPostInput = inputObjectType({ name: 'EditPostInput', definition(t) { - t.string('raw', { required: true }); - t.string('rawOld'); - t.string('editReason', { nullable: true }); + t.string('raw'); + t.nullable.string('rawOld'); + t.nullable.string('editReason'); }, }); diff --git a/api/src/typeSchemas/EditProfileInput.ts b/api/src/typeSchemas/EditProfileInput.ts index 120eb5b8..9d11a3e4 100644 --- a/api/src/typeSchemas/EditProfileInput.ts +++ b/api/src/typeSchemas/EditProfileInput.ts @@ -1,12 +1,12 @@ -import { inputObjectType } from '@nexus/schema'; +import { inputObjectType } from 'nexus'; export let EditProfileInput = inputObjectType({ name: 'EditProfileInput', definition(t) { - t.string('name'); - t.string('bioRaw'); - t.string('website'); - t.string('location'); - t.string('dateOfBirth'); + t.nullable.string('name'); + t.nullable.string('bioRaw'); + t.nullable.string('website'); + t.nullable.string('location'); + t.nullable.string('dateOfBirth'); }, }); diff --git a/api/src/typeSchemas/EditTopicInput.ts b/api/src/typeSchemas/EditTopicInput.ts index 729b45ef..f3c4f257 100644 --- a/api/src/typeSchemas/EditTopicInput.ts +++ b/api/src/typeSchemas/EditTopicInput.ts @@ -1,11 +1,11 @@ -import { inputObjectType } from '@nexus/schema'; +import { inputObjectType } from 'nexus'; export let EditTopicInput = inputObjectType({ name: 'EditTopicInput', definition(t) { - t.int('categoryId'); - t.string('featureLink'); //still not sure about the type of this var - t.string('tags', { list: true }); - t.string('title'); + t.nullable.int('categoryId'); + t.nullable.string('featureLink'); // TODO: still not sure about the type of this var + t.nullable.list.string('tags'); + t.nullable.string('title'); }, }); diff --git a/api/src/typeSchemas/Group.ts b/api/src/typeSchemas/Group.ts index d415238e..f18d1d27 100644 --- a/api/src/typeSchemas/Group.ts +++ b/api/src/typeSchemas/Group.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let Group = objectType({ name: 'Group', @@ -12,22 +12,22 @@ export let Group = objectType({ t.int('messageableLevel'); t.int('visibilityLevel'); t.boolean('primaryGroup'); - t.string('title', { nullable: true }); - t.boolean('grantTrustLevel', { nullable: true }); - t.string('flairUrl', { nullable: true }); - t.string('flairBgColor', { nullable: true }); - t.string('bioCooked', { nullable: true }); - t.string('flairColor', { nullable: true }); - t.string('bioExcerpt', { nullable: true }); + t.nullable.string('title'); + t.nullable.boolean('grantTrustLevel'); + t.nullable.string('flairUrl'); + t.nullable.string('flairBgColor'); + t.nullable.string('bioCooked'); + t.nullable.string('flairColor'); + t.nullable.string('bioExcerpt'); t.boolean('publicAdmission'); t.boolean('publicExit'); t.boolean('allowMembershipRequests'); - t.string('fullName', { nullable: true }); + t.nullable.string('fullName'); t.int('defaultNotificationLevel'); - t.string('membershipRequestTemplate', { nullable: true }); + t.nullable.string('membershipRequestTemplate'); t.int('membersVisibilityLevel'); t.boolean('canSeeMembers'); t.boolean('publishReadState'); - t.boolean('hasMessages', { nullable: true }); + t.nullable.boolean('hasMessages'); }, }); diff --git a/api/src/typeSchemas/GroupUser.ts b/api/src/typeSchemas/GroupUser.ts index c605dbcb..df53c518 100644 --- a/api/src/typeSchemas/GroupUser.ts +++ b/api/src/typeSchemas/GroupUser.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let GroupUser = objectType({ name: 'GroupUser', @@ -6,6 +6,8 @@ export let GroupUser = objectType({ t.int('groupId'); t.int('userId'); t.int('notificationLevel'); - t.boolean('owner', { nullable: true }); // If Admin change it's null + + // If this change is done by an admin, the value is null. + t.nullable.boolean('owner'); }, }); diff --git a/api/src/typeSchemas/GroupUsers.ts b/api/src/typeSchemas/GroupUsers.ts index 5f3eee68..76a72af6 100644 --- a/api/src/typeSchemas/GroupUsers.ts +++ b/api/src/typeSchemas/GroupUsers.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let GroupUsers = objectType({ name: 'GroupUsers', diff --git a/api/src/typeSchemas/GroupedSearchResult.ts b/api/src/typeSchemas/GroupedSearchResult.ts index 17e0ce8d..e26c3fd7 100644 --- a/api/src/typeSchemas/GroupedSearchResult.ts +++ b/api/src/typeSchemas/GroupedSearchResult.ts @@ -1,20 +1,20 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let GroupedSearchResult = objectType({ name: 'GroupedSearchResult', definition(t) { t.boolean('canCreateTopic'); - t.int('categoryIds', { list: true }); - t.int('groupIds', { list: true }); - t.boolean('moreCategories', { nullable: true }); - t.boolean('moreFullPageResults', { nullable: true }); - t.boolean('morePosts', { nullable: true }); - t.boolean('moreUsers', { nullable: true }); - t.int('postIds', { list: true }); + t.list.int('categoryIds'); + t.list.int('groupIds'); + t.nullable.boolean('moreCategories'); + t.nullable.boolean('moreFullPageResults'); + t.nullable.boolean('morePosts'); + t.nullable.boolean('moreUsers'); + t.list.int('postIds'); t.int('searchLogId'); - t.int('tagIds', { list: true }); + t.list.int('tagIds'); t.string('term'); - t.int('userIds', { list: true }); + t.list.int('userIds'); }, }); diff --git a/api/src/typeSchemas/HealthCheck.ts b/api/src/typeSchemas/HealthCheck.ts new file mode 100644 index 00000000..1e435b22 --- /dev/null +++ b/api/src/typeSchemas/HealthCheck.ts @@ -0,0 +1,10 @@ +import { objectType } from 'nexus'; + +export let HealthCheck = objectType({ + name: 'HealthCheck', + definition(t) { + t.boolean('isDiscourseReachable'); + t.string('discourseHost'); + t.nullable.string('discourseError'); + }, +}); diff --git a/api/src/typeSchemas/InviteeAccept.ts b/api/src/typeSchemas/InviteeAccept.ts index 7b844c26..adec1a1e 100644 --- a/api/src/typeSchemas/InviteeAccept.ts +++ b/api/src/typeSchemas/InviteeAccept.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let InviteeAccept = objectType({ name: 'InviteeAccept', diff --git a/api/src/typeSchemas/LikedTopic.ts b/api/src/typeSchemas/LikedTopic.ts new file mode 100644 index 00000000..7cfc4e06 --- /dev/null +++ b/api/src/typeSchemas/LikedTopic.ts @@ -0,0 +1,12 @@ +import { objectType } from 'nexus'; + +export let LikedTopic = objectType({ + name: 'LikedTopic', + definition(t) { + t.int('id'); + t.int('postId'); + t.int('topicId'); + t.int('likeCount'); + t.boolean('liked'); + }, +}); diff --git a/api/src/typeSchemas/LinkCount.ts b/api/src/typeSchemas/LinkCount.ts index 370aed45..ef21e4c4 100644 --- a/api/src/typeSchemas/LinkCount.ts +++ b/api/src/typeSchemas/LinkCount.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let LinkCount = objectType({ name: 'LinkCount', diff --git a/api/src/typeSchemas/LoginOutput.ts b/api/src/typeSchemas/LoginOutput.ts index a6adcb8b..7751c4d6 100644 --- a/api/src/typeSchemas/LoginOutput.ts +++ b/api/src/typeSchemas/LoginOutput.ts @@ -1,13 +1,13 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let LoginOutput = objectType({ name: 'LoginOutput', definition(t) { - t.field('userBadges', { type: 'UserBadge', list: true }); - t.field('badges', { type: 'Badge', list: true, nullable: true }); - t.field('badgeTypes', { type: 'BadgeType', list: true, nullable: true }); - t.field('users', { type: 'UserIconStatus', list: true, nullable: true }); - t.field('topics', { type: 'UserTopic', list: true, nullable: true }); + t.list.field('userBadges', { type: 'UserBadge' }); + t.nullable.list.field('badges', { type: 'Badge' }); + t.nullable.list.field('badgeTypes', { type: 'BadgeType' }); + t.nullable.list.field('users', { type: 'UserIconStatus' }); + t.nullable.list.field('topics', { type: 'UserTopic' }); t.field('user', { type: 'UserLite' }); // Auth t.string('token'); diff --git a/api/src/typeSchemas/LookupUrl.ts b/api/src/typeSchemas/LookupUrl.ts index 7f68a3aa..ab40ba34 100644 --- a/api/src/typeSchemas/LookupUrl.ts +++ b/api/src/typeSchemas/LookupUrl.ts @@ -1,14 +1,14 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let LookupUrl = objectType({ name: 'LookupUrl', definition(t) { t.string('shortUrl'); - t.string('url', (lookup) => { - let { url } = 'url' in lookup ? lookup : { url: '' }; - return PROSE_DISCOURSE_UPLOAD_HOST + url; + t.string('url', { + resolve: (instance) => getNormalizedUrlTemplate(instance, 'url'), + sourceType: 'string', }); t.string('shortPath'); }, diff --git a/api/src/typeSchemas/MessageParticipant.ts b/api/src/typeSchemas/MessageParticipant.ts index bfc98925..7bf6a647 100644 --- a/api/src/typeSchemas/MessageParticipant.ts +++ b/api/src/typeSchemas/MessageParticipant.ts @@ -1,11 +1,11 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let MessageParticipant = objectType({ name: 'MessageParticipant', definition(t) { t.int('userId'); - t.string('extras', { nullable: true }); - t.string('description', { nullable: true }); - t.int('primaryGroupid', { nullable: true }); + t.nullable.string('extras'); + t.nullable.string('description'); + t.nullable.int('primaryGroupid'); }, }); diff --git a/api/src/typeSchemas/NotificationDetail.ts b/api/src/typeSchemas/NotificationDetail.ts index eb4c23d8..da93de59 100644 --- a/api/src/typeSchemas/NotificationDetail.ts +++ b/api/src/typeSchemas/NotificationDetail.ts @@ -1,15 +1,15 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let NotificationDetail = objectType({ name: 'NotificationDetail', definition(t) { t.int('id'); - t.int('notificationType', { nullable: true }); + t.nullable.int('notificationType'); t.boolean('read'); t.string('createdAt'); - t.int('postNumber', { nullable: true }); - t.int('topicId', { nullable: true }); - t.string('fancyTitle', { nullable: true }); + t.nullable.int('postNumber'); + t.nullable.int('topicId'); + t.nullable.string('fancyTitle'); t.string('slug'); t.field('data', { type: 'NotificationDataType' }); }, diff --git a/api/src/typeSchemas/Notifications.ts b/api/src/typeSchemas/Notifications.ts index 84708423..583826a6 100644 --- a/api/src/typeSchemas/Notifications.ts +++ b/api/src/typeSchemas/Notifications.ts @@ -1,15 +1,13 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let Notifications = objectType({ name: 'Notifications', definition(t) { - t.field('notifications', { + t.nullable.list.field('notifications', { type: 'NotificationDetail', - list: true, - nullable: true, }); - t.int('totalRowsNotifications', { nullable: true }); - t.int('seenNotificationId', { nullable: true }); - t.string('loadMoreNotifications', { nullable: true }); + t.nullable.int('totalRowsNotifications'); + t.nullable.int('seenNotificationId'); + t.nullable.string('loadMoreNotifications'); }, }); diff --git a/api/src/typeSchemas/Participant.ts b/api/src/typeSchemas/Participant.ts index c0844e39..d7d456b6 100644 --- a/api/src/typeSchemas/Participant.ts +++ b/api/src/typeSchemas/Participant.ts @@ -1,24 +1,21 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let Participant = objectType({ name: 'Participant', definition(t) { t.int('id'); t.string('username'); - t.string('name', { nullable: true }); - t.string('avatarTemplate', (participant) => { - let { avatarTemplate } = - 'avatarTemplate' in participant ? participant : { avatarTemplate: '' }; - return avatarTemplate.includes('http') - ? avatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(avatarTemplate); + t.nullable.string('name'); + t.string('avatarTemplate', { + resolve: (participant) => getNormalizedUrlTemplate(participant), + sourceType: 'string', }); t.int('postCount'); - t.string('primaryGroupName', { nullable: true }); - t.string('primaryGroupFlairUrl', { nullable: true }); - t.string('primaryGroupFlairColor', { nullable: true }); - t.string('primaryGroupFlairBgColor', { nullable: true }); + t.nullable.string('primaryGroupName'); + t.nullable.string('primaryGroupFlairUrl'); + t.nullable.string('primaryGroupFlairColor'); + t.nullable.string('primaryGroupFlairBgColor'); }, }); diff --git a/api/src/typeSchemas/Post.ts b/api/src/typeSchemas/Post.ts index 96a934e8..7e59c9e2 100644 --- a/api/src/typeSchemas/Post.ts +++ b/api/src/typeSchemas/Post.ts @@ -1,38 +1,44 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; -import { getMention, getPostImageUrl } from '../helpers'; +import { generateMarkdownContent, getMention } from '../helpers'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let Post = objectType({ name: 'Post', definition(t) { t.int('id'); - t.string('name', { nullable: true }); + t.nullable.string('name'); t.string('username'); - t.string('avatarTemplate', (post) => { - let { avatarTemplate } = - 'avatarTemplate' in post ? post : { avatarTemplate: '' }; - return avatarTemplate.includes('http') - ? avatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(avatarTemplate); + t.string('avatarTemplate', { + resolve: (post) => getNormalizedUrlTemplate(post), + sourceType: 'string', }); t.string('createdAt'); t.string('cooked'); - - t.list.string('listOfCooked', { - resolve: (post) => getPostImageUrl(post.cooked) || null, - nullable: true, - }); - t.list.string('listOfMention', { + t.nullable.list.string('mentions', { resolve: (post) => getMention(post.cooked) || null, - nullable: true, }); - t.string('raw', { nullable: true }); // from Post(mutation) doesn't have raw even with include_raw: true + t.nullable.string('raw'); // from Post(mutation) doesn't have raw even with include_raw: true + t.nullable.string('markdownContent', { + resolve: (post) => { + let { raw = '' } = 'raw' in post ? post : {}; + let { cooked = '' } = 'cooked' in post ? post : {}; + + if (!raw) { + return null; + } + if (!cooked) { + return raw; + } + + return generateMarkdownContent(raw, cooked); + }, + }); t.int('postNumber'); t.int('postType'); t.string('updatedAt'); t.int('replyCount'); - t.int('replyToPostNumber', { nullable: true }); + t.nullable.int('replyToPostNumber'); t.int('quoteCount'); t.int('incomingLinkCount'); t.int('reads'); @@ -40,37 +46,41 @@ export let Post = objectType({ t.boolean('yours'); t.int('topicId'); t.string('topicSlug'); - t.string('displayUsername', { nullable: true }); - t.string('primaryGroupName', { nullable: true }); - t.string('primaryGroupFlairUrl', { nullable: true }); - t.string('primaryGroupFlairColor', { nullable: true }); - t.string('primaryGroupFlairBgColor', { nullable: true }); + t.nullable.string('displayUsername'); + t.nullable.string('primaryGroupName'); + t.nullable.string('primaryGroupFlairUrl'); + t.nullable.string('primaryGroupFlairColor'); + t.nullable.string('primaryGroupFlairBgColor'); t.int('version'); t.boolean('canEdit'); t.boolean('canDelete'); t.boolean('canRecover'); t.boolean('canWiki'); - t.boolean('bookmarked', { nullable: true }); - t.field('actionsSummary', { + t.nullable.boolean('bookmarked'); + t.nullable.list.field('actionsSummary', { type: 'ActionSummary', - list: true, - nullable: true, }); t.boolean('moderator'); t.boolean('admin'); t.boolean('staff'); t.int('userId'); - t.int('draftSequence', { nullable: true }); // Get Post doesn't have draft sequence + + // Nullable because when getting a post, there is no draft sequence. + t.nullable.int('draftSequence'); + t.boolean('hidden'); t.int('trustLevel'); t.boolean('userDeleted'); t.boolean('canViewEditHistory'); t.boolean('wiki'); - t.int('reviewableId', { nullable: true }); - t.float('reviewableScoreCount', { nullable: true }); - t.float('reviewableScorePendingCount', { nullable: true }); - t.field('linkCounts', { type: 'LinkCount', list: true, nullable: true }); // if post have link like image link - t.string('actionCode', { nullable: true }); - t.string('actionCodeWho', { nullable: true }); + t.nullable.int('reviewableId'); + t.nullable.float('reviewableScoreCount'); + t.nullable.float('reviewableScorePendingCount'); + + // The post can have an link, such as an image link + t.nullable.list.field('linkCounts', { type: 'LinkCount' }); + + t.nullable.string('actionCode'); + t.nullable.string('actionCodeWho'); }, }); diff --git a/api/src/typeSchemas/PostInput.ts b/api/src/typeSchemas/PostInput.ts index 4f5ad7a5..8295c9a0 100644 --- a/api/src/typeSchemas/PostInput.ts +++ b/api/src/typeSchemas/PostInput.ts @@ -1,30 +1,30 @@ -import { inputObjectType } from '@nexus/schema'; +import { inputObjectType } from 'nexus'; export let ReplyInput = inputObjectType({ name: 'ReplyInput', definition(t) { - t.string('raw', { required: true }); - t.int('topicId', { required: true }); - t.int('replyToPostNumber'); + t.string('raw'); + t.int('topicId'); + t.nullable.int('replyToPostNumber'); }, }); export let NewPrivateMessageInput = inputObjectType({ name: 'NewPrivateMessageInput', definition(t) { - t.string('raw', { required: true }); - t.int('category'); - t.string('targetRecipients', { list: true, required: true }); - t.string('title', { required: true }); + t.string('raw'); + t.nullable.int('category'); + t.list.string('targetRecipients'); + t.string('title'); }, }); export let NewTopicInput = inputObjectType({ name: 'NewTopicInput', definition(t) { - t.string('raw', { required: true }); - t.int('category'); - t.string('title', { required: true }); - t.string('tags', { list: true }); + t.string('raw'); + t.nullable.int('category'); + t.string('title'); + t.nullable.list.string('tags'); }, }); diff --git a/api/src/typeSchemas/PostRaw.ts b/api/src/typeSchemas/PostRaw.ts index 72b6283b..1c7b8e1b 100644 --- a/api/src/typeSchemas/PostRaw.ts +++ b/api/src/typeSchemas/PostRaw.ts @@ -1,10 +1,10 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export const PostRaw = objectType({ name: 'PostRaw', definition: (t) => { t.string('raw'); - t.list.string('listOfCooked'); - t.list.string('listOfMention'); + t.string('markdownContent'); + t.list.string('mentions'); }, }); diff --git a/api/src/typeSchemas/PostStream.ts b/api/src/typeSchemas/PostStream.ts index addf0b68..8fafe186 100644 --- a/api/src/typeSchemas/PostStream.ts +++ b/api/src/typeSchemas/PostStream.ts @@ -1,9 +1,10 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let PostStream = objectType({ name: 'PostStream', definition(t) { - t.field('posts', { type: 'Post', list: true }); - t.int('stream', { nullable: true, list: true }); + t.list.field('posts', { type: 'Post' }); + t.nullable.list.int('stream'); + t.nullable.field('firstPost', { type: 'Post' }); }, }); diff --git a/api/src/typeSchemas/PrivateMessageDetailOutput.ts b/api/src/typeSchemas/PrivateMessageDetailOutput.ts new file mode 100644 index 00000000..4f1057ef --- /dev/null +++ b/api/src/typeSchemas/PrivateMessageDetailOutput.ts @@ -0,0 +1,10 @@ +import { objectType } from 'nexus'; + +import { BaseTopicDetailOutput } from './TopicDetailOutput'; + +export let PrivateMessageDetailOutput = objectType({ + name: 'PrivateMessageDetailOutput', + definition(t) { + t.implements(BaseTopicDetailOutput); + }, +}); diff --git a/api/src/typeSchemas/PrivateMessageOutput.ts b/api/src/typeSchemas/PrivateMessageOutput.ts index 52221021..8da7a7dd 100644 --- a/api/src/typeSchemas/PrivateMessageOutput.ts +++ b/api/src/typeSchemas/PrivateMessageOutput.ts @@ -1,10 +1,10 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let PrivateMessageOutput = objectType({ name: 'PrivateMessageOutput', definition(t) { - t.int('primaryGroups', { nullable: true, list: true }); + t.nullable.list.int('primaryGroups'); t.field('topicList', { type: 'TopicList' }); - t.field('users', { type: 'UserIcon', list: true, nullable: true }); + t.nullable.list.field('users', { type: 'UserIcon' }); }, }); diff --git a/api/src/typeSchemas/PrivateMessagePostStream.ts b/api/src/typeSchemas/PrivateMessagePostStream.ts new file mode 100644 index 00000000..59001e8f --- /dev/null +++ b/api/src/typeSchemas/PrivateMessagePostStream.ts @@ -0,0 +1,9 @@ +import { objectType } from 'nexus'; + +export let PrivateMessagePostStream = objectType({ + name: 'PrivateMessagePostStream', + definition(t) { + t.list.field('posts', { type: 'Post' }); + t.nullable.list.int('stream'); + }, +}); diff --git a/api/src/typeSchemas/RefreshTokenOutput.ts b/api/src/typeSchemas/RefreshTokenOutput.ts index 1fb7e6a5..00645ffb 100644 --- a/api/src/typeSchemas/RefreshTokenOutput.ts +++ b/api/src/typeSchemas/RefreshTokenOutput.ts @@ -1,11 +1,11 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let RefreshTokenOutput = objectType({ name: 'RefreshTokenOutput', definition(t) { t.int('id'); t.string('username'); - t.string('name', { nullable: true }); + t.nullable.string('name'); // Auth t.string('token'); }, diff --git a/api/src/typeSchemas/RegisterInput.ts b/api/src/typeSchemas/RegisterInput.ts index f8111b3a..24035458 100644 --- a/api/src/typeSchemas/RegisterInput.ts +++ b/api/src/typeSchemas/RegisterInput.ts @@ -1,11 +1,11 @@ -import { inputObjectType } from '@nexus/schema'; +import { inputObjectType } from 'nexus'; export let RegisterInput = inputObjectType({ name: 'RegisterInput', definition(t) { - t.string('email', { required: true }); - t.string('username', { required: true }); - t.string('password', { required: true }); - t.string('name'); + t.string('email'); + t.string('username'); + t.string('password'); + t.nullable.string('name'); }, }); diff --git a/api/src/typeSchemas/RegisterOutput.ts b/api/src/typeSchemas/RegisterOutput.ts index f0cb6e6b..84d88188 100644 --- a/api/src/typeSchemas/RegisterOutput.ts +++ b/api/src/typeSchemas/RegisterOutput.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let RegisterOutput = objectType({ name: 'RegisterOutput', diff --git a/api/src/typeSchemas/RemindersFrequency.ts b/api/src/typeSchemas/RemindersFrequency.ts index 4303e605..9a121562 100644 --- a/api/src/typeSchemas/RemindersFrequency.ts +++ b/api/src/typeSchemas/RemindersFrequency.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let RemindersFrequency = objectType({ name: 'RemindersFrequency', diff --git a/api/src/typeSchemas/SearchGroup.ts b/api/src/typeSchemas/SearchGroup.ts index 345ecab0..28cce299 100644 --- a/api/src/typeSchemas/SearchGroup.ts +++ b/api/src/typeSchemas/SearchGroup.ts @@ -1,9 +1,9 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let SearchGroup = objectType({ name: 'SearchGroup', definition(t) { - t.string('fullName', { nullable: true }); + t.nullable.string('fullName'); t.string('name'); }, }); diff --git a/api/src/typeSchemas/SearchOutput.ts b/api/src/typeSchemas/SearchOutput.ts index 02de2282..2e3494cd 100644 --- a/api/src/typeSchemas/SearchOutput.ts +++ b/api/src/typeSchemas/SearchOutput.ts @@ -1,11 +1,11 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let SearchOutput = objectType({ name: 'SearchOutput', definition(t) { t.field('groupedSearchResult', { type: 'GroupedSearchResult' }); - t.field('posts', { type: 'SearchPost', list: true }); - t.field('topics', { type: 'SearchTopic', list: true }); + t.list.field('posts', { type: 'SearchPost' }); + t.list.field('topics', { type: 'SearchTopic' }); }, }); diff --git a/api/src/typeSchemas/SearchPost.ts b/api/src/typeSchemas/SearchPost.ts index 2ab12069..cbe10259 100644 --- a/api/src/typeSchemas/SearchPost.ts +++ b/api/src/typeSchemas/SearchPost.ts @@ -1,21 +1,18 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let SearchPost = objectType({ name: 'SearchPost', definition(t) { t.int('id'); - t.string('avatarTemplate', (searchPost) => { - let { avatarTemplate } = - 'avatarTemplate' in searchPost ? searchPost : { avatarTemplate: '' }; - return avatarTemplate.includes('http') - ? avatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(avatarTemplate); + t.string('avatarTemplate', { + resolve: (searchPost) => getNormalizedUrlTemplate(searchPost), + sourceType: 'string', }); t.string('blurb'); t.string('createdAt'); - t.string('name', { nullable: true }); + t.nullable.string('name'); t.string('username'); t.int('likeCount'); t.int('postNumber'); diff --git a/api/src/typeSchemas/SearchTopic.ts b/api/src/typeSchemas/SearchTopic.ts index d51c3584..5591ede6 100644 --- a/api/src/typeSchemas/SearchTopic.ts +++ b/api/src/typeSchemas/SearchTopic.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let SearchTopic = objectType({ name: 'SearchTopic', @@ -11,24 +11,30 @@ export let SearchTopic = objectType({ t.int('replyCount'); t.int('highestPostNumber'); t.string('createdAt'); - t.string('lastPostedAt', { nullable: true }); + t.nullable.string('lastPostedAt'); t.boolean('bumped'); t.string('bumpedAt'); - t.string('archetype', { nullable: true }); + t.nullable.string('archetype'); t.boolean('unseen'); t.boolean('pinned'); - t.string('excerpt', { nullable: true }); // Must be activated + + // Nullable because this is a feature that must be turned in + // in Discourse in order to be set. + t.nullable.string('excerpt'); + t.boolean('visible'); t.boolean('closed'); t.boolean('archived'); - t.boolean('bookmarked', { nullable: true }); - t.boolean('liked', { nullable: true }); - t.string('tags', { nullable: true, list: true }); - t.int('categoryId', { nullable: true }); - t.int('lastReadPostNumber', { nullable: true }); // Only available when logged in - t.int('newPosts', { nullable: true }); // Only available when logged in - t.int('notificationLevel', { nullable: true }); // Only available when logged in - t.int('unread', { nullable: true }); // Only available when logged in + t.nullable.boolean('bookmarked'); + t.nullable.boolean('liked'); + t.nullable.list.string('tags'); + t.nullable.int('categoryId'); + + // The below properties are only available when logged in. + t.nullable.int('lastReadPostNumber'); + t.nullable.int('newPosts'); + t.nullable.int('notificationLevel'); + t.nullable.int('unread'); }, }); diff --git a/api/src/typeSchemas/SearchUser.ts b/api/src/typeSchemas/SearchUser.ts index 992fec29..de6a50ac 100644 --- a/api/src/typeSchemas/SearchUser.ts +++ b/api/src/typeSchemas/SearchUser.ts @@ -1,18 +1,15 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let SearchUser = objectType({ name: 'SearchUser', definition(t) { - t.string('avatarTemplate', (searchUser) => { - let { avatarTemplate } = - 'avatarTemplate' in searchUser ? searchUser : { avatarTemplate: '' }; - return avatarTemplate.includes('http') - ? avatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(avatarTemplate); + t.string('avatarTemplate', { + resolve: (searchUser) => getNormalizedUrlTemplate(searchUser), + sourceType: 'string', }); - t.string('name', { nullable: true }); + t.nullable.string('name'); t.string('username'); }, }); diff --git a/api/src/typeSchemas/SearchUserOutput.ts b/api/src/typeSchemas/SearchUserOutput.ts index 23bce202..afd36c63 100644 --- a/api/src/typeSchemas/SearchUserOutput.ts +++ b/api/src/typeSchemas/SearchUserOutput.ts @@ -1,9 +1,11 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let SearchUserOutput = objectType({ name: 'SearchUserOutput', definition(t) { - t.field('groups', { type: 'SearchGroup', list: true, nullable: true }); // You can't see groups if not logged in - t.field('users', { type: 'SearchUser', list: true }); + t.list.field('users', { type: 'SearchUser' }); + + // Nullable because groups are not visible to unauthenticated users. + t.nullable.list.field('groups', { type: 'SearchGroup' }); }, }); diff --git a/api/src/typeSchemas/SecondFactorRequired.ts b/api/src/typeSchemas/SecondFactorRequired.ts index 818550a4..353f86ea 100644 --- a/api/src/typeSchemas/SecondFactorRequired.ts +++ b/api/src/typeSchemas/SecondFactorRequired.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let SecondFactorRequired = objectType({ name: 'SecondFactorRequired', diff --git a/api/src/typeSchemas/SingleBadgeOutput.ts b/api/src/typeSchemas/SingleBadgeOutput.ts index a9d8ba95..6554a4f2 100644 --- a/api/src/typeSchemas/SingleBadgeOutput.ts +++ b/api/src/typeSchemas/SingleBadgeOutput.ts @@ -1,9 +1,9 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let SingleBadgeOutput = objectType({ name: 'SingleBadgeOutput', definition(t) { - t.field('badgeTypes', { type: 'BadgeType', list: true }); + t.list.field('badgeTypes', { type: 'BadgeType' }); t.field('badge', { type: 'Badge' }); }, }); diff --git a/api/src/typeSchemas/SiteSetting.ts b/api/src/typeSchemas/SiteSetting.ts index c00d7a47..478e3f0e 100644 --- a/api/src/typeSchemas/SiteSetting.ts +++ b/api/src/typeSchemas/SiteSetting.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let SiteSetting = objectType({ name: 'SiteSetting', @@ -7,7 +7,7 @@ export let SiteSetting = objectType({ t.boolean('canTagTopics'); t.boolean('canSignUp'); t.string('authorizedExtensions'); - t.int('uncategorizedCategoryId', { nullable: true }); + t.int('uncategorizedCategoryId'); t.int('minSearchLength'); t.boolean('taggingEnabled'); t.int('maxTagLength'); @@ -16,13 +16,13 @@ export let SiteSetting = objectType({ t.int('minUsernameLength'); t.int('minPasswordLength'); t.boolean('fullNameRequired'); - t.field('topicFlagTypes', { + t.string('defaultComposerCategory'); + t.boolean('allowUncategorizedTopics'); + t.list.field('topicFlagTypes', { type: 'TopicFlagTypes', - list: true, }); - t.field('postActionTypes', { + t.list.field('postActionTypes', { type: 'TopicFlagTypes', - list: true, }); }, }); diff --git a/api/src/typeSchemas/Tag.ts b/api/src/typeSchemas/Tag.ts index 9f8d53b4..21db4db8 100644 --- a/api/src/typeSchemas/Tag.ts +++ b/api/src/typeSchemas/Tag.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let Tag = objectType({ name: 'Tag', @@ -6,7 +6,7 @@ export let Tag = objectType({ t.int('count'); t.string('id'); t.int('pmCount'); - t.boolean('targetTag', { nullable: true }); + t.nullable.boolean('targetTag'); t.string('text'); }, }); diff --git a/api/src/typeSchemas/TagFilter.ts b/api/src/typeSchemas/TagFilter.ts index 8693343b..be55c3cd 100644 --- a/api/src/typeSchemas/TagFilter.ts +++ b/api/src/typeSchemas/TagFilter.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let TagFilter = objectType({ name: 'TagFilter', diff --git a/api/src/typeSchemas/Topic.ts b/api/src/typeSchemas/Topic.ts index 09d2f508..c6671dc7 100644 --- a/api/src/typeSchemas/Topic.ts +++ b/api/src/typeSchemas/Topic.ts @@ -1,8 +1,6 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -type Poster = { - description: string; -}; +import { getTopicAuthorUserId } from '../helpers/getTopicAuthor'; export let Topic = objectType({ name: 'Topic', @@ -15,60 +13,52 @@ export let Topic = objectType({ t.int('replyCount'); t.int('highestPostNumber'); t.string('createdAt'); - t.string('lastPostedAt', { nullable: true }); + t.nullable.string('lastPostedAt'); t.boolean('bumped'); t.string('bumpedAt'); t.string('archetype'); - t.string('imageUrl', { nullable: true }); + t.nullable.string('imageUrl'); t.boolean('unseen'); t.boolean('pinned'); - t.string('excerpt', { nullable: true }); // Must be activated + + // Nullable because this is a feature that must be turned in + // in Discourse in order to be set. + t.nullable.string('excerpt'); + t.boolean('visible'); t.boolean('closed'); t.boolean('archived'); - t.boolean('bookmarked', { nullable: true }); - t.boolean('liked', { nullable: true }); - t.string('tags', { nullable: true, list: true }); + t.nullable.boolean('bookmarked'); + t.nullable.boolean('liked'); + t.nullable.list.string('tags'); t.int('views'); t.int('likeCount'); - t.int('allowedUserCount', { nullable: true }); // On PM - t.int('lastReadPostNumber', { nullable: true }); // Only available when logged in - t.int('newPosts', { nullable: true }); // Only available when logged in - t.int('notificationLevel', { nullable: true }); // Only available when logged in - t.int('unread', { nullable: true }); // Only available when logged in - t.boolean('hasSummary', { nullable: true }); // Nullable in suggested topic - t.string('lastPosterUsername', { nullable: true }); // recomended topic doesn't have dis - t.int('categoryId', { nullable: true }); - t.boolean('pinnedGlobally', { nullable: true }); // Nullable in suggested topic - t.field('posters', { type: 'TopicPoster', list: true }); - t.field('participants', { - type: 'MessageParticipant', - list: true, - nullable: true, - }); - t.int('authorUserId', { - nullable: true, - resolve: ({ posters }) => { - const author = posters.find((p: Poster) => - p.description.toLowerCase().includes('original poster'), - ); - return author?.userId || author?.user?.id || null; - }, - }); - t.int('frequentPosterUserId', { - nullable: true, - resolve: ({ posters }) => { - const frequentPoster = posters.find((p: Poster) => - p.description.toLowerCase().includes('frequent poster'), - ); + // For PMs + t.nullable.int('allowedUserCount'); - return frequentPoster?.userId || frequentPoster?.user?.id || null; - }, + // The following properties are only available when logged in. + t.nullable.int('lastReadPostNumber'); + t.nullable.int('newPosts'); + t.nullable.int('notificationLevel'); + t.nullable.int('unread'); + t.nullable.int('categoryId'); + + // The following fields are nullable when the topic is being + // presented as a suggested topic. + t.nullable.string('lastPosterUsername'); + t.nullable.boolean('pinnedGlobally'); + t.nullable.boolean('hasSummary'); + + t.list.field('posters', { type: 'TopicPoster' }); + t.nullable.list.field('participants', { + type: 'MessageParticipant', + }); + t.nullable.int('authorUserId', { + resolve: ({ posters }) => getTopicAuthorUserId(posters) ?? null, }); // Note: Comment out for maybe next phase - // t.int('recentPosterUserId', { - // nullable: true, + // t.nullable.int('recentPosterUserId', { // resolve: ({ posters }) => { // const recentPoster = posters.find((p: Poster) => // p.description.toLowerCase().includes('most recent poster'), diff --git a/api/src/typeSchemas/TopicDetail.ts b/api/src/typeSchemas/TopicDetail.ts index eeb56a35..de7f4af9 100644 --- a/api/src/typeSchemas/TopicDetail.ts +++ b/api/src/typeSchemas/TopicDetail.ts @@ -1,13 +1,13 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let TopicDetail = objectType({ name: 'TopicDetail', definition(t) { t.int('notificationLevel'); - t.field('participants', { type: 'Participant', list: true }); - t.field('allowedUsers', { type: 'UserIcon', list: true, nullable: true }); + t.list.field('participants', { type: 'Participant' }); + t.nullable.list.field('allowedUsers', { type: 'UserIcon' }); t.field('createdBy', { type: 'UserIcon' }); t.field('lastPoster', { type: 'UserIcon' }); - t.boolean('canEdit', { nullable: true }); + t.nullable.boolean('canEdit'); }, }); diff --git a/api/src/typeSchemas/TopicDetailOutput.ts b/api/src/typeSchemas/TopicDetailOutput.ts index 5b067377..25861e1e 100644 --- a/api/src/typeSchemas/TopicDetailOutput.ts +++ b/api/src/typeSchemas/TopicDetailOutput.ts @@ -1,49 +1,53 @@ -import { objectType } from '@nexus/schema'; +import { interfaceType, objectType } from 'nexus'; -export let TopicDetailOutput = objectType({ - name: 'TopicDetailOutput', +export const BaseTopicDetailOutput = interfaceType({ + name: 'BaseTopicDetailOutput', definition(t) { t.int('id'); - t.string('title', { nullable: true }); - t.string('fancyTitle', { nullable: true }); - t.int('postsCount', { nullable: true }); - t.int('timelineLookup', { list: [true, true], nullable: true }); - t.string('slug', { nullable: true }); - t.int('replyCount', { nullable: true }); - t.int('highestPostNumber', { nullable: true }); - t.int('currentPostNumber', { nullable: true }); - t.string('createdAt', { nullable: true }); - t.string('lastPostedAt', { nullable: true }); - t.string('archetype', { nullable: true }); - t.boolean('pinned', { nullable: true }); - t.boolean('visible', { nullable: true }); - t.boolean('closed', { nullable: true }); - t.boolean('archived', { nullable: true }); - t.boolean('bookmarked', { nullable: true }); - t.boolean('liked', { nullable: true }); - t.string('tags', { nullable: true, list: true }); - t.int('views', { nullable: true }); - t.int('likeCount', { nullable: true }); - t.boolean('hasSummary', { nullable: true }); - t.int('categoryId', { nullable: true }); - t.boolean('pinnedGlobally', { nullable: true }); - t.string('pinnedAt', { nullable: true }); - t.string('pinnedUntil', { nullable: true }); - t.int('wordCount', { nullable: true }); - t.string('deletedAt', { nullable: true }); - t.int('userId', { nullable: true }); - t.string('draftKey', { nullable: true }); - t.field('actionsSummary', { - type: 'ActionSummary', - list: true, - nullable: true, - }); - t.int('chunkSize', { nullable: true }); - t.int('messageBusLastId', { nullable: true }); - t.int('participantCount', { nullable: true }); - t.boolean('showReadIndicator', { nullable: true }); - t.field('details', { type: 'TopicDetail', nullable: true }); - t.field('suggestedTopics', { type: 'Topic', list: true, nullable: true }); + t.nullable.string('title'); + t.nullable.string('fancyTitle'); + t.nullable.int('postsCount'); + t.nullable.list.list.int('timelineLookup'); + t.nullable.string('slug'); + t.nullable.int('replyCount'); + t.nullable.int('highestPostNumber'); + t.nullable.int('currentPostNumber'); + t.nullable.string('createdAt'); + t.nullable.string('lastPostedAt'); + t.nullable.string('archetype'); + t.nullable.boolean('pinned'); + t.nullable.boolean('visible'); + t.nullable.boolean('closed'); + t.nullable.boolean('archived'); + t.nullable.boolean('bookmarked'); + t.nullable.boolean('liked'); + t.nullable.list.string('tags'); + t.nullable.int('views'); + t.nullable.int('likeCount'); + t.nullable.boolean('hasSummary'); + t.nullable.int('categoryId'); + t.nullable.boolean('pinnedGlobally'); + t.nullable.string('pinnedAt'); + t.nullable.string('pinnedUntil'); + t.nullable.int('wordCount'); + t.nullable.string('deletedAt'); + t.nullable.int('userId'); + t.nullable.string('draftKey'); + t.nullable.list.field('actionsSummary', { type: 'ActionSummary' }); + t.nullable.int('chunkSize'); + t.nullable.int('messageBusLastId'); + t.nullable.int('participantCount'); + t.nullable.boolean('showReadIndicator'); + t.nullable.field('details', { type: 'TopicDetail' }); + t.nullable.list.field('suggestedTopics', { type: 'Topic' }); t.field('postStream', { type: 'PostStream' }); }, + resolveType: () => null, +}); + +export let TopicDetailOutput = objectType({ + name: 'TopicDetailOutput', + definition(t) { + t.implements(BaseTopicDetailOutput); + }, }); diff --git a/api/src/typeSchemas/TopicFlagTypes.ts b/api/src/typeSchemas/TopicFlagTypes.ts index 62d79b7d..801411a9 100644 --- a/api/src/typeSchemas/TopicFlagTypes.ts +++ b/api/src/typeSchemas/TopicFlagTypes.ts @@ -1,15 +1,15 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let TopicFlagTypes = objectType({ name: 'TopicFlagTypes', definition(t) { t.string('description'); t.int('id'); - t.boolean('isCustomFlag', { nullable: true }); - t.boolean('isFlag', { nullable: true }); - t.string('longForm', { nullable: true }); + t.nullable.boolean('isCustomFlag'); + t.nullable.boolean('isFlag'); + t.nullable.string('longForm'); t.string('name'); t.string('nameKey'); - t.string('shortDescription', { nullable: true }); + t.nullable.string('shortDescription'); }, }); diff --git a/api/src/typeSchemas/TopicList.ts b/api/src/typeSchemas/TopicList.ts index 6c703fd7..b06ec831 100644 --- a/api/src/typeSchemas/TopicList.ts +++ b/api/src/typeSchemas/TopicList.ts @@ -1,16 +1,16 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let TopicList = objectType({ name: 'TopicList', definition(t) { t.boolean('canCreateTopic'); - t.boolean('draft', { nullable: true }); + t.nullable.boolean('draft'); t.string('draftKey'); - t.int('draftSequence', { nullable: true }); - t.string('forPeriod', { nullable: true }); + t.nullable.int('draftSequence'); + t.nullable.string('forPeriod'); t.int('perPage'); - t.string('topTags', { list: true }); - t.field('tags', { type: 'TagFilter', list: true, nullable: true }); - t.field('topics', { type: 'Topic', list: true, nullable: true }); + t.list.string('topTags'); + t.nullable.list.field('tags', { type: 'TagFilter' }); + t.nullable.list.field('topics', { type: 'Topic' }); }, }); diff --git a/api/src/typeSchemas/TopicPoster.ts b/api/src/typeSchemas/TopicPoster.ts index e94d2fcf..872eb4c0 100644 --- a/api/src/typeSchemas/TopicPoster.ts +++ b/api/src/typeSchemas/TopicPoster.ts @@ -1,11 +1,11 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let TopicPoster = objectType({ name: 'TopicPoster', definition(t) { - t.string('extras', { nullable: true }); + t.nullable.string('extras'); t.string('description'); - t.int('userId', { nullable: true }); - t.field('user', { type: 'UserIcon', nullable: true }); + t.nullable.int('userId'); + t.nullable.field('user', { type: 'UserIcon' }); }, }); diff --git a/api/src/typeSchemas/TopicsOutput.ts b/api/src/typeSchemas/TopicsOutput.ts index 95ea8240..cac372b4 100644 --- a/api/src/typeSchemas/TopicsOutput.ts +++ b/api/src/typeSchemas/TopicsOutput.ts @@ -1,9 +1,9 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let TopicsOutput = objectType({ name: 'TopicsOutput', definition(t) { - t.field('users', { type: 'UserIcon', list: true, nullable: true }); - t.field('topicList', { type: 'TopicList', nullable: true }); + t.nullable.list.field('users', { type: 'UserIcon' }); + t.nullable.field('topicList', { type: 'TopicList' }); }, }); diff --git a/api/src/typeSchemas/UpdateProfile.ts b/api/src/typeSchemas/UpdateProfile.ts index 2d1eea5e..b570b649 100644 --- a/api/src/typeSchemas/UpdateProfile.ts +++ b/api/src/typeSchemas/UpdateProfile.ts @@ -1,10 +1,10 @@ -import { inputObjectType } from '@nexus/schema'; +import { inputObjectType } from 'nexus'; export let UpdateProfile = inputObjectType({ name: 'UpdateProfile', definition(t) { - t.string('name'); - t.string('title', { nullable: true }); - t.int('primaryGroupId', { nullable: true }); + t.nullable.string('name'); + t.nullable.string('title'); + t.nullable.int('primaryGroupId'); }, }); diff --git a/api/src/typeSchemas/UploadOutput.ts b/api/src/typeSchemas/UploadOutput.ts index 92dc8ee1..5148a2c2 100644 --- a/api/src/typeSchemas/UploadOutput.ts +++ b/api/src/typeSchemas/UploadOutput.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let UploadOutput = objectType({ name: 'UploadOutput', @@ -13,9 +13,9 @@ export let UploadOutput = objectType({ t.int('thumbnailHeight'); t.string('extension'); t.string('shortUrl'); - t.string('shortPath', { nullable: true }); + t.nullable.string('shortPath'); t.string('humanFilesize'); - t.int('retainHours', { nullable: true }); - t.int('token', { nullable: true }); + t.nullable.int('retainHours'); + t.nullable.int('token'); }, }); diff --git a/api/src/typeSchemas/UserActions.ts b/api/src/typeSchemas/UserActions.ts index 7a6b85d2..a3aea65c 100644 --- a/api/src/typeSchemas/UserActions.ts +++ b/api/src/typeSchemas/UserActions.ts @@ -1,43 +1,36 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let UserActions = objectType({ name: 'UserActions', definition(t) { - t.string('actingAvatarTemplate', (userActions) => { - let { actingAvatarTemplate } = - 'actingAvatarTemplate' in userActions - ? userActions - : { actingAvatarTemplate: '' }; - return actingAvatarTemplate.includes('http') - ? actingAvatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(actingAvatarTemplate); + t.string('actingAvatarTemplate', { + resolve: (userActions) => + getNormalizedUrlTemplate(userActions, 'actingAvatar'), + sourceType: 'string', }); - t.string('actingName', { nullable: true }); + t.nullable.string('actingName'); t.int('actingUserId'); - t.int('actionCode', { nullable: true }); + t.nullable.int('actionCode'); t.int('actionType'); t.boolean('archived'); - t.string('avatarTemplate', (userActions) => { - let { avatarTemplate } = - 'avatarTemplate' in userActions ? userActions : { avatarTemplate: '' }; - return avatarTemplate.includes('http') - ? avatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(avatarTemplate); + t.string('avatarTemplate', { + resolve: (userActions) => getNormalizedUrlTemplate(userActions), + sourceType: 'string', }); - t.int('categoryId', { nullable: true }); + t.nullable.int('categoryId'); t.boolean('closed'); t.string('createdAt'); t.boolean('deleted'); t.string('excerpt'); - t.string('hidden', { nullable: true }); - t.string('name', { nullable: true }); - t.int('postId', { nullable: true }); + t.nullable.boolean('hidden'); + t.nullable.string('name'); + t.nullable.int('postId'); t.int('postNumber'); - t.int('postType', { nullable: true }); + t.nullable.int('postType'); t.string('slug'); - t.string('targetName', { nullable: true }); + t.nullable.string('targetName'); t.int('targetUserId'); t.string('targetUsername'); t.string('title'); diff --git a/api/src/typeSchemas/UserAuthToken.ts b/api/src/typeSchemas/UserAuthToken.ts index 7cfebf1f..1c620755 100644 --- a/api/src/typeSchemas/UserAuthToken.ts +++ b/api/src/typeSchemas/UserAuthToken.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let UserAuthToken = objectType({ name: 'UserAuthToken', diff --git a/api/src/typeSchemas/UserAuthTokens.ts b/api/src/typeSchemas/UserAuthTokens.ts index 469f374d..e54e9276 100644 --- a/api/src/typeSchemas/UserAuthTokens.ts +++ b/api/src/typeSchemas/UserAuthTokens.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let UserAuthTokens = objectType({ name: 'UserAuthTokens', diff --git a/api/src/typeSchemas/UserBadge.ts b/api/src/typeSchemas/UserBadge.ts index d1f06509..5d0961e8 100644 --- a/api/src/typeSchemas/UserBadge.ts +++ b/api/src/typeSchemas/UserBadge.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let UserBadge = objectType({ name: 'UserBadge', @@ -7,11 +7,11 @@ export let UserBadge = objectType({ t.string('grantedAt'); t.string('createdAt'); t.int('count'); - t.int('postId', { nullable: true }); - t.int('postNumber', { nullable: true }); + t.nullable.int('postId'); + t.nullable.int('postNumber'); t.int('badgeId'); t.int('userId'); t.int('grantedById'); - t.int('topicId', { nullable: true }); + t.nullable.int('topicId'); }, }); diff --git a/api/src/typeSchemas/UserDetail.ts b/api/src/typeSchemas/UserDetail.ts index cfcb1952..679fca28 100644 --- a/api/src/typeSchemas/UserDetail.ts +++ b/api/src/typeSchemas/UserDetail.ts @@ -1,26 +1,23 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let UserDetail = objectType({ name: 'UserDetail', definition(t) { t.int('id'); t.string('username'); - t.string('name', { nullable: true }); + t.nullable.string('name'); t.string('email'); - t.string('avatarTemplate', (userDetail) => { - let { avatarTemplate } = - 'avatarTemplate' in userDetail ? userDetail : { avatarTemplate: '' }; - return avatarTemplate.includes('http') - ? avatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(avatarTemplate); + t.string('avatarTemplate', { + resolve: (userDetail) => getNormalizedUrlTemplate(userDetail), + sourceType: 'string', }); - t.string('lastPostedAt', { nullable: true }); // New user doens't have last Posted - t.string('lastSeenAt', { nullable: true }); + t.nullable.string('lastPostedAt'); // New user doens't have last Posted + t.nullable.string('lastSeenAt'); t.string('createdAt'); - t.string('secondaryEmails', { list: true, nullable: true }); - t.string('unconfirmedEmails', { list: true, nullable: true }); + t.nullable.list.string('secondaryEmails'); + t.nullable.list.string('unconfirmedEmails'); t.boolean('ignored'); t.boolean('muted'); t.boolean('canIgnoreUser'); @@ -30,23 +27,23 @@ export let UserDetail = objectType({ t.int('trustLevel'); t.boolean('moderator'); t.boolean('admin'); - t.string('title', { nullable: true }); + t.nullable.string('title'); t.int('badgeCount'); t.int('timeRead'); t.int('recentTimeRead'); - t.int('primaryGroupId', { nullable: true }); - t.string('primaryGroupName', { nullable: true }); - t.string('primaryGroupFlairUrl', { nullable: true }); - t.string('primaryGroupFlairBgColor', { nullable: true }); - t.string('primaryGroupFlairColor', { nullable: true }); - t.field('featuredTopic', { type: 'UserFeaturedTopic', nullable: true }); - t.string('bioExcerpt', { nullable: true }); - t.string('bioCooked', { nullable: true }); - t.string('bioRaw', { nullable: true }); - t.string('dateOfBirth', { nullable: true }); - t.string('website', { nullable: true }); - t.string('websiteName', { nullable: true }); - t.string('location', { nullable: true }); + t.nullable.int('primaryGroupId'); + t.nullable.string('primaryGroupName'); + t.nullable.string('primaryGroupFlairUrl'); + t.nullable.string('primaryGroupFlairBgColor'); + t.nullable.string('primaryGroupFlairColor'); + t.nullable.field('featuredTopic', { type: 'UserFeaturedTopic' }); + t.nullable.string('bioExcerpt'); + t.nullable.string('bioCooked'); + t.nullable.string('bioRaw'); + t.nullable.string('dateOfBirth'); + t.nullable.string('website'); + t.nullable.string('websiteName'); + t.nullable.string('location'); t.boolean('canEdit'); t.boolean('canEditUsername'); t.boolean('canEditEmail'); @@ -54,47 +51,40 @@ export let UserDetail = objectType({ t.boolean('canChangeBio'); t.boolean('canChangeLocation'); t.boolean('canChangeWebsite'); - t.int('uploadedAvatarId', { nullable: true }); + t.nullable.int('uploadedAvatarId'); t.boolean('hasTitleBadges'); t.boolean('secondFactorEnabled'); - t.boolean('secondFactorBackupEnabled', { nullable: true }); // If Admin change it's null + t.nullable.boolean('secondFactorBackupEnabled'); // If Admin change it's null t.int('pendingCount'); t.int('profileViewCount'); t.boolean('canUploadProfileHeader'); t.boolean('canUploadUserCardBackground'); - t.string('locale', { nullable: true }); + t.nullable.string('locale'); t.int('mailingListPostsPerDay'); - t.int('mutedCategoryIds', { list: true }); - t.int('regularCategoryIds', { list: true }); - t.int('trackedCategoryIds', { list: true }); - t.int('watchedCategoryIds', { list: true }); - t.int('watchedFirstPostCategoryIds', { list: true }); - t.string('watchedTags', { list: true }); - t.string('watchingFirstPostTags', { list: true }); - t.string('trackedTags', { list: true }); - t.string('mutedTags', { list: true }); - t.string('systemAvatarTemplate', (userDetail) => { - let { systemAvatarTemplate } = - 'systemAvatarTemplate' in userDetail - ? userDetail - : { systemAvatarTemplate: '' }; - return systemAvatarTemplate.includes('http') - ? systemAvatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(systemAvatarTemplate); + t.list.int('mutedCategoryIds'); + t.list.int('regularCategoryIds'); + t.list.int('trackedCategoryIds'); + t.list.int('watchedCategoryIds'); + t.list.int('watchedFirstPostCategoryIds'); + t.list.string('watchedTags'); + t.list.string('watchingFirstPostTags'); + t.list.string('trackedTags'); + t.list.string('mutedTags'); + t.string('systemAvatarTemplate', { + resolve: (userDetail) => + getNormalizedUrlTemplate(userDetail, 'systemAvatar'), }); - t.string('mutedUsernames', { list: true }); - t.string('ignoredUsernames', { list: true }); - t.string('allowedPmUsernames', { list: true }); - t.int('featuredUserBadgeIds', { nullable: true, list: true }); - t.field('invitedBy', { type: 'UserIcon', nullable: true }); - t.field('groups', { type: 'Group', list: true }); - t.field('groupUsers', { type: 'GroupUser', list: true }); - t.field('remindersFrequency', { + t.list.string('mutedUsernames'); + t.list.string('ignoredUsernames'); + t.list.string('allowedPmUsernames'); + t.nullable.list.int('featuredUserBadgeIds'); + t.nullable.field('invitedBy', { type: 'UserIcon' }); + t.list.field('groups', { type: 'Group' }); + t.list.field('groupUsers', { type: 'GroupUser' }); + t.nullable.list.field('remindersFrequency', { type: 'RemindersFrequency', - list: true, - nullable: true, }); - t.field('userAuthTokens', { type: 'UserAuthToken', list: true }); + t.list.field('userAuthTokens', { type: 'UserAuthToken' }); t.field('userOption', { type: 'UserOption' }); }, }); diff --git a/api/src/typeSchemas/UserFeaturedTopic.ts b/api/src/typeSchemas/UserFeaturedTopic.ts index 95ebbce3..8015cde8 100644 --- a/api/src/typeSchemas/UserFeaturedTopic.ts +++ b/api/src/typeSchemas/UserFeaturedTopic.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let UserFeaturedTopic = objectType({ name: 'UserFeaturedTopic', @@ -6,11 +6,11 @@ export let UserFeaturedTopic = objectType({ t.int('id'); t.int('userId'); t.int('lastPostUserId'); - t.int('featuredUser1Id', { nullable: true }); - t.int('featuredUser2Id', { nullable: true }); - t.int('featuredUser3Id', { nullable: true }); - t.int('featuredUser4Id', { nullable: true }); - t.int('deletedById', { nullable: true }); + t.nullable.int('featuredUser1Id'); + t.nullable.int('featuredUser2Id'); + t.nullable.int('featuredUser3Id'); + t.nullable.int('featuredUser4Id'); + t.nullable.int('deletedById'); t.string('title'); t.string('fancyTitle'); t.string('slug'); @@ -19,12 +19,12 @@ export let UserFeaturedTopic = objectType({ t.int('highestPostNumber'); t.string('createdAt'); t.string('lastPostedAt'); - t.string('updatedAt', { nullable: true }); + t.nullable.string('updatedAt'); t.string('bumpedAt'); t.string('archetype'); - t.string('pinnedAt', { nullable: true }); - t.string('pinnedUntil', { nullable: true }); - t.string('excerpt', { nullable: true }); // Must be activated + t.nullable.string('pinnedAt'); + t.nullable.string('pinnedUntil'); + t.nullable.string('excerpt'); // Must be activated t.boolean('visible'); t.boolean('closed'); t.boolean('archived'); @@ -40,7 +40,7 @@ export let UserFeaturedTopic = objectType({ t.float('score'); t.float('reviewableScore'); t.float('percentRank'); - t.int('categoryId', { nullable: true }); + t.nullable.int('categoryId'); t.boolean('pinnedGlobally'); }, }); diff --git a/api/src/typeSchemas/UserIcon.ts b/api/src/typeSchemas/UserIcon.ts index d73c1fe2..edca4e70 100644 --- a/api/src/typeSchemas/UserIcon.ts +++ b/api/src/typeSchemas/UserIcon.ts @@ -1,19 +1,16 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let UserIcon = objectType({ name: 'UserIcon', definition(t) { t.int('id'); t.string('username'); - t.string('name', { nullable: true }); - t.string('avatarTemplate', (userIcon) => { - let { avatarTemplate } = - 'avatarTemplate' in userIcon ? userIcon : { avatarTemplate: '' }; - return avatarTemplate.includes('http') - ? avatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(avatarTemplate); + t.nullable.string('name'); + t.string('avatarTemplate', { + resolve: (userIcon) => getNormalizedUrlTemplate(userIcon), + sourceType: 'string', }); }, }); diff --git a/api/src/typeSchemas/UserIconStatus.ts b/api/src/typeSchemas/UserIconStatus.ts index 6da5765d..079f9f93 100644 --- a/api/src/typeSchemas/UserIconStatus.ts +++ b/api/src/typeSchemas/UserIconStatus.ts @@ -1,21 +1,16 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let UserIconStatus = objectType({ name: 'UserIconStatus', definition(t) { t.int('id'); t.string('username'); - t.string('name', { nullable: true }); - t.string('avatarTemplate', (userIconStatus) => { - let { avatarTemplate } = - 'avatarTemplate' in userIconStatus - ? userIconStatus - : { avatarTemplate: '' }; - return avatarTemplate.includes('http') - ? avatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(avatarTemplate); + t.nullable.string('name'); + t.string('avatarTemplate', { + resolve: (userIconStatus) => getNormalizedUrlTemplate(userIconStatus), + sourceType: 'string', }); t.boolean('moderator'); t.boolean('admin'); diff --git a/api/src/typeSchemas/UserLite.ts b/api/src/typeSchemas/UserLite.ts index d59d9e7d..a7ee3e13 100644 --- a/api/src/typeSchemas/UserLite.ts +++ b/api/src/typeSchemas/UserLite.ts @@ -1,22 +1,23 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; -import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; +import { getNormalizedUrlTemplate } from '../resolvers/utils'; export let UserLite = objectType({ name: 'UserLite', definition(t) { t.int('id'); t.string('username'); - t.string('name', { nullable: true }); - t.string('avatarTemplate', (userLite) => { - let { avatarTemplate } = - 'avatarTemplate' in userLite ? userLite : { avatarTemplate: '' }; - return avatarTemplate.includes('http') - ? avatarTemplate - : PROSE_DISCOURSE_UPLOAD_HOST.concat(avatarTemplate); + t.nullable.string('name'); + t.string('avatarTemplate', { + resolve: (userLite) => getNormalizedUrlTemplate(userLite), + sourceType: 'string', }); - t.string('lastPostedAt', { nullable: true }); // New user doens't have last Posted - t.string('lastSeenAt', { nullable: true }); // New user doens't have last Posted + + // The following 2 fields aren't present for new users, because the user + // won't have posted anything yet to have "last posted" fields. + t.nullable.string('lastPostedAt'); + t.nullable.string('lastSeenAt'); + t.string('createdAt'); t.boolean('ignored'); t.boolean('muted'); @@ -27,41 +28,41 @@ export let UserLite = objectType({ t.int('trustLevel'); t.boolean('moderator'); t.boolean('admin'); - t.string('title', { nullable: true }); + t.nullable.string('title'); t.int('badgeCount'); t.int('timeRead'); t.int('recentTimeRead'); - t.int('primaryGroupId', { nullable: true }); - t.string('primaryGroupName', { nullable: true }); - t.string('primaryGroupFlairUrl', { nullable: true }); - t.string('primaryGroupFlairBgColor', { nullable: true }); - t.string('primaryGroupFlairColor', { nullable: true }); - t.field('featuredTopic', { type: 'UserFeaturedTopic', nullable: true }); - t.string('bioRaw', { nullable: true }); - t.string('bioExcerpt', { nullable: true }); - t.string('bioCooked', { nullable: true }); - t.string('website', { nullable: true }); - t.string('websiteName', { nullable: true }); - t.string('location', { nullable: true }); + t.nullable.int('primaryGroupId'); + t.nullable.string('primaryGroupName'); + t.nullable.string('primaryGroupFlairUrl'); + t.nullable.string('primaryGroupFlairBgColor'); + t.nullable.string('primaryGroupFlairColor'); + t.nullable.field('featuredTopic', { type: 'UserFeaturedTopic' }); + t.nullable.string('bioRaw'); + t.nullable.string('bioExcerpt'); + t.nullable.string('bioCooked'); + t.nullable.string('website'); + t.nullable.string('websiteName'); + t.nullable.string('location'); t.boolean('canEdit'); t.boolean('canEditUsername'); t.boolean('canEditEmail'); t.boolean('canEditName'); - t.int('uploadedAvatarId', { nullable: true }); + t.nullable.int('uploadedAvatarId'); t.int('pendingCount'); t.int('profileViewCount'); t.boolean('canUploadProfileHeader'); t.boolean('canUploadUserCardBackground'); t.int('mailingListPostsPerDay'); - t.string('dateOfBirth', { nullable: true }); - t.int('featuredUserBadgeIds', { nullable: true, list: true }); - t.field('invitedBy', { type: 'UserIcon', nullable: true }); - t.field('groups', { type: 'Group', list: true }); - t.field('remindersFrequency', { + t.nullable.string('dateOfBirth'); + t.nullable.list.int('featuredUserBadgeIds'); + t.nullable.field('invitedBy', { type: 'UserIcon' }); + t.list.field('groups', { type: 'Group' }); + + // Nullable because a user from the login endpoint won't have this set. + t.nullable.list.field('remindersFrequency', { type: 'RemindersFrequency', - list: true, - nullable: true, - }); // User from login endpoint doesn't have this + }); }, }); /** diff --git a/api/src/typeSchemas/UserOption.ts b/api/src/typeSchemas/UserOption.ts index 4691d2a4..a215af33 100644 --- a/api/src/typeSchemas/UserOption.ts +++ b/api/src/typeSchemas/UserOption.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let UserOption = objectType({ name: 'UserOption', @@ -22,7 +22,7 @@ export let UserOption = objectType({ t.boolean('emailInReplyTo'); t.int('likeNotificationFrequency'); t.boolean('includeTl0InDigests'); - t.int('themeIds', { list: true }); + t.list.int('themeIds'); t.int('themeKeySeq'); t.boolean('allowPrivateMessages'); t.boolean('enableAllowedPmUsers'); diff --git a/api/src/typeSchemas/UserOptions.ts b/api/src/typeSchemas/UserOptions.ts index eaab4627..eee96e14 100644 --- a/api/src/typeSchemas/UserOptions.ts +++ b/api/src/typeSchemas/UserOptions.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let UserOptions = objectType({ name: 'UserOptions', @@ -6,8 +6,8 @@ export let UserOptions = objectType({ t.boolean('allowPrivateMessages'); t.int('autoTrackTopicsAfterMsecs'); t.boolean('automaticallyUnpinTopics'); - t.int('colorSchemeId', { nullable: true }); - t.int('darkSchemeId', { nullable: true }); + t.nullable.int('colorSchemeId'); + t.nullable.int('darkSchemeId'); t.int('digestAfterMinutes'); t.boolean('dynamicFavicon'); t.boolean('emailDigests'); @@ -20,7 +20,7 @@ export let UserOptions = objectType({ t.boolean('enableQuoting'); t.boolean('externalLinksInNewTab'); t.boolean('hideProfileAndPresence'); - t.int('homepageId', { nullable: true }); + t.nullable.int('homepageId'); t.boolean('includeTl0InDigests'); t.int('likeNotificationFrequency'); t.boolean('mailingListMode'); diff --git a/api/src/typeSchemas/UserProfileOutput.ts b/api/src/typeSchemas/UserProfileOutput.ts index 831e9a14..da2df7d6 100644 --- a/api/src/typeSchemas/UserProfileOutput.ts +++ b/api/src/typeSchemas/UserProfileOutput.ts @@ -1,13 +1,13 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let UserProfileOutput = objectType({ name: 'UserProfileOutput', definition(t) { - t.field('userBadges', { type: 'UserBadge', list: true }); - t.field('badges', { type: 'Badge', list: true, nullable: true }); - t.field('badgeTypes', { type: 'BadgeType', list: true, nullable: true }); - t.field('users', { type: 'UserIconStatus', list: true, nullable: true }); - t.field('topics', { type: 'UserTopic', list: true, nullable: true }); + t.list.field('userBadges', { type: 'UserBadge' }); + t.nullable.list.field('badges', { type: 'Badge' }); + t.nullable.list.field('badgeTypes', { type: 'BadgeType' }); + t.nullable.list.field('users', { type: 'UserIconStatus' }); + t.nullable.list.field('topics', { type: 'UserTopic' }); t.field('user', { type: 'UserUnion' }); t.boolean('unreadNotification'); }, diff --git a/api/src/typeSchemas/UserTopic.ts b/api/src/typeSchemas/UserTopic.ts index 0593ad82..efeec11a 100644 --- a/api/src/typeSchemas/UserTopic.ts +++ b/api/src/typeSchemas/UserTopic.ts @@ -1,4 +1,4 @@ -import { objectType } from '@nexus/schema'; +import { objectType } from 'nexus'; export let UserTopic = objectType({ name: 'UserTopic', diff --git a/api/src/typeSchemas/index.ts b/api/src/typeSchemas/index.ts index 5e4b838d..b74a318e 100644 --- a/api/src/typeSchemas/index.ts +++ b/api/src/typeSchemas/index.ts @@ -22,6 +22,7 @@ export * from './GroupedSearchResult'; export * from './GroupUser'; export * from './GroupUsers'; export * from './InviteeAccept'; +export * from './LikedTopic'; export * from './LinkCount'; export * from './LoginOutput'; export * from './LookupUrl'; @@ -33,7 +34,9 @@ export * from './Post'; export * from './PostInput'; export * from './PostRaw'; export * from './PostStream'; +export * from './PrivateMessageDetailOutput'; export * from './PrivateMessageOutput'; +export * from './PrivateMessagePostStream'; export * from './RefreshTokenOutput'; export * from './RegisterInput'; export * from './RegisterOutput'; @@ -71,3 +74,4 @@ export * from './UserOption'; export * from './UserOptions'; export * from './UserProfileOutput'; export * from './UserTopic'; +export * from './HealthCheck'; diff --git a/api/src/types/dataTypes.ts b/api/src/types/dataTypes.ts index 0137dcaf..ba424541 100644 --- a/api/src/types/dataTypes.ts +++ b/api/src/types/dataTypes.ts @@ -1,16 +1,44 @@ -export type UserIcon = { +import { z } from 'zod'; + +export type LikedTopic = { id: number; - username: string; - name?: string | null; - avatarTemplate: string; + topicId: number; + postId: number; + likeCount: number; + liked: boolean; }; -type TopicPoster = { - extras?: string | null; - description: string; - userId?: number | null; - user: UserIcon; -}; +export const MostRecentPoster = z.literal('MostRecentPoster'); +export const OriginalPoster = z.literal('OriginalPoster'); +export const FrequentPoster = z.literal('FrequentPoster'); +export const UnknownPosterType = z.literal('UnknownPosterType'); +export const PosterType = z.union([ + FrequentPoster, + MostRecentPoster, + OriginalPoster, + UnknownPosterType, +]); +export type PosterType = z.infer; + +export const UserIcon = z.object({ + id: z.number(), + username: z.string(), + name: z.optional(z.nullable(z.string())), + avatarTemplate: z.string(), +}); + +export type UserIcon = z.infer; + +// TODO: #1174: get to the bottom of why we have both `userId` and +// `user`, and why both can be nullable. Seems we made a mistake somewhere. +export const TopicPoster = z.object({ + extras: z.optional(z.nullable(z.string())), + description: z.string(), + userId: z.optional(z.nullable(z.number())), + user: z.optional(z.nullable(UserIcon)), +}); + +export type TopicPoster = z.infer; export type Topic = { id: number; @@ -47,7 +75,6 @@ export type Topic = { pinnedGlobally: boolean | null; posters: Array; authorUserId?: number | null; - frequentPosterUserId?: number | null; }; type TagFilter = { @@ -115,3 +142,13 @@ export type UserAction = { topicId: number; userId: number; }; + +type ActionSummary = { + id: number; + hidden?: boolean; + acted?: boolean; + canUndo?: boolean; + canAct?: boolean; + count?: number; +}; +export type ActionsSummary = Array; diff --git a/api/src/types/serverTypes.ts b/api/src/types/serverTypes.ts index a7489b5f..ba801096 100644 --- a/api/src/types/serverTypes.ts +++ b/api/src/types/serverTypes.ts @@ -1,5 +1,6 @@ import { AxiosInstance } from 'axios'; +// eslint-disable-next-line @typescript-eslint/ban-types export type Root = object | undefined; export type Context = { diff --git a/api/tsconfig.json b/api/tsconfig.json index 2e70bfac..670fe669 100644 --- a/api/tsconfig.json +++ b/api/tsconfig.json @@ -7,7 +7,7 @@ "resolveJsonModule": true, "strict": true, "forceConsistentCasingInFileNames": true, - "esModuleInterop": true + "esModuleInterop": true, }, - "include": ["src/**/*"] + "include": ["src/**/*", "reset.d.ts"] } diff --git a/api/yarn.lock b/api/yarn.lock index a17c8d45..ab3a11d5 100644 --- a/api/yarn.lock +++ b/api/yarn.lock @@ -2,285 +2,473 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" -"@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" - integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.1" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.18.8": + version "7.18.13" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz" + integrity sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw== + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": + version "7.18.13" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz" + integrity sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.13" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.13" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.13" + "@babel/types" "^7.18.13" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== - dependencies: - "@babel/types" "^7.11.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-member-expression-to-functions@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" - -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== +"@babel/generator@^7.18.13": + version "7.18.13" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz" + integrity sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ== dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.18.13" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== +"@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== - dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1": - version "7.11.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" - integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.13": + version "7.18.13" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz" + integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" - integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/runtime@^7.0.0": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" - integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.10.4", "@babel/template@^7.3.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.18.13", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.4": + version "7.18.13" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz" + integrity sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.13" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.13" + "@babel/types" "^7.18.13" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.18.13" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz" + integrity sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@cnakazawa/watch@^1.0.3": version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + resolved "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz" integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== dependencies: exec-sh "^0.3.2" minimist "^1.2.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@envelop/core@^1.0.3": + version "1.7.1" + resolved "https://registry.npmjs.org/@envelop/core/-/core-1.7.1.tgz" + integrity sha512-ZxeQs4G0FOzoFAH+zskubx5aM9kx6BiUvcSI9Lo3MfYBmnK7cjwcwDdwk6Mq48QDuAeVdGfDmQz+BiWg0k2GmQ== + dependencies: + "@envelop/types" "1.5.1" + +"@envelop/core@^2.5.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@envelop/core/-/core-2.5.0.tgz" + integrity sha512-nlDC9q75bjvS/ajbkkVlwGPSYlWhZOQ6StxMTEjvUVefL4o49NpMlGgxfN2mJ64y1CJ3MI/bIemZ3jOHmiv3Og== + dependencies: + "@envelop/types" "2.3.1" + +"@envelop/parser-cache@^4.6.0": + version "4.6.0" + resolved "https://registry.npmjs.org/@envelop/parser-cache/-/parser-cache-4.6.0.tgz" + integrity sha512-Oi3nX76tk5L7K6MdpPr4AjtpMW1XoyISeiaodYD8WxUWY7JzOA7qetuYguUZv/lK5VaLMsJuoWAwxbu1JKEe9A== + dependencies: + lru-cache "^6.0.0" + +"@envelop/types@1.5.1": + version "1.5.1" + resolved "https://registry.npmjs.org/@envelop/types/-/types-1.5.1.tgz" + integrity sha512-NrwLVzyNqiSzgRRqOxkU2IgRc5hSGS73VsgxqchU3jl36rYo7AXVAnITkytmB9wk+jN2vUOVvayLkaTXooARwg== + +"@envelop/types@2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@envelop/types/-/types-2.3.1.tgz" + integrity sha512-c5VLCVVRJ2R9LpDHg/N2BO2l4veaJhklquW+FX8GfzXU79DPWe8WmX4MbM6ABUZmSLOJkYInifHrnlqAoucxpQ== + +"@envelop/validation-cache@^4.6.0": + version "4.6.0" + resolved "https://registry.npmjs.org/@envelop/validation-cache/-/validation-cache-4.6.0.tgz" + integrity sha512-Xn5u/tQHid6GzWDenCJkIn5GsDm2fUCNnAudN1BGjXcRvAEFfTHuchpp1PJxvRAqGdYjznng+NkOcqrP5brQrw== + dependencies: + lru-cache "^6.0.0" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@graphql-authz/core@1.2.1", "@graphql-authz/core@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@graphql-authz/core/-/core-1.2.1.tgz" + integrity sha512-OSpYHmYGSN1FWQ9aoa/FIOlX0Gntph1DZfKBBOxKryYSKnVcAcm6X2mjr6kTnEWQ8BAzQDLWuD74AIsJNHqsCA== + +"@graphql-authz/envelop-plugin@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@graphql-authz/envelop-plugin/-/envelop-plugin-1.0.3.tgz" + integrity sha512-s3MHzuL7pZOCxGyy5ATD70Cb3KRp8xAIXkg73eZmcL7L/FSFHKXFan0rq9NheoxR2db3hjpChLmwIihKLsVH5Q== + dependencies: + "@graphql-authz/core" "1.2.1" + +"@graphql-tools/merge@8.3.3": + version "8.3.3" + resolved "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.3.tgz" + integrity sha512-EfULshN2s2s2mhBwbV9WpGnoehRLe7eIMdZrKfHhxlBWOvtNUd3KSCN0PUdAMd7lj1jXUW9KYdn624JrVn6qzg== + dependencies: + "@graphql-tools/utils" "8.10.0" + tslib "^2.4.0" + +"@graphql-tools/schema@^9.0.0": + version "9.0.1" + resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.1.tgz" + integrity sha512-Y6apeiBmvXEz082IAuS/ainnEEQrzMECP1MRIV72eo2WPa6ZtLYPycvIbd56Z5uU2LKP4XcWRgK6WUbCyN16Rw== + dependencies: + "@graphql-tools/merge" "8.3.3" + "@graphql-tools/utils" "8.10.0" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/utils@8.10.0", "@graphql-tools/utils@^8.8.0": + version "8.10.0" + resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.10.0.tgz" + integrity sha512-yI+V373FdXQbYfqdarehn9vRWDZZYuvyQ/xwiv5ez2BbobHrqsexF7qs56plLRaQ8ESYpVAjMQvJWe9s23O0Jg== + dependencies: + tslib "^2.4.0" + +"@graphql-typed-document-node/core@^3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz" + integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== + +"@graphql-yoga/common@^2.12.8": + version "2.12.8" + resolved "https://registry.npmjs.org/@graphql-yoga/common/-/common-2.12.8.tgz" + integrity sha512-c/dd/c9mX/A1chA2N7I/bWIf7LrZGPJbCjMUyq35cXZ2xLWaXs6d1aDS4qbsJjb6JplBu6KX6HAZTFY06UJ7ow== + dependencies: + "@envelop/core" "^2.5.0" + "@envelop/parser-cache" "^4.6.0" + "@envelop/validation-cache" "^4.6.0" + "@graphql-tools/schema" "^9.0.0" + "@graphql-tools/utils" "^8.8.0" + "@graphql-typed-document-node/core" "^3.1.1" + "@graphql-yoga/subscription" "^2.2.3" + "@whatwg-node/fetch" "^0.2.6" + dset "^3.1.1" + tslib "^2.3.1" + +"@graphql-yoga/node@^2.13.8": + version "2.13.9" + resolved "https://registry.npmjs.org/@graphql-yoga/node/-/node-2.13.9.tgz" + integrity sha512-3UWG7ueHherpdPOMYX6kHXh/nzJZQHfRUeeipI7Ig/HS9DYEJlSHyg0RRkTMIa0GkB2sAvAzRWDIQSORhnjZ/g== + dependencies: + "@envelop/core" "^2.5.0" + "@graphql-tools/utils" "^8.8.0" + "@graphql-yoga/common" "^2.12.8" + "@graphql-yoga/subscription" "^2.2.3" + "@whatwg-node/fetch" "^0.2.6" + tslib "^2.3.1" + +"@graphql-yoga/subscription@^2.2.3": + version "2.2.3" + resolved "https://registry.npmjs.org/@graphql-yoga/subscription/-/subscription-2.2.3.tgz" + integrity sha512-It/Dfh+nW2ClTtmOylAa+o7fbKIRYRTH6jfKLj3YB75tkv/rFZ70bjlChDCrEMa46I+zDMg7+cdkrQOXov2fDg== + dependencies: + "@graphql-yoga/typed-event-target" "^0.1.1" + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.3.1" + +"@graphql-yoga/typed-event-target@^0.1.1": + version "0.1.1" + resolved "https://registry.npmjs.org/@graphql-yoga/typed-event-target/-/typed-event-target-0.1.1.tgz" + integrity sha512-l23kLKHKhfD7jmv4OUlzxMTihSqgIjGWCSb0KdlLkeiaF2jjuo8pRhX200hFTrtjRHGSYS1fx2lltK/xWci+vw== + dependencies: + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.3.1" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -290,97 +478,97 @@ resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^26.2.0": - version "26.2.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.2.0.tgz#d18f2659b90930e7ec3925fb7209f1ba2cf463f0" - integrity sha512-mXQfx3nSLwiHm1i7jbu+uvi+vvpVjNGzIQYLCfsat9rapC+MJkS4zBseNrgJE0vU921b3P67bQzhduphjY3Tig== +"@jest/console@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz" + integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.2.0" - jest-util "^26.2.0" + jest-message-util "^26.6.2" + jest-util "^26.6.2" slash "^3.0.0" -"@jest/core@^26.2.2": - version "26.2.2" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.2.2.tgz#63de01ffce967618003dd7a0164b05c8041b81a9" - integrity sha512-UwA8gNI8aeV4FHGfGAUfO/DHjrFVvlBravF1Tm9Kt6qFE+6YHR47kFhgdepOFpADEKstyO+MVdPvkV6/dyt9sA== +"@jest/core@^26.6.3": + version "26.6.3" + resolved "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz" + integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== dependencies: - "@jest/console" "^26.2.0" - "@jest/reporters" "^26.2.2" - "@jest/test-result" "^26.2.0" - "@jest/transform" "^26.2.2" - "@jest/types" "^26.2.0" + "@jest/console" "^26.6.2" + "@jest/reporters" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" - jest-changed-files "^26.2.0" - jest-config "^26.2.2" - jest-haste-map "^26.2.2" - jest-message-util "^26.2.0" + jest-changed-files "^26.6.2" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" jest-regex-util "^26.0.0" - jest-resolve "^26.2.2" - jest-resolve-dependencies "^26.2.2" - jest-runner "^26.2.2" - jest-runtime "^26.2.2" - jest-snapshot "^26.2.2" - jest-util "^26.2.0" - jest-validate "^26.2.0" - jest-watcher "^26.2.0" + jest-resolve "^26.6.2" + jest-resolve-dependencies "^26.6.3" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + jest-watcher "^26.6.2" micromatch "^4.0.2" p-each-series "^2.1.0" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^26.2.0": - version "26.2.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.2.0.tgz#f6faee1630fcc2fad208953164bccb31dbe0e45f" - integrity sha512-oCgp9NmEiJ5rbq9VI/v/yYLDpladAAVvFxZgNsnJxOETuzPZ0ZcKKHYjKYwCtPOP1WCrM5nmyuOhMStXFGHn+g== +"@jest/environment@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz" + integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== dependencies: - "@jest/fake-timers" "^26.2.0" - "@jest/types" "^26.2.0" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" "@types/node" "*" - jest-mock "^26.2.0" + jest-mock "^26.6.2" -"@jest/fake-timers@^26.2.0": - version "26.2.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.2.0.tgz#b485c57dc4c74d61406a339807a9af4bac74b75a" - integrity sha512-45Gfe7YzYTKqTayBrEdAF0qYyAsNRBzfkV0IyVUm3cx7AsCWlnjilBM4T40w7IXT5VspOgMPikQlV0M6gHwy/g== +"@jest/fake-timers@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz" + integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" "@sinonjs/fake-timers" "^6.0.1" "@types/node" "*" - jest-message-util "^26.2.0" - jest-mock "^26.2.0" - jest-util "^26.2.0" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-util "^26.6.2" -"@jest/globals@^26.2.0": - version "26.2.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.2.0.tgz#ad78f1104f250c1a4bf5184a2ba51facc59b23f6" - integrity sha512-Hoc6ScEIPaym7RNytIL2ILSUWIGKlwEv+JNFof9dGYOdvPjb2evEURSslvCMkNuNg1ECEClTE8PH7ULlMJntYA== +"@jest/globals@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz" + integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== dependencies: - "@jest/environment" "^26.2.0" - "@jest/types" "^26.2.0" - expect "^26.2.0" + "@jest/environment" "^26.6.2" + "@jest/types" "^26.6.2" + expect "^26.6.2" -"@jest/reporters@^26.2.2": - version "26.2.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.2.2.tgz#5a8632ab410f4fc57782bc05dcf115e91818e869" - integrity sha512-7854GPbdFTAorWVh+RNHyPO9waRIN6TcvCezKVxI1khvFq9YjINTW7J3WU+tbR038Ynn6WjYred6vtT0YmIWVQ== +"@jest/reporters@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz" + integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.2.0" - "@jest/test-result" "^26.2.0" - "@jest/transform" "^26.2.2" - "@jest/types" "^26.2.0" + "@jest/console" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" @@ -391,133 +579,201 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" - jest-haste-map "^26.2.2" - jest-resolve "^26.2.2" - jest-util "^26.2.0" - jest-worker "^26.2.1" + jest-haste-map "^26.6.2" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^4.1.3" + v8-to-istanbul "^7.0.0" optionalDependencies: - node-notifier "^7.0.0" + node-notifier "^8.0.0" -"@jest/source-map@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.1.0.tgz#a6a020d00e7d9478f4b690167c5e8b77e63adb26" - integrity sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA== +"@jest/source-map@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz" + integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== dependencies: callsites "^3.0.0" graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^26.2.0": - version "26.2.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.2.0.tgz#51c9b165c8851cfcf7a3466019114785e154f76b" - integrity sha512-kgPlmcVafpmfyQEu36HClK+CWI6wIaAWDHNxfQtGuKsgoa2uQAYdlxjMDBEa3CvI40+2U3v36gQF6oZBkoKatw== +"@jest/test-result@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz" + integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== dependencies: - "@jest/console" "^26.2.0" - "@jest/types" "^26.2.0" + "@jest/console" "^26.6.2" + "@jest/types" "^26.6.2" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^26.2.2": - version "26.2.2" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.2.2.tgz#5e8091f2e6c61fdf242af566cb820a4eadc6c4af" - integrity sha512-SliZWon5LNqV/lVXkeowSU6L8++FGOu3f43T01L1Gv6wnFDP00ER0utV9jyK9dVNdXqfMNCN66sfcyar/o7BNw== +"@jest/test-sequencer@^26.6.3": + version "26.6.3" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz" + integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== dependencies: - "@jest/test-result" "^26.2.0" + "@jest/test-result" "^26.6.2" graceful-fs "^4.2.4" - jest-haste-map "^26.2.2" - jest-runner "^26.2.2" - jest-runtime "^26.2.2" + jest-haste-map "^26.6.2" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" -"@jest/transform@^26.2.2": - version "26.2.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.2.2.tgz#86c005c8d5d749ac54d8df53ea58675fffe7a97e" - integrity sha512-c1snhvi5wRVre1XyoO3Eef5SEWpuBCH/cEbntBUd9tI5sNYiBDmO0My/lc5IuuGYKp/HFIHV1eZpSx5yjdkhKw== +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" babel-plugin-istanbul "^6.0.0" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.4" - jest-haste-map "^26.2.2" + jest-haste-map "^26.6.2" jest-regex-util "^26.0.0" - jest-util "^26.2.0" + jest-util "^26.6.2" micromatch "^4.0.2" pirates "^4.0.1" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" - -"@jest/types@^26.2.0": - version "26.2.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.2.0.tgz#b28ca1fb517a4eb48c0addea7fcd9edc4ab45721" - integrity sha512-lvm3rJvctxd7+wxKSxxbzpDbr4FXDLaC57WEKdUIZ2cjTYuxYSc0zlyD7Z4Uqr5VdKxRUrtwIkiqBuvgf8uKJA== +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" + "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@nexus/schema@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@nexus/schema/-/schema-0.15.0.tgz#4f444417a1163a09d732e5b3b203f22780f4ae63" - integrity sha512-Q3JYHlxvQ24z5vGfDbEOT7Q+zIFYvnuPv14jNdQ/KCRk6YQODPD/nSQilfFJW+9CBIhZhWZACjbeALRKFLCwjg== +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: - iterall "^1.2.2" - tslib "^1.9.3" + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.15" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@peculiar/asn1-schema@^2.1.6": + version "2.3.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.0.tgz" + integrity sha512-DtNLAG4vmDrdSJFPe7rypkcj597chNQL7u+2dBtYo5mh7VW2+im6ke+O0NVr8W1f4re4C3F71LhoMb0Yxqa48Q== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.2" + tslib "^2.4.0" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.0.tgz" + integrity sha512-U58N44b2m3OuTgpmKgf0LPDOmP3bhwNz01vAnj1mBwxBASRhptWYK+M3zG+HBkDqGQM+bFsoIihTW8MdmPXEqg== + dependencies: + "@peculiar/asn1-schema" "^2.1.6" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.2" + tslib "^2.4.0" + webcrypto-core "^1.7.4" + +"@repeaterjs/repeater@^3.0.4": + version "3.0.4" + resolved "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz" + integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== "@sinonjs/commons@^1.7.0": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" - integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== + version "1.8.3" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz" integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== dependencies: "@sinonjs/commons" "^1.7.0" "@tootallnate/once@1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@types/accepts@*": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" - integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== - dependencies: - "@types/node" "*" - -"@types/aws-lambda@8.10.13": - version "8.10.13" - resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.13.tgz#92cc06b1cc88b5d0b327d2671dcf3daea96923a5" - integrity sha512-a1sC60Bqll4N2RYnd4+XuynrVd8LO+uZrgwCVaAER0ldMQ00LRM4iTjU2ulPoQF6P5bHZK5hL/6IF9088VJhUA== +"@total-typescript/ts-reset@^0.4.2": + version "0.4.2" + resolved "https://registry.npmjs.org/@total-typescript/ts-reset/-/ts-reset-0.4.2.tgz" + integrity sha512-vqd7ZUDSrXFVT1n8b2kc3LnklncDQFPvR58yUS1kEP23/nHPAO9l1lMjUfnPrXYYk4Hj54rrLKMW5ipwk7k09A== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== + version "7.1.19" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -526,679 +782,504 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" - integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ== +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.18.0" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz" + integrity sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw== dependencies: "@babel/types" "^7.3.0" -"@types/body-parser@*": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" - integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/connect@*": - version "3.4.33" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" - integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== - dependencies: - "@types/node" "*" - -"@types/content-disposition@*": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" - integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== - -"@types/cookies@*": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.4.tgz#26dedf791701abc0e36b5b79a5722f40e455f87b" - integrity sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw== - dependencies: - "@types/connect" "*" - "@types/express" "*" - "@types/keygrip" "*" - "@types/node" "*" - -"@types/cors@^2.8.4": - version "2.8.7" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.7.tgz#ab2f47f1cba93bce27dfd3639b006cc0e5600889" - integrity sha512-sOdDRU3oRS7LBNTIqwDkPJyq0lpHYcbMTt0TrjzsXbk/e37hcLTH6eZX7CdbDeN0yJJvzw9hFBZkbtCSbk/jAQ== - dependencies: - "@types/express" "*" - -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - -"@types/express-serve-static-core@*": - version "4.17.9" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz#2d7b34dcfd25ec663c25c85d76608f8b249667f1" - integrity sha512-DG0BYg6yO+ePW+XoDENYz8zhNGC3jDDEpComMYn7WJc4mY1Us8Rw9ax2YhJXxpyk2SF47PQAoQ0YyVT1a0bEkA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*", "@types/express@^4.11.1": - version "4.17.7" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.7.tgz#42045be6475636d9801369cd4418ef65cdb0dd59" - integrity sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "*" - "@types/qs" "*" - "@types/serve-static" "*" - "@types/form-data@^2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.5.0.tgz#5025f7433016f923348434c40006d9a797c1b0e8" + resolved "https://registry.npmjs.org/@types/form-data/-/form-data-2.5.0.tgz" integrity sha512-23/wYiuckYYtFpL+4RPWiWmRQH2BjFuqCUi2+N3amB1a1Drv+i/byTrGvlLwRVLFNAZbwpbQ7JvTK+VCAPMbcg== dependencies: form-data "*" -"@types/fs-capacitor@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" - integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ== - dependencies: - "@types/node" "*" - "@types/graceful-fs@^4.1.2": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" - integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ== + version "4.1.5" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== dependencies: "@types/node" "*" -"@types/graphql-deduplicator@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/graphql-deduplicator/-/graphql-deduplicator-2.0.0.tgz#9e577b8f3feb3d067b0ca756f4a1fb356d533922" - integrity sha512-swUwj5hWF1yFzbUXStLJrUa0ksAt11B8+SwhsAjQAX0LYJ1LLioAyuDcJ9bovWbsNzIXJYXLvljSPQw8nR728w== - -"@types/graphql-upload@^8.0.3": - version "8.0.4" - resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.4.tgz#23a8ffb3d2fe6e0ee07e6f16ee9d9d5e995a2f4f" - integrity sha512-0TRyJD2o8vbkmJF8InppFcPVcXKk+Rvlg/xvpHBIndSJYpmDWfmtx/ZAtl4f3jR2vfarpTqYgj8MZuJssSoU7Q== - dependencies: - "@types/express" "*" - "@types/fs-capacitor" "*" - "@types/koa" "*" - graphql "^15.3.0" - -"@types/graphql@^14.0.0": - version "14.5.0" - resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-14.5.0.tgz#a545fb3bc8013a3547cf2f07f5e13a33642b75d6" - integrity sha512-MOkzsEp1Jk5bXuAsHsUi6BVv0zCO+7/2PTiZMXWDSsMXvNU6w/PLMQT2vHn8hy2i0JqojPz1Sz6rsFjHtsU0lA== - dependencies: - graphql "*" - -"@types/http-assert@*": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" - integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== - -"@types/http-errors@*": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69" - integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA== - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: - "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" "@types/jest@^26.0.9": - version "26.0.9" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.9.tgz#0543b57da5f0cd949c5f423a00c56c492289c989" - integrity sha512-k4qFfJ5AUKrWok5KYXp2EPm89b0P/KZpl7Vg4XuOTVVQEhLDBDBU3iBFrjjdgd8fLw96aAtmnwhXHl63bWeBQQ== + version "26.0.24" + resolved "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz" + integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== dependencies: - jest-diff "^25.2.1" - pretty-format "^25.2.1" + jest-diff "^26.0.0" + pretty-format "^26.0.0" -"@types/json-schema@^7.0.3": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== +"@types/json-schema@^7.0.7": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - -"@types/keygrip@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" - integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== - -"@types/koa-compose@*": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" - integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== - dependencies: - "@types/koa" "*" - -"@types/koa@*": - version "2.11.4" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.4.tgz#8af02a069a9f8e08fa47b8da28d982e652f69cfb" - integrity sha512-Etqs0kdqbuAsNr5k6mlZQelpZKVwMu9WPRHVVTLnceZlhr0pYmblRNJbCgoCMzKWWePldydU0AYEOX4Q9fnGUQ== - dependencies: - "@types/accepts" "*" - "@types/content-disposition" "*" - "@types/cookies" "*" - "@types/http-assert" "*" - "@types/http-errors" "*" - "@types/keygrip" "*" - "@types/koa-compose" "*" - "@types/node" "*" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/mime@*": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" - integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== +"@types/node@*": + version "18.7.13" + resolved "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz" + integrity sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw== -"@types/node@*", "@types/node@^14.0.27": - version "14.0.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" - integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== +"@types/node@^14.0.27": + version "14.18.26" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.26.tgz" + integrity sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA== "@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + version "2.4.1" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/prettier@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.2.tgz#5bb52ee68d0f8efa9cc0099920e56be6cc4e37f3" - integrity sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA== - -"@types/qs@*": - version "6.9.4" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.4.tgz#a59e851c1ba16c0513ea123830dd639a0a15cb6a" - integrity sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ== + version "2.7.0" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz" + integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A== -"@types/range-parser@*": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" - integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== - -"@types/serve-static@*": - version "1.13.5" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.5.tgz#3d25d941a18415d3ab092def846e135a08bbcf53" - integrity sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ== +"@types/set-cookie-parser@^2.4.2": + version "2.4.2" + resolved "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz" + integrity sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w== dependencies: - "@types/express-serve-static-core" "*" - "@types/mime" "*" + "@types/node" "*" -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/strip-bom@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" - integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + resolved "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ== "@types/strip-json-comments@0.0.30": version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + resolved "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz" integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== "@types/tough-cookie@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d" - integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A== + version "4.0.2" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + +"@types/triple-beam@^1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz" + integrity sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g== "@types/ws@^7.2.6": - version "7.2.6" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.6.tgz#516cbfb818310f87b43940460e065eb912a4178d" - integrity sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ== + version "7.4.7" + resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^15.0.0": - version "15.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" - integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== + version "15.0.14" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== dependencies: "@types/yargs-parser" "*" -"@types/yup@0.26.23": - version "0.26.23" - resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.23.tgz#00721a3b675e7609e5bcccb94234e86b754bcd04" - integrity sha512-+tipAL6prdInS/avA6QityIFBDvHnqk1Tv9L5JMEws5IZC6agymBGAoDsrPyYp42wGcktyQtYKv9kvGPEKd4Qg== - -"@types/zen-observable@^0.5.3": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.5.4.tgz#b863a4191e525206819e008097ebf0fb2e3a1cdc" - integrity sha512-sW6xN96wUak4tgc89d0tbTg7QDGYhGv5hvQIS6h4mRCd8h2btiZ80loPU8cyLwsBbA4ZeQt0FjvUhJ4rNhdsGg== - -"@typescript-eslint/eslint-plugin@^2.7.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== +"@typescript-eslint/eslint-plugin@^4.28.2": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz" + integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/experimental-utils" "4.33.0" + "@typescript-eslint/scope-manager" "4.33.0" + debug "^4.3.1" functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@^2.7.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" - integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.34.0" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" + ignore "^5.1.8" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.33.0": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz" + integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.28.0": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz" + integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== + dependencies: + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz" + integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + +"@typescript-eslint/typescript-estree@4.33.0": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@wry/equality@^0.1.2": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" - integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== - dependencies: - tslib "^1.9.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== + dependencies: + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" + +"@whatwg-node/fetch@^0.2.6": + version "0.2.9" + resolved "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.2.9.tgz" + integrity sha512-h+ehuqE/ZqJdRy+xywHyKpBIPmST0ms8Itgf4gGSu10pJrmod3/t9DbG/GlATvLBE4pvqYHrxKAKo3NNQVJc3g== + dependencies: + "@peculiar/webcrypto" "^1.4.0" + abort-controller "^3.0.0" + busboy "^1.6.0" + event-target-polyfill "^0.0.3" + form-data-encoder "^1.7.1" + formdata-node "^4.3.1" + node-fetch "^2.6.7" + undici "^5.8.0" + web-streams-polyfill "^3.2.0" abab@^2.0.3, abab@^2.0.5: version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + event-target-shim "^5.0.0" acorn-globals@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.1.1, acorn@^7.3.1: +acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4: version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" -ajv@^6.10.0, ajv@^6.10.2: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.11.0" - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + type-fest "^0.21.3" -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" anymatch@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3, anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" -apollo-cache-control@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.1.1.tgz#173d14ceb3eb9e7cb53de7eb8b61bee6159d4171" - integrity sha512-XJQs167e9u+e5ybSi51nGYr70NPBbswdvTEHtbtXbwkZ+n9t0SLPvUcoqceayOSwjK1XYOdU/EKPawNdb3rLQA== - dependencies: - graphql-extensions "^0.0.x" - -apollo-link@^1.2.14: - version "1.2.14" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" - integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== - dependencies: - apollo-utilities "^1.3.0" - ts-invariant "^0.4.0" - tslib "^1.9.3" - zen-observable-ts "^0.8.21" - -apollo-server-core@^1.3.6, apollo-server-core@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.4.0.tgz#4faff7f110bfdd6c3f47008302ae24140f94c592" - integrity sha512-BP1Vh39krgEjkQxbjTdBURUjLHbFq1zeOChDJgaRsMxGtlhzuLWwwC6lLdPatN8jEPbeHq8Tndp9QZ3iQZOKKA== - dependencies: - apollo-cache-control "^0.1.0" - apollo-tracing "^0.1.0" - graphql-extensions "^0.0.x" - -apollo-server-express@^1.3.6: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-1.4.0.tgz#7d7c58d6d6f9892b83fe575669093bb66738b125" - integrity sha512-zkH00nxhLnJfO0HgnNPBTfZw8qI5ILaPZ5TecMCI9+Y9Ssr2b0bFr9pBRsXy9eudPhI+/O4yqegSUsnLdF/CPw== - dependencies: - apollo-server-core "^1.4.0" - apollo-server-module-graphiql "^1.4.0" - -apollo-server-lambda@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/apollo-server-lambda/-/apollo-server-lambda-1.3.6.tgz#bdaac37f143c6798e40b8ae75580ba673cea260e" - integrity sha1-varDfxQ8Z5jkC4rnVYC6ZzzqJg4= - dependencies: - apollo-server-core "^1.3.6" - apollo-server-module-graphiql "^1.3.4" - -apollo-server-module-graphiql@^1.3.4, apollo-server-module-graphiql@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.4.0.tgz#c559efa285578820709f1769bb85d3b3eed3d8ec" - integrity sha512-GmkOcb5he2x5gat+TuiTvabnBf1m4jzdecal3XbXBh/Jg+kx4hcvO3TTDFQ9CuTprtzdcVyA11iqG7iOMOt7vA== - -apollo-tracing@^0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.1.4.tgz#5b8ae1b01526b160ee6e552a7f131923a9aedcc7" - integrity sha512-Uv+1nh5AsNmC3m130i2u3IqbS+nrxyVV3KYimH5QKsdPjxxIQB3JAT+jJmpeDxBel8gDVstNmCh82QSLxLSIdQ== - dependencies: - graphql-extensions "~0.0.9" - -apollo-upload-server@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/apollo-upload-server/-/apollo-upload-server-7.1.0.tgz#21e07b52252b3749b913468599813e13cfca805f" - integrity sha512-cD9ReCeyurYwZyEDqJYb5TOc9dt8yhPzS+MtrY3iJdqw+pqiiyPngAvVXHjN+Ca7Lajvom4/AT/PBrYVDMM3Kw== - dependencies: - busboy "^0.2.14" - fs-capacitor "^1.0.0" - http-errors "^1.7.0" - object-path "^0.11.4" - -apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" - integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== - dependencies: - "@wry/equality" "^0.1.2" - fast-json-stable-stringify "^2.0.0" - ts-invariant "^0.4.0" - tslib "^1.10.0" - arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" arr-diff@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.4, array-includes@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-unique@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" - integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== 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.19.2" + es-shim-unscopables "^1.0.0" + +asn1js@^3.0.1, asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async@^3.2.3: + version "3.2.4" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== atob@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== axios-cookiejar-support@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/axios-cookiejar-support/-/axios-cookiejar-support-1.0.0.tgz#9fceb20d3dd541eec1eb1a346bf3265a3b6e7bca" - integrity sha512-9pBlIU5jfrGZTnUQlt8symShviSTOSlOKGtryHx76lJPnKIXDqUT3JDAjJ1ywOQLyfiWrthIt4iJiVP2L2S4jA== + version "1.0.1" + resolved "https://registry.npmjs.org/axios-cookiejar-support/-/axios-cookiejar-support-1.0.1.tgz" + integrity sha512-IZJxnAJ99XxiLqNeMOqrPbfR7fRyIfaoSLdPUf4AMQEGkH8URs0ghJK/xtqBsD+KsSr3pKl4DEQjCn834pHMig== dependencies: is-redirect "^1.0.0" pify "^5.0.0" axios@^0.21.2: - version "0.21.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.2.tgz#21297d5084b2aeeb422f5d38e7be4fbb82239017" - integrity sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg== + version "0.21.4" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" -babel-jest@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.2.2.tgz#70f618f2d7016ed71b232241199308985462f812" - integrity sha512-JmLuePHgA+DSOdOL8lPxCgD2LhPPm+rdw1vnxR73PpIrnmKCS2/aBhtkAcxQWuUcW2hBrH8MJ3LKXE7aWpNZyA== +babel-jest@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== dependencies: - "@jest/transform" "^26.2.2" - "@jest/types" "^26.2.0" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" "@types/babel__core" "^7.1.7" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.2.0" + babel-preset-jest "^26.6.2" chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz#bdd0011df0d3d513e5e95f76bd53b51147aca2dd" - integrity sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA== +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-preset-current-node-syntax@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz#b4b547acddbf963cba555ba9f9cbbb70bfd044da" - integrity sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ== +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" @@ -1211,28 +1292,24 @@ babel-preset-current-node-syntax@^0.1.2: "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.2.0.tgz#f198201a4e543a43eb40bc481e19736e095fd3e0" - integrity sha512-R1k8kdP3R9phYQugXeNnK/nvCGlBzG4m3EoIIukC80GXb6wCv2XiwPhK6K9MAkQcMszWBYvl2Wm+yigyXFQqXg== +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== dependencies: - babel-plugin-jest-hoist "^26.2.0" - babel-preset-current-node-syntax "^0.1.2" - -backo2@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base@^0.11.1: version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" @@ -1244,36 +1321,13 @@ base@^0.11.1: pascalcase "^0.1.1" binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== - -body-parser-graphql@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/body-parser-graphql/-/body-parser-graphql-1.1.0.tgz#80a80353c7cb623562fd375750dfe018d75f0f7c" - integrity sha512-bOBF4n1AnUjcY1SzLeibeIx4XOuYqEkjn/Lm4yKhnN6KedoXMv4hVqgcKHGRnxOMJP64tErqrQU+4cihhpbJXg== - dependencies: - body-parser "^1.18.2" - -body-parser@1.19.0, body-parser@^1.18.2: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1281,7 +1335,7 @@ brace-expansion@^1.1.7: braces@^2.3.1: version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" @@ -1295,60 +1349,57 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browser-process-hrtime@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browserslist@^4.20.2: + version "4.21.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz" + integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== + dependencies: + caniuse-lite "^1.0.30001370" + electron-to-chromium "^1.4.202" + node-releases "^2.0.6" + update-browserslist-db "^1.0.5" + bs-logger@0.x: version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@1.x, buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -busboy@^0.2.14: - version "0.2.14" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" - integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= - dependencies: - dicer "0.2.5" - readable-stream "1.1.x" + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -busboy@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" - integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: - dicer "0.3.0" - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + streamsearch "^1.1.0" cache-base@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" @@ -1361,103 +1412,100 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - camelcase-keys@^6.2.2: version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: camelcase "^5.3.1" map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" - integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001370: + version "1.0.30001383" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001383.tgz" + integrity sha512-swMpEoTp5vDoGBZsYZX7L7nXHe6dsHxi9o6/LKf/f0LukVtnrxly5GVb/fWdCDTqi/yw6Km6tiJ0pmBacm0gbg== capture-exit@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + resolved "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz" integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== dependencies: rsvp "^4.8.4" chalk@^2.0.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chokidar@^3.4.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== +chokidar@^3.5.1: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.2" ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cjs-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz" + integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== + class-utils@^0.3.5: version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" @@ -1467,7 +1515,7 @@ class-utils@^0.3.5: cliui@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -1476,123 +1524,114 @@ cliui@^6.0.0: co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== collection-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" component-emitter@^1.2.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - copy-descriptor@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -core-js@^2.5.3: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cors@^2.8.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: - object-assign "^4" - vary "^1" + cross-spawn "^7.0.1" cross-spawn@^6.0.0: version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -1601,9 +1640,9 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -1612,120 +1651,101 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: cssom@^0.4.4: version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - data-urls@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: abab "^2.0.3" whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -dateformat@~1.0.4-1.2.3: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" + ms "2.1.2" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + version "10.4.0" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz" + integrity sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg== decode-uri-component@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" + integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" define-property@^0.2.5: version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" @@ -1733,190 +1753,178 @@ define-property@^2.0.2: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -deprecated-decorator@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" - integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -dicer@0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" - integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= - dependencies: - readable-stream "1.1.x" - streamsearch "0.1.2" - -dicer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" - integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== - dependencies: - streamsearch "0.1.2" - -diff-sequences@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" - integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== - -diff-sequences@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6" - integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg== +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - esutils "^2.0.2" - isarray "^1.0.0" + path-type "^4.0.0" doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" domexception@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: webidl-conversions "^5.0.0" dotenv@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + version "8.6.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +dset@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz" + integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== dynamic-dedupe@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" - integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= + resolved "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz" + integrity sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ== dependencies: xtend "^4.0.0" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.4.202: + version "1.4.230" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.230.tgz" + integrity sha512-3pwjAK0qHSDN9+YAF4fJknsSruP7mpjdWzUSruIJD/JCH77pEh0SorEyb3xVaKkfwk2tzjOt2D8scJ0KAdfXLA== emittery@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" - integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + version "0.7.2" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enquirer@^2.3.5: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" is-symbol "^1.0.2" -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" @@ -1926,155 +1934,174 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-kodefox@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/eslint-config-kodefox/-/eslint-config-kodefox-0.2.2.tgz#0adb0555369685b804fe30b66e2ef77e1bb9cec6" - integrity sha512-R0cAFvsfCIhbt/xiaDOZp8JlE95Gtrdkm1hJZvNcbODdxUPRMJW89PaC+RDjo+Sv5mXQuxfitHiumUx5xlW+bA== - dependencies: - "@typescript-eslint/eslint-plugin" "^2.7.0" - "@typescript-eslint/parser" "^2.7.0" - eslint-config-prettier "^6.5.0" - eslint-plugin-eslint-comments "^3.1.2" - eslint-plugin-import "^2.20.1" - eslint-plugin-prettier "^3.1.1" +eslint-config-kodefox@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/eslint-config-kodefox/-/eslint-config-kodefox-1.2.0.tgz" + integrity sha512-CjSTQe3Q/nAXLxEs+PiZBRw8OvL8MNQTydpJ17TOZLHmYKtWXM58zdYAXuGslrSYetF9zwCuXqjhfeVhcG7t7w== + dependencies: + "@typescript-eslint/eslint-plugin" "^4.28.2" + "@typescript-eslint/parser" "^4.28.0" + eslint-config-prettier "^6.15.0" + eslint-plugin-eslint-comments "^3.2.0" + eslint-plugin-import "^2.22.1" + eslint-plugin-prettier "^3.1.4" optionalDependencies: - eslint-plugin-react "^7.16.0" - eslint-plugin-react-hooks "^2.2.0" - eslint-plugin-react-native "^3.8.1" + eslint-plugin-react "^7.21.5" + eslint-plugin-react-hooks "^4.2.0" + eslint-plugin-react-native "^3.10.0" -eslint-config-prettier@^6.5.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" - integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== +eslint-config-prettier@^6.15.0: + version "6.15.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" -eslint-import-resolver-node@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + resolve "^1.20.0" -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-module-utils@^2.7.3: + version "2.7.4" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" + debug "^3.2.7" -eslint-plugin-eslint-comments@^3.1.2: +eslint-plugin-eslint-comments@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + resolved "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz" integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== dependencies: escape-string-regexp "^1.0.5" ignore "^5.0.5" -eslint-plugin-import@^2.20.1: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== +eslint-plugin-import@^2.22.1: + version "2.26.0" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" - eslint-module-utils "^2.6.0" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-prettier@^3.1.1: - version "3.1.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" - integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-prettier@^3.1.4: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz" + integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-react-hooks@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.1.tgz#4ef5930592588ce171abeb26f400c7fbcbc23cd0" - integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g== +eslint-plugin-react-hooks@^4.2.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react-native-globals@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" + resolved "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz" integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== -eslint-plugin-react-native@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.8.1.tgz#92811e37191ecb0d29c0f0a0c9e5c943ee573821" - integrity sha512-6Z4s4nvgFRdda/1s1+uu4a6EMZwEjjJ9Bk/1yBImv0fd9U2CsGu2cUakAtV83cZKhizbWhSouXoaK4JtlScdFg== +eslint-plugin-react-native@^3.10.0: + version "3.11.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-3.11.0.tgz" + integrity sha512-7F3OTwrtQPfPFd+VygqKA2VZ0f2fz0M4gJmry/TRE18JBb94/OtMxwbL7Oqwu7FGyrdeIOWnXQbBAveMcSTZIA== dependencies: + "@babel/traverse" "^7.7.4" eslint-plugin-react-native-globals "^0.1.1" -eslint-plugin-react@^7.16.0: - version "7.20.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.5.tgz#29480f3071f64a04b2c3d99d9b460ce0f76fb857" - integrity sha512-ajbJfHuFnpVNJjhyrfq+pH1C0gLc2y94OiCbAXT5O0J0YCKaFEHDV8+3+mDOr+w8WguRX+vSs1bM2BDG0VLvCw== +eslint-plugin-react@^7.21.5: + version "7.31.0" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.0.tgz" + integrity sha512-BWriBttYYCnfb4RO9SB91Og8uA9CPcBMl5UlCOCtuYW1UjhN3QypzEcEHky4ZIRZDKjbO2Blh9BjP8E7W/b1SA== dependencies: - array-includes "^3.1.1" - array.prototype.flatmap "^1.2.3" + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.4.1" - object.entries "^1.1.2" - object.fromentries "^2.0.2" - object.values "^1.1.1" - prop-types "^15.7.2" - resolve "^1.17.0" - string.prototype.matchall "^4.0.2" - -eslint-scope@^5.0.0, eslint-scope@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: +eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + eslint@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.6.0.tgz#522d67cfaea09724d96949c70e7a0550614d64d6" - integrity sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w== + version "7.32.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: - "@babel/code-frame" "^7.0.0" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" - eslint-scope "^5.1.0" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" - espree "^7.2.0" - esquery "^1.2.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -2082,7 +2109,7 @@ eslint@^7.6.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.19" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -2091,76 +2118,71 @@ eslint@^7.6.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" - integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: - acorn "^7.3.1" - acorn-jsx "^5.2.0" + acorn "^7.4.0" + acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +event-target-polyfill@^0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/event-target-polyfill/-/event-target-polyfill-0.0.3.tgz" + integrity sha512-ZMc6UuvmbinrCk4RzGyVmRyIsAyxMRlp4CqSrcQRO8Dy0A9ldbiRy5kdtBj4OtP7EClGdqGfIqo9JmOClMsGLQ== -eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + version "0.3.6" + resolved "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: cross-spawn "^6.0.0" @@ -2172,9 +2194,9 @@ execa@^1.0.0: strip-eof "^1.0.0" execa@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" - integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== + version "4.1.0" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== dependencies: cross-spawn "^7.0.0" get-stream "^5.0.0" @@ -2188,13 +2210,13 @@ execa@^4.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-brackets@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -2204,72 +2226,36 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.2.0.tgz#0140dd9cc7376d7833852e9cda88c05414f1efba" - integrity sha512-8AMBQ9UVcoUXt0B7v+5/U5H6yiUR87L6eKCfjE3spx7Ya5lF+ebUo37MCFBML2OiLfkX1sxmQOZhIDonyVTkcw== +expect@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" ansi-styles "^4.0.0" - jest-get-type "^26.0.0" - jest-matcher-utils "^26.2.0" - jest-message-util "^26.2.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" jest-regex-util "^26.0.0" -express@^4.16.3: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" extglob@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" @@ -2281,44 +2267,74 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" fb-watchman@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: bser "2.1.1" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-stream-rotator@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz#007019e735b262bb6c6f0197e58e5c87cb96cec3" + integrity sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ== dependencies: - flat-cache "^2.0.1" + moment "^2.29.1" fill-range@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -2327,371 +2343,272 @@ fill-range@^4.0.0: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -fn-name@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" - integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.14.0: version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz" integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== 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= + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +form-data-encoder@^1.7.1: + version "1.7.2" + resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz" + integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== + +form-data@*, form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" -form-data@*, form-data@^3.0.0: +form-data@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" mime-types "^2.1.12" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +formdata-node@^4.3.1: + version "4.4.1" + resolved "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz" + integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== + dependencies: + node-domexception "1.0.0" + web-streams-polyfill "4.0.0-beta.3" fragment-cache@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -fs-capacitor@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-1.0.1.tgz#ff9dbfa14dfaf4472537720f19c3088ed9278df0" - integrity sha512-XdZK0Q78WP29Vm3FGgJRhRhrBm51PagovzWtW2kJ3Q6cYJbGtZqWSGTSPwvtEkyjIirFd7b8Yes/dpOYjt4RRQ== - -fs-capacitor@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" - integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== - fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.1.2, 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.1.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + 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" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stdin@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== get-stream@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" get-stream@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== -glob-parent@^5.0.0, glob-parent@~5.1.0: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -graceful-fs@^4.1.2, graceful-fs@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -graphql-deduplicator@^2.0.1: - version "2.0.6" - resolved "https://registry.yarnpkg.com/graphql-deduplicator/-/graphql-deduplicator-2.0.6.tgz#83ba9225235531de7be47fdf9fa6d6395d48565c" - integrity sha512-sm9tNL+9qqIrKBb7Ovy8opUE+WKuK/r+hvcP49VL8Kop6slRJn7a5vW2wRNrMfZAZ5p9KHmJ3AkB/3j+Q6d+LA== - -graphql-extensions@^0.0.x, graphql-extensions@~0.0.9: - version "0.0.10" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.0.10.tgz#34bdb2546d43f6a5bc89ab23c295ec0466c6843d" - integrity sha512-TnQueqUDCYzOSrpQb3q1ngDSP2otJSF+9yNLrQGPzkMsvnQ+v6e2d5tl+B35D4y+XpmvVnAn4T3ZK28mkILveA== - dependencies: - core-js "^2.5.3" - source-map-support "^0.5.1" - -graphql-import@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.7.1.tgz#4add8d91a5f752d764b0a4a7a461fcd93136f223" - integrity sha512-YpwpaPjRUVlw2SN3OPljpWbVRWAhMAyfSba5U47qGMOSsPLi2gYeJtngGpymjm9nk57RFWEpjqwh4+dpYuFAPw== - dependencies: - lodash "^4.17.4" - resolve-from "^4.0.0" - -graphql-middleware@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/graphql-middleware/-/graphql-middleware-4.0.1.tgz#8c627b22cc046a47e9474a813cf9e0bd50fa0c4b" - integrity sha512-r9r+pcHV4yZW7LAOcjQYTbNY6nR9SrLgpVZKbrtgXxpQW/MUc1N8q3PESciebvp5s0EEUgRchcRjUkyaArCIFw== - dependencies: - graphql-tools "^4.0.5" - -graphql-playground-html@1.6.12: - version "1.6.12" - resolved "https://registry.yarnpkg.com/graphql-playground-html/-/graphql-playground-html-1.6.12.tgz#8b3b34ab6013e2c877f0ceaae478fafc8ca91b85" - integrity sha512-yOYFwwSMBL0MwufeL8bkrNDgRE7eF/kTHiwrqn9FiR9KLcNIl1xw9l9a+6yIRZM56JReQOHpbQFXTZn1IuSKRg== - -graphql-playground-middleware-express@1.7.11: - version "1.7.11" - resolved "https://registry.yarnpkg.com/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.11.tgz#bbffd784a37133bfa7165bdd8f429081dbf4bcf6" - integrity sha512-sKItB4s3FxqlwCgXdMfwRAfssSoo31bcFsGAAg/HzaZLicY6CDlofKXP8G5iPDerB6NaoAcAaBLutLzl9sd4fQ== - dependencies: - graphql-playground-html "1.6.12" - -graphql-playground-middleware-lambda@1.7.12: - version "1.7.12" - resolved "https://registry.yarnpkg.com/graphql-playground-middleware-lambda/-/graphql-playground-middleware-lambda-1.7.12.tgz#1b06440a288dbcd53f935b43e5b9ca2738a06305" - integrity sha512-fJ1Y0Ck5ctmfaQFoWv7vNnVP7We19P3miVmOT85YPrjpzbMYv0wPfxm4Zjt8nnqXr0KU9nGW53tz3K7/Lvzxtw== +globals@^13.6.0, globals@^13.9.0: + version "13.17.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: - graphql-playground-html "1.6.12" + type-fest "^0.20.2" -graphql-shield@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-6.1.0.tgz#7298af72167e7c9fd19a36fac9b425b94025a393" - integrity sha512-dIZ6ABnUn3XQtIzw9/9f8wFmZoY5XZlsHgkxSKF+N/oXmKvQoi11J5/y/jxJTBmKYi/2JZ12C1JjDn5TOopn+w== +globby@^11.0.3: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: - "@types/yup" "0.26.23" - lightercollective "^0.3.0" - object-hash "^1.3.1" - yup "^0.27.0" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" -graphql-subscriptions@^0.5.8: - version "0.5.8" - resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-0.5.8.tgz#13a6143c546bce390404657dc73ca501def30aa7" - integrity sha512-0CaZnXKBw2pwnIbvmVckby5Ge5e2ecmjofhYCdyeACbCly2j3WXDP/pl+s+Dqd2GQFC7y99NB+53jrt55CKxYQ== - dependencies: - iterall "^1.2.1" +graceful-fs@^4.2.4: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graphql-tools@^4.0.0, graphql-tools@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30" - integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== - dependencies: - apollo-link "^1.2.14" - apollo-utilities "^1.0.1" - deprecated-decorator "^0.1.6" - iterall "^1.1.3" - uuid "^3.1.0" - -graphql-upload@8.0.7: - version "8.0.7" - resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.0.7.tgz#8644264e241529552ea4b3797e7ee15809cf01a3" - integrity sha512-gi2yygbDPXbHPC7H0PNPqP++VKSoNoJO4UrXWq4T0Bi4IhyUd3Ycop/FSxhx2svWIK3jdXR/i0vi91yR1aAF0g== - dependencies: - busboy "^0.3.1" - fs-capacitor "^2.0.4" - http-errors "^1.7.2" - object-path "^0.11.4" - -graphql-upload@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.1.0.tgz#6d0ab662db5677a68bfb1f2c870ab2544c14939a" - integrity sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q== - dependencies: - busboy "^0.3.1" - fs-capacitor "^2.0.4" - http-errors "^1.7.3" - object-path "^0.11.4" - -graphql-yoga@^1.18.3: - version "1.18.3" - resolved "https://registry.yarnpkg.com/graphql-yoga/-/graphql-yoga-1.18.3.tgz#047fa511dbef63cf6d6ea7c06a71202d37444844" - integrity sha512-tR6JYbwLSBVu0Z8M7BIyt1PHhhexmRwneYM8Ru/g2pixrtsWbelBFAXU7bDPhXrqZ49Zxt2zLJ60x3bLNGo/bQ== - dependencies: - "@types/aws-lambda" "8.10.13" - "@types/cors" "^2.8.4" - "@types/express" "^4.11.1" - "@types/graphql" "^14.0.0" - "@types/graphql-deduplicator" "^2.0.0" - "@types/zen-observable" "^0.5.3" - apollo-server-express "^1.3.6" - apollo-server-lambda "1.3.6" - apollo-upload-server "^7.0.0" - body-parser-graphql "1.1.0" - cors "^2.8.4" - express "^4.16.3" - graphql "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0" - graphql-deduplicator "^2.0.1" - graphql-import "^0.7.0" - graphql-middleware "4.0.1" - graphql-playground-middleware-express "1.7.11" - graphql-playground-middleware-lambda "1.7.12" - graphql-subscriptions "^0.5.8" - graphql-tools "^4.0.0" - graphql-upload "^8.0.0" - subscriptions-transport-ws "^0.9.8" - -graphql@*, graphql@^15.3.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.3.0.tgz#3ad2b0caab0d110e3be4a5a9b2aa281e362b5278" - integrity sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w== - -"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0": - version "14.7.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72" - integrity sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA== - dependencies: - iterall "^1.2.2" +graphql@^16.5.0: + version "16.6.0" + resolved "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz" + integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== growly@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz" + integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, 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-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" has-value@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -2699,8 +2616,8 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -2708,77 +2625,44 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" kind-of "^4.0.0" has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== html-encoding-sniffer@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: whatwg-encoding "^1.0.5" html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@^1.7.0, http-errors@^1.7.2, http-errors@^1.7.3: - version "1.8.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" - integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-proxy-agent@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" @@ -2787,7 +2671,7 @@ http-proxy-agent@^4.0.1: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -2795,151 +2679,163 @@ https-proxy-agent@^5.0.0: human-signals@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.5: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.0.5, ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -import-fresh@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@~2.0.1: +inherits@2, inherits@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - es-abstract "^1.17.0-next.1" + get-intrinsic "^1.1.0" has "^1.0.3" - side-channel "^1.0.2" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + side-channel "^1.0.4" is-accessor-descriptor@^0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^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" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-ci@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" +is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-descriptor@^0.1.0: version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" @@ -2948,7 +2844,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" @@ -2956,169 +2852,178 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: kind-of "^6.0.2" is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 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" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-redirect@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + resolved "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz" + integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw== -is-regex@^1.1.0: - 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.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: - has-symbols "^1.0.1" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" 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= + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -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-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-typedarray@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@^1.0.0: +isarray@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: +istanbul-lib-instrument@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== dependencies: "@babel/core" "^7.7.5" @@ -3126,9 +3031,20 @@ istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-instrument@^5.0.4: + version "5.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -3136,428 +3052,416 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + version "3.1.5" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2: +iterall@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + resolved "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== -jest-changed-files@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.2.0.tgz#b4946201defe0c919a2f3d601e9f98cb21dacc15" - integrity sha512-+RyJb+F1K/XBLIYiL449vo5D+CvlHv29QveJUWNPXuUicyZcq+tf1wNxmmFeRvAU1+TzhwqczSjxnCCFt7+8iA== +jest-changed-files@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz" + integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" execa "^4.0.0" throat "^5.0.0" -jest-cli@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.2.2.tgz#4c273e5474baafac1eb15fd25aaafb4703f5ffbc" - integrity sha512-vVcly0n/ijZvdy6gPQiQt0YANwX2hLTPQZHtW7Vi3gcFdKTtif7YpI85F8R8JYy5DFSWz4x1OW0arnxlziu5Lw== +jest-cli@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz" + integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== dependencies: - "@jest/core" "^26.2.2" - "@jest/test-result" "^26.2.0" - "@jest/types" "^26.2.0" + "@jest/core" "^26.6.3" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^26.2.2" - jest-util "^26.2.0" - jest-validate "^26.2.0" + jest-config "^26.6.3" + jest-util "^26.6.2" + jest-validate "^26.6.2" prompts "^2.0.1" - yargs "^15.3.1" + yargs "^15.4.1" -jest-config@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.2.2.tgz#f3ebc7e2bc3f49de8ed3f8007152f345bb111917" - integrity sha512-2lhxH0y4YFOijMJ65usuf78m7+9/8+hAb1PZQtdRdgnQpAb4zP6KcVDDktpHEkspBKnc2lmFu+RQdHukUUbiTg== +jest-config@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz" + integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.2.2" - "@jest/types" "^26.2.0" - babel-jest "^26.2.2" + "@jest/test-sequencer" "^26.6.3" + "@jest/types" "^26.6.2" + babel-jest "^26.6.3" chalk "^4.0.0" deepmerge "^4.2.2" glob "^7.1.1" graceful-fs "^4.2.4" - jest-environment-jsdom "^26.2.0" - jest-environment-node "^26.2.0" - jest-get-type "^26.0.0" - jest-jasmine2 "^26.2.2" + jest-environment-jsdom "^26.6.2" + jest-environment-node "^26.6.2" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.6.3" jest-regex-util "^26.0.0" - jest-resolve "^26.2.2" - jest-util "^26.2.0" - jest-validate "^26.2.0" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" micromatch "^4.0.2" - pretty-format "^26.2.0" - -jest-diff@^25.2.1: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" - integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== - dependencies: - chalk "^3.0.0" - diff-sequences "^25.2.6" - jest-get-type "^25.2.6" - pretty-format "^25.5.0" + pretty-format "^26.6.2" -jest-diff@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.2.0.tgz#dee62c771adbb23ae585f3f1bd289a6e8ef4f298" - integrity sha512-Wu4Aopi2nzCsHWLBlD48TgRy3Z7OsxlwvHNd1YSnHc7q1NJfrmyCPoUXrTIrydQOG5ApaYpsAsdfnMbJqV1/wQ== +jest-diff@^26.0.0, jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== dependencies: chalk "^4.0.0" - diff-sequences "^26.0.0" - jest-get-type "^26.0.0" - pretty-format "^26.2.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" jest-docblock@^26.0.0: version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz" integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== dependencies: detect-newline "^3.0.0" -jest-each@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.2.0.tgz#aec8efa01d072d7982c900e74940863385fa884e" - integrity sha512-gHPCaho1twWHB5bpcfnozlc6mrMi+VAewVPNgmwf81x2Gzr6XO4dl+eOrwPWxbkYlgjgrYjWK2xgKnixbzH3Ew== +jest-each@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz" + integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" chalk "^4.0.0" - jest-get-type "^26.0.0" - jest-util "^26.2.0" - pretty-format "^26.2.0" - -jest-environment-jsdom@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.2.0.tgz#6443a6f3569297dcaa4371dddf93acaf167302dc" - integrity sha512-sDG24+5M4NuIGzkI3rJW8XUlrpkvIdE9Zz4jhD8OBnVxAw+Y1jUk9X+lAOD48nlfUTlnt3lbAI3k2Ox+WF3S0g== - dependencies: - "@jest/environment" "^26.2.0" - "@jest/fake-timers" "^26.2.0" - "@jest/types" "^26.2.0" + jest-get-type "^26.3.0" + jest-util "^26.6.2" + pretty-format "^26.6.2" + +jest-environment-jsdom@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" "@types/node" "*" - jest-mock "^26.2.0" - jest-util "^26.2.0" - jsdom "^16.2.2" - -jest-environment-node@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.2.0.tgz#fee89e06bdd4bed3f75ee2978d73ede9bb57a681" - integrity sha512-4M5ExTYkJ19efBzkiXtBi74JqKLDciEk4CEsp5tTjWGYMrlKFQFtwIVG3tW1OGE0AlXhZjuHPwubuRYY4j4uOw== - dependencies: - "@jest/environment" "^26.2.0" - "@jest/fake-timers" "^26.2.0" - "@jest/types" "^26.2.0" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +jest-environment-node@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz" + integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" "@types/node" "*" - jest-mock "^26.2.0" - jest-util "^26.2.0" + jest-mock "^26.6.2" + jest-util "^26.6.2" -jest-get-type@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" - integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-get-type@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039" - integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg== - -jest-haste-map@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.2.2.tgz#6d4267b1903854bfdf6a871419f35a82f03ae71e" - integrity sha512-3sJlMSt+NHnzCB+0KhJ1Ut4zKJBiJOlbrqEYNdRQGlXTv8kqzZWjUKQRY3pkjmlf+7rYjAV++MQ4D6g4DhAyOg== +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" "@types/graceful-fs" "^4.1.2" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.4" jest-regex-util "^26.0.0" - jest-serializer "^26.2.0" - jest-util "^26.2.0" - jest-worker "^26.2.1" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.2.2.tgz#d82b1721fac2b153a4f8b3f0c95e81e702812de2" - integrity sha512-Q8AAHpbiZMVMy4Hz9j1j1bg2yUmPa1W9StBvcHqRaKa9PHaDUMwds8LwaDyzP/2fkybcTQE4+pTMDOG9826tEw== +jest-jasmine2@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz" + integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.2.0" - "@jest/source-map" "^26.1.0" - "@jest/test-result" "^26.2.0" - "@jest/types" "^26.2.0" + "@jest/environment" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^26.2.0" + expect "^26.6.2" is-generator-fn "^2.0.0" - jest-each "^26.2.0" - jest-matcher-utils "^26.2.0" - jest-message-util "^26.2.0" - jest-runtime "^26.2.2" - jest-snapshot "^26.2.2" - jest-util "^26.2.0" - pretty-format "^26.2.0" + jest-each "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + pretty-format "^26.6.2" throat "^5.0.0" -jest-leak-detector@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.2.0.tgz#073ee6d8db7a9af043e7ce99d8eea17a4fb0cc50" - integrity sha512-aQdzTX1YiufkXA1teXZu5xXOJgy7wZQw6OJ0iH5CtQlOETe6gTSocaYKUNui1SzQ91xmqEUZ/WRavg9FD82rtQ== +jest-leak-detector@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz" + integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== dependencies: - jest-get-type "^26.0.0" - pretty-format "^26.2.0" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" -jest-matcher-utils@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.2.0.tgz#b107af98c2b8c557ffd46c1adf06f794aa52d622" - integrity sha512-2cf/LW2VFb3ayPHrH36ZDjp9+CAeAe/pWBAwsV8t3dKcrINzXPVxq8qMWOxwt5BaeBCx4ZupVGH7VIgB8v66vQ== +jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== dependencies: chalk "^4.0.0" - jest-diff "^26.2.0" - jest-get-type "^26.0.0" - pretty-format "^26.2.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" -jest-message-util@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.2.0.tgz#757fbc1323992297092bb9016a71a2eb12fd22ea" - integrity sha512-g362RhZaJuqeqG108n1sthz5vNpzTNy926eNDszo4ncRbmmcMRIUAZibnd6s5v2XSBCChAxQtCoN25gnzp7JbQ== +jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.2.0" - "@types/stack-utils" "^1.0.1" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.4" micromatch "^4.0.2" + pretty-format "^26.6.2" slash "^3.0.0" stack-utils "^2.0.2" -jest-mock@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.2.0.tgz#a1b3303ab38c34aa1dbbc16ab57cdc1a59ed50d1" - integrity sha512-XeC7yWtWmWByoyVOHSsE7NYsbXJLtJNgmhD7z4MKumKm6ET0si81bsSLbQ64L5saK3TgsHo2B/UqG5KNZ1Sp/Q== +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" "@types/node" "*" jest-pnp-resolver@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== jest-regex-util@^26.0.0: version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== -jest-resolve-dependencies@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.2.2.tgz#2ad3cd9281730e9a5c487cd846984c5324e47929" - integrity sha512-S5vufDmVbQXnpP7435gr710xeBGUFcKNpNswke7RmFvDQtmqPjPVU/rCeMlEU0p6vfpnjhwMYeaVjKZAy5QYJA== +jest-resolve-dependencies@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz" + integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" jest-regex-util "^26.0.0" - jest-snapshot "^26.2.2" + jest-snapshot "^26.6.2" -jest-resolve@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.2.2.tgz#324a20a516148d61bffa0058ed0c77c510ecfd3e" - integrity sha512-ye9Tj/ILn/0OgFPE/3dGpQPUqt4dHwIocxt5qSBkyzxQD8PbL0bVxBogX2FHxsd3zJA7V2H/cHXnBnNyyT9YoQ== +jest-resolve@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz" + integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" chalk "^4.0.0" graceful-fs "^4.2.4" jest-pnp-resolver "^1.2.2" - jest-util "^26.2.0" + jest-util "^26.6.2" read-pkg-up "^7.0.1" - resolve "^1.17.0" + resolve "^1.18.1" slash "^3.0.0" -jest-runner@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.2.2.tgz#6d03d057886e9c782e10b2cf37443f902fe0e39e" - integrity sha512-/qb6ptgX+KQ+aNMohJf1We695kaAfuu3u3ouh66TWfhTpLd9WbqcF6163d/tMoEY8GqPztXPLuyG0rHRVDLxCA== +jest-runner@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz" + integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== dependencies: - "@jest/console" "^26.2.0" - "@jest/environment" "^26.2.0" - "@jest/test-result" "^26.2.0" - "@jest/types" "^26.2.0" + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" "@types/node" "*" chalk "^4.0.0" emittery "^0.7.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-config "^26.2.2" + jest-config "^26.6.3" jest-docblock "^26.0.0" - jest-haste-map "^26.2.2" - jest-leak-detector "^26.2.0" - jest-message-util "^26.2.0" - jest-resolve "^26.2.2" - jest-runtime "^26.2.2" - jest-util "^26.2.0" - jest-worker "^26.2.1" + jest-haste-map "^26.6.2" + jest-leak-detector "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + jest-runtime "^26.6.3" + jest-util "^26.6.2" + jest-worker "^26.6.2" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.2.2.tgz#2480ff79320680a643031dd21998d7c63d83ab68" - integrity sha512-a8VXM3DxCDnCIdl9+QucWFfQ28KdqmyVFqeKLigHdErtsx56O2ZIdQkhFSuP1XtVrG9nTNHbKxjh5XL1UaFDVQ== - dependencies: - "@jest/console" "^26.2.0" - "@jest/environment" "^26.2.0" - "@jest/fake-timers" "^26.2.0" - "@jest/globals" "^26.2.0" - "@jest/source-map" "^26.1.0" - "@jest/test-result" "^26.2.0" - "@jest/transform" "^26.2.2" - "@jest/types" "^26.2.0" +jest-runtime@^26.6.3: + version "26.6.3" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz" + integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/globals" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" "@types/yargs" "^15.0.0" chalk "^4.0.0" + cjs-module-lexer "^0.6.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.4" - jest-config "^26.2.2" - jest-haste-map "^26.2.2" - jest-message-util "^26.2.0" - jest-mock "^26.2.0" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" jest-regex-util "^26.0.0" - jest-resolve "^26.2.2" - jest-snapshot "^26.2.2" - jest-util "^26.2.0" - jest-validate "^26.2.0" + jest-resolve "^26.6.2" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.3.1" + yargs "^15.4.1" -jest-serializer@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.2.0.tgz#92dcae5666322410f4bf50211dd749274959ddac" - integrity sha512-V7snZI9IVmyJEu0Qy0inmuXgnMWDtrsbV2p9CRAcmlmPVwpC2ZM8wXyYpiugDQnwLHx0V4+Pnog9Exb3UO8M6Q== +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== dependencies: "@types/node" "*" graceful-fs "^4.2.4" -jest-snapshot@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.2.2.tgz#9d2eda083a4a1017b157e351868749bd63211799" - integrity sha512-NdjD8aJS7ePu268Wy/n/aR1TUisG0BOY+QOW4f6h46UHEKOgYmmkvJhh2BqdVZQ0BHSxTMt04WpCf9njzx8KtA== +jest-snapshot@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz" + integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" + "@types/babel__traverse" "^7.0.4" "@types/prettier" "^2.0.0" chalk "^4.0.0" - expect "^26.2.0" + expect "^26.6.2" graceful-fs "^4.2.4" - jest-diff "^26.2.0" - jest-get-type "^26.0.0" - jest-haste-map "^26.2.2" - jest-matcher-utils "^26.2.0" - jest-message-util "^26.2.0" - jest-resolve "^26.2.2" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + jest-haste-map "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" natural-compare "^1.4.0" - pretty-format "^26.2.0" + pretty-format "^26.6.2" semver "^7.3.2" -jest-util@26.x, jest-util@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.2.0.tgz#0597d2a27c559340957609f106c408c17c1d88ac" - integrity sha512-YmDwJxLZ1kFxpxPfhSJ0rIkiZOM0PQbRcfH0TzJOhqCisCAsI1WcmoQqO83My9xeVA2k4n+rzg2UuexVKzPpig== +jest-util@^26.1.0, jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" "@types/node" "*" chalk "^4.0.0" graceful-fs "^4.2.4" is-ci "^2.0.0" micromatch "^4.0.2" -jest-validate@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.2.0.tgz#97fedf3e7984b7608854cbf925b9ca6ebcbdb78a" - integrity sha512-8XKn3hM6VIVmLNuyzYLCPsRCT83o8jMZYhbieh4dAyKLc4Ypr36rVKC+c8WMpWkfHHpGnEkvWUjjIAyobEIY/Q== +jest-validate@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" camelcase "^6.0.0" chalk "^4.0.0" - jest-get-type "^26.0.0" + jest-get-type "^26.3.0" leven "^3.1.0" - pretty-format "^26.2.0" + pretty-format "^26.6.2" -jest-watcher@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.2.0.tgz#45bdf2fecadd19c0a501f3b071a474dca636825b" - integrity sha512-674Boco4Joe0CzgKPL6K4Z9LgyLx+ZvW2GilbpYb8rFEUkmDGgsZdv1Hv5rxsRpb1HLgKUOL/JfbttRCuFdZXQ== +jest-watcher@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz" + integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== dependencies: - "@jest/test-result" "^26.2.0" - "@jest/types" "^26.2.0" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.2.0" + jest-util "^26.6.2" string-length "^4.0.1" -jest-worker@^26.2.1: - version "26.2.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.2.1.tgz#5d630ab93f666b53f911615bc13e662b382bd513" - integrity sha512-+XcGMMJDTeEGncRb5M5Zq9P7K4sQ1sirhjdOxsN1462h6lFo9w59bl2LVQmdGEEeU3m+maZCkS2Tcc9SfCHO4A== +jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^7.0.0" jest@^26.2.2: - version "26.2.2" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.2.2.tgz#a022303887b145147204c5f66e6a5c832333c7e7" - integrity sha512-EkJNyHiAG1+A8pqSz7cXttoVa34hOEzN/MrnJhYnfp5VHxflVcf2pu3oJSrhiy6LfIutLdWo+n6q63tjcoIeig== + version "26.6.3" + resolved "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz" + integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== dependencies: - "@jest/core" "^26.2.2" + "@jest/core" "^26.6.3" import-local "^3.0.2" - jest-cli "^26.2.2" + jest-cli "^26.6.3" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 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.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" -jsdom@^16.2.2: +jsdom@^16.4.0: version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" @@ -3590,83 +3494,91 @@ jsdom@^16.2.2: jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@2.x, 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== - dependencies: - minimist "^1.2.5" +json5@2.x, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -jsx-ast-utils@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" - integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.3" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== dependencies: - array-includes "^3.1.1" - object.assign "^4.1.0" + array-includes "^3.1.5" + object.assign "^4.1.3" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" 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" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -3674,163 +3586,114 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -lightercollective@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.3.0.tgz#1f07638642ec645d70bdb69ab2777676f35a28f0" - integrity sha512-RFOLSUVvwdK3xA0P8o6G7QGXLIyy1L2qv5caEI7zXN5ciaEjbAriRF182kbsoJ1S1TgvpyGcN485fMky6qxOPw== - lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.7.0: +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@4.x, lodash@^4.7.0: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +logform@^2.3.2, logform@^2.4.0: + version "2.5.1" + resolved "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz" + integrity sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg== + dependencies: + "@colors/colors" "1.5.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" + yallist "^4.0.0" make-dir@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-error@1.x, make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - tmpl "1.0.x" + tmpl "1.0.5" map-cache@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== -map-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" - integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== +map-obj@^4.0.0, map-obj@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== map-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^3.1.4: version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" @@ -3847,63 +3710,46 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -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== + braces "^3.0.2" + picomatch "^2.3.1" mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -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== - dependencies: - mime-db "1.44.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== - mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== mixin-deep@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" @@ -3911,34 +3757,32 @@ mixin-deep@^1.2.0: mkdirp@1.x, mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" +moment@^2.29.1: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + nanomatch@^1.2.9: version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" @@ -3955,44 +3799,59 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +nexus@^1.4.0-next.11: + version "1.4.0-next.11" + resolved "https://registry.npmjs.org/nexus/-/nexus-1.4.0-next.11.tgz" + integrity sha512-Vex7P3aZVNjlZjTZMWyM5XLzNzh+Hu0X5dlt989482qmsXEUD0naRHvgwHzioUDdAPHEx2UpkeDTHa8w/w8FEw== + dependencies: + iterall "^1.3.0" + tslib "^2.0.3" nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-domexception@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-notifier@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.2.tgz#3a70b1b70aca5e919d0b1b022530697466d9c675" - integrity sha512-ux+n4hPVETuTL8+daJXTOC6uKLgMsl1RYfFv7DKRzyvzBapqco0rZZ9g72ZN8VS6V+gvNYHYa/ofcCY8fkJWsA== +node-notifier@^8.0.0: + version "8.0.2" + resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz" + integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== dependencies: growly "^1.3.0" is-wsl "^2.2.0" semver "^7.3.2" shellwords "^0.1.1" - uuid "^8.2.0" + uuid "^8.3.0" which "^2.0.2" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +normalize-package-data@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -4002,146 +3861,147 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package- normalize-path@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== dependencies: remove-trailing-separator "^1.0.1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" npm-run-path@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" nwsapi@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz" integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-hash@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" - integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-hash@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== -object-inspect@^1.7.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.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-path@^0.11.4: - version "0.11.8" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" - integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== - object-visit@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.assign@^4.1.2, object.assign@^4.1.3: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" -object.entries@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" - integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" - has "^1.0.3" + es-abstract "^1.19.1" -object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.19.5" object.pick@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" -object.values@^1.1.1: - 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== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: - ee-first "1.1.1" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -4153,7 +4013,7 @@ optionator@^0.8.1: optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -4164,288 +4024,185 @@ optionator@^0.9.1: word-wrap "^1.2.3" p-each-series@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" - integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== + version "2.2.0" + resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz" + integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.1.tgz#7cfe35c1ccd641bce3981467e6c2ece61b3b3878" - integrity sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ== + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse5@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - pascalcase@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" + version "4.0.5" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" posix-character-classes@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" prettier@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" - integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== - -pretty-format@^25.2.1, pretty-format@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== - dependencies: - "@jest/types" "^25.5.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" + version "2.7.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== -pretty-format@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.2.0.tgz#83ecc8d7de676ff224225055e72bd64821cec4f1" - integrity sha512-qi/8IuBu2clY9G7qCXgCdD1Bf9w+sXakdHTRToknzMtVy0g7c4MBWaZy7MfB7ndKZovRO6XRwJiAYqq+MC7SDA== +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== dependencies: - "@jest/types" "^26.2.0" + "@jest/types" "^26.6.2" ansi-regex "^5.0.0" ansi-styles "^4.0.0" - react-is "^16.12.0" + react-is "^17.0.1" progress@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prompts@^2.0.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" - integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" - sisteransi "^1.0.4" + sisteransi "^1.0.5" -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== +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" - react-is "^16.8.1" - -property-expr@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" - integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== - -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.9.1" + react-is "^16.13.1" psl@^1.1.33: version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -4453,90 +4210,63 @@ pump@^3.0.0: punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +pvtsutils@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.2.tgz" + integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ== + dependencies: + tslib "^2.4.0" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== querystring@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + version "0.2.1" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-lru@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-is@^16.12.0, react-is@^16.8.1: +react-is@^16.13.1: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== read-pkg-up@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: find-up "^4.1.0" read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read-pkg@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" @@ -4544,169 +4274,185 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.3.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== +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + functions-have-names "^1.2.2" -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== remove-trailing-separator@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-url@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve@^1.0.0, resolve@^1.10.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.22.0: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.0.0, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^2.0.0-next.3: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" ret@~0.1.10: version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^2.6.1: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rsvp@^4.8.4: version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -safe-buffer@5.1.2, safe-buffer@~5.1.1: +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sane@^4.0.3: version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + resolved "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz" integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== dependencies: "@cnakazawa/watch" "^1.0.3" @@ -4721,63 +4467,41 @@ sane@^4.0.3: saxes@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.x, semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-cookie-parser@^2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz" + integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" @@ -4785,88 +4509,86 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shellwords@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + resolved "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" -sisteransi@^1.0.4: +sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" snakecase-keys@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/snakecase-keys/-/snakecase-keys-3.2.0.tgz#3ac428d643c6634eca461192fc7f731378fa7bd1" - integrity sha512-WTJ0NhCH/37J+PU3fuz0x5b6TvtWQChTcKPOndWoUy0pteKOe0hrHMzSRsJOWSIP48EQkzUEsgQPmrG3W8pFNQ== + version "3.2.1" + resolved "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-3.2.1.tgz" + integrity sha512-CjU5pyRfwOtaOITYv5C8DzpZ8XA/ieRsDpr93HI2r6e3YInC6moZpSQbmUtg8cTk58tq2x3jcG2gv+p1IZGmMA== dependencies: - map-obj "^4.0.0" + map-obj "^4.1.0" to-snake-case "^1.0.0" snapdragon-node@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" @@ -4875,14 +4597,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" @@ -4896,7 +4618,7 @@ snapdragon@^0.8.1: source-map-resolve@^0.5.0: version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: atob "^2.1.2" @@ -4905,37 +4627,37 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.1, source-map-support@^0.5.12, source-map-support@^0.5.17, source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@^0.5.12, source-map-support@^0.5.17, source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" 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.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.6: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== spdx-correct@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" @@ -4943,237 +4665,198 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.12" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== stack-utils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" - integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== + version "2.0.5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: escape-string-regexp "^2.0.0" static-extend@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== string-length@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" - integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" + strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== +string.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== dependencies: - ansi-regex "^4.1.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - ansi-regex "^5.0.0" + safe-buffer "~5.2.0" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - is-utf8 "^0.2.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-eof@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - strip-json-comments@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-json-comments@^3.1.0: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -subscriptions-transport-ws@^0.9.8: - version "0.9.18" - resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz#bcf02320c911fbadb054f7f928e51c6041a37b97" - integrity sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA== - dependencies: - backo2 "^1.0.2" - eventemitter3 "^3.1.0" - iterall "^1.2.1" - symbol-observable "^1.0.4" - ws "^5.2.0" - supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + version "2.2.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" -symbol-observable@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -synchronous-promise@^2.0.6: - version "2.0.13" - resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.13.tgz#9d8c165ddee69c5a6542862b405bc50095926702" - integrity sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA== - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +table@^6.0.9: + version "6.8.0" + resolved "https://registry.npmjs.org/table/-/table-6.8.0.tgz" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" terminal-link@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== dependencies: ansi-escapes "^4.2.1" @@ -5181,63 +4864,68 @@ terminal-link@^2.0.0: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" glob "^7.1.4" minimatch "^3.0.4" +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== throat@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-no-case@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" - integrity sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo= + resolved "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz" + integrity sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg== to-object-path@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" @@ -5247,84 +4935,72 @@ to-regex@^3.0.1, to-regex@^3.0.2: to-snake-case@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/to-snake-case/-/to-snake-case-1.0.0.tgz#ce746913897946019a87e62edfaeaea4c608ab8c" - integrity sha1-znRpE4l5RgGah+Yu366upMYIq4w= + resolved "https://registry.npmjs.org/to-snake-case/-/to-snake-case-1.0.0.tgz" + integrity sha512-joRpzBAk1Bhi2eGEYBjukEWHOe/IvclOkiJl3DtA91jV6NwQ3MwXA4FHYeqk8BNp/D8bmi9tcNbRu/SozP0jbQ== dependencies: to-space-case "^1.0.0" to-space-case@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" - integrity sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc= + resolved "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz" + integrity sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA== dependencies: to-no-case "^1.0.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -toposort@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== +tough-cookie@^4.0.0, tough-cookie@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + tree-kill@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -ts-invariant@^0.4.0: - version "0.4.4" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" - integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== - dependencies: - tslib "^1.9.3" +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== ts-jest@^26.1.4: - version "26.1.4" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.1.4.tgz#87d41a96016a8efe4b8cc14501d3785459af6fa6" - integrity sha512-Nd7diUX6NZWfWq6FYyvcIPR/c7GbEF75fH1R6coOp3fbNzbRJBZZAn0ueVS0r8r9ral1VcrpneAFAwB3TsVS1Q== + version "26.5.6" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz" + integrity sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA== dependencies: bs-logger "0.x" buffer-from "1.x" fast-json-stable-stringify "2.x" - jest-util "26.x" + jest-util "^26.1.0" json5 "2.x" - lodash.memoize "4.x" + lodash "4.x" make-error "1.x" mkdirp "1.x" semver "7.x" - yargs-parser "18.x" + yargs-parser "20.x" ts-node-dev@^1.0.0-pre.56: - version "1.0.0-pre.56" - resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.0.0-pre.56.tgz#b74c0d1db2d98f005ad73f9eaa0a3c0a231f14da" - integrity sha512-+2a3FAShOja+W5X6ZxKgf1PG3kOOkHCiYzSu6s3lwhLVxeMBusJudcv7W6cZKOTp7+L7hPkKW97t1CGw7bCDaA== + version "1.1.8" + resolved "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.8.tgz" + integrity sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg== dependencies: - chokidar "^3.4.0" - dateformat "~1.0.4-1.2.3" + chokidar "^3.5.1" dynamic-dedupe "^0.3.0" minimist "^1.2.5" mkdirp "^1.0.4" @@ -5332,33 +5008,34 @@ ts-node-dev@^1.0.0-pre.56: rimraf "^2.6.1" source-map-support "^0.5.12" tree-kill "^1.2.2" - ts-node "^8.10.2" + ts-node "^9.0.0" tsconfig "^7.0.0" -ts-node@^8.10.2: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== +ts-node@^9.0.0: + version "9.1.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== dependencies: arg "^4.1.0" + create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" source-map-support "^0.5.17" yn "3.1.1" -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" - minimist "^1.2.0" + minimist "^1.2.6" strip-bom "^3.0.0" tsconfig@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz" integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== dependencies: "@types/strip-bom" "^3.0.0" @@ -5366,75 +5043,94 @@ tsconfig@^7.0.0: strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.3: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.1, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-fest@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" -typescript@^3.9.7: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== +typescript@4.7.4: + version "4.7.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici@^5.8.0: + version "5.19.1" + resolved "https://registry.npmjs.org/undici/-/undici-5.19.1.tgz" + integrity sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A== + dependencies: + busboy "^1.6.0" union-value@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" @@ -5442,65 +5138,71 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== unset-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" +update-browserslist-db@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" use@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@^8.2.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" - integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" - integrity sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ== +v8-to-istanbul@^7.0.0: + version "7.1.2" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz" + integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -5508,96 +5210,177 @@ v8-to-istanbul@^4.1.3: validate-npm-package-license@^3.0.1: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +value-or-promise@1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz" + integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== w3c-hr-time@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" w3c-xmlserializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: xml-name-validator "^3.0.0" walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +web-streams-polyfill@4.0.0-beta.3: + version "4.0.0-beta.3" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz" + integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== + +web-streams-polyfill@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + +webcrypto-core@^1.7.4: + version "1.7.5" + resolved "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.5.tgz" + integrity sha512-gaExY2/3EHQlRNNNVSrbG2Cg94Rutl7fAaKILS1w8ZDhGxdFOaw6EbCfHIxPy9vt/xwp5o0VQAx9aySPF6hU1A== dependencies: - makeerror "1.0.x" + "@peculiar/asn1-schema" "^2.1.6" + "@peculiar/json-schema" "^1.1.12" + asn1js "^3.0.1" + pvtsutils "^1.3.2" + tslib "^2.4.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== webidl-conversions@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== whatwg-encoding@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" whatwg-mimetype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" tr46 "^2.1.0" webidl-conversions "^6.1.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + 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" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which@^1.2.9: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +winston-daily-rotate-file@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz#f60a643af87f8867f23170d8cd87dbe3603a625f" + integrity sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA== + dependencies: + file-stream-rotator "^0.6.1" + object-hash "^2.0.1" + triple-beam "^1.3.0" + winston-transport "^4.4.0" + +winston-transport@^4.4.0, winston-transport@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz" + integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.10.0: + version "3.10.0" + resolved "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz" + integrity sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g== + dependencies: + "@colors/colors" "1.5.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.5.0" + word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + version "1.2.4" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz" + integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -5606,12 +5389,12 @@ wrap-ansi@^6.2.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -5619,56 +5402,52 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@^5.2.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" - integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== - dependencies: - async-limiter "~1.0.0" - ws@^7.4.6: version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xml-name-validator@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xtend@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^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== + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.x: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@18.x, yargs-parser@^18.1.2: +yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^15.3.1: +yargs@^15.4.1: version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -5685,30 +5464,10 @@ yargs@^15.3.1: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -yup@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/yup/-/yup-0.27.0.tgz#f8cb198c8e7dd2124beddc2457571329096b06e7" - integrity sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ== - dependencies: - "@babel/runtime" "^7.0.0" - fn-name "~2.0.1" - lodash "^4.17.11" - property-expr "^1.5.0" - synchronous-promise "^2.0.6" - toposort "^2.0.2" - -zen-observable-ts@^0.8.21: - version "0.8.21" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" - integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== - dependencies: - tslib "^1.9.3" - zen-observable "^0.8.0" - -zen-observable@^0.8.0: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== +zod@^3.22.0: + version "3.22.0" + resolved "https://registry.npmjs.org/zod/-/zod-3.22.0.tgz" + integrity sha512-y5KZY/ssf5n7hCGDGGtcJO/EBJEm5Pa+QQvFBeyMOtnFYOSflalxIFFvdaYevPhePcmcKC4aTbFkCcXN7D0O8Q== diff --git a/documentation/beta_docs/discourse-features.md b/documentation/beta_docs/discourse-features.md new file mode 100644 index 00000000..bac3e064 --- /dev/null +++ b/documentation/beta_docs/discourse-features.md @@ -0,0 +1,51 @@ +--- +title: Discourse Features Support Lexicon +--- + +Below is a table of Discourse features which provides the details and current status about the support for a given feature in Lexicon. + +If we missed one, or anything looks out of date here, don't hesitate to submit a Pull Request which updates the table. + +**Table Legend** + +| Emoji | Meaning | +| ----- | -------------------------------------------- | +| ✅ | Supported in Lexicon-powered mobile apps | +| ❌ | Not supported in Lexicon-powered mobile apps | +| 🔧 | Requires some configuration | +| 🔨 | Planned or under development | + +| Feature | Description | Supported | Notes | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 2FA Login | Allow users with 2FA enabled to be prompted for their 2FA code when logging in | ✅ | Managing 2FA, such as enabling it or disabling it from within the app, is not currently supported. | +| Ability to Tag Topics | Create and tag topics to provide relevant metadata for your users. | ✅ 🔧 | Configuration required: see [Optimal Experience](optimal#enable-topic-tagging). | +| Topic Previews (Excerpts) | Show an excerpt of the first post in a topic from the Home screen. | ✅ 🔧 | Configuration required: see [Optimal Experience](optimal#enable-topic-excerpts). | +| View User Activity | View a user's recent activity—such as topics, posts, and likes—in a single feed from their profile. | ✅ | The ability to filter by activity is not currently supported. | +| Topic Metrics | Likes, Views, Replies, and Frequent Posters | ✅ | | +| Topic & Post Actions | Ability to like and edit topics and posts | ✅ | | +| View Top & Latest Topics | A Tab View at the top of the main feed provides the ability to switch between Latest and Top activity | ✅ | | +| Search | Search the current Discourse instance for topics and posts based on keywords, categories, and tags | ✅ | | +| Categories | View the category of a topic and filter topics by a given category | ✅ | Categories cannot be created, updated, or deleted. | +| Attaching Media to Posts | Users can attach media to a post from the app | ✅ 🔧 | Configuration recommended for supported file extensions-see [Optimal Experience](optimal#configure-upload-extensions) | +| Standard Markdown | Standard Markdown is supported in the editor and rendered correctly in the mobile app | ✅ | Light, incomplete support exists for some of Discourse's custom markup, such as dates. | +| Sign Up | Allow users to sign up for an account directly through the mobile app, depending on whether your Discourse instance allows new user registration or not | ✅ | | +| Browsing Public Instances | Allow users to immediately access and browse your Discourse instance from the mobile app if it is not private | ✅ | Users will be prompted to login upon attempting an authenticated action. | +| User Profiles | Ability to view users' profiles and edit your own | ✅ | Partial Support. The profile screen displays the user's photo, username, Markdown bio on a single line, and recent activity. | +| Post Flagging | Allow users to flag posts for admins to review | ✅ | Admins are not able to review posts in the app, though they will see in-app notifications for flags | +| In-App Notifications | Allow users to see new notifications from the profile screen of the mobile app and mark all notifications as read | ✅ | Some notifications from Discourse are not tappable in the mobile app, such as badge notifications. | +| Private messaging | Allow users to start private or group messages with one another | ✅ | | +| Mentions | Allow users to mention a user when creating or editing posts and messages. | ✅ | +| Color Mode | Provides light and dark mode support for users. | ✅ | Users can manually specify light or dark mode, or allow their device's settings to dictate the current color mode. This does not synchronize with the Discourse web theme (if the user happens to have chosen a Dark theme on the website) | +| Badges | The ability to see and interact with badges that have been awarded to users on the Discourse instance | ❌ | | +| Post Drafts | Enable users to start composing a draft of a post and return to it later | ❌ | | +| Groups | Enable users to create and participate in private groups of which only group members can view certain topics | ❌ | | +| Admin Features | Discourse provides an entire admin panel for managing and moderating the forum. These features are not available in Lexicon, and may be better suited to a desktop environment. | ❌ | Editing posts is supported | +| Post Quotes, Polls, Toggles, and Task Lists | Custom text formatting that enables Discourse-specific features | ❌ 🔨 | | +| Discourse Emojis | Utilize emojis when creating a topic, making a post, or sending a reply. | ✅ | Unicode-based emojis are of course supported. BBCode emoji is already support in lexicon Beta for example `:smile:` or `:raised_back_of_hand:t5:` | +| Post Bookmarks | Allow users to bookmark certain posts or topics | ❌ | | +| DiscourseConnect (SSO) | Replace Discourse authentication with a Custom Provider | ❌ | | +| Custom Authentication Plugins | Login via OAuth2 or other protocols using custom Discourse Plugins | ❌ | | +| Real-time Chat | Enable users to initiate conversations using the chat feature, either in a channel or through private messaging. | ❌ | | +| User Status | Allow other user in community to see user message status | ❌ | | + +Please note that this table is subject to change as the Lexicon Mobile App evolves, and new features may be added or existing features may be improved based on user feedback and development efforts. diff --git a/documentation/docs/app-store.md b/documentation/docs/app-store.md index 5a8104a8..941750d5 100644 --- a/documentation/docs/app-store.md +++ b/documentation/docs/app-store.md @@ -13,34 +13,27 @@ In this page, we'll cover the process of publishing it on iOS. - An Apple Developer account - An Expo account - XCode is installed on your development machine +- EAS CLI 2.6.0 or newer -To get started with Test Flight and publishing your app, you'll need an **Apple Developer account** account. +To get started with TestFlight and publishing your app, you'll need an **Apple Developer account**. -This will enable you to interact with Apple as you go through the process of submitting to Test Flight and, eventually, the App Store. +This will enable you to interact with Apple as you go through the process of submitting to TestFlight and, eventually, the App Store. -Similarly, you'll need an [Expo account](https://expo.dev/signup) so you can build your app, download it, and upload it to Apple's servers. +You'll also need an [Expo account](https://expo.dev/signup) so you can build your app, download it, and upload it to Apple's servers. Finally, you'll want to have already downloaded and installed [Xcode](https://developer.apple.com/xcode/), which is what you'll use to upload your built app to Apple's servers. :::note -If you don't yet have an account, you'll need to enroll in the [Apple Developer Program](https://developer.apple.com/programs/enroll/) first. Note that there is an annual cost associated with this. -::: - -Additionally, you'll want to make sure that you have accounts - -## Publish to Test Flight +If you don't yet have an account with Apple, you'll need to enroll in the [Apple Developer Program](https://developer.apple.com/programs/enroll/) first. Note that there is an annual cost associated with this. -Test Flight is a key aspect of Apple's Developer Program, which enables developers to provide beta users with access to their app under less-strict review requirements. - -With Test Flight, you're able to invite users to test and collect their feedback before releasing your app to the public on the App Store. - -You can learn more about Test Flight [here](https://developer.apple.com/testflight/). +Additionally, you'll want to make sure you have an account with [Expo](https://expo.dev/signup) so you can use features like [EAS Submit](https://docs.expo.dev/submit/introduction/). +::: -### Register a new Bundle ID +## Register a new Bundle ID -Each App in the App Store has a unique **Bundle Identifier**, or Bundle ID. +Each app in Apple's App Store has a unique **Bundle Identifier**, or Bundle ID. -In order to publish the app anywhere, including to Test Flight, you'll need to have a Bundle ID registered for your app with Apple. +In order to publish the app anywhere, including to TestFlight, you'll need to have a Bundle ID registered for your app with Apple. Typically, this uses the format of `com..`. @@ -64,7 +57,7 @@ You can follow these instructions to get one. - You can leave this section empty. -### Add New App in App Store Connect +## Add a New App in App Store Connect Steps: @@ -77,32 +70,47 @@ Steps: Add New App - **Platforms**: Select `iOS`. - - **Name** : The name of your app, as it will appear on the App Store and user's devices. - - **Primary Language** : The Primary language that will be used if localized app information is not available. - - **Bundle ID** : Choose the Bundle ID you created above. + - **Name**: The name of your app, as it will appear on the App Store and user's devices. + - **Primary Language**: The primary language that will be used if localized app information is not available. + - **Bundle ID**: Choose the Bundle ID you created above. - **Note**: double-check that it's correct, because you can not change it afterwards. - **SKU (Stock Keeping Unit)**: A unique ID to differentiate your app from the others, similar to a product ID. - - **User Access** Full access means all users will have access to the app, while limited access means that the app can only be accessed by certain roles defined within App Store Connect. + - **User Access**: Full access means all users will have access to the app, while limited access means that the app can only be accessed by certain roles defined within App Store Connect. -### Configuration +## Configuration After creating the app in App Store Connect, you'll want to jump back over to the codebase and make some adjustments. -In particular, you'll want to open `frontend/app.json` and find the `ios` section of the file. +### Build Config -``` - "ios": { - "supportsTablet": false - }, +:::note +If you haven't yet installed the EAS CLI, follow the instructions in the [tutorial](tutorial/setup#install-the-eas-cli). +::: + +First, you'll need to ensure you've set your app name and slug in `frontend/app.json`. The [slug](https://docs.expo.dev/workflow/glossary-of-terms/#slug) is used as part of the URL for your app on Expo's web services, so it is recommended to use kebab-case (e.g., `my-lexicon-app`). + +Replace these placeholders with your desired values: + +```json + "name": "", + "slug": "", ``` -Then, you'll want to add the information you just registered in App Store Connect: +Next, configure EAS Build by running this command from the `frontend/` directory: +```bash +eas build:configure ``` + +The EAS CLI will prompt you to specify `android.package` and `ios.bundleIdentifier` if those values are not already provided in `app.json`. You'll want to add the bundle ID you just registered in App Store Connect as the `bundleIdentifier`. + +Then you can see that the value has been updated in the `ios` section of `frontend/app.json` file. + +```json "ios": { "supportsTablet": false, - "bundleIdentifier": "com.companyname.appname", "buildNumber": "1.0.0", + "bundleIdentifier": "", "config": { "usesNonExemptEncryption" : false } @@ -115,76 +123,120 @@ We set `usesNonExemptEncryption` to `false` because Lexicon doesn't leverage tha For further details, please take a look at [this link](https://developer.apple.com/documentation/bundleresources/information_property_list/itsappusesnonexemptencryption) from Apple's documentation. ::: -### Build your App for iOS +### Setup Config Values + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](deployment) to deploy Prose if you haven't already. +::: -Before publishing, you'll need to build your app by instructing Expo to generate an iOS build, like so: +Next, configure the **Prose URL** for your build in `Config.ts`. You can set a different URL for each build channel. +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +```ts +const config = { + // ... + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; ``` -$ expo build:ios + +### Setup Apple Dveloper Account + +Lastly, please adjust these fields in `eas.json` with your account information to submit the app: + +```json + "base": { + "ios": { + "appleId": "", + "ascAppId": "", + "appleTeamId": "" + }, + ... + }, ``` -When you run the above command, Expo will prompt you for your Apple ID and password. +- **appleId**: your apple ID (e.g., `john@gmail.com`). +- **ascAppId**: your App Store Connect app ID. Find your ascAppID by following [this guide](https://github.com/expo/fyi/blob/main/asc-app-id.md) (e.g., `1234567890`). +- **appleTeamId**: You can check your apple team ID [here](https://developer.apple.com/account/) (e.g., `12LE34XI45`). -Expo provides documentation about this step on [Building Standalone Apps](https://docs.expo.io/distribution/building-standalone-apps/#if-you-choose-to-build-for-ios). +## Build your App for iOS -Once the above step has completed, login to your account on [Expo](https://expo.io) and download your newly built app. +Before publishing, you'll need to build your app by instructing Expo to generate an iOS build. -It is located under **Recent Builds**. You can also simply click on the Builds menu that's located on the left-hand side of the screen. +It is recommended to build your app with the `preview` profile before releasing to verify that it works as expected. See [this tutorial](tutorial/building) to learn more about build profiles. -- Click on the project you want to publish. Double-check that the build status is **Finished** and the platform is **iOS**. - Builds +Run this command: -- Download the iOS build by pressing `Download` button on Build artifact section. - Build Artifact +```bash +eas build --platform ios --profile preview +``` -This will download an IPA file representing your app, which is the format that Apple expects it to be in. +When you run the above command, Expo will prompt you for your Apple ID and password. -### Upload your App to Apple +Once the above step has been completed, login to your account on [Expo](https://expo.dev) and download your newly built app. -:::note -You'll need to download the Application Loader developer tool if you haven't done so before. -::: +Navigate to your project in the [Expo web console](https://expo.dev), then click on the **Builds** menu located on the left-hand side of the screen. + +- Click on the project you want to install. + Builds -Now that you've downloaded the IPA file you'll need to upload it to Apple's servers. +- Download the iOS build by pressing the `Download` button in the `Build Artifact` section. + Build Artifact -In order to do this, you'll need to open the Application Loader in XCode. +This will download a tar file containing your app. Extract the file, then drag it to your simulator to install it. See [this section](tutorial/building#1-preview) of the tutorial to learn about running the app on real devices. -This is located under the XCode menu in the menubar when XCode is open. +Once you have verified that the app runs as expected, you can proceed to build it for release: +```bash +eas build --platform ios --profile production ``` -XCode > Open Developer Tool > Application Loader -``` -If Application Loader isn't there, you'll need to download it. Click on "More Developer Tools..." and download it from the Apple Developer Website. +The approach for a production build is similar to the one used for generating a preview build. However, unlike a preview build, you won't be able to launch the production build in the iOS simulator—it is intended solely for publishing to the App Store. + +Once this process is completed, you can proceed with submitting it to Apple. This process typically involves Apple's TestFlight service. -Once it's ready, you can proceed with the steps below. +## Submit to TestFlight -Upon opening Application Loader, you'll likely be prompted for the credentials of your Apple Developer account. +TestFlight is a key aspect of Apple's Developer Program, which enables developers to provide beta users with access to their app under less restrictive review requirements. -Once you've successfully submitted them, you'll be able to select the IPA file from your file system. +With TestFlight, you're able to invite users to test your app and collect their feedback before releasing it to the public on the App Store. You can learn more about TestFlight [here](https://developer.apple.com/testflight/). -After selecting it, click "Open" in order to begin uploading the IPA. +Submitting an iOS app is much easier with EAS Submit. This is covered in more detail in the [tutorial](tutorial/publishing). -### Submit to Test Flight +Run the following command to start publishing the app to TestFlight: + +```bash +eas submit --platform ios --profile production +``` -Once the IPA has been uploaded, you can submit it to Test Flight. +Once the process has completed successfully, we can check the build in App Store Connect. -In App Store Connect, click on the Test Flight Tab. +In App Store Connect, click on the TestFlight Tab. You'll see the [status](https://help.apple.com/app-store-connect/#/dev3d6869aff) of your built version. - **Red** indicates that you need to perform some action. - **Yellow** indicates that some aspect of the process is pending—either from you, or from Apple. -- **Green** indicates that the build is being tested in Test Flight, or is ready to be submitted for review. +- **Green** indicates that the build is being tested in TestFlight, or is ready to be submitted for review. -You won't be able to begin beta testing with Test Flight until an tester from Apple verifies your app. +You won't be able to begin beta testing with TestFlight until an official tester from Apple verifies your app. In order to allow Apple to properly test your Lexicon-powered app, they'll need to have credentials to login your Discourse site. Before submitting your app, you'll need to create those credentials in Discourse and specify them in App Store Connect. - In App Store Connect, click on your app. -- Click on Test Flight App. +- Click on TestFlight App. - Click on Test Information in the sidebar on the left-hand side. - Fill the required fields, then check the `Sign in required` checkbox, and enter the credentials. Review Information Sign In @@ -201,13 +253,13 @@ Similarly, you can specify external users by selecting External Groups, and clic #### More Information -Test Flight and App Store Connect are sophisticated tools to help with the process of submitting, testing, and publishing your app. +TestFlight and App Store Connect are sophisticated tools to help with the process of submitting, testing, and publishing your app. If you have further questions or just want to learn more, we'd recommend that you make use of Apple's documentation, which is very high quality. -For more information about Test Flight in general, read the [documentation](https://developer.apple.com/testflight/). +For more information about TestFlight in general, read the [documentation](https://developer.apple.com/testflight/). -Similarly, for specific information about beta testing with Test Flight, check out [Testing Apps with TestFlight](https://testflight.apple.com/). +Similarly, for specific information about beta testing with TestFlight, check out [Testing Apps with TestFlight](https://testflight.apple.com/). ## Publish to the App Store diff --git a/documentation/docs/concepts.md b/documentation/docs/concepts.md index cdd178a3..f32b0652 100644 --- a/documentation/docs/concepts.md +++ b/documentation/docs/concepts.md @@ -14,18 +14,16 @@ However, [the official documentation](https://docs.discourse.org/) for this API > > —**Discourse API Documentation** -The core team, as well as members of the [support forum](https://meta.discourse.org), regularly respond to questions about the API by [encouraging developers to reverse-engineer the API](https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576). As of this writing, the topic for how to reverse engineer the API has been linked to from nearly 170 other topics on the support forum. +The core team, as well as members of the [support forum](https://meta.discourse.org), regularly respond to questions about the API by [encouraging developers to reverse-engineer the API](https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576). As of this writing, the topic for how to reverse engineer the API has been linked to from nearly 200 other topics on the support forum. To help you simplify the process for you, Prose strives to normalize a subset of the API. We have done so with the hope that it will save you some time as you develop against Discourse. -#### GraphQL Playground +#### GraphiQL -Prose's GraphQL implementation includes an [interactive GraphQL IDE](https://github.com/graphql/graphql-playground), known as the GraphQL Playground, which allows developers to easily reference the entire documentation and schema. +Prose's GraphQL implementation includes an [in-browser GraphQL IDE](https://www.graphql-yoga.com/docs/features/graphiql), known as [GraphiQL](https://github.com/graphql/graphiql), which allows developers to easily reference the entire documentation and schema and make queries against a running Discourse instance. -_You tried to click the Play button on the image, didn't you?_ - This means you can rapidly get a clear understanding of how a method behaves—and what parameters it requires—without digging through support posts or reverse-engineering the REST API. #### Why GraphQL? @@ -46,19 +44,17 @@ Having said that, we chose to build Lexicon with it for two primary reasons. We find that Expo makes us much more effective as developers, and also provides excellent services to facilitate the entire process of building and publishing React Native apps. -## Architecture of the Lexicon Stack - -While it's a fairly lightweight setup to describe as an application stack, our reference here to the **Lexicon Stack** refers to all of the components needed to produce the Lexicon mobile experience. +## Lexicon Architecture The Lexicon Stack is fairly simple, and only consists of 3 major pieces: - The Lexicon Mobile App - The Prose GraphQL API -- A running Discourse instance +- A running, accessible Discourse instance Below is a diagram illustrating the typical architecture for a Lexicon-powered mobile app. -![Architecture Diagram](/img/lexicon-architecture.png) +IOS Lexicon Login Page As indicated above, the mobile app makes requests to a deployed Prose GraphQL server. diff --git a/documentation/docs/dedicated.md b/documentation/docs/dedicated.md index 34e014b4..75fe8afe 100644 --- a/documentation/docs/dedicated.md +++ b/documentation/docs/dedicated.md @@ -243,7 +243,7 @@ Regardless, to emphasize it again, it is **critical** that you don't deploy Pros When someone navigates to your host which is running Prose, how will their request get routed to Prose? -If you had exposed Prose directly on port 80—NOT recommended—and your host's domain name was `myproseserver.com`, then a user would navigate to `http://myproseserver.com` and be greeted with the GraphQL Playground. +If you had exposed Prose directly on port 80—NOT recommended—and your host's domain name was `myproseserver.com`, then a user would navigate to `http://myproseserver.com` and be greeted with the [GraphiQL interface](https://www.graphql-yoga.com/docs/features/graphiql). However, a more common approach is to use a dedicated webserver, such as Nginx or Apache, that acts as a reverse-proxy. @@ -293,7 +293,7 @@ Otherwise, you'll want to get the IP address of your host, go into your domain p #### Ready to Go -At this point, your deployed host should be running Prose correctly. When you navigate to the domain name that you configured it with, you should see the GraphQL Playground, which will allow you to make GraphQL queries against your Discourse instance. +At this point, your deployed host should be running Prose correctly. When you navigate to the domain name that you configured it with, you should see [GraphiQL](https://www.graphql-yoga.com/docs/features/graphiql), which will allow you to make GraphQL queries against your Discourse instance. We understand that the details of your deployment can vary quite a bit depending on how you chose to do it. diff --git a/documentation/docs/discourse-features.md b/documentation/docs/discourse-features.md index ca052932..3183014a 100644 --- a/documentation/docs/discourse-features.md +++ b/documentation/docs/discourse-features.md @@ -18,34 +18,35 @@ For this reason, most admin tasks are still best accomplished using the Discours ### Lexicon Mobile App Features -| Feature | Description | Supported | Notes | -| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------- | -| 2FA Login | Allow users with 2FA enabled to be prompted for their 2FA code when logging in | ✅ | Managing 2FA, such as enabling it or disabling it, is not currently supported. | -| Ability to Tag Topics | Create and tag topics to provide relevant metadata for your users. | ✅ 🔧 | Configuration Required-see [Optimal Experience](optimal#enable-topic-tagging). | -| Topic Previews (Excerpts) | Show an excerpt of the first post in a topic from the Home screen. | ✅ 🔧 | Configuration Required-see [Optimal Experience](optimal#enable-topic-excerpts). | -| View User Activity | View a user's recent activity—such as topics, posts, and likes—in a single feed from their profile. | ✅ | The ability to filter by activity is not currently supported. | -| Topic Metrics | Likes, Views, Replies, and Frequent Posters | ✅ | | -| Topic & Post Actions | Ability to like and edit topics and posts | ✅ | | -| View Top & Latest Topics | A Tab View at the top of the main feed provides the ability to switch between Latest and Top activity | ✅ | | -| Search | Search the current Discourse instance for topics and posts based on keywords, categories, and tags | ✅ | | -| Categories | View the category of a topic and filter topics by a given category | ✅ | Categories cannot be created, updated, or deleted. | -| Attaching Media to Posts | Users can attach media to a post from the app | ✅ 🔧 | Configuration Recommended for supported file extensions-see [Optimal Experience](optimal#configure-upload-extensions) | -| Standard Markdown | Standard Markdown is supported in the editor and rendered correctly in the mobile app | ✅ | Light, incomplete support exists for some of Discourse's custom markup, such as dates. | -| Sign Up | Allow users to sign up for an account directly through the mobile app, depending on whether your Discourse instance allows new user registration or not | ✅ | | -| Browsing Public Instances | Allow users to immediately access and browse your Discourse instance from the mobile app if it is not private | ✅ | Users will be prompted to login upon attempting an authenticated action. | -| User Profiles | Ability to view users' profiles and edit your own | ✅ | Partial Support. The profile screen displays the user's photo, username, Markdown bio on a single line, and recent activity. | -| Post Flagging | Allow users to flag posts for admins to review | ✅ | Admins are not able to review posts in the app, though they will see in-app notifications for flags | -| In-App Notifications | Allow users to see new notifications from the profile screen of the mobile app and mark all notifications as read | ✅ | Some notifications from Discourse are not tappable in the mobile app, such as badge notifications. | -| Private messaging | Allow users to start private or group messages with one another | ✅ | | -| Mentions | Allow users to mention a user when creating or editing posts and messages. | ✅ | -| Color Mode | Provides light and dark mode support for users. | ✅ | Users can manually specify light or dark mode, or allow their device's settings to dictate the current color mode. | -| Push Notifications | Enable users to be directly notified of activity on their mobile devices. | ❌🔨 | Under Development | -| Email Deep Linking | Automatically open the mobile app to a specific post, message, etc. when a link is clicked from an email notification | ❌ | Complex task that may either require a custom theme or a manual guide | -| Badges | The ability to see and interact with badges that have been awarded to users on the Discourse instance | ❌ | | -| Post Drafts | Enable users to start composing a draft of a post and return to it later | ❌ | | -| Groups | Enable users to create and participate in private groups of which only group members can view certain topics | ❌ | | -| Admin Features | Discourse provides an entire admin panel for managing and moderating the forum. These features are not available in Lexicon, and may be better suited to a desktop environment. | ❌ | Editing posts is supported | -| Post Quotes, Polls, Discourse Emojis, Toggles, and Task Lists | Custom text formatting that enables Discourse-specific features | ❌ | Unicode-based emojis are of course supported. | -| Post Bookmarks | Allow users to bookmark certain posts or topics | ❌ | | -| Discourse SSO | Replace Discourse authentication with a Custom Provider | ❌ | | -| Custom Authentication Plugins | Login via OAuth2 or other protocols using custom Discourse Plugins | ❌ | | +| Feature | Description | Supported | Notes | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------- | +| 2FA Login | Allow users with 2FA enabled to be prompted for their 2FA code when logging in | ✅ | Managing 2FA, such as enabling it or disabling it from within the app, is not currently supported | +| Ability to Tag Topics | Create and tag topics to provide relevant metadata for your users | ✅ 🔧 | Configuration required: see [Optimal Experience](optimal#enable-topic-tagging) | +| Topic Previews (Excerpts) | Show an excerpt of the first post in a topic from the Home screen | ✅ 🔧 | Configuration required: see [Optimal Experience](optimal#enable-topic-excerpts) | +| View User Activity | View a user's recent activity—such as topics, posts, and likes—in a single feed from their profile | ✅ | The ability to filter by activity is not currently supported | +| Topic Metrics | Likes, Views, Replies, and Frequent Posters | ✅ | | +| Topic & Post Actions | Ability to like and edit topics and posts | ✅ | | +| View Top & Latest Topics | A Tab View at the top of the main feed provides the ability to switch between Latest and Top activity | ✅ | | +| Search | Search the current Discourse instance for topics and posts based on keywords, categories, and tags | ✅ | | +| Categories | View the category of a topic and filter topics by a given category | ✅ | Categories cannot be created, updated, or deleted | +| Attaching Media to Posts | Users can attach media to a post from the app | ✅ 🔧 | Configuration recommended for supported file extensions-see [Optimal Experience](optimal#configure-upload-extensions) | +| Standard Markdown | Standard Markdown is supported in the editor and rendered correctly in the mobile app | ✅ | Light, incomplete support exists for some of Discourse's custom markup, such as dates | +| Sign Up | Allow users to sign up for an account directly through the mobile app, depending on whether your Discourse instance allows new user registration or not | ✅ | | +| Browsing Public Instances | Allow users to immediately access and browse your Discourse instance from the mobile app if it is not private | ✅ | Users will be prompted to login upon attempting an authenticated action | +| User Profiles | Ability to view users' profiles and edit your own | ✅ | Partial support: displays the user's photo, username, Markdown bio on a single line, and recent activity | +| Post Flagging | Allow users to flag posts for admins to review | ✅ | Admins are not able to review posts in the app, though they will see in-app notifications for flags | +| In-App Notifications | Allow users to see new notifications from the profile screen of the mobile app and mark all notifications as read | ✅ | Some notifications from Discourse are not tappable in the mobile app, such as badge notifications | +| Private messaging | Allow users to start private or group messages with one another | ✅ | | +| Mentions | Allow users to mention a user when creating or editing posts and messages | ✅ | +| Color Scheme | Provides light and dark mode support for users | ✅ | Specify color scheme (light mode, dark mode, or system) from within the app (only local to the user's mobile device) | +| Badges | The ability to see and interact with badges that have been awarded to users on the Discourse instance | ❌ | | +| Post Drafts | Enable users to start composing a draft of a post and return to it later | ❌ | | +| Groups | Enable users to create and participate in private groups of which only group members can view certain topics | ❌ | | +| Admin Features | Discourse admin features generally not available in Lexicon—better suited to a desktop environment | ❌ | Editing posts is supported | +| Post Quotes, Polls, Toggles, and Task Lists | Custom text formatting that enables Discourse-specific features | ❌ | | +| Discourse Emojis | Utilize emojis when creating a topic, making a post, or sending a reply | ❌ | Unicode-based emojis are of course supported | +| Post Bookmarks | Allow users to bookmark certain posts or topics | ❌ | | +| DiscourseConnect (SSO) | Replace Discourse authentication with a Custom Provider | ❌ | | +| Custom Authentication Plugins | Login via OAuth2 or other protocols using custom Discourse Plugins | ❌ | | +| Real-time Chat | Enable users to initiate conversations using the chat feature, either in a channel or through private messaging | ❌ | | +| User Status | Allow other user in community to see user message status | ❌ | | diff --git a/documentation/docs/discourse-plugin-enable.md b/documentation/docs/discourse-plugin-enable.md new file mode 100644 index 00000000..9c032a6a --- /dev/null +++ b/documentation/docs/discourse-plugin-enable.md @@ -0,0 +1,34 @@ +--- +title: Enable the Lexicon Plugin +slug: discourse-plugin/enable +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +--- + +After you have confirmed the plugin has been installed and your Discourse instance is running again, you can follow these steps to enable the plugin: + +1. As an admin user, access your Discourse admin dashboard. + +2. Navigate to the `Plugins` tab. + +You'll notice that the `discourse-lexicon-plugin` is not enabled yet. + +Plugin Admin Page + +3. Click on the `Settings` button for the `discourse-lexicon-plugin` entry. + +4. Select the feature you want to enable and turn it on. + +##### Push Notifications + +For push notifications, all you need to do is check the box for `lexicon push notifications enabled`. This is covered in [Enable Push Notifications](push-notifications/setup/enable-push-notifications). + +##### Email Deep Linking + +For email deep linking, you need to fill in your app scheme first before enabling it. + +Plugin Settings Page + +This is covered in detail in [Enable Email Deep Linking](./email-deep-linking/setup/enable-email-deep-linking.md). diff --git a/documentation/docs/discourse-plugin-installation.md b/documentation/docs/discourse-plugin-installation.md new file mode 100644 index 00000000..911770b1 --- /dev/null +++ b/documentation/docs/discourse-plugin-installation.md @@ -0,0 +1,82 @@ +--- +title: Plugin Installation +slug: discourse-plugin/setup +--- + +Before you can start using the Lexicon Discourse Plugin, there are a few prerequisites and installation steps you need to follow. This documentation will guide you through the process, ensuring a smooth setup of the plugin on your site. + +## Prerequisites + +In order to use this plugin, you must have access to your Discourse server in a way which allows you to modify the server's `app.yml`. If a hosting provider is managing Discourse for you, you will have to contact them to request that they install the plugin on your behalf. + +Specifically, you will need the ability to install plugins, which means directly modifying `/var/discourse/containers/app.yml` to include the [Lexicon Discourse plugin](https://github.com/lexiconhq/discourse-lexicon-plugin.git), and then rebuilding your site. + +## Plugin Installation Steps + +### Access your Server + +Login to your underlying Discourse host server via SSH. + +This is specific to each hosting setup, but typically you will need to use a terminal application such as Terminal on macOS or PuTTY on Windows. + +### Open the Discourse `app.yml` file + +Feel free to use your terminal editor of choice (vim, emacs, nano, etc.). + +:::note +You may need `sudo` access to edit the file, but it depends on how the server was configured. +::: + +```bash +vim /var/discourse/containers/app.yml +``` + +### Get the Plugin’s Git Clone URL + +Discourse plugins are referenced by their reachable Git clone URLs, which typically end with `.git`. + +The Git clone URL for the [Lexicon Discourse plugin](https://github.com/lexiconhq/discourse-lexicon-plugin) can be found below: + +``` +https://github.com/lexiconhq/discourse-lexicon-plugin.git +``` + +Copy it to your clipboard for use in the next step. + +### Add the plugin’s repository URL to your container’s `app.yml` file: + +Add the plugin’s Git clone url to the section below. + +``` +hooks: + after_code: + - exec: + cd: $home/plugins + cmd: + - git clone https://github.com/lexiconhq/discourse-lexicon-plugin.git +``` + +### Rebuild the container, with caution + +:::caution +Please be aware that rebuilding your site will result in your site going offline for a period of time, typically between 5 to 30 minutes. We advise proceeding carefully and taking precautions outlined below. +::: + +#### Precautionary Measures + +1. Before installing the plugin or performing any site rebuild, it is highly recommended to create a backup of your Discourse site. +1. It is advisable to upgrade your Discourse installation and all existing plugins to their latest versions before attempting to install this plugin. +1. Although rare, there may be situations where the site does not come back online after the rebuilding process, and requires further troubleshooting to revive. + - This is always a risk when installing a plugin or performing any task that requires rebuilding the app. + - We recommend that you perform these changes at a time that minimizes the users affected and that you have a well-defined contingency plan in place if something goes wrong. + +#### Run Rebuild Command + +```bash +cd /var/discourse +./launcher rebuild app +``` + +### How to Uninstall the Plugin + +To remove the plugin, simply remove the Git clone URL line from your `app.yml` file and rebuild your site. Please keep in mind that rebuilding your site will will result in your site going offline for a period of time, and poses the same risks that come with rebuilding the app. diff --git a/documentation/docs/discourse-plugin.md b/documentation/docs/discourse-plugin.md new file mode 100644 index 00000000..de85ea89 --- /dev/null +++ b/documentation/docs/discourse-plugin.md @@ -0,0 +1,15 @@ +--- +title: Lexicon Discourse Plugin +slug: discourse-plugin/ +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +--- + +Discourse lacks native mobile app functionalities such as push notifications and deep linking. + +To address this, Lexicon has developed a custom Discourse plugin that seamlessly integrates push notifications and deep linking capabilities. + +- By leveraging Expo's powerful features, our plugin establishes a secure connection between your Discourse site and Expo's push notification service, delivering real-time updates to users' mobile devices based on your site's activity. +- Additionally, our plugin generates custom deep links in email notifications, allowing users seamlessly launch your Lexicon-powered mobile app directly from their mobile email client. diff --git a/documentation/docs/email-deep-linking/intro.md b/documentation/docs/email-deep-linking/intro.md new file mode 100644 index 00000000..ca863368 --- /dev/null +++ b/documentation/docs/email-deep-linking/intro.md @@ -0,0 +1,9 @@ +--- +id: intro +title: Introduction +slug: discourse-plugin/email-deep-linking +--- + +The Lexicon Discourse plugin provides support for integrating Discourse's email notifications with your Lexicon-powered mobile app. Our plugin modifies links in specific Discourse emails so that when a relevant link is tapped and the user has your Lexicon-powered mobile app installed, it will open the app to the relevant topic or post. Otherwise, it will fall back to opening the topic in the device's web browser as it normally would. + +This section of the documentation offers step-by-step instructions to integrate email deep linking into your Discourse site so that your users have a more seamless experience with your Lexicon-powered mobile app. diff --git a/documentation/docs/email-deep-linking/setup/enable-email-deep-linking.md b/documentation/docs/email-deep-linking/setup/enable-email-deep-linking.md new file mode 100644 index 00000000..73c7dd3f --- /dev/null +++ b/documentation/docs/email-deep-linking/setup/enable-email-deep-linking.md @@ -0,0 +1,25 @@ +--- +title: Enabling the Lexicon Discourse plugin +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +This guide will walk you through the necessary steps to activate email deep linking on your Discourse site. + +## Steps + +1. Access your Discourse admin dashboard. + +2. Navigate to the `Plugins` section. + + + +3. Locate the `discourse-lexicon-plugin` and click on the `Settings` button. + +4. Fill in the `lexicon app scheme` setting with your app scheme. The app scheme is required to enable email deep linking. + +5. Check the `lexicon email deep linking enabled` box in the Lexicon settings section and save your changes. + + + +Once the email deep linking feature is enabled, you will be able to utilize its functionality in your Discourse instance. diff --git a/documentation/docs/email-deep-linking/setup/verify-email-deep-linking.md b/documentation/docs/email-deep-linking/setup/verify-email-deep-linking.md new file mode 100644 index 00000000..0fe7642d --- /dev/null +++ b/documentation/docs/email-deep-linking/setup/verify-email-deep-linking.md @@ -0,0 +1,49 @@ +--- +title: Verify Email Deep Linking +slug: verify-email-deep-linking +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +:::note +The steps below assume that **you have already published your Lexicon-powered mobile app** to the App Store and/or Google Play Store **with the correct app scheme**. If you are running the app on your machine locally through Expo, you should not expect the steps to work. +::: + +This guide will provide you with step-by-step instructions to help you validate the functionality of email deep linking within your Lexicon mobile app. + +## Pre-requisites + +:::note +If you have not yet fulfilled all of the pre-requisites below, this test will not work as expected. +::: + +In order to test email deep linking properly: + +1. You **must** have already published your Lexicon-powered mobile app to the App Store and/or Google Play Store. +1. You have already installed and configured the Lexicon Discourse plugin on your Discourse site. +1. You have enabled email deep linking within the Lexicon Discourse plugin settings, and the app scheme matches what you published your app with. +1. You have at least 1 mobile device with your Lexicon-powered mobile app already installed, with the correct app scheme as it was configured in Discourse. +1. You have at least 2 separate Discourse accounts to test with. +1. Ensure your Discourse site allows **mailing list mode**, and that it is turned on for the accounts you are testing with. + - If you do not do this, you will have to wait for Discourse to send its next digest email, which could take a while. + +## Steps + +To test email deep linking within your **published** Lexicon-powered mobile app, follow these steps: + +1. Ensure you have access to at least 2 separate accounts on your Discourse instance. +1. On your mobile device, open your Lexicon-powered mobile app and login using one of your accounts. + - **Note**: ensure that your email client on your mobile device will receive emails for this account. +1. Open your Discourse site in a web browser on your laptop or desktop computer. +1. Login to your **second** Discourse account in your web browser. +1. On your mobile device, using the **first** account, create a new post. +1. Now, on your laptop or desktop computer, using the **second** account, find the post you created on the mobile app and reply to it. +1. Back on your mobile device, you should receive an email notification from Discourse about the reply from the second account. +1. Click on the button that says `Visit Message` or `Visit Topic`. The label depends on what activity generated the email (see screenshot below). +1. The link will first open in your mobile web browser. Provided that the Lexicon-powered mobile app is installed and matches the configured app scheme, it should automatically open your app to the relevant topic or message scene. + +
+ +
+ +And that's it! You have successfully completed the steps to enable and test email deep linking in your app. diff --git a/documentation/docs/env-mobile.md b/documentation/docs/env-mobile.md index df2ed995..79af9933 100644 --- a/documentation/docs/env-mobile.md +++ b/documentation/docs/env-mobile.md @@ -1,48 +1,119 @@ --- -title: Environment Variables +title: Configuration Values --- -The table below lays out environment variables for the Lexicon Mobile App. +You can check and set the configuration values in `frontend/Config.ts`. + +The table below describes the configuration values for the Lexicon Mobile App. If there is a default value indicated, you do not need to set it. -| Environment Variable | Required | Notes | Default Value | Example Value | -| -------------------- | -------- | ---------------------------------------------------------------- | ------------- | -------------------------- | -| MOBILE_PROSE_HOST | Yes | The hostname of the Prose Server (must start with http or https) | - | https://prose.myserver.com | -| MOBILE_PROSE_PORT | No | The port of the Prose Server | (empty) | 8080 | +| Variable | Required | Notes | Default Value | Example Value(s) | +| -------------------- | -------- | -------------------------------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| proseUrl | Yes | The url of the Prose Server (must start with http or https) | - | https://prose.myserver.com https://prose.myserver.com:8080 https://prose.myserver.com/subpath https://prose.myserver.com:8080/subpath | +| inferDevelopmentHost | No | The flag (true / false) to override localhost with the host of the development machine | (empty) | true | + +## The `config` object + +In the `Config.ts` file, you'll find a `config` object that allows you to specify configuration values by scenario. + +The two primary scenarios are: + +- `localDevelopment`: when developing against the app locally. This configuration is also used as a fallback for an unknown build channel. +- `buildChannels`: used to define configuration by build channel when building the app with the EAS CLI. -## `MOBILE_PROSE_HOST` +Primarily, you'll only be concerned with configuring `proseUrl` for each of these sections. -Note that `MOBILE_PROSE_HOST` must always be specified, and must always start with either `http://` or `https://`. +## `proseUrl` -Otherwise The Lexicon Mobile App has no idea what server to talk to in order to interact with Discourse. +:::caution +`proseUrl` must always be specified, with or without a port number, and must always start with either `http://` or `https://`. +::: + +`proseUrl` is used to specify the URL of the Prose GraphQL API. + +The Prose GraphQL API acts a middleman between the Lexicon Mobile App and your Discourse instance. Without it, the mobile app cannot interact with your Discourse instance. + +### Example + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com', + }, + production: { + proseUrl: 'https://prose.myserver.com', + }, + }, +}; +``` + +With this configuration above, the app will: + +- point at `http://localhost:8929` when you run the app using `npm run start` +- point at `https://preview.myserver.com` when you build the app using `eas build --profile preview` +- point at `https://prose.myserver.com` when you build the app using `eas build` + +`proseUrl` also can include a subpath if desired: + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com:8080/subpath', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; +``` **Different Behavior in Development** -If the Mobile App detects that `NODE_ENV` is not `production`, then it will adjust its behavior slightly if `MOBILE_PROSE_HOST` is making use of `localhost` or `127.0.0.1`. +When running the app locally, if `proseUrl` is set to `http://localhost` or `http://127.0.0.1`, it will replace `proseUrl` with the IP address of your development machine. It does this by using Expo's `debuggerHost` constant. -In this case, a replacement will be made using Expo's `debuggerHost` constant, which is used to locate the IP address of your development machine. +_Note: this does not apply when building the app._ This addresses multiple issues: - Accessing `localhost` from within the Android simulator does not map to your development machine -- Accessing `localhost` from a device running Expo Go does not map to your development machine, requiring you to manually identify and specify your development machine's IP address with `MOBILE_PROSE_HOST`. +- Accessing `localhost` from a device running Expo Go does not map to your development machine + +Both of these scenarios would otherwise require you to manually identify and specify your development machine's IP address with `proseUrl`. This is bothersome since your machine's IP address can change over time. If you are interested in more details about this, the implementation of this behavior is available in `frontend/constants/app.ts`. -## `MOBILE_PROSE_PORT` +This behavior of automatically overriding those values can be disabled, with `inferDevelopmentHost`, which is covered below. -`MOBILE_PROSE_PORT` is used to allow explicitly specifying the port number. +## `inferDevelopmentHost` -```bash -MOBILE_PROSE_HOST=http://localhost -MOBILE_PROSE_PORT=8999 -``` +:::info +This flag is only valid under `localDevelopment`. It has no effect when used as part of `buildChannels`. +::: + +When in development, by default, the Lexicon Mobile App will check to see if `proseUrl` is set to either `http://localhost` or `http://127.0.0.1`. + +When detected, either of those values will be overwritten with the IP address of your development machine. + +This is a very useful feature that makes on-device testing simply work out of the box without needing to manually specify your IP address (or update it when it changes). -If it is not set, only `MOBILE_PROSE_HOST` will be used to derive the host of the Prose +For scenarios where this behavior is not desirable, `inferDevelopmentHost` can be used as a flag to disable this behavior. It can be disabled by specifying the value as `false`. -This presents a situation where you could omit `MOBILE_PROSE_PORT` and still specify a port number, if you desired: +When set to `false`, this behavior of overriding `proseUrl` with the development machine's IP address will no longer occur, and the original value will be passed through as-is. -```bash -MOBILE_PROSE_HOST=http://localhost:8999 +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + inferDevelopmentHost: false, + }, +}; ``` diff --git a/documentation/docs/play-store.md b/documentation/docs/play-store.md index f1ac1dfb..dacdfa8c 100644 --- a/documentation/docs/play-store.md +++ b/documentation/docs/play-store.md @@ -7,10 +7,12 @@ import useBaseUrl from '@docusaurus/useBaseUrl'; ## Prerequisites :::note -If you don't already have a Google Developer account, note that there is a $25.00 fee to create one. +If you don't already have a Google Developer account, note that there is a fee to create one. ::: - A [Google Developer Account](https://play.google.com/console/signup) to access the [Google Play Console](https://play.google.com/console) +- An Expo account +- EAS CLI 2.6.0 or newer ## Google Play Console @@ -18,67 +20,143 @@ The [Google Play Console](https://play.google.com/console) enables you to setup Because you're publishing an app that was built using Expo, it is **very important** that you follow [Expo's instructions](https://github.com/expo/fyi/blob/master/first-android-submission.md) for submitting an app to the Google Play store correctly. -### Configuration +## App Configuration -Similar to how you configured your `app.json` in [Publishing to the App Store](app-store), you'll need to adjust the `android` section to include the details specific to your app. +After setting up your app in the Google Play Console, there are some other adjustments you'll need to make. + +### Build Config + +Similar to the approach for [Publishing to the App Store](app-store), if you haven’t already, you'll need to set your app name and slug in `frontend/app.json`. The [slug](https://docs.expo.dev/workflow/glossary-of-terms/#slug) is used as part of the URL for your app on Expo's web services, so it is recommended to use kebab-case (e.g., `my-lexicon-app`). + +Replace these placeholders with your desired values: ```json - "android": { - "package": "com.yourdomain.yourapp", - "versionCode": 1, - "permissions": [] - }, + "name": "", + "slug": "", ``` -Above, make sure that you always increment the `versionCode` before building a newer version of your app. +Then, you need to configure EAS Build by running the following command, or skip to the next [step](play-store#setup-config-values): -Also, there's one additional detail that you might want to add, depending on your app: permissions. +```bash +eas build:configure +``` + +The EAS CLI will prompt you to specify `android.package` and `ios.bundleIdentifier` if those values are not already provided in `app.json`. + +Next, verify that the `package` name and other details specific to your app are included in the `android` section of `app.json`. Note that the `versionCode` will be automatically updated when you build the app with the `production` profile, so you don't need to increment the version manually. + +Also, there's one further detail that you might want to add, depending on your app's permissions. In the example below, we're providing our app with the ability to read and write to external storage. ```json - "android": { - "package": "com.yourdomain.yourapp", - "versionCode": 1, + "android": { + "package": "", "permissions": [ "READ_EXTERNAL_STORAGE" , "WRITE_EXTERNAL_STORAGE" ] + "versionCode": 1, }, - ``` +If your app requires further permissions, be sure to specify them as needed in this part of the configuration. + If you don't quite understand how permissions work yet, it's best to check out the [Expo documentation](https://docs.expo.io/versions/latest/sdk/permissions) on this topic in order to get a full understanding. -### Build your App for Android +### Setup Config Values -Because we're working with Expo and React Native, this step isn't too different from building your app for iOS. +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](deployment) to deploy Prose if you haven't already. +::: -From the `frontend/` directory, you'll simply want to run: +Next, set the **Prose URL** for your builds in `Config.ts`. You can set a different URL for each build channel. +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +```ts +const config = { + // ... + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; ``` -$ expo build:android + +### Add the Play Store Secret File + +For the last step, you'll need to provide a `.json` file containing a private key in order to interact with the Play Store. Follow [this guide](https://github.com/expo/fyi/blob/main/creating-google-service-account.md) to generate one. Then, copy the JSON file to your `lexicon/frontend` directory, and rename the file as `playstore_secret.json`. + +The JSON file looks like this: + +```json +{ + "type": "service_account", + "project_id": "", + "private_key_id": "", + "private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n", + "client_email": "", + "client_id": "", + "auth_uri": "", + "token_uri": "", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/lexicon%40api.iam.gserviceaccount.com" +} ``` -When executing this command, you'll be prompted with the option of building your app as an APK or as a bundle. +## Build your App for Android -If you'd like to test the app on your device before publishing it in the Google Play Console, you might want to build it as an APK. This enables you to quickly load it onto your Android device. +Because we're working with Expo and React Native, this step isn't too different from building your app for iOS. + +From the `frontend/` directory, you can run this command to check the app before publishing: -However, if you're planning to invite beta testers to your app in the Google Play Console, you'll want to build it as a bundle and submit it through there. +```bash +eas build --platform android --profile preview +``` -Upon making your selection, Expo will initiate the build process on their servers, and will provide you with a link to monitor its progress. +Running `eas build` with the `preview` profile will build the app as an APK. This allows you to quickly load it onto your Android device or emulator. After the build is done, navigate to your project in the [Expo web console](https://expo.dev), then click on the **Builds** menu located on the left-hand side of the screen. - +- Click on the project you want to install. -Once Expo has finished building your app, you can download it to retrieve the APK or Bundle. + Builds -Then, you can finish the process of publishing it by following Expo's Android-specific guide, [First Submission of an Android App](https://github.com/expo/fyi/blob/master/first-android-submission.md). +- Download the app by pressing the `Install` button in the `Build Artifact` section. -For further information about the `expo build:android` command, check Expo's [documentation](https://docs.expo.io/distribution/uploading-apps/#2-start-the-upload). + Build Artifact -### Publish to the Play Store +You can download and launch the app on your real device, or drag the downloaded APK file to your emulator. -Unlike the process of publishing an iOS app to the App Store, publishing to the Google Play Store is much simpler. +Once you have verified that the app runs as expected, you can proceed to build it for release: + +```bash +eas build --platform android --profile production +``` -At this point, you can take your app live on the Google Play Store, or you can proceed with internal testing on the Google Play Console. It's really up to you. +The approach for a production build is similar to the one used for generating a preview build. However, unlike a preview build, you won't be able to launch the production build in Android emulator—it is intended solely for publishing to the Play Store. + +Once this process is completed, you can proceed with submitting it to the Play Store. + +## Publish to the Play Store + +At this point, you can take your app live on the Google Play Store, or you can proceed with internal testing on the Google Play Console. + +To proceed with internal testing, run this command: + +```bash +eas submit --platform android --profile staging +``` + +To release your app publicly, run this command: + +```bash +eas submit --platform android --profile production +``` -And, provided that you've now also published your app to the Apple App Store, congratulations! +You can read more about build profiles [here](tutorial/publishing). -Your Lexicon-powered app is now live and ready to be downloaded by your users. +At this point, provided that you've completed all the steps, congratulations! Your Lexicon-powered mobile app is now live and ready to be downloaded by your users. diff --git a/documentation/docs/push-notifications/introduction.md b/documentation/docs/push-notifications/introduction.md new file mode 100644 index 00000000..619429c6 --- /dev/null +++ b/documentation/docs/push-notifications/introduction.md @@ -0,0 +1,8 @@ +--- +title: Introduction +slug: /push-notifications +--- + +The Lexicon Discourse plugin provides support for native push notifications for your Lexicon-powered mobile app. This works for both Android and iOS, and is handled by Expo's [push notifications service](https://docs.expo.dev/push-notifications/overview/). + +This documentation offers step-by-step instructions to seamlessly integrate push notifications into your Discourse site so that your users receive them in your Lexicon-powered mobile app. By following this guide, you will be able to enhance the UX of your users by ensuring they receive timely and engaging notifications about activity on your Discourse site. diff --git a/documentation/docs/push-notifications/plugin-interaction.md b/documentation/docs/push-notifications/plugin-interaction.md new file mode 100644 index 00000000..5a424ac4 --- /dev/null +++ b/documentation/docs/push-notifications/plugin-interaction.md @@ -0,0 +1,31 @@ +--- +title: How Push Notifications work with Lexicon +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +Below, we outline the interaction between the Lexicon mobile app, Prose, and the Discourse Plugin regarding the implementation of push notifications. + +## The Lexicon mobile app + +The Lexicon mobile app plays a crucial role in enabling push notifications for your users. When a user logs into their account using the app, a unique token is generated using the [`expo-notifications`](https://docs.expo.dev/versions/latest/sdk/notifications/) library. This token serves as a unique identifier for the user's device. The app then sends this token to the Prose GraphQL API, which makes a separate request to the Lexicon Discourse plugin. The plugin then inserts a record into your Discourse site's database—ensuring any relevant activity on Discourse triggers a push notification to the user's mobile device. + +## Prose + +As mentioned elsewhere in the documentation, Prose is an intermediary component that facilitates communication between the Lexicon mobile app and your Discourse site. It serves the key role of providing a GraphQL interface over Discourse, which allows the mobile app to communicate with Discourse via GraphQL. + +The latest Prose API exposes a new GraphQL mutation, `pushNotifications`, to receive the unique Expo push token from the mobile app when the user logs in. + +Once Prose receives the token from the app, it forwards the token to the Discourse Plugin running on your site. + +## Discourse Plugin + +The Lexicon Discourse Plugin provides several features. In terms of enabling push notifications, it is responsible for integrating with Expo's [push notifications service](https://docs.expo.dev/push-notifications/overview/). When the Discourse Plugin receives a push token from Prose, it saves the token in your Discourse site's database, associating it with the corresponding user. + +Since the Lexicon Discourse plugin has been configured to respond to events within your Discourse site, it is able to dispatch push notifications based on your users' activity. + +When a relevant event triggers the need for a push notification, such as a new message or reply, the Discourse Plugin retrieves the associated user's token from your Discourse site's database. Using this token, the plugin sends a push notification request to Expo's push notification service, triggering the delivery of the push notification to the user's device. + +## Flowchart + +Build Artifact diff --git a/documentation/docs/push-notifications/setup/enable-push-notifications.md b/documentation/docs/push-notifications/setup/enable-push-notifications.md new file mode 100644 index 00000000..e08a9070 --- /dev/null +++ b/documentation/docs/push-notifications/setup/enable-push-notifications.md @@ -0,0 +1,32 @@ +--- +title: Enable the Lexicon Discourse plugin +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + + + + + + +Below, we'll walk you through the necessary steps to activate push notifications for your Discourse site. + +## Steps + +1. Ensure the [Lexicon Discourse plugin](../../discourse-plugin-installation.md) is installed and activated. + +1. As an admin user, access your Discourse admin dashboard. + +1. Navigate to the Plugins section. + + + +4. Click on the `Settings` button for the `discourse-lexicon-plugin` entry. + +5. Check the `enable Push Notifications` box in the Lexicon settings section and save your changes. + + + +Once the push notifications setting is enabled, your users will be able to login through the mobile app and start receiving push notifications. + +It is important to remember that push notifications are setup specifically when the user logs in through the mobile app. If users are not receiving push notifications, you should instruct them to log out and log back in before attempting any further troubleshooting. diff --git a/documentation/docs/push-notifications/setup/verify-push-notifications.md b/documentation/docs/push-notifications/setup/verify-push-notifications.md new file mode 100644 index 00000000..26679ffb --- /dev/null +++ b/documentation/docs/push-notifications/setup/verify-push-notifications.md @@ -0,0 +1,33 @@ +--- +title: Verify Push Notifications +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + + + + + +Below, we'll walk you through how you can validate the functionality of push notifications within your Lexicon-powered mobile app. + +:::info +In order to properly test push notifications, **you will need two separate accounts** on your Discourse site (to generate notifications). + +Additionally, **you will need at least one mobile device** for testing purposes. +::: + +## Step + +To test push notifications within your Lexicon-powered mobile app, follow these steps: + +1. Ensure that you have completed the [Getting Started](../../quick-start) steps for Lexicon. +1. Start the Lexicon Expo app by navigating to `frontend/` and running `yarn start` from your terminal. +1. Using the Expo link or QR Code, launch the app on a real mobile device. +1. Login to the app using one of your accounts. +1. Using that account, create a post within your Discourse site +1. Using a separate account, reply to the post to trigger a notification for the first account. +1. You should receive a push notification on your phone with the reply content from the other account. + + + +And that's it! The Lexicon Discourse plugin is properly sending push notifications through your Discourse site. diff --git a/documentation/docs/quick-start.md b/documentation/docs/quick-start.md index ed5fd52f..c72f310c 100644 --- a/documentation/docs/quick-start.md +++ b/documentation/docs/quick-start.md @@ -4,12 +4,17 @@ title: Quick Start ## Prerequisites -- Node.js 12.19.0 or newer -- The latest version of NPM or Yarn, compatible with Node 12.19.0 or newer -- Expo-CLI 3.22.1 or newer +- Node.js 16.14 or newer +- The latest version of NPM or Yarn, compatible with Node 16.14 or newer +- Expo CLI 6.0.6 or newer +- EAS CLI 2.6.0 or newer to build and publish the App - An active Discourse site - If you don’t have one, please follow the instructions in [Development Setup](setup#discourse-host) +:::note +Follow the instructions in [Setup Guidance](tutorial/setup) to install the prerequisite depedencies, such as NPM, the Expo CLI, and the EAS CLI. +::: + ## Installation Clone the repository and navigate into it: @@ -33,10 +38,7 @@ Note that `npm run generate` involves two steps. - This allows the frontend codebase to stay in sync with, and not duplicate the code for, the types from the `api` directory. -This is a necessary process from our tooling, [Apollo](https://github.com/apollographql/apollo-tooling). - -To learn more about this process, check out the [apollo client:codegen](https://github.com/apollographql/apollo-tooling#apollo-clientcodegen-output) documentation. -Click [here](https://github.com/apollographql/apollo-tooling#apollo-clientcodegen-output) to learn more about why we do this. +The code shared from the API is then used by [Apollo](https://github.com/apollographql/apollo-tooling), the GraphQL library we use on the frontend, which enables the Mobile App to query the API correctly. ## Launch the Mobile App diff --git a/documentation/docs/rationale.md b/documentation/docs/rationale.md index ec672574..bfb62fa4 100644 --- a/documentation/docs/rationale.md +++ b/documentation/docs/rationale.md @@ -22,7 +22,7 @@ In our case, we were looking for a very specific type of experience. ### Who We Are -The Lexicon Team is part of [KodeFox](https://www.kodefox.com/), a software studio comprising of passionate software engineers, designers, and product managers who regularly build world-class software for our customers. +The Lexicon Team is part of [KodeFox](https://www.kodefox.com/), a software studio comprised of passionate software engineers, designers, and product managers who regularly build world-class software for our customers. Interested in custom software development with a personal touch? Drop us a line at [hello@kodefox.com](mailto:hello@kodefox.com). @@ -36,7 +36,7 @@ However, our clients wanted a seamless, native mobile experience, tailored to th After digging into the Discourse API documentation, we felt that it was worthy investment to build a mobile-first Discourse experience which also faciliated customizability. -We were already advocates of the elegant development process provided by React Native and Expo, so we forged ahead, implementing the entire mobile app with these technologies. +We were already fluent with the elegant development process provided by React Native and Expo, so it was a natural fit for us to build the mobile app with these technologies. This allowed us to achieve a high ratio of code reuse across iOS and Android, making feature implementations and bug fixes a much simpler process in most cases. @@ -46,11 +46,11 @@ While we can appreciate the sentiment of figuring things out yourself, we wanted For this reason, we also chose to build Prose, our GraphQL API layer on top of the Discourse RESTful API. Another motivating factor was our existing fluency with GraphQL. -This allowed us to quickly iterate on new features with a more modern, well-thought-out API paradigm. +This allowed us to quickly implement the mobile app with an intuitive API paradigm that we were already very familiar with. #### How Lexicon can help you -For starters, if you already run an existing Discourse site and want a native mobile experience for your users, you can very quickly point Lexicon at your site and browse it in real-time from your device. +If you already run an existing Discourse site and want a native mobile experience for your users, you can very quickly point Lexicon at your site and browse it in real-time from your device. Check out the [Quick Start](quick-start) page to see a rapid example of spinning up a mobile app for Discourse's own [Meta site](https://meta.discourse.org). diff --git a/documentation/docs/setup.md b/documentation/docs/setup.md index ddb84c1e..7ef46648 100644 --- a/documentation/docs/setup.md +++ b/documentation/docs/setup.md @@ -4,9 +4,7 @@ title: Development Setup ### Clone the Lexicon Repository -If you haven't already, make sure you clone the Lexicon repository from Github. - -We walk you through this process in [Quick Start Installation](quick-start), so head over there to get started. +If you haven't already, make sure you [clone the Lexicon repository](quick-start#installation) from Github. ### Setup a Discourse Instance, if necessary @@ -24,104 +22,118 @@ For detailed instructions on setting up a local development instance of Discours However, if you already have a deployed instance of Discourse, we'd recommend using that instead. -### Configure Environment Variables +### Configuration -The Lexicon Stack requires multiple environment variables in order to properly interact with your Discourse server. +The [Lexicon Stack](concepts#architecture-of-the-lexicon-stack) requires some configuration in order to properly interact with your Discourse server. -In order to run the components of Lexicon, it's recommended that you create and populate `.env` files in two locations within the project: +This involves configuring both the backend GraphQL API, which interacts with your Discourse instance; as well as the frontend Mobile App, which interacts with the GraphQL API. -- `api/` (the GraphQL API server) -- `frontend/` (the React Native app) +The architecture of this setup is depicted in [Architecture of the Lexicon Stack](concepts#architecture-of-the-lexicon-stack). -To simplify this process, both directories contain a template file, `.env.example`, which you can copy into `.env` files for each directory: +#### Backend GraphQL API Configuration -``` -$ cp frontend/.env.example frontend/.env -$ cp api/.env.example api/.env -``` +The [Prose GraphQL API](concepts#prose-discourse-through-graphql) is fairly simple in terms of configuration. In the simplest case, it only needs to know where your Discourse instance is accessible at. -#### Frontend Environment Variables - -:::note -If the Lexicon Mobile App is already running through Expo, and you adjust these values, you may need to **quit the Expo process and relaunch it** in order to run the Mobile App with the latest values from `frontend/.env`. +It receives its configuration via a [`.env` file](https://www.codementor.io/@parthibakumarmurugesan/what-is-env-how-to-set-up-and-run-a-env-file-in-node-1pnyxw9yxj) in the root of the `api/` directory. -If this does not help, try clearing the cache from the frontend directory via `expo r -c`. -::: +Here is the simplest configuration of the `api/.env` file: -Change the value of `MOBILE_PROSE_HOST` in `frontend/.env` to the hostname of your Prose GraphQL API—whether local or already deployed somewhere. +``` +PROSE_DISCOURSE_HOST=https://meta.discourse.org +``` -In the first case, this would look like: +It is also worth noting that you can optionally configure the **Hostname** and **Port Number** that the Prose API server listens on, both of which default to **localhost** and **port 80**, respectively. -```bash -MOBILE_PROSE_HOST=http://localhost -MOBILE_PROSE_PORT=8080 ``` +PROSE_DISCOURSE_HOST=https://meta.discourse.org -Alternatively, for a deployed instance, it would look like: +# Instruct Prose to broadcast publicly instead of on localhost +PROSE_APP_HOSTNAME=0.0.0.0 -```bash -MOBILE_PROSE_HOST=https://prose.mysite.com +# Instruct Prose to listen on port 8929 instead of the default port 80 +PROSE_APP_PORT=8929 ``` -#### Prose GraphQL API Environment Variables +For a comprehensive list of all environment variables that can be used to configure Prose, check out [Prose Environment Variables](env-prose). -The Prose GraphQL API is fairly simple in terms of configuration. In the simplest case, it only needs to know where your Discourse instance is accessible at. +#### Frontend Mobile App Configuration -``` -PROSE_DISCOURSE_HOST=https://meta.discourse.org -``` +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: -However, it is also worth noting that you can optionally configure the **Hostname** and **Port Number** that the Prose server listens on, which default to **localhost** and **port 80**, respectively. +To configure the frontend mobile app, you'll first need to set your app name and slug in `frontend/app.json`. The [slug](https://docs.expo.dev/workflow/glossary-of-terms/#slug) is used as part of the URL for your app on Expo's web services, so it is recommended to use kebab-case (e.g., `my-lexicon-app`). -``` -PROSE_DISCOURSE_HOST=https://meta.discourse.org +Replace these placeholders with your desired values: -# Instruct Prose to broadcast publicly instead of on localhost -PROSE_APP_HOSTNAME=0.0.0.0 +```json + "name": "", + "slug": "", +``` -# Instruct Prose to listen on port 8080 instead of the default port 80 -PROSE_APP_PORT=8080 +Next, change the value of `proseUrl` in `frontend/Config.ts` to the URL of your Prose GraphQL API—whether local or already deployed somewhere. + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com:8080/subpath', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; ``` -For a comprehensive list of all environment variables that can be used to configure Prose, check out [Prose Environment Variables](env-prose). +`localDevelopment.proseUrl` will be used during development when you run the app using `npm run start` or `expo start`, whereas the specific value within `buildChannels` (e.g., `production.proseUrl`) will be used when actually building the app. #### Development Scenarios When developing locally, there are at least three scenarios that you may find yourself in. -Depending on which one applies to you, the config values across `frontend/.env` and `api/.env` may need to be set differently. +Depending on which one applies to you, the config values across `frontend/Config.ts` and `api/.env` may need to be set differently. ##### Scenario 1: Existing Prose Deployment -If you've already deployed the Prose GraphQL API to a host that is publicly reachable, you will have already setup `api/.env` to the proper values. +If you've already deployed the Prose GraphQL API to a host that is publicly reachable, you will have already setup `api/.env` with the proper values. -In that case, `frontend/.env` only needs updated to point at the deployed GraphQL API. +In that case, `frontend/Config.ts` only needs updated to point at the deployed GraphQL API. For example: +```ts +const config = { + localDevelopment: { + proseUrl: 'https://my-deployed-graphql.api', + }, + buildChannels: { + preview: { + proseUrl: 'https://my-deployed-graphql.api', + }, + production: { + proseUrl: 'https://my-deployed-graphql.api', + }, + }, +}; ``` -MOBILE_PROSE_HOST=https://my-deployed-graphql.api -``` + +In the example above, we have configured the app to point at `https://my-deployed-graphql.api` in all scenarios, including during development when running with `npm run start`. ##### Scenario 2: Run Prose Locally & Access from a Simulator This approach involves running both the Lexicon Mobile App and the Prose GraphQL API on your development machine. It is accomplished by instructing Expo to launch the Mobile App in the Android or iOS simulator. -When developing in this way, you can simply set `MOBILE_PROSE_HOST` to `localhost` or `http://127.0.0.1` in both `api/.env` and `frontend/.env`. - -Instructing the GraphQL API to listen on `localhost` or `http://127.0.0.1` ensures that others on the same network as your development machine cannot access it. Because the simulator is running on the same device, it should be able to access the GraphQL API. - -##### _Brief Note about the Android Simulator_ +When developing this way, you can simply set `localDevelopment.proseUrl` to `http://localhost` in `frontend/Config.ts`. And then in `api/.env`, you can set `PROSE_APP_HOSTNAME` to `0.0.0.0`. -The Android Simulator is actually unable to access your development machine's network on `http://locahost`. +Note that if you want to run Prose locally on a specific port, you would need to make sure that the configuration in both `api/.env` and `frontend/Config.ts` reflect that correctly. -However, we have accounted for this in our business logic when preparing environment variables. - -If you run into issues here, take a look at the function, `getProseEndpoint`, in `frontend/src/constants/app.ts` - -Feel free to adjust it to work more properly with your setup. - -If you're still running into issues with this, please reach out to us on Github. We'd love to make this more robust if we missed a use-case. +:::caution +If you configure `PROSE_APP_HOSTNAME` in `api/.env` to only listen on `localhost` or `127.0.0.1` (rather than `0.0.0.0`), it prevents others on the same network as your development machine from accessing it. This includes both your mobile device and the Android simulator, which can lead to connectivity issues when developing locally. +::: ##### Scenario 3: Run Prose Locally & Access from your Mobile Device @@ -129,25 +141,35 @@ It can be very useful to develop and debug against the app using your actual mob In order to do this, you'll need to have your development machine reachable from your mobile device. -A simple way to make it reachable is to ensure that your mobile device and development machine are on the same network, and then, in `api/.env`, set `MOBILE_PROSE_HOST` to `0.0.0.0`. +A simple way to make it reachable is to ensure that your mobile device and development machine are on the same network, and then, in `api/.env`, set `PROSE_APP_HOSTNAME` to `0.0.0.0`. + +In a regular Expo project, you would be required to update the `localDevelopment.proseUrl` value in `frontend/Config.ts` to contain the hardcoded IP address of your development machine on your network. -Next, you'll need to update the `MOBILE_PROSE_HOST` value in `frontend/.env` so that the Lexicon app running on your mobile device knows how to reach the GraphQL API running on your development machine. +However, by setting the value to `http://localhost`, we handle this **automatically** by default, so you don't have to worry about it. Read more about it [here](env-mobile#infer_development_host). + +###### Hardcoding your local IP Address + +:::info +This approach is not ideal. If your local IP address ever changes, you'll need to locate it again, and update `Config.ts` to reflect that. For this reason, it's preferable to just use `http://localhost`. +::: -In order to do this, you'll need to find out what the **local IP address** of your development machine is on your current network. +To manually instruct the Mobile App how to locate your development machine, you'll need to find out what the **local IP address** of your development machine is on your current network. Note that your local IP address is different from your public IP Address. If you are not sure how to get your local IP address, you can go to [What Is My Browser: Detect Local IP Address](https://www.whatismybrowser.com/detect/what-is-my-local-ip-address) and follow the instructions. +The website itself may not be able to automatically detect your local IP address, but it will give you instructions on how to locate it within your specific operating system. + You will be given an IP address like `10.0.12.121` or `192.168.17.69`. -You can then update the value of `MOBILE_PROSE_HOST` in `frontend/.env` to your local IP address. +You can then update the value in `frontend/Config.ts` to your local IP address. This will allow the app running on your mobile device to properly locate the GraphQL API running on your development machine. ## Configure your Discourse Host -As mentioned above, you'll need to have setup a Discourse host for the Lexicon Stack to interact with. +As mentioned above, you'll need to have setup a Discourse host for the GraphQL API to interact with. We'd like to briefly cover the different approaches to setting up a Discourse Host for development before continuing. @@ -176,13 +198,17 @@ The only drawback of this approach is that you can only register as a normal use With this approach, you'd simply configure Prose in `api/.env` to point `PROSE_DISCOURSE_HOST` at one of these instances. +```bash +PROSE_DISCOURSE_HOST=https://try.discourse.org +``` + ## Working with the Codebase Now that you've prepared everything for development, you can start digging in on the Lexicon codebase. ### Run the Lexicon Mobile App & Prose GraphQL Server -You can run the Mobile App and test it out with a local Prose server by running this command from the project root: +You can run the Mobile App and test it out with a local Prose server by running this command **from the project root**: ``` $ npm run dev @@ -231,25 +257,40 @@ You can run tests across both the frontend and backend codebases sequentially by $ npm run test ``` -On top of ensuring that all tests have passed, the command will also notify you if there are any type errors or issues from Prettier or ESLint. +On top of ensuring that all tests have passed, the command will also notify you if there are any Typescript errors or issues from Prettier or ESLint. -Also note that the process of testing the frontend involves an additional action. +Also note that the process of running `npm run test` triggers an additional action in the frontend to take place before running the tests. -This step creates a new folder, `frontend/generated`, which contains all the GraphQL Query and Mutation types for use in the codebase. +A new folder, `frontend/generated`, is created and populated with all the GraphQL Query and Mutation types for use in the codebase. -If we did not run this before the tests, the tests would fail due to type errors. +If we did not run this before the tests, they would fail due to type errors. ### Build & Publish the Lexicon Mobile App :::note An Expo account is required in order to use Expo's services. You can create one here: https://expo.io/signup. -Once you have created your Expo account, please ensure that you are signed in with your current shell session, via `expo login`. +Once you have created your Expo account, please ensure that you are signed in with your current shell session, via `expo login` or `eas login`. ::: -You can build the Mobile App via Expo by running command below: +You are required to configure EAS build first by running: +```bash +eas build:configure ``` -$ expo publish + +You will then get a prompt from the EAS CLI related to the EAS project IDs: `android.package` and `ios.bundleIdentifier`. EAS will provide you with an existing project ID if you have one or ask you to create a new one. As for `android.package` and `ios.bundleIdentifier`, you can specify those values with `com.companyname.appname`, or any other patterns you might prefer. + +Once you're done, verify the `proseUrl` value you will use for the actual build of the app in `Config.ts`. + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](deployment) to deploy Prose if you haven't already. +::: + +Now you can build the Mobile App via Expo (EAS) with the preview build profile by running command below: + +```bash +eas build –platform all –profile preview ``` When you do this, the packager will minify all your code and generate two versions of your code—one for iOS, and one for Android—and then upload them both to the Expo CDN. @@ -258,19 +299,61 @@ Additionally, if you haven't yet optimized the app's assets, Expo will ask you i This has the same effect as manually running `npx expo-optimize` beforehand. It simply compresses all of the image assets in your project to reduce the size of your build. -When the process has completed, you'll be presented with a link, resembling https://exp.host/@ccheever/an-example. +When the process is complete, you'll be presented with a shareable QR Code and a URL resembling https://exp.host/@ccheever/an-example, which directs you to the build details in Expo's web console. At this point, anyone can then use that link to load your project. +For Android, you can install the app on an emulator or on your physical device. However, for iOS, you can only install it on the iOS simulator. To run the app on a real iOS device, follow the steps in [this part](tutorial/building#1-preview) of the tutorial. + +When building your app, it is recommended to build it as a preview build first, and make sure everything runs well before building it for release with the production profile. + +To build the app with the production build profile, run this command: + +```bash +eas build –platform all –profile production +``` + +You will also be presented with links directing you to the build details in Expo. + +However, unlike the preview build, the release build cannot be installed directly on your physical device or in an emulator / simulator. You'll need to publish the app and then install it from either the Play Store or App Store. + +You can read a more detailed explanation of this process in [this section](tutorial/building) of the tutorial. + #### Updates -If you later want to deploy an update to your version of the Lexicon Mobile App, you can follow the steps above again in order to publish. +If you later want to deploy an update to your version of the Lexicon Mobile App, you can use the EAS update command. + +First, make sure to configure EAS update by running the following command: + +```bash +eas update:configure +``` + +This command will automatically add the `expo.runtimeVersion` field to your `app.json` file. +You'll see a warning in your terminal telling you to add `expo.updates.url` to `app.json`. + +Then run this command to update your project: + +```bash +eas update -–branch +``` + +:::note +The channel name is the same as the build profile, so for the preview builds, you can run: + +```bash +eas update -–branch preview +``` + +::: + +Read more about updating your app [here](tutorial/updating). Once published, the new version will be available to your users the next time they open it. -For more details on this process—including publishing to the App Store and Google Play Store—follow the instructions in [Publishing your App](publish-app). +For more details on this process—including publishing to the App Store and Google Play Store—follow the instructions in [Publishing your App](tutorial/publishing). -#### Configure the GraphQL API with Your Discourse Server +#### Configure the GraphQL API with your Discourse Server In order for a published version of the app to be able to contact your Discourse server, you'll need to ensure that: diff --git a/documentation/docs/technologies.md b/documentation/docs/technologies.md index c4180c4f..838fcffb 100644 --- a/documentation/docs/technologies.md +++ b/documentation/docs/technologies.md @@ -18,6 +18,8 @@ White Label the Lexicon Mobile App to give your users the familiar look and feel Getting started is as easy as spinning up a new server for the Prose GraphQL API, and pointing it at your Discourse instance. No changes are required on your Discourse instance itself. +However, to enable features like [Push Notifications](./push-notifications) and [Email Deep Linking](./email-deep-linking/), you can install our [Discourse Plugin](./discourse-plugin.md). + However, to provide an [optimal experience](optimal) with features like Tagging and Topic Excerpts, you will need to make some light adjustments. This is covered in detail in [Deploying Prose](deployment). diff --git a/documentation/docs/troubleshooting-build.md b/documentation/docs/troubleshooting-build.md new file mode 100644 index 00000000..68d75dad --- /dev/null +++ b/documentation/docs/troubleshooting-build.md @@ -0,0 +1,128 @@ +--- +title: Troubleshooting when trying out the app +--- + + + + + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## Troubleshooting Connection and Configuration Issues with URL + +
+ please connect to network error +
+ +If you are encountering issues related to the URL, resulting in an error message saying "please connect to network" as shown in the screenshot, it is likely due to incorrect settings. Specifically, if you are attempting to test builds locally on your mobile device and the channel field is not properly configured, the app may continuously fallback to the localDevelopment channel, even if you have set it to something else like "preview." + +Here some steps and notes to help resolve this: + +- Open the `frontend/Config.ts` file in your project. +- Locate the `config` object within the file. +- In the `localDevelopment` section of the `config` object, you can add the Prose URL specific to the channel you are trying to test. This section is used for local development and as a fallback configuration for unknown build channels in EAS Build. Here's an example: + + ```ts + const config: Config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, + }; + ``` + +- The example above shows that the config consists of two main sections: localDevelopment, which specifies the URL during localDevelopment, and buildChannels, which includes configurations for different channels such as preview and production. For local development, it will hit the Prose API with the URL `http://localhost:8929`. If the buildChannel is unknown or not found, it will always default to localDevelopment. +- Update the `proseUrl` value within the desired build channel, such as `preview` or `production`, with the valid and reachable URL of your Prose server. +- Once you have made the necessary changes, save the `frontend/Config.ts` file. + +Now, when you run eas build for a specific build channel, such as `eas build --profile=production`, it will utilize the Prose URL specified in the production configuration. + +:::note +It is important to include the URL in the `frontend/app.json` file, which expo-updates will use to fetch update manifests. Failing to set the URL in the `frontend/app.json` file will result in the expo-update constant always returning undefined for the channel, causing the app to consistently utilize the localDevelopment URL after building. You can specify this URL in the expo and updates sections of the app.json file. For more detailed information on how to configure this, please refer to the [expo documentation](https://docs.expo.dev/versions/latest/config/app/#url) for more detail on this. + +```json +"expo": { + "updates": { + ..., + "url": "https://u.expo.dev/" + } +} +``` + +This configuration is essential for seamless integration with Config.ts in your project. +::: + +In certain cases, you may encounter an issue related to Prose API URLs when the channel name specified in the `frontend/eas.json` file does not match the corresponding key name defined in the `config` variable in `frontend/Config.ts`. This discrepancy can lead to problems because the channel name from `eas.json` is used to determine the URL that will be utilized. If the names do not match, the default `localDevelopment` URL will be used instead. + +To ensure smooth functioning, it is important to use the same channel name in both the `frontend/eas.json` file and the `frontend/Config.ts` file. This will ensure proper mapping of the channel name to the corresponding URL. + +Here is an example to illustrate this: + +```json +// frontend/eas.json + +"build": { + "staging": { + "android": { + "buildType": "apk" + }, + "channel": "staging" + } +} +``` + +```ts +// frontend/Config.ts; + +const config: Config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + inferDevelopmentHost: true, + }, + + buildChannels: { + preview: { + proseUrl: '', + }, + production: { + proseUrl: '', + }, + staging: { + proseUrl: '', + }, + }, +}; +``` + +## The app closes abruptly after the splash screen + +If you encounter a situation where your app closes abruptly after the splash screen, it is likely that there are missing configurations in your `app.json` file. One common cause is the absence of a scheme definition in `app.json`, which is essential during the app build process. + +To resolve this issue, follow these steps: + +1. Open your project's `frontend/app.json` file. +2. Look for the `"expo"` section. +3. If a scheme is not present add this part in `"expo"` section + +```json +"expo":{ + "name": "", + "slug": "", + "scheme": "", + "version": "1.0.0" +} +``` + +Replace `""` with the desired scheme name for your app. + +4. Save the changes to the `app.json` file. +5. Rebuild your app and test it again. + +By ensuring that the scheme is correctly defined in `app.json`, you should be able to resolve the issue of the app closing after the splash screen. diff --git a/documentation/docs/tutorial/building.md b/documentation/docs/tutorial/building.md new file mode 100644 index 00000000..3e261343 --- /dev/null +++ b/documentation/docs/tutorial/building.md @@ -0,0 +1,152 @@ +--- +title: Build your App +--- + +## EAS Build + +EAS Build is the upgraded version of `expo build`. This service helps to build app binaries for your Expo and React Native projects. Read more about it in the Expo documentation [here](https://docs.expo.dev/build/introduction/). + +### Configuration + +Let's get started by configuring EAS build. Check [here](https://docs.expo.dev/build-reference/build-configuration/) to see the complete guide from Expo. + +#### Build Setup + +Run this command in `/frontend` directory: + +```bash +eas build:configure +``` + +When running that command, the EAS CLI will typically do the following: + +1. It will prompt you for the EAS project ID, either to use an existing ID if you have one, or create a new one. Then it will automatically add the `expo.extra.eas.projectId` field in `app.json`. +2. It will create a new `eas.json` file if one doesn’t already exist. However, we have that set up for you, so you don't need to worry about creating one. 🎉 +3. It will prompt you to specify `android.package` and `ios.bundleIdentifier` if those values are not already provided in `app.json`. Note that those two values don't have to be the identical. + +You can see that the values in `app.json` are updated after running the command. + +#### Configuration Values + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](../deployment.md) to deploy Prose if you haven't already. + +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +Next, open `Config.ts` and overwrite the placeholder values with the Prose URL you want to use for the build version. You can either set the same values or a different one for each channel. You don't need to adjust the values in `localDevelopment` since that is only used in development, and not when building the app. + +```ts +const config = { + // ... + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; +``` + +### Run a Build + +#### Build for Both Platforms + +To build on both platforms, you can use either of the commands below: + +```bash +eas build --platform all +``` + +```bash +eas build -p all +``` + +#### iOS only + +```bash +eas build --platform ios +``` + +#### Android only + +```bash +eas build --platform android +``` + +#### Run a build with a specific profile + +```bash +eas build --platform all –-profile +``` + +```bash +eas build -p all –e +``` + +:::note +Without --profile, the EAS CLI will default to the `production` profile. +::: + +### Build Profiles + +Build profiles serve as a way of grouping configuration values for different scenarios when building the mobile app. + +You can find more details [here](https://docs.expo.dev/build/eas-json/). + +The `eas.json` file can contain multiple build profiles. However, it typically has 3 profiles: **preview**, **development**, and **production**. + +#### 1. Preview + +Purpose: to internally test the app in production-like circumstances. + +It is recommended to try building with the preview profile **_first_** before building your app with the production profile. That way, you can ensure the app runs as expected before it’s ready to be published. + +The build type for Android will be an **APK** file, whereas the iOS build will output a format that can be installed on the simulator. + +This is because the `ios.simulator` option was specified in `eas.json`: + +```json + "ios": { + "simulator": true + }, +``` + +If you want to run the preview build on a real device, you'll need have an Apple account with Apple Developer Enterprise Program membership, then add the `ios.enterpriseProvisioning` value in `eas.json`: + +```json + "ios": { + "enterpriseProvisioning": "universal" + } +``` + +For the `preview` build profile, we have already set the distribution mode to [internal](https://docs.expo.dev/build/internal-distribution/). This ensures that EAS build provides shareable URLs for builds, with instructions on how to get them running. + +This approach then allows us to test the app without submitting to the App Store or Play Store. + +#### 2. Development + +Purpose: to make debugging easier. Expo will automatically include developer tools in the build. As you may have figured, this build should never be published to either of the app stores. + +Development builds depend on [expo-dev-client](https://docs.expo.dev/development/introduction/), so Expo will prompt us to install the library if needed. + +Similar to preview builds, you can add the iOS options mentioned above to run them on a simulator or real device. + +#### 3. Production + +Purpose: for submission to the App Store and Play Store—as a public release, or as part of testing in each respective ecosystem. + +In order to use builds like this, they must be installed through the respective app stores. + +After running builds with this profile, you'll see that the iOS and Android versions have automatically been incremented. As you might expect, this is because `autoIncrement` has been set to `true`. + +It is worth noting, however, that this behavior only applies to TestFlight and Internal Testing, so you'll need to be sure to also manually increment the `expo.version` in `app.json` for public release. Expo provides further [documentation](https://docs.expo.dev/build-reference/app-versions/) on this topic. + +## The App is Built + +Great work! You can now share the installation link with your peers so they can try out the app. + +In the next section, you'll learn how to [publish](publishing) your app to the App Store and Play Store! 🚀 diff --git a/documentation/docs/tutorial/install-prose.md b/documentation/docs/tutorial/install-prose.md index 47b8d69e..d6ecec67 100644 --- a/documentation/docs/tutorial/install-prose.md +++ b/documentation/docs/tutorial/install-prose.md @@ -18,7 +18,7 @@ Otherwise, it would be unnecessary extra work to get a remote Prose server commu However, if you've setup your Discourse instance in the cloud, it is up to you if you want to run your Prose server locally or in the cloud as well. -If you'd like to install it in the cloud, you'll want to setup an additional server - similar to how you would set one up for Discourse. If you're not yet comfortable with this, feel free to jump back to the page, [Setting up a Cloud Server (Optional)](setup-cloud-server). +If you'd like to install it in the cloud, you'll want to setup an additional server - similar to how you would set one up for Discourse. If you're not yet comfortable with this, feel free to jump back to the page, [Setup a Cloud Server (Optional)](setup-cloud-server). Bearing all of that in mind, once you have identified where you'd like to host Prose, you should also consider how you'd like to install it onto that machine. @@ -241,7 +241,7 @@ $ pm2 delete # To delete a process Now that you've successfully launched Prose, you can actually interact with it in your web browser. -Because of the libraries that we leveraged in building Prose, it automatically comes with a [GraphQL Playground](https://github.com/graphql/graphql-playground). +Because of the libraries that we leveraged in building Prose, it automatically comes with [GraphiQL](https://www.graphql-yoga.com/docs/features/graphiql). This is an in-browser GraphQL IDE that makes it easy to explore the documentation and the schema of the GraphQL API. @@ -251,7 +251,7 @@ For example, if you launched Prose from your local machine on port 5000, you'd n Similarly, if you set it up in the cloud, and all you have is an IP address with Prose listening on port 80, you would navigate to something like [http://174.31.92.1](http://174.31.92.1). -Once the GraphQL Playground loads, you can test out some example queries and mutations, including logging into Discourse through Prose. +Once the [GraphiQL](https://www.graphql-yoga.com/docs/features/graphiql) interface loads, you can test out some example queries and mutations, including logging into Discourse through Prose. ### Login diff --git a/documentation/docs/tutorial/intro.md b/documentation/docs/tutorial/intro.md index 54e0d630..0098344d 100644 --- a/documentation/docs/tutorial/intro.md +++ b/documentation/docs/tutorial/intro.md @@ -3,6 +3,10 @@ title: Overview slug: /tutorial --- +:::info +This tutorial **does not** cover the process of actually launching the app, as well as certain details about deploying to production. For support with those tasks, please refer to the documentation. +::: + ## Welcome to the Lexicon Tutorial We're really excited to help you dig in with the Lexicon Stack and learn how to deploy it in a way that benefits you and your users. @@ -40,6 +44,4 @@ You will also have an understanding of: - How to configure and run the Lexicon Mobile app on your device or in a simulator - The next steps needed to make full use of Lexicon -Please note that this tutorial will not cover the process of actually launching the app, as well as certain details about deploying to production. For support with those tasks, please refer to the documentation. - Let's get started! diff --git a/documentation/docs/tutorial/publishing.md b/documentation/docs/tutorial/publishing.md new file mode 100644 index 00000000..66005bdd --- /dev/null +++ b/documentation/docs/tutorial/publishing.md @@ -0,0 +1,97 @@ +--- +title: Publish your App +--- + +## EAS Submit + +EAS Submit is a service for uploading and submitting your application binaries to App Store and/or Play Store. +Check [here](https://docs.expo.dev/submit/introduction/) to learn more about EAS Submit. + +### Prerequisites: + +- Registered app in App Store Connect, see the guide [here](../app-store#register-a-new-bundle-id). +- Registered app in Play Store, see the guide [here](../play-store). + +### Configuration + +Before submitting, you are required to specify the credentials to publish your app. + +#### iOS + +For iOS, fill in your account information for `appleId`, `ascAppId`, and `appleTeamId`: + +```json + "base": { + "ios": { + "appleId": "", + "ascAppId": "", + "appleTeamId": "" + }, + ... + }, +``` + +- **appleId**: your apple ID (e.g., `john@gmail.com`). +- **ascAppId**: your App Store Connect app ID. Find your ascAppID by following [this guide](https://github.com/expo/fyi/blob/main/asc-app-id.md) (e.g., `1234567890`). +- **appleTeamId**: You can check your apple team ID [here](https://developer.apple.com/account/) (e.g., `12LE34XI45`). + +#### Android + +For Android, you will need to add a `.json` key file to authenticate with the Google Play Store. Please follow [this guide](https://github.com/expo/fyi/blob/main/creating-google-service-account.md) to generate one. Then, copy the JSON file to your `lexicon/frontend` directory, and rename the file as `playstore_secret.json`. + +The JSON file looks like this: + +```json +{ + "type": "service_account", + "project_id": "", + "private_key_id": "", + "private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n", + "client_email": "", + "client_id": "", + "auth_uri": "", + "token_uri": "", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/lexicon%40api.iam.gserviceaccount.com" +} +``` + +Now that the configuration is done, you can start submitting your app. + +### Submitting + +Use this command to submit the build: + +```bash +eas submit --platform ios --profile +``` + +Then you will see the EAS CLI prompt asking which app you would like to submit. + +There are 4 possible options: + +- Selecting a build from EAS +- Providing the URL of an app archive +- Providing the local path to an app binary file +- Providing the build ID of an existing build on EAS + +If you have built your app using EAS Build or have been following the tutorial from [Build your App](building), then please choose the first option, and select the version you want. + +### Submit Profiles + +By default, `eas.json` has been configured with two submit profiles, which are **staging** and **production**. + +The configuration is mostly the same, the only difference lies in the Android track options. + +- Staging infers the track as `internal`. This means submitting with the staging profile will submit the build for internal testing in the Play Store. +- Production infers the track as `production`, which will submit the build for Public Release in the Play Store. + +With iOS, on the other hand, both profiles will be submitted to TestFlight before you can release them publicly. + +You can reference the Expo documentation to learn more about [Android-specific](https://docs.expo.dev/submit/eas-json/#android-specific-options) and [iOS-specific](https://docs.expo.dev/submit/eas-json/#ios-specific-options) options. + +## Congratulations! + +Your app is now available for users to download from both the Play Store and the App Store! 🥳 + +To learn more about how to update your published app in the case of a bug, as well as OTA updates, check out the [next and final section](updating) of the tutorial. diff --git a/documentation/docs/tutorial/setup-cloud-server.md b/documentation/docs/tutorial/setup-cloud-server.md index 9b2aff33..b69659a4 100644 --- a/documentation/docs/tutorial/setup-cloud-server.md +++ b/documentation/docs/tutorial/setup-cloud-server.md @@ -1,5 +1,5 @@ --- -title: Setting up a Cloud Server (Optional) +title: Setup a Cloud Server (Optional) --- import useBaseUrl from '@docusaurus/useBaseUrl'; diff --git a/documentation/docs/tutorial/setup-mobile.md b/documentation/docs/tutorial/setup-mobile.md index ff1b704a..62ab943a 100644 --- a/documentation/docs/tutorial/setup-mobile.md +++ b/documentation/docs/tutorial/setup-mobile.md @@ -4,91 +4,108 @@ title: Configure & Launch the Mobile App import useBaseUrl from '@docusaurus/useBaseUrl'; -After following the **[Install the Prose GraphQL API](install-prose)** section, your GraphQL API should now be connected to your Discourse site. +After following the **[Setup the Prose GraphQL API](install-prose)** section, your GraphQL API should now be connected to your Discourse site. Next, we'll guide you through the process of connecting the Lexicon Mobile App to your Discourse site via Prose. ### Mobile App Configuration +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + Before launching your local version of the Lexicon Mobile App, you'll need to configure it with at least one piece of information. -The Lexicon Mobile app relies exclusively on a running instance of the Prose GraphQL API in order to retrieve data. +The Lexicon Mobile app relies exclusively on a running instance of the Prose GraphQL API in order to retrieve data from your Discourse instance. -Therefore, you'll need to instruct it on where your Prose server is running. +Therefore, you'll need to instruct it on how to locate your running Prose server. -In development, it is common to have it running locally. However, if you have already deployed Prose somewhere, you are free to use that. +In development, it is common to have it running locally. However, if you have already deployed Prose +somewhere, feel free to use that. -The environment variable which instructs the Mobile App on how to find your Prose server is `MOBILE_PROSE_HOST`. +#### Configuring `proseUrl` via `config` -Additionally, `MOBILE_PROSE_PORT` is present to define a non-standard port number, such as `8080`. +:::caution -As is typical with environment variables, there is more than one way to provide this to the process you want to run. +##### `proseUrl` requirements -#### Pass the value when launching Expo +It is worth noting that `proseUrl` **must** start with either `http://` or `https://`. -:::info -This only works if you invoke `expo` directly from within `frontend/`. If you use a command like `npm run start`, the environment variable will not be forwarded to Expo. +If it does not, the Mobile App will throw an error when launching. ::: -You can pass an environment variable to the `expo start` command. - -```bash -MOBILE_PROSE_HOST=https://prose.myserver.com expo start +`Config.ts` contains the `config` object, which allows you to specify the Prose URL for each scenario encountered when developing and building the Mobile App. + +The specific configuration value which enables this is `proseUrl`, and it is contained within each scenario expressed by the `config` object. + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com:8080/subpath', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; ``` -#### Define a `.env` File (recommended) +As mentioned earlier—above, the `config` object allows us to express configuration values for multiple scenarios, which are: -The preferred way to specify `MOBILE_PROSE_HOST` is to create a `.env` file in the `frontend/` directory. +- `localDevelopment`: when developing against the app locally. This configuration is also used as a fallback for an unknown build channel. +- `buildChannels`: used to define configuration by build channel when building the app with the EAS CLI. -```bash -MOBILE_PROSE_HOST=http://your.prose.site +`buildChannels` makes use of Expo's build channels (typically `preview` and `production`) as its keys. -# The Port Number of your Prose server, if needed -MOBILE_PROSE_PORT=8999 -``` - -To do this, from the root of the project, make a copy of `frontend/.env.example`, and name it `frontend/.env`: +Each key within `buildChannels` maps to a specific Prose URL, which will be used for the build version based on which channel you build for. -```bash -cp frontend/.env.example frontend/.env -``` +From the example above, when we create a `preview` build, the app will be built and configured to contact a Prose server located at `https://preview.myserver.com:8080/subpath`. -Bear in mind that if you are not running on port 80 or 443, you also need to specify the **port number** via `MOBILE_PROSE_PORT`. +The example above expresses a setup in which each build has its own deployed Prose server. However, it is also common to use one server for all scenarios, including development. -For example, if you've started a Prose server **locally** on port `8999`, your `.env` file would contain. - -```bash -MOBILE_PROSE_HOST=http://localhost -MOBILE_PROSE_PORT=8999 +```ts +const config = { + localDevelopment: { + proseUrl: 'https://myserver.com/api/prose', + }, + buildChannels: { + preview: { + proseUrl: 'https://myserver.com/api/prose', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; ``` -The Lexicon Mobile app will throw an error upon starting if any of the following is true: +##### Port Number -- `MOBILE_PROSE_HOST` is not set -- `MOBILE_PROSE_HOST` does not start with `http://` or `https://` +Bear in mind that if your Prose server is not running on port 80 or 443, you also need to specify the **port number** via `proseUrl`. + +For example, if you've started a Prose server **locally** on port `8929` and try to run it using `expo start`, your `Config.ts` file would contain `http://myserver.com:8929/api/prose` under `localDevelopment.proseUrl`. ### Launch the Mobile App Once you have configured everything, you'll want to launch the Mobile App to test that it is speaking to the right Prose server. -If you have declared a `frontend/.env` file, you can simply run +To do this, you can simply run the following from the project root: ```bash npm run --prefix frontend start ``` -If you want to pass in values directly, you should run: - -```bash -cd frontend -MOBILE_PROSE_HOST=https://prose.yoursite.com expo start -``` - The Expo development server should launch, and you can follow the instructions to run the app in a simulator or on your actual device. -If the app throws a relevant error upon loading, you should double-check the environment variables you specified, according to the message you've received. +#### Troubleshooting + +If the app throws an error upon loading, you should double-check the configuration values you specified, according to the message you've received. -If the app loads, but you're unable to actually connect, you should check the following: +If the app loads, but you're unable to actually connect, you should verify the following: - Your Prose Server is up and running at the location you provided to the Lexicon Mobile App - Your Prose Server is configured to point at an accessible Discourse instance @@ -100,4 +117,4 @@ At this point, you've already accomplished a lot. The Discourse server you started off with is now accessible in a new way from a sleek native mobile app, and you're free to customize it to your heart's content. -As the last part of the tutorial, we'll briefly get into that very topic: customizing the Mobile App to white label it for your brand. +In the next part of the tutorial, we'll briefly get into that very topic: customizing the Mobile App to [white label](white-label) it for your brand. diff --git a/documentation/docs/tutorial/setup.md b/documentation/docs/tutorial/setup.md index aef9b090..20505940 100644 --- a/documentation/docs/tutorial/setup.md +++ b/documentation/docs/tutorial/setup.md @@ -14,7 +14,9 @@ If you are unsure of how to install NodeJS, you can follow the instructions on t It is recommended that you perform this tutorial using the latest version of Node that is compatible with the the project's version of Expo. -If your environment doesn't support this, we would recommend making use of [`nvm`](https://github.com/nvm-sh/nvm) to quickly switch between Node versions. +You can always confirm this by viewing the dependencies in [frontend/package.json](https://github.com/lexiconhq/lexicon/blob/master/frontend/package.json). + +If your setup doesn't allow you to easily change your current Node version, we would recommend making use of [`nvm`](https://github.com/nvm-sh/nvm) to quickly switch between Node versions. ### Install yarn, if you prefer @@ -24,7 +26,7 @@ For the purposes of this tutorial, we will demonstrate all commands using `npm`. ### Clone the Lexicon Repository -In a preferred location on your development machine, clone the Lexicon repository and `cd` into it. +In a desirable location on your development machine, clone the Lexicon repository and `cd` into it. ```sh git clone git@github.com:lexiconhq/lexicon.git @@ -39,7 +41,7 @@ Next, install Lexicon's dependencies: npm install ``` -This will install dependencies for both the mobile app and the backend GraphQL API, Prose. +This will install dependencies for both the Mobile App and the backend GraphQL API, Prose. ### Install the Expo CLI @@ -47,7 +49,7 @@ This will install dependencies for both the mobile app and the backend GraphQL A We will later use the Expo CLI to launch the Mobile App - either on your device or in a simulator. -You can install Expo with the following command: +You can install the Expo CLI with the following command: ```sh npm install --global expo-cli @@ -59,14 +61,35 @@ Then, verify that Expo is available in your `PATH` with the following: ```sh $ expo --version -3.28.0 + +``` + +### Install the EAS CLI + +[Expo Application Services (EAS)](https://expo.dev/eas/) is an integrated set of cloud services for Expo and React Native apps. + +We will use the EAS CLI to build and publish the Mobile App. + +You can install the EAS CLI with the following command: + +```sh +npm install --global eas-cli +``` + +Further information is available in the [Expo docs](https://docs.expo.dev/eas/). + +Then, verify that EAS is available in your `PATH` with the following: + +```sh +$ eas --version +eas-cli/ ``` ### Ready to Go! That's all we need for this step. -Next, there's an optional guide to help you if you're not too familiar with setting up a server on a cloud provider. +Next, there is an optional guide to help you if you're not too familiar with setting up a server on a cloud provider. You're free to skip this if you're already adept at this process. diff --git a/documentation/docs/tutorial/updating.md b/documentation/docs/tutorial/updating.md new file mode 100644 index 00000000..46fcfdd1 --- /dev/null +++ b/documentation/docs/tutorial/updating.md @@ -0,0 +1,68 @@ +--- +title: Update your App +--- + +## EAS Update + +EAS Update is the successor to `expo publish`. This service helps to update projects using the `expo-updates` library. + +In particular, it enables you to push quick fixes to your users in between full-fledged app store submissions. + +With EAS Update, there is no need to recompile the app with its non-native parts, such as TypeScript code, styling, or image assets. [Click here](https://docs.expo.dev/eas-update/introduction/) to learn more about EAS Update. +:::note +You are required to build the app with [EAS Build](building) before using the EAS Update. +::: + +### Configuration + +Let's get started by configuring EAS update. Feel free to check out the [complete guide](https://docs.expo.dev/build-reference/build-configuration/) from Expo for further details. + +```bash +eas update:configure +``` + +Running this command will add `expo.updates.url` and `runtimeVersion.policy` in `app.json`. + +:::caution + +As mentioned in the [Expo documentation](https://docs.expo.dev/build/updates/#previewing-updates-in-development-builds), you can no longer launch your app in Expo Go (using `expo start`) after adding the `runtimeVersion` field in `app.json`. It is recommended to use `expo-dev-client` instead to create a development build. + +```bash +eas -p all -e development +``` + +or if you still wish to use Expo Go, please remove `runtimeVersion` field from `app.json` before running `expo start`. +::: + +### Updating + +After making the necessary changes, you can push updates using this command: + +```bash +eas update –-branch –-message “” +``` + +The branch name here is the same as the build profile name when building the app. +For example, if you had previously built the app with this command: + +```bash +eas build –p all –e preview +``` + +Then you can later update it using: + +```bash +eas update –-branch preview –-message “Fixing typos” +``` + +Once the update is complete, force close and reopen the installed app twice to view the update. + +## All Done! 🙌 + +That's it for the tutorial. Great work. + +We hope that this has served as an informative guide to help familiarize you with Lexicon and how you can make use of it. + +If you haven't already, check out the [Lexicon Documentation](../) to get a deeper understanding of the project and how it all works. + +If you have any questions, comments, feedback, or want to contribute, please reach out to us on Github! diff --git a/documentation/docs/tutorial/white-label.md b/documentation/docs/tutorial/white-label.md index 625bac97..f0192667 100644 --- a/documentation/docs/tutorial/white-label.md +++ b/documentation/docs/tutorial/white-label.md @@ -14,7 +14,11 @@ Both of these assets often contain your logo in one form or another. For example ### Customizing the Splash Screen -The assets used for the Splash Screen in Lexicon is located at `frontend/assets/images/splash.png` and `frontend/assets/images/splashDark.png`. +:::info +Expo does not currently support dark mode for splash screens. +::: + +The assets used for the splash screen in the Mobile App are located at `frontend/assets/images/splash.png` and `frontend/assets/images/splashDark.png`. Above, we mention splash screen assets for both Dark Mode and Light Mode. @@ -61,22 +65,18 @@ The `backgroundColor` field enables you to specify the color of the background b Customizing the App Icon in Lexicon is nearly the same process as customizing the Splash Screen. -The asset for the App Icon is located at `frontend/assets/icon.png`. To customize it, simply overwrite that file with your own `icon.png`. +The image asset for the Mobile App's icon is located at `frontend/assets/icon.png`. To customize it, simply overwrite that file with your own `icon.png`. ## Further Customization -We get into much more detail about how to White Label your app in the [White Labeling](../white-labeling) section of the documentation. +We get into more detail about how to white label your app in the [White Labeling](../white-labeling) section of the documentation. In particular, this includes customizing and extending the theme's color palette, icons, and even fonts. -Should wish to customize anything not covered in that section, get in touch with us, and we'll see how we can help you make it a reality. - -## All Done! - -That's it for the tutorial. Great work. +Should you wish to customize anything not covered in that section, get in touch with us, and we'll see how we can help you make it a reality. -We hope that this has served as an informative guide to help familiarize you with Lexicon and how you can make use of it. +## Awesome Work -If you haven't already, check out the [Lexicon Documentation](../) to get a deeper understanding of the project and how it all works. +Your app looks cool now 😎. However, it's only accessible to you. -If you have any questions, comments, feedback, or want to contribute, please reach out to us on Github! +Next, we'll cover how you can actually [build your app](building), so you can share it with the world. diff --git a/documentation/docusaurus.config.js b/documentation/docusaurus.config.js index cf9f5cfe..937e4856 100644 --- a/documentation/docusaurus.config.js +++ b/documentation/docusaurus.config.js @@ -16,10 +16,10 @@ module.exports = { }, items: [ { - to: '/', - activeBasePath: 'docs', + type: 'doc', label: 'Documentation', position: 'left', + docId: 'intro', }, { type: 'doc', @@ -32,6 +32,9 @@ module.exports = { label: 'GitHub', position: 'right', }, + { + type: 'docsVersionDropdown', + }, ], }, footer: { @@ -58,8 +61,20 @@ module.exports = { { docs: { sidebarPath: require.resolve('./sidebars.js'), - editUrl: 'https://github.com/lexiconhq/lexicon/blob/master/documentation/', + editUrl: + 'https://github.com/lexiconhq/lexicon/blob/master/documentation/', routeBasePath: '/', + onlyIncludeVersions: ['1.0.0', '2.0.0-beta'], + versions: { + '2.0.0-beta': { + path: 'version-2.0.0-beta', + banner: 'none', + }, + '1.0.0': { + path: 'version-1.0.0', + banner: 'none', + }, + }, }, theme: { customCss: require.resolve('./src/css/custom.css'), diff --git a/documentation/sidebars.js b/documentation/sidebars.js index c87aaebb..e345acf2 100644 --- a/documentation/sidebars.js +++ b/documentation/sidebars.js @@ -15,7 +15,13 @@ module.exports = { 'White Labeling': ['white-labeling', 'assets', 'theming'], 'Deploying Prose': ['deployment', 'env-prose', 'dedicated'], 'Configuring Discourse': ['optimal'], - 'Publishing your App': ['app-store', 'play-store', 'lexicon-updates'], + 'Publishing your App': [ + 'app-store', + 'play-store', + 'lexicon-updates', + 'troubleshooting-build', + ], + Plugin: ['push-notifications/introduction'], }, tutorial: { Tutorial: [ @@ -26,6 +32,29 @@ module.exports = { 'tutorial/install-prose', 'tutorial/setup-mobile', 'tutorial/white-label', + 'tutorial/building', + 'tutorial/publishing', + 'tutorial/updating', ], }, + plugin: [ + { + type: 'doc', + id: 'push-notifications/introduction', // document ID + label: 'Introduction', // sidebar label + }, + { + type: 'doc', + id: 'push-notifications/plugin-interaction', // document ID + label: 'How Push Notifications work with Lexicon', // sidebar label + }, + { + type: 'category', + label: 'Setup', + items: [ + 'push-notifications/setup/enable-push-notifications', + 'push-notifications/setup/verify-push-notifications', + ], + }, + ], }; diff --git a/documentation/src/pages/index.js b/documentation/src/pages/index.js new file mode 100644 index 00000000..19a6bb8d --- /dev/null +++ b/documentation/src/pages/index.js @@ -0,0 +1,6 @@ +import React from 'react'; +import { Redirect } from 'react-router-dom'; + +export default function Home() { + return ; +} diff --git a/documentation/static/img/guides/playStore/build-artifact.png b/documentation/static/img/guides/playStore/build-artifact.png new file mode 100644 index 0000000000000000000000000000000000000000..5d14e7d944dcf42296aa58c042e0f2fa362e7731 GIT binary patch literal 55559 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

J*t4VnX_GbB|G?v?m)+gV-SLW-# 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 K0CN9@|NjHyB}5GX diff --git a/documentation/static/img/lexicon-architecture.png b/documentation/static/img/lexicon-architecture.png index 96ab7b7f613b4b7c2e262da25f7f416afcf9353b..c57293ef457e0c9eb146d6206a00099408a77d44 100644 GIT binary patch literal 176898 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 z zRLU5(8^$r2OYswZWwzw)V_oC|Orf1R?CMv&p-EEH= z+ean{J`?hiMy}tl4+}ahoz2%cS9xRT9NoSTRK~gv+H&%%P7bQA@blfxLEcSz1H&}DmQ7S~=Dt_sPNRt5=>^6YEt(42+n8fIMn&IX^JjmgxSP{j^JCs;gsC2U6ipAIJf5Kkdk2f&mgB2BqB(e`EJ9grIm*~boS;>dY{SG(1wiK^kTod$gJXx_HR4t~n5CB2C z_5b}a-8m-CGCpaj$aU!}t9SRz1BrOq#Z(jV;Ued$6x9cfTrC@zkG7s|U4d9*nq9fK zcN?=e76;)=%Z*xIH56CWLatwHNS}LfmA*gsYHgib0Z=X85$<89j z^Hj^;Lfcde8-w#=7++@rLV_`~qGy!HvKxji&wG*+O?qG&OoAad-5x$@`We)<%PRqLP*d?F3Tva=Fe3&|V1J$1XR^E8(XDO-np0{-1{jv0iZ*5}Ll zdzBf13c7LNuP?uyV-AoSVnmzKzAo;6z0N)o%9nMV5wx6Q9SqS}vv=9I(%Ooh zlSA-7gIyAP_EHc^iMHFtJn82%_@G2zfVtNj%{~vSSv%fdwq2!WP)pHzmt;bN^#v;(&k02?*u$Zc3UnghechR{Dgo1bct=pKEv~ZV;{{Z$hc5y3oUs}&)AKD0sX8Ah;(Zy3|FdEw%lK~@$d5t-&)>O zsb4HVD0Ld0G`+pm&TZRzoHfIok)xSCe2J#AaUT!%M#F4{P1AQu+*0T?`YTPYqKGwu z`0SnGMHe5O6msv|%I*^6v*gc`fLgwC9yC4U-GPkY-zaO!B0~!yJ&)Z()}?mJMj6H= zunhqSMR)~pNh3H+Yb(lpY(?$q*s7kD#Z~%pSsnI57g9&rKZNy$k*UmO&mkUen>u_v zH=OY1V`*{B>C8Q^gDf=4`rRYyLdUJk8N;)a*p4zCWFOWrMiZ_ku1yaifUDN#4G+fB8yw!`gt!&xP=6mkuH>cCWRfR+KExiz^M!18!!xL>x9g_D0o zZ%)z{k+h`JwD~O)uU+Mk$_@D0A=e~7+1QHBxL;b)RR^{J~-y8iT>0133$X;~jOmSoL73BVEH=(0un@eEuIz__A zrU|H*S*CbRJ)inhmtXb4g^>r_?~Z5`K1=tT?;jFnv+ON^l*qOoXwWs&Qx(uLe^VRo z{y8F$GUH=o)uo9zoZ;i>*T?P*t%lC-(f|*9oYTPa`*_Vfq{o2u5`dlkIP7)w4}7tH zzM5T7hS2YCpSHiXZ7m;CVdOQB~HFy%PM>JUDzFJ-xUaB4S}AY z1v}wqidV>|5GQistyFe+!@&#QK$h{|T~Di3>rFa!@!YXY|A>K3Ofqlf9^c{SgdLu% z^_0%@-#BoLNM)Xis_dcXDdoF~xcp=6z44kL?-7soxZQIV^p0y$sc*bKcgsisLPUg_ zCqpXvCWD<~1rDs<@rKTCtLCD+OWf_r9-4Q5Tthd|_n_p;JrFp-zPwc92{pKUE6Vlp zV7NX!^xDvOGXLHW?C$UW%chc-%T!rckKBFt-8CuP^)_X20)~^jWm|6xTlyx`9fLo+I}Ar6=2I@qj)oOT{$e%e<-)gRiO(E@Td@Kkd@t=?{hXFErZK> zTOHjUNl&hW{s}2ii6|GPeT4z9WocSAdXn@f;iob-qz2J!(SJrQ7ZRyUHOXZ+t0>I| zMfc%G`)qa2FCoe*H;}nE-Y4w)Vd-z;k#$E#Q_n4RcKuR)N&SWkAKJK(x~)>LP%>Y< z<*k6Pcw`(HVu8)QX$>&YE#$K;^QmX(R)d)>!$~nmEOOCo@w6iGt+-~lTEOy zh)o2`=%W^&tN`J=Yc%`=WL2PP{RnBd+WPT`&WL{}cCMwfwfTP!1`v)@Cl-7b#rr<~ z*!e{7n@1i#S{{{ir#W;W&eu5Teo)+AukNfst_=Jwyb6wqFD`%cBDcuRBRw?!+P7A1 zMBDYEMH8b{M(waiu}2K5?Nnk??5apkJzp(OpGl zC17Rnb=dqFhE4T}+V)_-oSqPgt~uqRw5A9AA$)Bq(o0RmJ!#t>f-QRt}uri zXbv8QHn0eav;s+_ZiGYOO_STXrM@=Yu#ATfMGR7?q0>8|v^EkjEn~0@C)3(8L>X;U zy)#xeweL5%gUt2+=xIbO7^6U^`~t!~hEHP41$OFNIL6O1SZXxUYLA8=y}1SYV$ehQ zf7pA^s3zLzUlajB1VKOqq$*vih;#@jN^gQvqzNJ*y>~)WdXe5idXwH;Ku{E5U%}*~ain*acWP9lBw1hq;%Kg`I z!_pnce%*so!)5E?RF`4-?M1C9ajo`hRABZlanbxFP{M;Fr4kN?fd+ME>&f!{i&wE9 zYG5)0;#=o2;saxCuW#4@1~%TBbQt3%s@9Wwzv@;*I!3RW@n1LsNoy(EE(2S$!|Ai^12zNW-9&Gg?`v z+(7)t=EaDK48CNtAFsH0@n+n#vDq}Mk=y6;s0UxzD{VHY!icEi!Oj~F3%=gB<99RS zVtZZPFMjw7-}6Y0*Y$8bU}2F}-+D(N<#9YLvt$|`&2>Gv z>;e@oZiqb~$Wyk{oQF+Fp)PJ!zoXyYNQKn93`90|X>&7ryco2ahiz*tnAdOnk`c^V z7CL5?MGXZ)ie6|c%Se|#{pq+}8nni6mqo6#Z36B(RyIa-FrK1=Q+zty5{f@itip-F(>#|!5yBdNS zGW$+MOQ=aD=<2;UGl_NE(p+da`0*<)38jil9?H%4< z2bdsTgsR(?}UWfNf%!WK0p+@SN8qPG1M`*cqV?{JZM$u_@rVf z1(U6Y}_!V$@Y^T>nfhGwRTncqlGU(>=c z-gFvAewv-rGxPHaiF2zqYK*^e`-aOhPyMKWp3EYT?xA>sMhqV_?#T2<4go>cp0vpg3C0{=|(#Je5U$CFasYVltVY`11Z`8i^`5D_g|ei}~A z3m}Ah8(!YuwrBf!4}BD-;e_>_TwJHK*$8^S*S(!Tlc1&E^&cP|v)xP4KCe5uAFO|k zG8~9G)w~8^!CpCsHGk(udgEz}FolZ<&sGW=UP}49MG-%=uK~lUy`vBQq4u(fh_1LN zj`6q!oa;c5y!tPh4gtacoz3fe4Y9);wt0T@8vu*b*V9oGl}_#b3kV3ip#{u=2Ip2o z5B{A90q#a*+Mo8{-TuEN1nZ=!{t}jO-b3kW5F~$?p(TB|)AZqd69`a}XQ16wqxfb- zAa4oK^yXU%Fp$U%a^nfS`butxbgxR_YxOt7xXFF}Tf!ljnUOt&><(wVoA=NC8k7&L zmNl$hT(B-vh1&vX;yCe{1|1wdJ38O?0??C2fr_!}L3=LJM=M9$0Ak>NuICW?dYL&k zq$CvqIqLh^PW;2l{P_dLw)H$Gv<6}u-SZH+{oKZTGGe*TGdjk^+g_r39T|Z+08qaG zXqY!1Sg`CRN#1O7hSYB#2X z|2Tx|z*L1k*Gh!7PO7c{z3FpO{n&d(aVP~rTC$d^>BF)SZfPp@&nADR8D!pFHSbm1 zdNBKx({K>GUIhb7ng+%B1Ja+nc_^7U`KsG1AmBT)ccu*BfqF=|@#w?5CmfTt9dG@; zIJ<16x{Yj$k?-~6a{LRqfyf&NMUgU_+Q=j}@ z_-^mgCKk8Ak#OsfZ7t}2=hb|@dd6*&|};=My%$;M>a~aMF~c+wn=|!=dx$Z9}<7&?8zEfS&vtR zKXW$BL1m~|_^d0F{+hW@a}&VP_F?~yoK|!2DOPvNJ_x+K9y+=3%S)Z}hBe{OL0E&x z2@+8Ht(V$c@t>dnG1iv5{cGkgG8KN7Jd1b&=xOjn0B#&>py@gF}z^%%XO+B)m%nqzHJzYSQhy!f-T{TizNfZz26|?n%U>w zRxjhvjL0!HOioavGD@?(uE%50%yIUETkj} zF;-c$^p;H9?TfxS`~(2Z3ux+(?lp(3;{*@cPOyuw%#C(=7^+Kbvj_LKI73xjB+cJ2 z69lvDRGML~s)orR&Yc!t%txwVLI|upx?vAH=L{(@HF+@nC|-p*ue4U~kP7HiTXY{v zigZOpW{h@IQLYo!Yb66WZ&|!t>f4)LXLMW>*z6dP-VVC*y*N);*mi}{xYng3*Vv)^ z$V96<5=(OVn|-nXTiVjVbx`OpDO)DREp=gA*s;eeBeO z2N&mioLmDZYyC(l!Z-*0jhT%BafR*Y|3%3^9OQCa46=sqhyS~iGrPJCmLwPRsJice zRdYD?M+$!3M@;NZAAlJ&7s@kUh%q!Q&b962eDwH}8i9drQ)@cXsIS%gvSF_(sLv7{ z_n%NYm9x$UXskDbTpdpz0cmuVlmP&v<}Wv37`}F;F1%AL5#(`%*>j2;?QPm}BYdU< znA+gnhoQ3uunf}go_b}pj;GYFQ7M>uprB#iIPTmp5rz7-IUAplud!>NFe_}uWF#w$ zUT$n;y$8nM4#D|g!y@9Z-Z0uk`Mek~`thB1$n#I&8awxSJj`6W@TuFMSvIoYK=0#e z6~ps^H$s@j$)AC&Yn~6hTvq=aT=+9Xk*1G)eZL&IhBsRPx;ee<9zoxUa=!Yn0ur+OiPLg!JT-Q9HaH@8q@dl_b4n=b9^7YhQz*9n5Z zTIzqSza4^IT#moMbyIzyA|mMZi^0J~KU?U-d?E<~p-s>UHZyJ-iib%hxPnepYrx13 zZS5dUVf0z~tT1MV6ucK3h#jt}=B7ELy{5$&kUAXe^MaGK>HIT)L=>@a;4X$2xBNbn zI>Bdz$|g})tp9$kRn#szljZXYYs4}$`=)eyMN zk3$z5RBycLwKEtWge{M}x|oek@D7jE-IsIrVDoC)9uCQvXsJa; z4elv{d}>5Z61WCZY=Ib4(&wug%$IoS8HJEzr4|d4ZgWrhL_xNURU&%Ow1rtC;UMPR zDQiu#Qc@#&smmEAGErcc`N-w;#Gbp>MvnCk3?c9Oc0+W1PRSZ>mqt(Y8Y$blknpD0 z?`3ANr}uJZKO$SSv7z=Zm+jCliRRiGTgd8dwiMma?a6sk`$%#RPO1Uk>_pJ*g-ELL zwsG@6{y|tGA?XhJu2$n9ZXuMtRF+&zdo{`JkV8~mrL+50jeu$jNMO67I<^kExVyZbkMh~u^j}2l=(=IfHN)j{`QyG6NPk5VN6({L24%))Z7%JIz$t<$ zMayqTNQ2f$YvAs#_1SZ!C&=V9Mm;96uQu_dseL$Y6B$3qVDPvA%~Ni{+Qmbh{_WBr ztK7fV%G6`@DOcp8$0~o=dRT+>flR^>xu=QCaFVQNy%sRRa3n~*_c~wMCI|52IVdEG zKnQeWi=|08b%B{pA^FAO0BremxZknIFMf}1AtT|yj)zSul=s5>oj_Vb{%bKOZWbsm z;(+PX0zFHvqrC09iQT+&qX0di4xtT>W?HUwC!KnqqWap`7LEC;rs6tk{~8`%LQL`t zta4{N#fNmVjuN*-^X?88zIprv59>A5UqnQu& zak~j*y;o$n%dxH;MKyOqbh?EdVN-D|GtCgUce=Y7p|fxv9gGwE#R9EX7k7f0pG8l{ z*#f*J8x>EUIxNsTXI@ET;kQN|TNh=Wbp^Zyt26=6?N|AlfoVzAa2fifx!#7_aX;f_ zO_%ovs1_;kf)+1VKr;B)2dJQeB^8{io4J3tTi=K8qROuf%lY{Q2e41|1UN{_#J{Ty zDHhas>C&YP`zMv!F`fARP#DYMtuK3R`n3!Ep|PuP{nK!yUC~>)c3PWfQ^S_=ojb~^ z!?HtMG=y1Oy?m)r1Vt~Pv3fl(gi1iFQXN4_=$%}w%y9=-nB zOCkPE`gE-A2k31>-~Eby1Z2K05W3%bI%c>)sZT&)=xqJ5zKxVgVy(QZtP}kSo|Htz zdarA=ytWN=^)po+KFua+k}2~fsidr(jhG<#pjy*9*eby(K&1q91qyPq(?hx|FMjbj z8sG3-g1SXFE!}ecB{6z@1<6;o z4$Xe3dMg>J8(_FqNj#xr$MhTI7%i$6Mm67O&+Jpaa5OhHZ};5|;Lo{6(3@uPl~|-_ zgyrDER%TG{XR&{W?%FY8VYWxihLc7tRTh{fD@CH+>HS>8`?2DF`rJO-Jn3jG90VR> zcVUIG%|76Jn`g=Xe$j^6hj*qTn^jIM66v6H8$0@7iw0Wr)ysSX%WP@XsDaO^60JtM zzTHmJ==~H$`6Xw<^ZR*`Ox_U1*9`ji_ef(1F5#eM`6CmOo(1BWvP`C(HXF^>{pq$s zwt{?In61vEx1Jn9HElgPvrUid*Lq!*sfbP{TrV%k=L2uBg1(blXNLH!eEF4-yG7LI zSM!sE7?=y>=kNarKx-D$V1br4CC{7}<(57uS-NRBmOcOi$?CYBb=(ot-AQHn&L+_l z&^(IzH^kESwgo4RvUP(kLixO*`Sz=H4*8?+&K~^rxp5aN6A17Xb13pWBp1qQlwSC- zpS^|fFF7j{x4e%~r<>uje9w?B{PXA3$4#Ytc97&Jz<3wc=L&<@Dv>10P99>JUP@5o zNJ>2*M2*_j%hQC`r&f(NtB%GE##Z{>c05Kc91l`d4nJ=IV)nWg%ZJ<03xU$%TGL(9 z^F1ip21;|l-Ew@pg#LGJE^F=i@|eIA&PRj6eHkAdzqC>|UWbMJ0c>0UnM~s7Uh!}( zqv;whdgv+xn%*R^{Uxe6Tt&r@{819bk!QAVFalQloGgnW1XM1NIN2#|lu`K(+=6MZ zvcD0qg`N(~Xl0o=`*|moWoW-o?p9_pRR6u<-Y&pAU6)s5X#ECPSu1dUc$|e;S~EMC zB-a3@(+IMkL!S06D>BJFq+JX!&?h$pW*G&N$seq)^ghc?9juvQ0{Qt^>)1s~YH853 z(0$?PlY9Y7ug_Dlo#RdTEya5KQDFkavjxk0oORBb8GNf5x%koJ@(B>yrE?t)PaNoq z+oUz5S&vJq^)%hOJ-gj&M`L~J-CCWMNQ7NQSxqjca(!CEh)P*?r|9YBc)#eJ1RdWG z0P4($g?L*(kLZ`mnC8Q}yr+*N8l*i@N6VucMC!9Ir2q=mxjxDB zw(%DOE*8c~WOF*yBJnZSlo+3SNa{Zw7zB^-s|zoCU8x`+PU{7 z>~}Y~AD$&|U~12X+Nfg%4oUU&2tiKe}Q7)+bN)q-LusvN!t zIG3-2mW*s*`?ARh^I9>v7?~KwVEVkqO8|GR?+_{ZdJ(z7*J;qWR9_vbt5j{vIvjRh zP{YntlVi>kilg>O_}$_#LzO6+$V$I~mIbXVWn%Zc?)IT_;$}B0Ewc;t$BZ@Hb+~y4 zLggSQj2S;)XfFjM3BJzFn!6=V%wC-y;hgfN6?BrIbdU` zBl zlUUU8c~nevV3M-f699R##Tn_w)|89BuO|M4FP$l_+-U6YcDDWNCK9q*1i^2QQGv62 zD}=z3vy-fLug(6`3$1u{wW09Y#brOkE+>IM2$tfalXm4y%j*nvhTI)m0S_o-S<+Lx zM=4fGjn;1u>|&=s+6e2X&AwmYfV0O#LAc)4<)93?c%sHcV92))*;OdrC)h|@yeHq} z{nnxIsi{emFh4E`e*FN(njYw6=kQb!WQd>W*W=;)U0Hp0o6Rs;-r}^wdXPm96LCx* zvpyqkYo2ATq!;k>1&58v(>?&E#7{=)m|&N~k64nxnM84Za%=Y=^W?h@prs!w_vc9T z>)Ywl3BkOZf%gLTM|Js{zl+ogn@QkF!2>U zuvLn^uW&CxUsgKa$Y7~@GfugMcB%J!&_51`NZnAt7%|j1IuKwty$r*j*r)sLB~G?? zQ+1{bBgS}z?<|;TP29#{mePOsI2qJhMu!QMO1E9s^dXP0`NFTSvvndDweUpZEvreu zeAk~I-NCc-?G~9*-}ZVr^KN^engRJ3zT3dqkR8_}P7`$2s0K?7pxlhrE#C|yN9%V? zV*K-6&JBKJfbvAPY12AKc`m8i3xU%YMq5YG!t)tb#&Bl{kV*UYw$4@T1g=>M}8DD8GC)5dLHB2T5O0E^9v=V_RSt zHcfCtg;AB442dg0_)ce~7XKq+eh}6ndD`)v)V6)8e$0kik45RFs*~-2=%DA*AGlbh zc+|Mle2-))qP=+O(N|&b$#xpDo2Sy+*9a^){;rhQ1plXB#E%H!O9>?$FIN6KmElfd zGnE8pV`Ehjr>s!P&_4hY5TzJ}mHf#>LL}0N6ZOaEc@<<||Twqu%t~GcF{4GkD~s8O-%jy5TYabkV7BtD6s`vVVRjRfI_VnZ>UWjSZB*bB*0R|-T@A~vmR;c(e)&~*R;}{A!bcffc z${KXEuPpG^{E@iR9c8vzHr7JztEF@g^tF@ndm^e7y|Hsj1JBjGmy_c&8YDvx>VI#| zjjVN0OyzKz;mINGl8^4{|1im#@vb`<0T{nQtkCzce&Zd017)8bJ1I%p!C$hQfG`cv zhCR;reg8rbQ=Px-fV$q(V|HKu%H|f@IVFSMR)^0*q+7v=j(zCb^A{@|!(8E|e|qfF zFeiGyRsWWxfjJpH1eLkt73U!LgP%Ry?a5YL)R4BuNUH(&lN8eIiSi63sJK>AE7%Of zx>anSMdX#!mN;0R>Gyi^z4^rlhne%NG8JY+P0x?#f74{(aNs^Yq#CP_61ObI$?y;Qk}?>^~7%xbJ$DMcpG@7%FeY8=KHP z_@eOgzy5&(qiHIc1?jIS!bW}ejKMt;)qiC{P?dh}2{$YEk@5-~*e31F(<&J*jsK3a>#Py|b8paeZgIy-Pg7KKZr? z{L!(*|Gqt+=PT}D%^LYveQmo0P$B23F{nW2!TJv_ij;+a7!Co|6M9J7%l+7CK6F~Z zekMG`_vbId^&}E~-hY22SX0@W5OCub;O1%4p^Xscf_!Akjm8Z9j|Cu41FLfN_(tz*(&?7 zuN+P@6dro@_}`1_R)HUZW+;z?1xp2O^*k+JzEoIH1IQ?tW0R7}=C6Vlt^So@u%~qv z5km>9k2BK|8(l`emtRQf`G?a^T?iX}v2dAQIbI%Qv*^|Q)llTay)fMaK`p9mGy*y;O_gN%yz%!8l_xx%#)0VkAW=32f)Bst_gv&w`x!0u8f&uOkqT zwWFNNJh8p93xg-8JxTBcehrP-*1h$1%4&D`D-TU9+W*oSTmMCanc+OA8YlVhbrz;T zrh{R6au0&T7^OXddp8Q$zg+7reitG7sBpw>7=AsARi@@?Z}CmSb69GEqh7AX)Y!k5 z_I3a{=taZ41-`t3-~>`tVWuNwp9YIVzsat=eh!PvKD21Mf%fL%CS^X3ee{d)e2BOx z?azC)e@r4!J~mb122#tg^(whky^YQ5a&vf@h0JUZnl(Hl)(Dy zLhnw|5^x8azvljFzA64cpW_MEd?tGB%~<&g`a>A5szO#oDAHV;m^W-)6H4BMT`E=z z`$I$iy64TGPaS@43Ru@<8nSQYyTt$V-5v|Q&ltee zetdOasGvlHcj@o$wD>G3UJqS`7!jYxfRZ+@d~qvSVyXdeIWcSdo-n|U4}tGKuf;cxU;wg zCv|UFpf~zZj&$-Fm3&H`&&e;bfIoff^j?CcrZJt9kMoXyd;D%pQ02+C^9xLv@D{An&7R#~2(Qs;1G+x^0$eRB*qdKqf%L%#alex(Yh-Yrm&(8Q3m=+^Hh( zb2gz2#UjDNOF@_exG-)l?QCQjf?V!*c>@?-to9g0z&q{ zn%gq+e5V@Is_44dvA<#11vovf51bARWaa0@OYfGaVqcPA)-hL44!6;WVTg?{`r}Fc z|7@CFHEs*1EnQ!Wmq+0F&8AGJ0$gh)^P+i>#s}mThgq2htIEMlQC2`*j%^*Y9w@+v zPwu3jtrUX0XoX5RcXpfmuGDlQv|xBZ=IaTdM=J8XGgBpZ{u-@WotSOawGjq{R5yu!0%mmsH5{;F1*tAt*#8VBvo zp~30o8-US9kNxjG@(kFeUdf?r*^WlmZUB=z>4_Mj^%2P6zHM^G_*upwbt>fv;LNLkuLI6w1F`pucs+^wKg|VbVp0n}`s%a%9CN(6tKFD$6^Pxwy@?-I@VJt7 zVpI=Pxnhs9(B}#{+!zRPliP*TQQ&6q_<`*o`5bk)jpT$fe?+(NlHZ;L`W5K~0>Zxp zs4x7pGG%EQ6=-Q8{%z7Xc7W7GkU^hhN2qwyai>`8UX8XI&;=h#B}?;+c8sm<54(Be z*m%t6$7ATkAam|rdhZg_9zdPe>IWx1wdFGp!7Cw6NP{3LIpkoFfM;4GZO4+9wal=i zV1l-<$x!}Y6w&$ie?D#RnKj{yhsx8lVP}m(Rd8>pfX$*9$#JLOWN(`_1^6&F=bJ?u zA5F&+M>6#btYD9+p~+4J2H;|ifXl!xozOoVVH&NAZtCcn)CX(lgX!S)$o}MqW=(HMnx5h3%g#b z7Ozlt168&=bv+eMcA`(lmqa?L_Mp!K9sYJRcWS+QgO`}L_Egq>E21Hwf~7`3dagjch>&t| z?!acZmMu78-glgi%0L4F`^Mt8KW@uA2s*q2F<)%Xh?hraob9j2tB?6FpJJk@ zc@BbfrQyZNlXy=AK2htk0`f{qOVj+)HHJKfzxEX_XzE{s-8(~@dff?vy}-@3qRnB( z6_Rz+n**Wg`R-n5_%ia?bJ1;+Xzm;E)_0PJ&a^vY(a0*J(PAK&z!q<}RIrPT8&TFJ z)T+3=b5qnEDR`qnT_=kMf5~4N$FR%#h+wD9v9HkRS!dPOB`<&U@G_E09%bQo6~!|- zx!OOhch_S$lxSF$IM?z+_*-K|5ARCsE5h)IYApJ2L}p;o-gbl?OY`x0!lRI*&< z$sq};!l(BymHFdY&1zKYL^RkV@xmz;*TX;qEx=wVf+pnpSW4F;&n3X8F7v1BJZ0%! z8{gsP-IwO2+p^o?eMJT|*Y3V9mF4BXJw;2tJ59>{n#WLU4iJA!{$XF)5{qr{hqtPmRYW3d8`Ehi^hGSllQimbr^7a&S`s?7 zmLfHkirJg7Xer?;yLN!ize$Zm1(<6Cp%G!cfz5<{069x4gbLTx);6A>w(>VZ@IHj) zJ9VEk!I@f@({Shom=-7i6#+k*oLo7sP+>JR)3WhR0c)}T#GB`p7l_g+1UXeJ*T^Q$ zzAgEtfO~FJ7q32?5MyAd(mA>IO?Nnoh#U(M6qIA+Bko3|qkj>RcU$0}`u%X@`h>!M z3A!GJGUp+@7|sS69(+tq2lk6i*|t2w7cRvk%OiKy9|28(oRz?Bz*~r73H-3c87<|H z*Y^!gOfGx!G;~;J|CCAZR5SNppQZp72I{|NPgTr=zX~~1LhMy^vL5o#raZ`8VJrjg zwMXw&R%G5RBiOU^=O4g|Q`hRJpy?3&0XcXc?=7RxoKcqX;C|9g+(Z@lQLg)_6gK~D zGB91d^qU67CgIrIRYkP{Gf>-4Far2Z$bNj?dnufePc+dV9Pq^T?U^VBZ_ap`ABO)d z>9RAPFo}fV73RUSrtm#;$de_n1xG9&1*`vly_p5r?&#hy`L7r_zBVVmU|gHUko6J< zry$x4D---$y>6lQX;f`Z0S_B$xkW?T(LH!ZOLRAW7mN8FRM-nu*Dmc};z6qt_WO~p ze|Nv@KNiP+1yzqoOTGax4u#_G2^pv`=-)Hk(e^&NqVKXe>HunRF%L^KM1K$W(VuI=&nIOXNVi=8MV$Nz|_e zXmU5W?D%)Se~|Q6voJicTMRJMOgs;7UBT&l#%rZ-)7{{t(%?xV8qeP5of zqIGx*%++;>DJ3@QZ`|H%UCcV{*gHJyMg&6gWp5Xu4QBXQDx@9zPMoEOn@Qa)0}sAxFXx0Q^0`E=LG^krjh&cJMJ{CL%XD3UHhD$$|JpsW$NiB$E+7BLl*wc za=zKe!`U|hnTDAT=2ek1Iw3K$E2b-z)v z!B=>aM zrsG@NC$M8x;?2`Z>R-g0?wD)4X1(YNo_r0e0DQ<5OZ}kSilY zQOf7Dc8QWl9*~pXce(lk)z6gzj@nFft^Be*+mO=Q0@{p;{1j(6IK9SBaZ#S9KDvH8 zFC%DwFmFM-*XLN>JPQZkGfNIS?lNG}eN`Y|qL}$kCn*0MEJP!``-_CBEZHWtd|y2Z zSQ-&C4fCU)Wlq{4^m^x{EK6XY`sA_mrQP3xLfwl8AuHODqcXU=fmsE*S2`;CIv&eK zuP$Iwq{=;abC=_!EYRr^Tb)WeWF2R$b=m25FQg^v#(LgkIP92=bQrX~5(wn_#QsIH zc&IigwFlXaC~;O=>y-e~ibYo&K&ud{q*Sc?*aLWwb!dZ{0%cCZJWrS+n)(Ktmcclm zS!XA+2Wz!^J$4u`LZSp#;yq&!2BlaK8?ztQL0@wl6wFa48yM}UVu=O|~pcsmbubv8ho zP(quJzdEA@@9|7xa0j&|rrp+Qs>DS}WV@+kyL$ILe&|1Ba5CGDv=W{1dnImIv7Go? zOZM*y?!QaG9h<^e%A629cd9>rr)Noy_dnInMgz*Vr9{}b^_iAjsAnUIcuzyL@4cAj zbg=j^!@0ZNqCU~4yD}GLtiRR*ANekrDOE(|q1}A}LBY7dxS$6LLW8iF4f)FrJs^Ay z%IG=G^`De*>J-F&HxH2e8=sd(um*_8ou5Jb*@H4;>vAX(rKNnjnZw6iQJb5>KVbAE zFz@s#dV%vYK^6W!T#i!WhlL4KqZ7B(@WT^n@6P_Gg#A2c_&?34{j;-4+TlO9DvSgR za?|*q2wa4oD6<86NMFoZLCMWgp&q*xWyR@TsPAwd@CnakYmcW5T06hJFyHXAIY+5p zBxhL3vOSWP`}GMm31;JOgawiAI|f_@i}YF1*<}9J8@PdR4=>gmuyjFmpHyD_EV@+I zbl1@qGc>}^Pm!Ev?G}K|N;oEkW^_G2MB&7zUvoOYzXTw!!C$wcYUL7HFCnm`ypFxq zCe{ZPE8*bNMl2tIC<=xvP4<@IkAT9Q|7I%uZ*=M)G{^!D06z?m5pHkGw;YO8-TC$tbmm-q6!7A!S7=c3=)Wp^mLf zc}|!u38*>#ycG(&8i7$%Qcjsyy^+0)JUThqL2Xvtlz#5g(_Jwmb7vlYh4cmH#zG?FrWNetrdm&TJYp0)^&d%giIr#7 zUAYtQnIA_tLaXo-mvEk-H72{o-^8;Kv{vUgbn;F20Dh_&x9X1U#6$>ak-s; z;;6c_p%ik}s$XGP=O(t5q9O8&8h}7$ez}-y?(*^aP!)O!DHy_r~=# zEz*?2oVewPQ)rD$VzCz+d`$^3RtL(IBJF>r8CM=5b^{`Z8^kaSU ztncJyTG&rtQyDCrPI@>2v=~@OZvsoDEaQnbx=Er+Oz!J~ahnd!Xjw@&!_1$Z3S<79 z&Cw>5;nyL7T-ZOr${L%PXn>9<(@Vj}pYX2M*QNO}WyxBg^AupzA5aGGcD4SM@A<~k zDe?23CVn0ME+W^Tfn48a>>Mj0p0I-Vb^Nv-=TFprI9ghMgu+n;CFXgrxnqV8ctSj^ zytm`D`5|oY4K_|C^Yg>3%;G1FD4&XpkP!) z>7%(&%0+i=KO_Wujza==I=$GtXD>JDrXg(-0H)C+=!W|`f@|(a#tF6BCv?2&@>8EV}Qezcl85c2lH zw-Xg)%ERY3I;33L2^Vum)pW#3U9CDon;LTZ@FyPEmp1KgM=ypnF<&#M+(AMK()0*F zVCs|kDXXsx`CpEImFs$=q3a?k=#ej_BFXSx^epUb47_|g+22idRhAbd+P&f{tO7>i zugoWJNh~M!;F{l{Gf5z*gi-BTQ+&zU#^mbRfiqZ!CE!dM-e#4bE8V?vwOW?1g=B7% z2;94nnf%%s$RUSX3F{7Q7ZZR$y1waBe}Nh?S3`%qs0d-&Agn&*;ehLyv@~{SLK#DM z6L%tvuWU8rpr{?aI-GPE;BQ(xCrCXGc{LZ~VgJfb&ZH;W@4Ot9lkB;YwU zprFaqY<*UVEva>ydqZbY)A#bW`(YaM;iKW_K+Aht^6V0#MG89q>VfKED;Zh)>mO?f{#=lyaWpErf(rK?5?}>>NSr|rWv&iu2|>4vIiD`->M_UOJZ!Dd z5OKmT=rjFPrFbN$$l4qDu1;dcv*JcDWseb1B9cS6p!)z9s%_-52e?&pJX#P-a1N8b zasdy8o-m$ogv{R+9PG!OpQb01fBJ$+-3T)=vyf6Ss{oRN_D)el5cf?ZBbXmcSW|=N zC4T+s&s?>nXP)<^)(aXNggWmgXhu+hT28{}S`*|hl+a-FWB6H#FrLj0hTn_!I0j+M z-~+Vz*`q<1V`a(U0BxXpW>eCNuQFGMbz!ryjwm=(Tif}H-dSZV=wbqX;e4QNj){S& zz&i05_yn8Wyf&u~`e-#M^tt@|{#QWWN-My^tf8vo@Cp%pzP%^43IsK8@}I%EK*zN3 zR4|?neva=4?eX}g=-r{HBo{d2XWz&tjbYOYOau#o^V4V*q{(xmKBJENPP`DEZl<$q zG=JLm-9CKWtR%Ac{URO+n769qfmv1+Qjjm^lcwGH%vwym>KMk{%z78-ka%&b63Zy( z5w5PO3#rzrnf@Z)dpBtdcTE@}yH->xV(W(kfc-^gR%!X!m6WmI-)@t=EA*)_Wf#d8 zgFvx%9lH_IdDtU^y)=NN^&F2ZOnUcVmw-BN1X}SF=bn~t9&e058wAYzBamZgm^c_YbtjB`wHpwfv+a^RqLUKw#5i~khd*y_h>ub9*`NbahOKRs# z`Plnz-e*eTTSFgTB;r!^v^4RpFq}>YycDD@>W<yF{^N zpeqlEfV@mhG2s^A=ey#Vj$uvNgIpB9-F$vCYXx%VmoNb8xaTykGBFQn4ZhcDBz*vYH>f+ow1se?QENf zfh4_i6UGlw9}YQd$m>;m=O=Y!9Cv}w-_IrOUD98|Lw>Q0w}?}@4AC&^;fW%=$qH+2?^1a1$W=2-1=Ck@I{BWNN`EeL!M>K47t3K4^!20OUjnX z`(tw@pSA3t?4FdIym9{*!oLU7G*>@<%eEz`H+^4$ytNg1>)2qnh!6X`hWNWmremS4 z=;wjdbTIjFT5T^P$X_PNb0HVCcDcP8POIH`o&0r4IcpzdS$;GUbamT)rslM{wo&O^ z@+P^Zt)26ieKNHo%>i<9T{APXk$ESh=Zr6?*gi6WeFPu!^Dm-Xf_u|^e8^~IJ2%Y z%}}pOboP$p<0QV~*gMhWpTChDTVRNH(B+VvY3gUViKay-;9cMT}Q6vpo9O)gy9psRaVxS)u|o+ z9$0y)w`GK-L@rrjHRBUg*FW40H+ewFs6^30_RhFgdQB?dgY0cQ;bkXPB-mR0J5uRE z2>KIAz{xLe0nE`efa1Wk8nweQ*RF*T+MM;&Jg1%@PZV>IAn4aHI+)UV`7*qrK~&%1RZ(Ffb4dwTZn*NBOUrUon7!_ZUw+YaV8u8AQ!OYgJs zhiZgit6g0Mu|6K>R3)Dj{2R;fE$UMk&Ch*(8b%pOY^d|E#d+LTAV!ih8vNpziX>Vq zKlmiZrmp;dL?F>sZ%bVRxsZN@&Uq{SZB>~$&4y&^B$r!fvO`}mlmu=`@LY1GW%kb}f$Y1jsS`o)PYUqcN;iq0{f6eG zka@)#BfqK#rC)Pq{4GvYcvJI|(pHT~teNzxBuD;Ly$xfb9Cf!+iYmiM;nP>I=qRN& zZZmtHQP26;!WrZpc!!3EZpVDDZpcz0Q{ceb6@D#FQWa|zEBf+9^@hCH;o@7CGHC~x zS(s+Fgw^TR*Yb)AYChhq?5yw`?4Q+q4rXOTA{->!IR`BHnt0{|9ZOHHe|%nEH?MMC zU0wZ=+rW)QRR5mN`#`FWn?9C=%C-vmTKVJN@D~KU@x-G)96l=-II^&tyt8=kNhcCg zJuF8ZoOU`-S+xh#S?SFD8lUNF%5tBrHKL|E|Gzz8phA6(>?R5AXWj4r&&D`Sj0|?z zgD1c3`1WTzCyc+gBMEQ?3w3a&!7hrm^++aBg7^~!6G+Yz7xmS zv0I3)L=!D`l&-fS_^r1)wRLY2Ki(A6AgKog#ts$AxaLi4eW$BYx|QtEVZ>mJoP_^d zXhDY}8H2skf@=M3MWq-;<;8g?V%5g!tlZvM#>Xy)?b|Cq`>CF(+C?!LdJ`cIZNVc< z-)ntuy;_HSP%xJ!NxZ@NS>+~unB&5SI;(9hhvkN8bPt`3*Z#Lr78%_}E7INFz458J z56z!n8i{qt6vDmy3+pA-_#f)%n+TxYZO?C;_>XL6NLx3|mc`#z@Fr&V$|5Q*k<yJhaUknGqGezovYyDr&ZYzn;6Gq69yfZr*VGsyD5|)8@LC-Hgj+<|8A({S^hd4X z*|oopS>$(biKFVRdxvJ?7JBzK$fIsPtdY_wRsehmT+l4&(ptc@-1*4lWZcfgfV2&PkRW1<8NM{^6fjjzRSC<5z<=_ z$)23Z4z=Ny2vrdaJy>Y5>Qg5_njEgRxI9T1pPP#G;$Nx$<@xg(s?<`l0QizQwGYS8 z^k-BJL-5^uW-NT{iE9MT=CUQBdvXPthZolS(`;K}A6dWyHz#>$9LISDuT9TV%x(rh zR9>`bKD-|Mu96SC$#7f8{;Wk1$N7kuYe*OO zM$0MIDrd_wu}UM-UD51Yr~u}>CE%Zxzy8+x;@x7CzRRf3jY^Re;L;F`~HvPFmiM^I8wTihK=q{r3ESJ zk`fppp@bkEqedg$9ZEA=8Wf})NK60r`n;1uWSbwi|D5am@r9aw=2}!y1?~nT*SULYH%)5ilG*|VfmBFO^ zVC>5Z!sDRotr{+j3%GT`*1N-3j&+Q@CaU+WYhPd`)dYN#lWJ@uMRPjLTZ!QTtPsW>HpT`zb{+^6=RXBaR!C{9Wh8 zf)B<1j{;F`!zkK_mF(Yn__V@!_SVm5zi!w0IUXJ*lB~V?eL)OgO{yf}`aU-3$ZE}u zHF%+WCfob9N&!mcIP*jZUz!u3PBiyLNS+@eGLnJ<(Jd58T>HzX;En;MZ3&&`K`AtVyX@8{{0bZ+Jb!ib@AaW3680*-7fDQj7BSZElHG_T}59vj3LYpJs@r#bLxbb zezy^c1Lm3>nDo88NTE=PeZanV25ueaRwV8d;{iin>Fs5^Gk0cTA(}JQlx@T}@!&ab zwdc^^u~hSJx;ZZ>QFfY38rdMWpQmkV%3#Fvc1-a3tbkg5_>Xk=>o_e*5~_0lBMI3Y zKC|EcpIq)h*Rxu>Rogtz%0a7|KhY)lF}NxnXy{j2Phwa#>W@-v`nBUg z76h|XM4MLwSKpubt_ylUJ`_9C{(8v5xY<53d6Kgic=kii`y}EI>tq0Lay{RT+nROK zF6IQdl+}(lsN!@=`oudx4!^@aw%>Kqyaz z!(oo&s!V~H1rL85`*&3TW}{T}UVbH70udT!9H{i~jR>57bT(ILY;3S5oC5hh2Ej-w z5j+l_Ftun7|Kn>1RCZVGood;*aiT`>>VHWhe3mHPJ) zy=Qgnu1xM*59Jz2E&_fR>Q7QOEdZELWcxZA7((8g^$!^Z25MWE#p|kYTbAPJaFz>1T6oiuCunJx z7x8uhW9zu;S##~z9$)-AKV}6^aEX$9rq$iTZ)cq#>}?a0X2Tb;I5<+K6=4QyEzhHa zqYwLF?ytz*ajXt8jniKLd&#(QZ1ch4o__1t#w<+DE1Igqu6?h42;v@ieG>WAVWS?m zX>czFa5A^*?)h*KRy8|P*Gs!6GJ&R;2>PrCvSegGJ?=b-?>n(!3Vqh}m*9#t6m{eB zW7OABr0ajs>`Er?OLKXr8`nz4eE8@y4J`fOxmQkYjyZVJ$= zwK`8rJT6~QY6$Gc6Hz#X3&U5b6#^K6Ai%xw-(x8WPOIxCc{;mT<@oCExIP5IXQJ4d z3$9{IT#P^A?LGvI7ytpAsy`{LO%m@Hc`dw0#q~{0;@`<|P$iS2fBM#{dNGdH{QHHe z5462@HEK;j6>Y1zZ`pN@6cSquW8f)eb%0q-_!#$Hy`XDT+$T8fm8?KT_IzK#$)?N*)Q>(X z;_yn0FFCz$vj=toYK$FezoNX1eiAhXTyJpgZl?d1#KUZT{UjSNy#PtYrqP(R`lLNizCW~%VVU=o7 zy4R_$q=e#l>+NeMm)oqG>lW`{06BZ#VJG0x#GHB|AULJ%c*$zvfH4D4p0KLj9a)z3 zqnU1Nc(DGZTo3E@)M2-i?!vgA{Q69=pWmu&1wiVKVP?4pH*%wJ4P~Onh zGULw~tqk8QoRZ0@xPvW@UQDFcoGkc9Eljo`r(}9ZFF!04@Ad~6cn4>#ObTKUdb74| z;B9@*47a@nBu(TzH*l-d?B8Mwd#Zt`)Pi32)M9!!@U2cZb-0+vakGsWy=Z%Yse#ww znVc8M36W|v9xRuGyKjW_Ufbe5agO=HGfd4M1C(Ut7>Ntv^;|8s@uREqlKN=WcDQX> z8nd3hq)ti78hSL%R(Qje`Xn_}iYPPm9@H3GTU<05x}N{Z)UA!72>t* z-}#*wg~>wBbEsjJl?D=IYSIGUY_ZC(52rd4G2Ou{7qjZ+5g{j;Ke#YCb>uG*ma{uCng5a92 zJTG6Z4$ZHveN0a`5t@-ojVp1gdd+5Aa0lnpBVobfbgY4M?ZJQJ1+G09a?Bx319{V2 zx!#2;9t4+IpZg0vZ4$gIi}1*C=6tA(7n&g09jw(j84;S;`US=3|JyxbVC}x<^__8` z!$_y;<6Dh`QkGDDi#CL5k_BO9W#!tg=!^#$52p1ubtk#zh{b2ss=cFFAad_uBk@h7 zUrbeP$Jlj|D&r^i!i);{ow_MesM)|+10E98NnTd#h2=2EJe+)wn)W85}N>YAIVQ)e7tmK^DyL%@J z1{tl8uRWKXAK(3HlFNDt+Z`n=zd6Gns6bHy9Q3}=R86j3{-zz1I(TN}4=&vO7)^a% zR`Uzh2>YD?7lIvw(x?3eG`N> zS^R(>{Cjloe$2>}{ZBhb!Cq_K1Hn;1AQ9H;^J)6*&AjPqf;nnt^nS1J4C4v__%yR6 zp4$F^J8dMsKL>6hYq3`&5Gd7=_!baZC;T1~@lRY^Z!2BoEq({DEA1P)_>nbQH+Rn8lH!Qr!NM2m(^TaYV_Iw*A3=ww53NmyXDBAD` zq2U#kI%)nO=FXdHJ8o3Noue7)^8-6ymX}f_hzEp(5)G#390v7 z0ZF2gFAKCVSQ7oh;u$blSSZ8uS_UK^rAmQyNhusX<1H0;Cm|vP|J-h5`y-{|t!BVr zq?s`%>~V2+u?!C+;}wM@K*Q3V|LiCG7(G?l{bB?bN^_Suv%0Jno)0=#_ z`dY?odoF3^n_KZT@55>sybxp*W0ii!NssFGp)KrUJ0MS_gUu_Ztzek1jhF&8|Sw_tD z8>5|b`pZp}gW~s81{YJgJ3MIqn2`R(mfRH1G=cZXr>(^HfGzYMs!X{=U#|Z@sw4>c zkp+sffYe(gV%{tglH-?;duz+>q3^az6#$B^IM35OnMhb$YNoTZ8QYFKPV9Co7Y2?k zv3m-?`8f2=`bJ?+k=W0e3^LUS@b0ljbH=8#GBpCWQ@mZ@698EwTI^+ClKYwb?Nk`2fz592+ARza?a5tBXe4DEE351&Q#b)3*L7flLrnz9id*fu}Is zDzMo;VQ))q5h$82P+d_!Pk!s7v)NvOn@f7-9$fMY+TB%Ghh}Ph$#@#BZ$?5L;mXWL zVmKj}@3~kO*l+(?pk#%WGd2y@RgI_k!Q}NtrY((_3+}g%&2rxfzQ=AW>Ral6n*FIk zF+5()YKX~(Z_}cj@^%KX@s?%Ajxo=F^$Yk-$;HIU+SxbfK9J<2?*a;>zFtskMQ4?=Hmj>eZ^MFv$!d0t5Q`iPL?Z`% zIuEul_u3PkM4@K9Z}N_Ww%fqpqt}Q(bFBg+4x5q(A(}kd+1bd7cI63OcEb(7<6QA6 z_Fb*~gy>f5{JZduFul7;!ERUb{IH0xT`Q_8ZAamUK{g2z-U+!hG3u>E?A-su+>V?z@c194)Z}5voW)Rhy?JZvejP)vTk2PYm-sr%($j`(%9U1 z#qm3!vYU~$Hx{3kF*EulesknXv6LJ_u7cH~+_FFA#>iAk84<)KxJizAXL%HEsXh%wuJG@!2rLB{@=8j{>r%j3ABtuiV=Y_x_rV{^6`0YOJOw?1&1) zN8o)al?o+2JXy)v7^pq6I%<5F6r9Lc?OrN#e2drf8>;fLs^6!>y5!Ejqs++dydqaB zJNLb{&!kvSaBxRPNwCJ{hD-5w^!iZPSWy>zeNkD{-Q@uXg*e_RtUtfJQIzFi z>)9vz0FY`)l7DQw%h@p2&J^soL|xx4z8mtQIFyhHhs(yKu%n5%K_CclC~vHmjJ(lC z29PP0D*%GN6~0zZT{-dYEic&dNs13qDT*`f5yBwFo5=TCIpAfpxh34u`fI%?8N9b9 z-S@vU6asa~^J2p#+=|9L^o}E#zp?#^De%u}wJtR_{JkN<5Su0JU-7f;_3MpDo#G8= zv`!-Fm2zjREjo=h#F{ggJ!w51wJ3W^p$DI3i`IC(~p+&@0t9&kfXZqH96 z`plEHIh&fzkB@q2!QLV!3)bH<9AaTnu9pDa@d7k+O=>vlZxSpnS;`0mbC zVn3UQ!}9^ZTJG+Txuf0vzf(?bZi;?CGE${z9>|2ORc&g-xx5IavV$>geEe%WrLIF3 zP%B-8Wiw3h=O_Mv7QSct8tN;R$0!kNZQe zUiY-G47x11*SXVmGn}&~nV+s)=R%6qWUL5WTjvWvPE`eoc~Dd#$3#q&nlqR@^rR|z z9DHzNIHRwohq&LlmFx7V!52@c_#b$PX)a(#f!Gwx0@}qr+vVEyLPuXNC-#y$F-{Gb zqkl(%(UE~{pn%4>vwc?xyl{_@%fB=*>u~+uuTKgv(8)qYb=NggXJ0NmKV_fE3@H-i zo~&n$cxVoBPYH$8VqS3Np+Q3-mqw<7FKdreSEz4_uBe;y@~@#0p+P384hs%0Ph?HV zED=YzY>vM4N!Pi~=3^>8+9f&!{mDiu_85FsU_V=;E~kojnG0(;Y%B?~G6+79RE>up zyc;#5nO`yxWxh71WKQnO&%@7*7<*W3e~=enCx|&nT62CtJ{Ov(>AlDL_K^|)jm>}^ zAo`fWi@phqc#1e(f6t+koP#EL2IBnd*oT{>IGM2EHG0kUaqw}od!;pmjf{GntG9b| zV*|f!3|0*PPO_vqv=%k%_8SHSDqc$_GT3+s8oJuNdE zXhf>OfPMt*J0{9_6cP*eDbiMSP?qH8PRQkOJQ3FhCRRE41-z4&)HHi`8cV{VR*!Z$ z3fJ|ABymte6oWiBK3P^pILv9DZl%xJNGpJuln<%B|Oq1>aerjXQ=ZL z05-YvYZXAwu>jQjCv5ZZnvNWVC<^3AwTWvKtl=m?;bd(vh+;`&4ulUM_+?Y)9*$9D zJm?s5Kr1)roMZYJBqBd9F~L2r{6TWOC=gvw`eLL z4GY-!Y39!LTPR%fltbUA^5Y)L>D?yQ?TKG58#4(g4~r!8*HCJ2y5n8h4S zBP8#KCHH(*BGCyFfD|F$Y(QBXtirf+Ep1&ol2jp6klVGaT@x`i)Rm0x%oG~r^p_k-W zUCD8eGD}>dDnjRT!Ls``;D`1G4>-4yNLjLAR3E|czV-&kFBtuuV<`M?kkBY0t0f3+ zmaac4d)(^$)A$l2Btk0^T&gRNG@_u+z(q$#>WUU6%wsoY0>&FuIbmXGxd$J3GY z4i$`|S3#RRVxN>0V(kd!Fa50E#P&Hh88>2-J?3F~ zoq)I2lBq^65hz{a@Q5No2(rjU$uG{H{{yH+L%&0e0?_@8g6i@^oXHtJeeIb@L3a*f zX0?{lxAe>FPtmXy=$uCjfv@G|MXW%60+*RqsQq4D%yPYY8j~`zo)pn|pwhwumlwqz zD^NP=tsW>_lK2(uoEE*PWWmT5xXWMRSH@kQdWOQuA)wQ~sUs`${-Z|)eQLlTHl_U| zJAeXQ?*B(XTB67yb=HEJlQTK%jn}i?6~4no!RoYH#Bfc+0_K6^oC+O58=Vuhd7A(; z*_(ToB@{d*I`kjRPZ_vX*syjyOt7IpSY|UNc@=7P#64>p0ecKR>Aqfb$cnr?6$#i$xq;3`sA0H^Wx2yKknSRd@c;7F(Dir2BE@D9Tu7 zkO0$uC6cH5I@Q$T%hMJcJgm2WiW1kO2uEjLt<^lXDmn^(J3GQvKs!E$0_m z&_6o(r0WxcKn6Bd#-(!Dp$I@_Tib{QD~uT@EeW!HlVr2s%^5}HlO0B?1YZ@ZL7(;2 zVENXTDn3&+YBv5Y#yrKhjpjSjRnw2Myx|@a5$}xOv1W7vFq&(!8w@7>C=nswP07En z`+@Zq1;z(y*H0X<5VM%XZ?ZelX94F8wO>!smB!QJ4J6Wp8O)=aKgX^zkpnes?JhM% z>AdFHGy9FD&vO$MS`_zPUIV@-`T+=1X(dtaH`eh5>fkIZ(5zFgpi}UL@N=g<=4t%_Cjiodj0Y~g|N9`9+{#U zo}I4aZe1!}FnK0vWyxOfm^!WN%fJ-4Lz;rkoQbEvBoIW!@*J$OjL4aON6=Wd)r36( zj+teeUt0P#R#mHH9w?a^fsQJ64M42fNY^*tI&7WsgiB@hj$%TyHEd=tN`>q8#!lEc z1sQB3v^-!^WQeAa8@!3IGj*X#^Bp(p147^D8cwSt(x+Z{)30_l5cw`()xs;p6=z>o zLdgtAF7ZfdpJ=LoJla#8ue1#E_$%`Y)hCMhmerr=WJFD@&f2&iV=^GGrTZ#NRo^)X zi4Rpjx=t@qB)y*_R0%#Z@%q-^xfu#^5lhyr{PoKb$PD3i=_EsaDPHP;P=*HfBqYdpR1M~; zh({y3_pf3P`qd5I>OLuVK1{Y7F8PKsAJ%6{oO{k3n)S+ZE^qU(u4l8G`A69?ZFZsz zW;QYzQcI*F%ypYl>)`d+Cx;`td2{S$8Y@k(3h5_kqaJy9p-3Tn9EfW|CP;ww&Uidb zlB|p;!upb39ZoH@Y{fl;PffS2fbNntC;HFs^H_QMEq6cl%jJ~}VhY}j0W7@4Dre?> zhy0H2Eqwl!q&j^uZd-w2;mg(I_0E~~@~hl=ac_Hlj`_#pmejt;L~`@A+2@Q^uvGL< zYDF?-_kd6T@qX6Pn31HBYpndQMxcNg+My8&EV7{Aa>s4I&MGw_<{hSK*I#yIsJhBZ zcB!r272*~J?B*LxS{ID^f!EzVHhafzl3`8Qt!us_O!?x(s84}?w`vRr2^JU<0t5;=WGgMG(I2mj z3^$5X47o6{7K6w~F%umown3zTSAn@vGx_%WsYp-DwQhS5*-dS>rC* zN56SY+{k^4<#3nHBZ$bmaVRa#tiQI3{cfjl4;jGsW{*Yed$S|7rbtf*$S5*~8l}ke zKnGt;tsq`rLfJVvLZP?5X&D)>|NY&5_dCmR2xGo9!-|_p_=Wpg?8Eiuvt<%=`@OXh zLk)z3{Z>a!H{+<$n4EmgL)nimPXxj(1KaZa*(;Bo?t{m4D8MiO<7m#*BiCmV{f(5l zcg~c#rP;q<8k7r@iZ@5VRgO!KhbVb6Ye~@brg*f^xv_?^4j-L1+AF09eq>`=TKt-~ z_RSmSGRC%KjLB#KOYvb^>hD~htbRQBLTvR9ekQI^gwievu=h&|y9Ez))M7!_u#vS4 zh!^x0%C6N07N}C&0Ywv0B*Vcyhi2fXPcUlJ{@V*cO_|lLzO_Dm2@P~b>BZw27G3kJ zP{?x1qp>yS*bHw!wNHNVbJtylzyMJ zf1&_r6pEPo+;r6~&w_we4q=XUyrrg){{0A-6Lyzs_{9`y?coTa|8t`TdMlC&-w4k zf7d)uq*S+4R&5dQX-Cpl6Au0>dldVGcx+P-1AC`uP{-=dFWng*>!W!TyQI1v5pjnq?e*g~c zznADZ(e0b_&QjA?ir@v$N?=ZA9&caCxn|%w!mvo13>$gFL>W-pAbUzqb9vTMOLF8^LPkqMMOM z@*~VyNLMT6-7gdBjstXu7k0{D88Yrf9{tUix78!IAa)eSg7~3h*?O1+< zc@NRXNzVT&{asM{i!ub5fn>MySotnYFehK$>uBCfN#^7rlxf)(H?R5n;RTH@6l%HD zLxeIj^ZRacU@VKy$Ua}co{9AX%1-amOMGd05S_V`xy=7^Torje;;XBEWO^bt+O66B z;Y)AnLf3?s?&Un1$d_W9wx|u9@}t7D!|n#UzeJ0K@mx}hs&@)4`bc~!rv5(3Qijy& zXTG@|!UOW0-pQf7`UR6EKfuwq+MzA5aB0YQu{NuP11L5*))IT694z3&q5r}>#!hu| z1%Kg{>yPu*wRWG-2i0+Bdba%ZI|EBgWR>D~rO?OGE8h9M3J?vvl^Go!%h+74kKl!x z-e2~kHAnHpM`CI69SBPCR2~1YK&MfDBt&>Idr{H+ zx(SEV4N5HIV*+tf6Ux#MFiIIokcaH@Soaf${ZqV0g|x^k9Xr&Yro$d1>wM`UV?6Qo zRW0nkB|*A2IK$f8O5lF~0%gp%ssLH;Y4el5Dk4S&Bi3QrWIG}dQ&NH)(ea0ShnUNH z5;QS!kxJl0RJ#?vVA6x zrrH&k%1K^R3`HR#ruYn7aIC_BSke4>xLwHX#7l^Ps~XK41dFv`#Z|@yH2U{U!e<+V zc?a z`$wym&o<%dGd=p9^C0=jQ~`E%-aJL4~IjeO!~ul9GD7gp$_Y(ZFe z4mRZIeZ!tn+`oY`a4ZCCcLc!i{4|D@uX|m>^N*kJhO!ZI7v5>3m^)|0{`>S}u7mfl zx=)N(6)xw)g-ZVwg%$;9irTRMt7bVGYa%=p0WN$|`1SUB^=3AuN3Vc&z6W*}5EKKu zwr|RPZzvnMsdG2;CC$Hm4G5in(-1b8Kj~z7w*0Xt?6S)GvL+*4Kk#K)ki`J56wAoD zQOApNh2*VAgb1$eImx{Ba{gv{mj(4@v4zUW`?6okp-dE!(bzf}9SJh(9$=BQIThihSdXCH!-b@kuJl7lF)o@Hc z=nOl{1^$`GMwwn>M6#v6XmuQ8&eCqrY6=WWpYSVJ!@!tk#WQU*l*Dtu6@&7*Tc#uv z+z;V`W18ch-x+&{mJ8&c3CM^)Gkv-as1KZb^RYkz-TH2fTDdPh7ua(b`OJ2zea~jS z<_{Qi@l;IyElpto@k6PT8*WpW29hk#hzsY$(b$lKVR{`r{JcyE2sGkgL z!zU9Qy%hp72PbA^IuE6@&cwylxX*&?hu^M|2I$-!-?%Z~*c9fUTzrnQvf9D_G+#*V zM@Gj?c4Zf1^|8G8co3GM(ByVGtRZ)a8?;^AqKJ+3`P2Yh#E)#L=>e6V^`{tL2q&~W z2VSvu%Z%@agC97~lis}asFQJ14UMRH>`wm~DOjH5{Mpah()SNr9`ZWmDit=PSJ@cl zD~;Rpwv;;NVj#sfvwyOsG5IwnnoE zFUIy3+qXAMdZCPPeRJ-?POnSzs14k zM;*8>n|?q+<`=-E=zz?tt%76Yiu?{)m!pX+5yb+@^3dMfg|9>J$3jbPeV=qLIdt>? zY`D&aiu2*me(3?}N3Qv|1U0R{wS(5ZZuUp6G@)=xD*AhF#np@fe7uppU*RMnQ$?4b zr7bx=;E+|6yJNY89;m?Zve|_vqYp!<*Ivj*s%1oJVNS<|T#Ni+AXsH;_F1a6lud6) zLYaD{Yh002?ExqUL=I1N@G~lk3r#H@9|Tailm~avu_Avkw69m^sf=;Lk9Uz!U?Du^DIiq}ce|ocs@y(r$OkL*e>-ReE1r1+m4w4JQX*QO>F?l?!1ErD? z7A2Tr53aKo{ox0GUmDfUsZ-BI*^QyTEXm#gRI(?Na^jhkeQe!n8C)MNeU{;ec5^G) zCsjQX9xz+Bwdd6cYtoQM*xjr9KaTQ)f42uuO9euKzrH7ZClp@;x!)czN95u;Jp?10 zP2Ur@EyBk&#;eaqoE3?W5_bYC+=u7?_%fuZ8DW0MukPXD<^C|pF$*S6HKmY zLk!WZyGIkcf{a|%kyO05oDud759$&NvqowAp(9|)ZautUS_OfHeRiuKxP;~c1Sp0M z58y=KBzNnfnArxwp7j9&&)6q63_}l;1@sn3CHh-t69iu}y{)2P$Gl^IHiNSOeD(ZO z;;3=Pp`N8nfZ5Y166X#jyWVTL1I{FH42?#9QLgE>{IjQlyQypUl93I;jqOHG9Bs?R zu%a>FC>AN+k(s;@uB7=Q&cp(LOuG%AWfYZfXCfFR2q{sdTK|x0)?CbQbHS@~ok{VL zsFV21&3~U5o+n~O2X9KV1Xm$mq~r(lQlq(E9iK8#R6dg>9C|W4 z!*7`5-id5Mbco7l7-9oU8uK)pkXu4i%>~O-kPe-JLqB#DqPn2kQR!0v#GEPua*n=s z6KOp~<^dTR{31KF5><%eafRam^CveQq$K_@GJiyJx@6$$a9>c0hwLs-Dqe}0UYNkE z76NK(?<`z9R~Ao3MHws5tKVjA^d^1H3|x(r%Rho|eM!^gwxi77omDuVZrq(D`0LlD zM-jzcmDHJ?_?MG&_PN|f0}5*~-HjG+`1uaBxi}GBw>sh0smBBjmG?hm`9xLOZIVD4 zyw`h`i_8dmy%@?-Ayr(Lm)Au&|A%` z72Cry;a+A*eK%l1w79*yAMbFrcz-5z^1%PkAm3N%-L|ZC3QSW5yauYq+lrztJcnH@ z$#M1?*ECElq?@|e!;b^HKdu%QIWO^M+I%5(ZiG>7kXA!^rywN>p&y%mUWqBc(7wP$ z>FS**ka1BY_CL6Y*YF2P+nuI%e*&#%r#+_g!iN|Q1WE6!MyD_d=KS_cW1AjJs5x#D zTlQUKp@)8#!zee5|44=cqjSQ9V%1_{MpRZV5W1T7u$Yy?mv<20Cohe<>&yhTo!tF5 zFHCyXyuhr-;{w?!Gh+q0m~_YHi46%?|796dh}}GvU{~;AlRR45qmj!ioPOny--0Q% z5wN-}>D!{>X?15HiMG2tk-kPk4Jyr zkG1$;Eq}5N!q;#FD*&cQrv019a z7^sNKHYzd`ae-|m6}jb@84jkTl6klg`B(6C{iLU7#@0ffL|^2rltfC^+1Nuh;K0_e^!i%WwX5lRP(Dg0&>u0y=94o&@BxsqGD_nKfu~V(@n$d zZ&wx1)twM)^NH|pRG{oAroy8QxhKv#-6fc>U#v>8JJ=fgVe}HJgjM4P94aC;y-@gP zz{H81XSCG}s>BHEz@Q>W6)MwFQ!P{+Z_fIF81>WugB75H_+j2APHn-oD>c(U=bppP zzJKT#AE^jWzT9t}`El&SP~LsO$4mnQhb$xwuH)Vs9!Ba5 znv5*OYwG6z$cC6vB7D4C$~P2RCTHrlBqki3+#{PaU`kpw)38BPao+9-Zf?D>)Z+g1 z$(-$&9%SLU|EhLyiEIrI9T(XYpxw#Yt$&m0{)3b8S0E7ASZM3KU)2W9?@fKg*H{)E zL`bRDbUSFWzi*SE!nDrOY0RZrbUiY5Tq+A|Y+OURZZU;k!mryWt|uiQM0X@@uBM^E zRntc@ztmb(+D?edBD+-a@gi6$LSksRh_$cE`JktzA4q;Yte)6So!w3}Zu^E5*W;eC zr*4J+rlvTIrB>3@H)d19`b5ZwU_rJ7qsM(D(8krjh~=ma|6?{5}xU=G_H%qk#T<(UI=J@*>bb+}e2m#;gpq|| z3Ab&XBTjDak{1us(}TUoUdP+Np0e!Bg%uF^B}D!4mqyl@^^Zt=mNZ~!b5r$5I>yI* zG1wbp>VxMT;g^}!@{=1=&8ZM5jxl#2HL1@xB9>Kq9s#GJF6Wz-DUAG`R>z$}nZb|6 z7|zO7hw;Zob02wTX94?Q-k6`J=P$MBRF4!5TS;3VL*;%q%S5X*QW$$N9|(2&{l;xH*xY5 zg5i#h(F2w*S}bG9dil~}UX0>IA1_M79qhIaG@4EB{ojQf{WdH;(#jwa4z zf~|*$HlESZQ9Or$e<@ZCvE||5dJE`bq3v*hqOn~h$q4m=FxuU_d1DN!_$7%+_;lS# z95kj2($fthR>Ur@8*hCNF*>z*IsUi42T94v;S9k2RNKt^l%@Z+zZ@@z=g2O9vhMoZ zfrz?Y7tpj7e>9d(2Zpi@C<>j;2G@&2j}h2)0{^G8-Ph7$!v0Mg;yoAV$usy(`?{b< z)6C|DVf71%x|R8~8#wja^+G)oqiYiLo~WcMvI5gQ^eAOhd$&{8+J(ZYvbr2oR6wBH zjqBN3SuBn7Mur~7ue0DN?9K12Fig7s^Htv{LEjaQR4$$oH?xApG&Pp2q7(Ha2C<24@>sI9_mE*?ToW~nq|aZGF8+K1 z|FNfup^Ythas5^>mjRvA=~<2m7vPj)OBdyb?++2{`que3A;6UNm8(A z8T4qh*|jcj`B7_rvxQ>tF{tP+M+sx{T)ge5)PK?3f$o_F`-(xxHzn)PTWxY63A89? z>Nq$6vijdLXC5nrQWZI}qI{Y}RAho$OEwV5Q}{5Z`3QxmA%^EoJPDK^^Dw|8KX=GL zJiId9G!J(NMdyrwYRuj&6!*CaiiLZ!fi^?uJneS;lN&q|u``Nqx5rgL)Xs&wNQE8; zofUxLsQK18Y4ReP@I!>O%&T~Q(elW>IhAS6h!}EDV`_~jfK(+a8En!g36K=F_}wj@ z_oUxkPKkT$L3Gv+Yx<|{j=6Ykw$^e#O%?T``dluBn7H3}+k}O4)eJ7< zla$uGC1#dN4&}qRt(}Wd;5dy~$xrlc=KIdf|NhKG2;?0Z_6P+A_pBwj1D%8dA<%jl^`*?0 zfMV_W_i(LM154nDB*@UbUXG`H)85Tmia1#sy;SH&;Ie|XB;Lf*#zi^_8m8g15u}Db zr17&m^J))?k=1&@|HbbUw6aBkM~gKWgMzZe_&^$XFlwXP}-chYKT3n;^AY6hD@a}V#a<_W(@cYx;F?!?{(b!|P+mSrn+$1xs zIqyy>>i=B|KpR(0T z^^EkQ(v?#ECd(}L$Oh}4_>(z@wF>~N{o$4LT%BR|M8pRQU>!2jGGz8=I`(%2%US;m z*uSxXpkExmO2X6Dhoz@P{OefVR2~hS6NZbHw?dC8{!L?kx+Rvv(ZhpU=n3}zyNGk| zD`!lz~;pmnKkYM7Ikc!x7NbnaN$}u zb14JhEPBZp3v;~qe=cX7PEqWP5=%$79FJ#JXTSL!jXvmQl9Hg=Xl4(%k&(!*4zLqV z3te7(I|ziAedZuTsxyl^c{Iy?O0x`C`J1DoXK8^SL*nby@yiM(O+*O~J#K?y>~?(k z8kbEO{-Ifx(ZRuilaHq_kx?3fK!juAQ-M;{wop@@s8MnU+uQXH;~(QQr;oz|?;}W2 z7sH@t|3F^9W_^FRy7@E9F`u-6jjateG5GZM=xcFD2i@QY;_o9VtjagGgE6)v$;|)e z%jDQsEcK0}7Hg1;k`8#LI4R%2jZZ{i35y?L!BLv%K!PHDX@~eV9K-j`)1HUqWZnOg z;=IxQc7DG8Uzc%XI0B4P`-OW>m7_!1LY~y%;0Zc zAtePwu6G9DU!!}|(Mb80mj@ixwEi5oerzBiLru;A*7rM?<#8OQW^UEAZjiBHLZi@T z3t@G2Bp(>OV?D)CR`E15Q$Ihh7LQFJAD$O7C;K^f(Tfs>B|vcg^Z2?a_Y!H6OvrZB z*C*7ll-H;}?Z1e>R#?eDRPsyay=aHR>Swz7CzlE}<>curySeWB$+UEsP(lKPgbatG zV7n$#ZZs5>Lk>mtfkn|{&z{9Yvu=RT2Vlq)!3aa9|2N=7&P=UOPtC6y2E7ru!KLLZy;m^d~t5C6U#fH?RS7yP`G%@(m9enUEm$l(Kt z1G!VcocREBd-f(A6GvYJMTUl98=5fW5227Qm#YTuX~Yr8_Tj6G6Ej{yQ4ca@wGS0$ zLXA4R*J}eN+t{G&Jk-a49WC(g&r=DekiQTM&wi{-+2EE;xNZS|x|q25>$@wYJNqie2-sPqCmXPxs}< zNNas46^f(@nVW1wZDO=JaT}osg-k(Mv0X%+LzV>)di0`Hx94?$M@+RUTtko|0N|I! z5XgHDH>~Rk8X@7?GW)pL;?HwIOWHq_)-3b;?Icl&tAd_Q_RV+v(&Pwe<;|Be!h^*Y zv9v@P(r<7T3e#z&!QW*K3s7CQEyDZjhl>gfD9Sc&NPyp^V8FD+zxZ}0qT){?)mnP` zA`4oCC{S)4+RZrW6%Ly@pirWk!hq-f26vFOeP2cB=`moq0)z5Da#2#K`I5v9>FKG3 z@#EWTkFZivg%=3Dj%kx4LJb!`&9T5KUrXnEmFDI;AhxyUGd+yrXNBHO&;(feGU}qn zEEvMINC(ifIV}~0vnY znA+sHxdvIJ6=FTAU{x#rzmiEp$k$h#pv7AUZQ*&5<>aK&TN?Ob+070>=digPE~Ov5 z+Q~>xX0b!OW$4-K@EGJvvGQhhRm|N58wCy;Jf^@8NX_%g&9fbBHq!+^&fy3=xBri& ztB#7Y`?}09Lw8E2q(~|aLkS`cN;fD-H%Jc+Qi6iy&><-e(jeX4Dc#+C5AW~$p9O1i zpL@^Q`|Ptfr=}5 z7)H^6O9K0c63AOLKI7xG-}Kq4b8QPiK5OE>Nyncs5n1Vu5aTT|O_NPe@#@#M#mW(M zA4Jf<7!%LBa*&)V6nEoDliTDc3813iEYy$8I-`fn`r=gm@?nOj|Ll24n2SZG<$DCB zc#nZkt15AVl2(yMiDA5{&Ug1Rpx!&;nCb zjJ%q+Yrg05I5Bf;tR9nq2}z&$eF zM_*y(uM_0I_3LhcP%#t7e@kx7@Bn(}{Rj(c|H3#6a zo;@VQA->NP`~@&z@Q-VX6ZtCIxiMn7&=GwT_yZQY)7H(mscH0EtE*mga-7t^L;rJ9 z!=ik0mEzV(+7@A?7C@=CUxul)7!sadn0ew<&cbX|J5kg$j%XI_15u1F@Nnnd((#D& z945XSUA%a~q|*JI0F6Dlr-#=1r``bu+PIB8Hxf7#r7L*8JBCC8gW!)dYFQ^Vczc|? zLvEw-a+ad+Ls3}`12~dZH-8y|jh*y0o7nj)o%x0jmGs=N`NPKy^C=2RKG-d{*`ZyQ z>s+!)GBIJ3pL9EU2OAFj0~e%fcatt>+d|6|m!;fOW<+{-k6pGiTQGm=2zN^-*ypg{ z=#ygbVf!TAJ=o6~1pk^c>+ds1XCMV5UG^4mnfEK&IDHGd!6p1>o)h{vvzh_K$GqU* zY~L&78mrYLY$L3apVi}SWvYAQgDyy-@&%F<%Hw|iAp?h z98chWMmPGxim#9@_`TM54bM;c)qn5u4c-g-Zrnz`;1Wc_KSOaAMvJs&>H-eMtrzQ` zpY~0czVwv}A_;T$DI}k{3JO@%)mBmY@%W$Sem^$E0}|chZ3Ja z&@7wAcc8Ilw2Gzox@{Btzs|-xW}v~Zbm-O5xiA(9!MZ=dwP;!x{%ppC0le_S(nl#U z_T>v%P0KG9-?b6~N2yhA{Jpk{y=jW9XVLGr9awA${iah3oS@X{_8e=^;2!CX*N)D(tp{0H{d0@CYbJt7nv6!D=Z@c~X$C~`X3zGM4nz1P zV=S@wn9u#M?2;6CS16xsqn|@wfE({WPVaM|9gS+f`^R|& z1yUZXFvo z^!TEa9*#5oKKWt2xBgErcB9pgLw-RF=g#ji6Fx>2-{>XV>K%Y9F2MagGU3htnm?ci zTR*`tJ-IC_;_81VnCt8C=zUopL#vEaX?wmQ1co1KgWNEh5^#p+noWzmZ_|wTt=Q-< zeg;AnhMZppe`RbnNvHsi8IdN-_79EEG=U{Z}fCbFMd31ha0mCQz1$U`nv4TIfaY zE4gt_sX`CrovBCSH+^6B9xPs}MY79qHI9+o8KfAVqs!g?lRBM;Sa^SwV` zb-KSfUv;;h`3;?zm@ql};^f53q>#9rM!~_sApoFz`*v*pQ}S#-&nB=Ns83V7{%aR2@~*E%)W7=KE??P(AdI}` z=29^WnLkW!JV#>@^9Ivr$esF{T?qd& z!xSem@*?HjOQ83V`~?2g+G5pofU@(&yb$F3{4#ym<_ZEivwXHF!fclR5Y=gtC}2tO zHC}>g)1*Ysg_fTIwVQ&K{o$F+>z%0wvH^CVpcPp$zqYWYN|SgQljr#Ca!pPX$dWLX ziaXNbZ`c-#58uvjMcG}KqLlFWe0cl3KAlyOd=OJ?pp&6_FbCFL)N!vOQ7L~R51e6& znY|rISZ=|$e#XMd-j%PK<c?|Q-% z>dK<;Ls35zY0(Yl0Lno?B}L@o;*v=jhR*2waGGBJd4f#@Fb;O#EAKi2L@6r(1Z=Aq z5{no}=Epn+P3Shb7Uw6smXr@8l;h-bI<92`AN293H-E0EQ(cY3%vc8fuhHNf83yY) z)c8Mo_8^T3?%3&u52_@{iaMgPG`I)*dM>aq#y~pJ0SnfD|CEMjyzRU!UL{7IHsoRH zU873r)%*{TdlQr2du?|n_@T?zPuYCE&C)!kwjoVl`RR3TS7736%su#l^*KmVVQXp8RZVY-Ofh zIN3$ZCoyzV^QIE!xr)ib%HBKbCX4Z`>SgZ7CX}wz#?#d{6tlCl_Uo~-tBIyjt4Aav;h~nj_R-D89Kaw0#pnwKhTJ#r8+eYF_zbZ{ptnA1zz)%$A!bD+K}dcH z1mID!p0EM`_>aj1{)XoB-_O`e#ArV?0)({kUc1ps=cR(4Kmru{-$|Y+lBbLeS?3*u z!2fM(flfk*NWn}g1@hz&0^+ahT@$wdB4r}%F&l!npE>R*YgQ4HKmtW}7AG z+%HLpHsqJTS`Vg|@GjSPFVtMiQ2d>8t?{>Zh#6ZHA{D-U``Ty4U$gC>bu+j8%5ycn z6xPi0nHd5?Cc>!Or}#@g(k@dO)el1GszFCZq}dY<8?}V)=ZeaG8McGE#dAo!i32bP znX*m3n#$!7U(qP#qU5N&bRU$%KMms;>%O6IcR-KPvA}UC;?Eu!`ljMiybg8#%Wkp2 zQ48|%&acwdspf}QVy8cc&=Nod$a}L@?*s^~mzwki)UYUC_ZPnd-DPIdU-H-Cex(#7 z0C+G`OMW7R~9)Av=?;;d>*|_K%bN4Dprn`9`Ba~01xR_XPN>tjNpPa-IF^WYvWi3 zkxcVo<44z0Bz2eWBegHJ-Max}l>a@dW3s?j0Q(h{VGXPRe1cu5&Lx`82aUHy?9n%~ zOXxGFBAsL$T(}v(W}IK@{G=f5wNaLGZn1Q#*bsBr#5<$?5Ehm`WXg~KzYdk!t-moK z2!fHL#1;_p742mWc>SK0tAsS^fT&m@ojzyrB+c(8TpH>W8M-A!LhMWf^!+qX`v?k$ z_|UlT))M-{w4c`X#k?0Bc@{?654^7aU`W>B-^CLzAeC&(EN;8KcX?I#tFX-U(pI`M z6pbslh}GnN2s5e=$;<~N70zD0Z}646l~?b`j<+~QNOS+~VP0u`fuIgpeMVi`8cEr9 z`5C!;-3Dec>`wbrnt$`7H?@+;G2}%V_=+e#^|cKflVVcnlz}fH$AF?mksZubied4K zC;G*#r_hh4M>^O2c@8})v(LyYIvI2HIF?EhrzXc}za_wa0K2JNi>X4J&eTilG-ICd zpYnRLSeM&&USNeqMMcFA;6-a)dR+X}$VIN#L9ys7OP@Ro2WdkI()B~j~fq+lf;tc=Jo$wy#$ z9a2)S{r5K%mX-(WoMd9YIi#Q!3G@nnTv9NFf&JuuogROtO7zQ9pp3sT(KP)V z1syv*QrGq4n(|X&_J8q@_Z|mjMMDZa7px~l+CpVf3i8luwJI?}>fJKsB(QkQRXqm8 zSRt|Ub;oV-#x3>{)4bTboLMF2xE7Z}g})`Yd213hp1;BC)M-)BEvT0qSolg6`d%M* zkJiSMo({rDWZk@xbhs?M^gxoUkOnXH*^Zz$Z&ehp1AQ(Gx?FrjLfxxrmg85^(g>Af z#E2ZFOpM=v)l_G(E4~imlGyk&1cA;sA4l4SipQVar2sr0+SS;xewh)d>7uICc%%O( zy*+0t9-1R1Eone0V6-Rs6;^-+e6i91iGc3k(h)`|BPgE%dkK9i>oQ~nbd)|R&C+L?DoKS6=p*Tq(!;^`>rWqwD4A;K8ZNiPeh!hI854U(7aR)7Qfyg z|2uE)e-n@yLKVCdH|3N3jWj>-Nfm!%Q0i3kMzXTRO=`l+eqA{g0jo-T6qTtt`yt0O zKE_ZLC?*sY_q2+E!f|QW)^m#AchjXb?D_@cme0ctK?MANK#1anVKtW9U?VbC;H$?* z6F%=HJc5`2m{)vQn($W|X(zm4FpFRQi{-g#Tm^-MEIh+UL@U zNo}s4MWthf(EZVihzs80YbKNSejJ;3p%|2T;2qOkt8ro0w=A#F$4<+5C78R3q{rs{ zd@jx)+kHgmesNZR!+G1C9}s4wjP6p00SplfI`R)mtm;f_12v1k+k+U@5b>zF=$frY z6Y{w_MFreO^2j@xJL zSXEU>6@mhOuQV8I4wMe-D_YGySuO$Plz?tlELZ7gD7UGsX)v*tVWmYZ9&xwVS%cf* zoAa2@ba*W693-voIxnfV-gBc@r4-6!);&rQFzK+emOI5pQH$z$sTCpg^-)4$Cz|3*;0w<3d8$sWfkNE3L~|IH-En9`{?bkXaKbOCSroLDr_h^T|La{UlR;{wC^5v z4IjgSghW^KgkUv;LT~;jN66*;?Lm5Uo2Ml= zJXKJ;fwXjZ-@!@w;Qf13Q!bLU21ghFa*3xXCgROnW|N8aniJd+i`C^IYG~EkD zx7wx)2t|OG`kwN{1NM*O-Kttgqmp0AUtv6YoWDv84r2y-kp%rO+y**VcCn*=h~@j7 zrJE=%1KWv+znK>n4kwIwnSi6RvjQK1n{?n2BG3B4vXRjO;U}(0fN=xxh`z2h!pc4T zQkIynZDs@eIGZUWNI6NOkQv!xGNC%JEk_yY*bt}TYA<5mfzIg!ae+hu#S}Nr#@LT1s$Uu}zeFB(D@-uOi`+a;SqHx}@J5M^B zq@tnFT+BQy#~zi(sO)s7RwDZU_4J-;OJbHrV@h1!iGcQsmZz}eUXkHJccWC+ZlvCx zcXqJ^zXT!;xJt=yDi9W6B{s==V;-G)px9nxP<-Nf`W+RYo-AQyR2<7B50Dcmggze9 z;e*1UCRqy700(^x6RQOWsGjxVlWMJGm_@#t_;{es$|f-UMfTCp)_x~INwVNAa32CN zU;e>U7;06v65Ntg(bNh5ggKlO1`1q;`4lqU+D0CIvHv9%S@zBtZsoeXu8<%Z1XOZF ze!g5N+Byan!#|4h(uf!@3~xzX^UnrNs2tHpxeAucyQBkEjI{VIYtawLam1vV11WK`}K#qUUDseJ@`<@=7RFq^_o2k-xs{fpLVozmb5a$EEu4WabH zBWXT=9VK$YrI7lXxH-u)gcwa6%k5#qZMx1h1TgKSd?xNgsdUqiJ}E?hK`@}?v@EQ0 z#$g`*=h71nj4TDc51i5oCE>h7B7{%vgMhDr`wBD#=r~NSy(ejQb#3cpLeYExxEJB{ zH3g;npI?)@e6Sf$m}#^qNnVO0#zEty0pKzm=Ap6Kib_Lty5xPS4@`TB#cyYZ0$J#a zY=A(v%6zFg(`0Y)f^0fzaIU4{3q} z0C9SvyEXn2@`X8zy&*7LTKaP%ir0aQfhxbDaEeZu*aX#|iqJf+8hC0<6b_v>=j+@b z>NdHw1iOZh@MaD!f5-SikdGah!f}6(kq{|WsAHb-(@8vIe1RCpj3>`HW3gJg;0~IT zWXeCJkyq70_vu^IW|8SJB7vNv>;VJ9D3ljY-*J_FX`x6b5!;>ZR0&{h&bck)iE6_D zigZ{0OkF}KTsDf*Ka$4R1WIUX(nwVMioxIq6yr_!a+akq@g5mC6Qfg*)~o=R<4W<2 zMi8XJb%SQSO;hfpclA`eTTzXQh*KT_4l4ZcVVzCyBK4O_g=xqHzv_tQ+h2ApITB9l zSC2`*>HR-VEj?4_0NLD*^oWI`1YWJlu0=WNtD0= zijs7YlT)@pXYqI@Mw*CCIG%snt?!3$+W7X)TA0NV*ZtvoQ{Mqw5cdy2jI|Z4019-X z62KJQo$hZm4QC3$%la+)yKQA(Np*F?hu!7}cIV{vY*-0&{maorsZUkcJjD%rPoQx` z$Z}XHntGh?+ds{`&I;WisoXc+U#$*-=?!oGj2h+(Jxky8S5(j519F)QB=Phv{^#CQ z@~jAy{p8Kk!}prtx3}NO`9v$_L($NHaZ&g$+?JAEL*%hb1pDo!a+1Iqo6lchcE62w zm(s?i9{`Ug3Z(oRs(Rd*G758{rCn(;f^kAtv-Wx{Ud7I1Gm4?8MQ-2w_}hmdm5i$I zsSQi8Y`EQ5O|6vTilXIy0<6DD(S=X~bHvep#eG=BCz#Hfw3M!8JxTdBr&2?x#URacu6OK13)i2M!5i$X0gPHw+VAYG@02ry2=XiNd35_V)X7wC z_xbSSn3ahbX5P}4S~Hlfh? z{zm6){DWtBGwN|QQT&LDjeS0Cv7n{**hqse@plj)_FB>(*c=DrO#LZZU53Hw<56@{ zzhs6}Iv|jV96nT~P|f%ZQz?2BWwYVtZld|T>va|TST$*twEL_hGT^4IOH6iIs!R>LKdLYL}1JF>R z&|Llj&)89 ztWE#HObkr5NTylwTn)4jUMfBOO7ysntbpq??$+Ji9R8wKrCex0N$rk2*8*;yAX-Ki zsAA8f>r}6lP`z6JW?-;b>PPJLsAArqGk$)Xl@%foF}SsB`9>ZwPH>kjMHgIj6mOu8_kZjCh|=&t!;pN@!_ z1ku!l-$m`jS8Y2N1bOdqSTT%~C!H7d8lZg`JUa=VCooRvOrt?4=^@sikB z-B1<j}a%KbYEW?+{@M~ZOG_C#&8y$!= z>gA74AxvyS7tQ=r8*i8hl*#pWFCQi2#FtK8w3RZ<$1NPJR0$M~3_xuHL~67RzQ6Bj z`X%AC@faBvG>COBVQlz^EkmW3&`X`J&x}jdZfNqlzrC~%^JXZpj{Z@=DX&xP{9bE) zxGyeYuWd3C#c<8T>fDB%CSXr~PfsH3|FL$l5W8>kqjJctSNkyrDmpWer_e40a;9UG z`^nmImM_XSdy{@&Xp8%pgF%+bF$&VE$og=*HmRYb6I|+j-j|=x(p75PjJ(uvKz_H? z#h+1CMO^VIJR8RYoSt)kXA z@m*qL-Oe5**=hwUpm$ub(wCS%pKhq5(okt^6cMk8x67m?cw!~9hi@oWS;%q%LfDDm z%tVOY7Uxsybw`mNq;zFqHvmlS#e4djd8tC&PJ|Gv{frBn!&T`#4N-(P?fIf?N(=j+ z%ogca!_NyL#Zu{+fDFcDy_pdRMF5nYM#>EH=!1#Nxdto(?ul~V!$f#wdzLtpR*{H&*;_5891ZVX>36qid~} z1XvwiKih(UXEY9ZsJKP?mIPswN*v+X-!X;b}R+$yaf2IGH>03eFd4*f7cflQ8VQADkg2vZJFCUJrXiE1ghG z`}y)NL{TM{ETs=in)d}1zyEQ9^MUlx`-twMdZ)Q+-A2!$v&Mdj<}uK!w4qnO`D5{8 zNyB4kef<~fnH!Qc?*~C?dR4l0gzfJjNVs*&=~uU@mAB~YxY)S_Mdws9I-eNfz}7+R z7m2ARDf5`-j zW`B4KHs_lrE@m)~QmB-jurpg+^&SiLhL4n5RM%%+sGhO*zPyOODqU(Xfv`3B-jDze z>wWi%2ao~fl8~7gn4y2sy|O^#<1<;?S#*&LAZAq82%}sXaOtIYgAY-+;*tWr(9H5C zQSi3N`Wx7XtpId+E0`@rG>izp3|V3mosc-@YR&V*vMr;)zC_dTE2TjO@%m#Ft_4)X z$pz`xZs70s$NoY?n6Dd}729hTQ??0G5E-V@%YuXgGV~)XOo}OiHgj&F7`bx3F~4i} z{*u^m`~qbz_yRs=%cc%qQ7#>IbVhcEj}&WE z07X}oKK35|>V=5ts3@mmTL)+-?~a;@srwUk1a>{?P7k}d?pGUZa-aKBMvUUVl>)cf zGMA9BQ>E_1eOESfeOX8E1J?Z+bGaJAC2lOM&=;5k#CTVePt8pz(9&2J3>X9(j&myv zjV(-WX8rQNEe$v7$KzT+f^Pon_J!-A>i{^#FvI&T_Wy87paF^0c8X4o)$1tO%aquHo8IYBWv1xS81#d@`{y-g%F}yHJ z%l%3n%+E7JOgo)!7ANk~tMR9L3;Wpz3H^BfqJdcn2USCX=ZyGaL>IM*%lvMO!88j; z>U^*GfsRMDmJ#b0HC)*C5ej7FYO?&w$NR^k*g9|ch~xV>hpbiO!?37*L;Y|)BzqJ` z<4ZGFGqoJ+D;i8n`X?~>=FRxtw0|_e4nK6#mzl=r%8=d$6we3EU86I)ae8~@LZw6l z2KmFdLQ6c5D^g<`9SyV|M_#f5Y`Fh3?-J^eO21~~L(|v9Qf??t6Z@z#DA(fy|7>F{ zspD{5#uDl9k4+lN1j2x%l1g<_u z#vh-3MDT2?EMIIoC9ILUV2xG$nTQ;O0Q{2ypoWnl2Ym<39)g?R>?=laua=L^FSVr_ zJp_xbr41XB2@};G_R7^@U@YpjgFgbY3hQC^#M7e9_`0WdmMVCZLc~Nd07O3G6M^44 zPW`7U{6i8;%E;v?S&WgNG$_`=6pu{2_r_p96t&QrTY_Jz4L;tLY~$~L{&wlD1#GE7 zQbohw=vV5+GMi{894_(%bdNjKmEqge07C)#jgAGR+N`s!C4#4$HpzMm(;v+3kyq>E z4q8b6ssFiVR!R!B;A4}94Aaxc*l5Lev*eK2OYQ|%y})o5a1%}u+PB$fVdv~DGj2Zu z*qd5<)Y%Qd{xkppo^W@pyg@N^AW`Pm!|iRR;?vl6V=L?EZ?fHrr+6*3R0xg?oB48Q zf+2||<%9jDckL~1b1TiECsG6n2k=8L-#EN2w`U0LTyuBZRx>U~?AFI+N?by3^+`cv z=%MO6NctD-UOD~CN`jUc>&+$Oem8QLLbJrqTJb-=(`R;dKeXbz#UT41WT%$Z(7lOa zfLpxyR#nQIBS7nqwr^K`nkC%x!&bsZYTAvMgd*E%nh{Z7v^JF@@ThPr9Zyd`H{Eed z@%(mOl!m^WbaR&|k&BgFLJpx>!155N z_8?li`U}0<9(cqB;14kMZS?DV*@U+CH?kFAoR4lB4mxQb>}g)xEq>J+C*k>X`EZ-) zy~CP#8SQJ_eiJFMcNCzS&GL6q@2(mT2bg|IbzIcgEWMm1t=f^gfX|tg8jdTM2axNn z1ioo?7}%G%RB@+9aTT}7{YF9;x?M6kpdoRuqpgY~TG%evMvT|p6S#v0V`bryjcErr z^q3JOzqTPT0pIAqe;>57^LY=wZ8jkqpleWeFMn`la!NFOX?@#CMM99R#u&;i>L0P2 zpHa7s9e5g4yP+N`O|Lz*`Jfo!xSvmt%;H-JFp0cnbt}z#%08-HT%N(i>CQ`--vF^9 zz)D6=mq7j>4mDxqyaH4P^p!lqg3oe9Lx(7tMri@u3V|95O0*xQ?FH{nFoI&k8oN&7 zPylH3`l%}u`fK#o&K|+Q$g=M*z?;Jz!-{>uxGscO0l&a!_fwX*OS7lgdKuW=lC;W9 z&Fm9r3h3O`CZ)jvUY$_JWrR<3+QmygIdezq>h%C z9;4WsodgL0S1*A(05qpRF5jIFww_`dv;iA*MN6eCwQEtGt8PDN4e+`SeSA4TloHm#TFa?GnRwB4Y*Zr`ovNI{hq%0R{DmXap8_ju5m=81s@0M@y;ppD;146JeD zZ@3kX{pS1oD-~mX;5zUzvlBA z+WPq^O*D1XFA%vr;6moC<^Icp2SPZ*8Pmb4Z6qXo3CJ>SI`v;OiV@}jpZoSG2%opQ zO>VQ;@E;*zV(_Thb>fu*@sM}t8K|w!*g#>YOJDY#K2bRRUEEjEnIK`S&doaP#ZX@X z)oDCbAx62#|MHwmz@wLFi?fMk6g83O2S*Cp9;|2svW8uOt=b3)dtn0q&aSyqvb5m8 zneM9!;p&rr$89yqZ8GzkeY(;58sqL?sjn2z_qNMs&s02a;0j|$kTm*7a5mvJKMWim z%~T9_JmsBUD~kmI8+`Leamg~tkM}#j3~1U&B%jO_fCy6NSN;p;xukde|Ng|#<|S81 zIQh1@1Ww(xzGuGoXNr#4Ku6)LYF0eVw=DSu>VY`ZjRGY}O4n0(wH!Pp*jAO1C&o`@ z3>JL5j@FOT$-1tfqM@-qn0IJnV?)*nSvP@YjTY$1$OPHx*P+#8oDuzmptc^)?4YQ> zFk|Cav9NoGrWp}`dZ6UOjvfyBHu;Js+G?_DUp&D~`#M2Z$jV|*6uA2g{~h_K=|2^o z24DBgp-eO15w}lrB9k%pg{Am6ejN~i)^btt3Z8Ox)I^M<@}+N+J9|e`o8+->0gAA> zDN*qdfTUbUe(LOOn*=t!u$%|E`Scc%CBcpiEQx0HVmOUaM0g!hLY2x5xXwZOYb7wW zDY%)P(YstYTr0>+$2S2fI$$C8lhi1eD<$G%^^FTfKivou(Dm`z#TNYFZB$I` zfQJ;##OI+Nb%4wT*p(yioEAF_){&hKGzv;_?VG&Zaa7Qx9k ze%s*5=dN2CO@jb&b^&=R^FKY@7yp3L7nkAG1Ozb@5o}eEWvU)V_yy=?YUawW&{D{!fO&NCo!wSvYCxDK zSuzf8{Y@{IAX|s1YDmdrJ+?GV(M~-az;we&PryNr(n0 z#H%^37?RMwQM@6DmFqu$Q#OE=vMk7R** zk8KeGW*ZWrZ!!f|^Ods->hLx7yi++Gkwij3E+LHzfl0+JuSir9q!if@XX#A$AfrwG z;hfEYjUEmbd+RxZT2YyfOzv3V-w~GHI?k$o+$DZbW+?V3LWgDX*|rT1#cXu70Afov z`fG%fs_$Dv*nzG6bt}jEvX0r0jJN-uG1(Rr7Pbwh3YUKzAm@(OLuHXuN^i9RR*0n` z>%bP8eq?>UP-S&BhOtyZ)xqDtZ}9CoU%Viq4+;)OiU08y^Ma(S)?rPWOdawe6@TU+-~8u+A2|B$ zt|w#$;reiv`zWEU&8jn}W4~GI8*OKB$3aB&x7>Qh@$Q-vS2Ehd!q)O+p5Qk=5mqAI z>4E{z1dY6)V&ti(Op*5s4vzM>%swbm!8rKeGe@2UYhdHIo*jQ^PVs%H6S$mrIy%%e zB$c=T8cKIy^c~o}?00|Zv_RQWI1rO-Y0!sJOe+RG38L^frJ!-3d^W$KcUUj2p3 z8UJTH9jpqvm4}z2zT_rjZ2zsN+>-&M=`(Ra&SVN}AUF$*@q5!iN;57j3Eq}exoH;1 zdkNq~xsV$cpR)|H8aUTht@kDxHfi(<>GeuXTNr?d1MZ@?yw~eFF`FGI()%)Ggx3N34q<}LqNJ(TH zYj3^^6Z^yRbtFG&1X8`I%TaV98OdJ1hCo>h*2|Moe3h2(9bi)LH7l)hM`#l;Bn$1r zJo?9(7GfGLj4@^CNeo2g8bO1x$0uHgj@&wbXDsqN&IqA|<1Rkp$pi&8`B{bj3~c21 zL=*llToo^xp-^@?iA0V&XdChqTRj`l-ghK9rAbXP*P+JjB0(R#2OQMs0d=oTEhb=~ ziirv?l!Akkn>$7%T9I!H`2mU3vnR&XAkxwn0ny*x$$ z6GBToc!jX4kModn>ocD%xp$*C)Fc6(bS(KR87km1$0A}79uHr#tNAjTV`oRd{tfwX zz46^JZj;94Y2>)w{xqtXjtO0k^*H5H`MCg8XL&0Xkum8?4AF2ldW7=t%TJC{CJ~vK zo1s2^jBJ3Y19xzos~$-KDO`U6*f=v1LXALo9R9g%kgGcAs6Fjf^AbL%`NJZ~?tVoQ zI`G!XNV%SY)^A78sNpsO;lW2jykstH7NZVfpi-3RwUCnTOU0LhWJGF&j7phF_Z`o< z?aa29z9$8%YsXtC>wtCwQ&(GWmL5>|Lb}r3F=*`O1D75SY%6so&Q5+iidUCS$mA!{^^R>T((YP`PO@nQ!7b!&atCizHFhVc}XAXHD(i&=+^;myZ{1T@){eylG-0ZM%fTf-be#g2Nj=B|*xc&?5`RG} z=Jf1IAC%kNKE#S;+CYG%5yj2tRhk?GId))VER(IhB$B`f-G3Cq3FG`7hH=3*VSfn{ z!o-lI^&g>#Ao1T8sAK3*Am@RRzcw7`q<;NPB=MK%SbagR{-`qqDc5eie!j^nwNwcI znf*NKpOkI#Yy`|nf7mk6!`vJSc#4%z8p~8v4Ofh_F?r*afB911W@&_XOn!Tkp{Z^zU*wh z8M-c=$HRLXgt@sM^7t6t%*BsJT@2c?9-9=5L;un;e3(Igf%B+v^N5HDeN^Pk!ry9@ z0n#Wu=BVD^C_vEm?G$!GdIUegHTl3NZM2skZK+O&Erv8gV1=&GyAH6zn>Kj#&p-%IZDBaJ5Rcj{ zjlvmxAlQZ~hQwM!RG`Z0bBeReb^D z;0?X%P*TfHs5C}ViBgZs-mi`NFAzB`Hjuo6ts z6tR)}(QBXG@b5d$W_rNr|2y$Bp=|O#&7!A$dhSnyb@?TQZRpJXZH4cD9rsrZ8Q&PF zAGbwtVm8E?_a&?a;3i;_f>w?YbGkJ{sLYXpyCih_D1V3uKHpv@iD9Es)uzk2A%3po z;mH{LGh=3%#wmQxFJhGS>*ojWlplm4YIoc-gmAZ%Xu9Lk0_}C|dt+Gq;Fs&tus+Lp z(fgP77pl49v{T4BZ!)2dEQp(R5f~gwfFF|#nqY81LPy(*`wEY&M703Nh{fVf6vxTZ`UOsP2QPPm(ENiG95n{TymfghDpNoIp zet*kw5eHbF-YH)M)MM+iFhn;ixER?@CFDvIXXl@j0mEtTiVJY{B#8ag9j0skeMZe{ z3JA#JkI?)%8Thi|QVW}zl8fs=n}FTwNg(tE-kom}uP=g3ytIg`kmvwRe8%VO! zLw|Bh@OOm9>8f5gDeXYt>_b@7Vs1f6lwJimcG_2GJEtUC9~V z>Mbjv#br2PW^dFy;&diufH1NiIxXebYCRi z8GnL{bgxU}>6Hi(t``z^7=E}Ra0lu0X6tb^`U4AWxdQm1MrA9w1fyofRwvnS-4E|^ z0dt~@O|^KV=GD2Dhxqu4TzNwkDX9umlN{Y6Y$yy zTswaFjVoj1agvQbU1rSiG2M%RU>_JPO%t{q_^t*X3yj{h9}P7RwNJgg3MZ^pUfmRb zBnDKhp-@f^>36^GyUweoNW%D#n?`PlLMHxvn7Q$50dyb>Y56T_mg&e7--+pC*n?0G z9KP*l`H9j$_}QQl3235I^rT(iZHd8m-^-v7mF2y~KtdBr@0NfG(RA+yg74!U0mnl* z3m6y)z7aR=H~IE7#{!7|($^6eB#F`T55zdp$y$>)@22t(gjA+XO09w&1rg_Q`Ns3L z4w5l2kc*J4gTd~2S5IvH3yfBcuYdcyHGgG=yu;r8K>?bcPhyQT?ZnuP2~U60n0~liZv8v~-y1CuAR@p~)nM_|DGXc=6mZ5A+Cu^oLx1iN@ zsXP|+v8L9yDc=T>`FoxW-FCA$T7cnR@n7P|A3YPG`P)TTBD%|cd#@DdOeD8!(zycU z$cBJ0hJUr8CdrmS3;RIOi?@2PX3LpSe1?v4dJqyiR`$-u0bK5J z`Z4{TwDMUFqh^`dcR4x&%>{70tMKM8B9u^PR3#k3_g}w_+_&^w0Y*$%Yb|we$%3~_ zV`31iNysPFXPk*MkFq20gjUg1Tt~3DpPWAweBn>$4S}Mg(kD=Sslh-G|8(&cX#IQQ z_IpqSAL;QUJ`)38iug6^@2Lr<7JC{0ZcPBnjih_Y{T|1EEBxE_}4VQ5ar* z3KUs(qe1g3B#abOYPByKP`7PK`P*WZB>HUzgWY7c13l5De?;r(q>p}B*5FtUtuZ2C+67nq3d!q$Hzaf1LSp>$Xs(TLnMG%pR-J?Jq}}2Qln2>&NGC~G zMNbW`JTQ$)<8?%r=Ck3UcbxhT*xu4faoqV-H1ukiK`2-Yv^QHXG(Nu9a+jBe@4qv( zbIX$zzGb0JK&c`uhXq>&qt{UmGhT*3kQh;D zKY@1Ugmy&`Ys%?o$xZ5P5P&zChN0;Mx=WGTqMRjH%k;^;7#<&I3`AjDw}zQOvy-d}C1bFR@S zzi25bPA;DcRqIdW1EU^_Qg;S9)ci?eq9v)3ou8U~Wps098A?hNPHUmA&f8nG%#kCI zUj{#a^tv)u{a4<#ne}nbRXB!n#F`G2f4)At2 zj_gN@l30R<36s}HMW-$t-zqp+w-iBkWO$l+3QEWl{Fv#>9q9S*WRV@g2-Yk8AAJH} zsJ6KCkY}l@0#cyxTiWJ0b&#S)lr)Hu4{>TTp0D~$&@tPBGz?iz0d_0D)Z^hd54ETx z;v5#6_1+Hq%($)tIQuzLqmyP&`&SbxNQ@-MtcA?~$RHNCrU)kwav2 zO$SYofdOm({|=ZimC8~a@6A?%zKHwflZ>3q>#14~lZBQ*)D;N`orfAW)BfY;R#GZd zOgjC5F-{FyJyD9FTDx-YX|gwb0niCPIo*p%j9N3a1e{is4xPi(9q>j|qmg>4hr3q3cfA9{~G`PccwVMeqZ)eA^fbY)n+sW`{(3wED@}elB-c!_M)N!mF z9Eak!2dN-tF&`XB#n?@XDlc9wQm~FB| zC{zt)G)QR9wIk6t`WIOC9v^+9bbkr;Uo)lQQ;mKgq>1iQ(NT^2 zS_47IDFnTC3jaBD-4X)ODwZZn0S98SVDrH6_?Zyt>laKDLvhfvrmjJTUgmJ-8Led2$o+LmJ{Ic0()RV! zT**UC5vyDN@|gyzeZaBE8_m9as|I0QcYpm!(4vBdUj#!UgPHN&NU&Yc9`A0jon_x* zA%RCu=+ESNDNl5qZ_o!VAlU))BBCKL6cM21iMRLLl#3zi{vYf91QL)ZLPF!YiXrfC zOO5ufvKT9}>izgA4YLB-0j}9^w!HVVt5tmnUk9SY9DT{h72WC_f=$V+x_fvI0JP+= zzeFb*?qyxxex{D44M;!p?bofI7jxyn5TI(pfSAV@bn?MTD|jbIZ1m9kesc|{o$tM$ zgZA$dm3mk<gpKSZaHtsgc;XWc=m(=o0GE@cz0t-+tojd=^Bx= zeJ19}gO*e$v%o*RA_Ur$Bpq!8ci0><;zmK#ad8VPncZTe^QJZH+hnf;n6$Z`WY8#V zc-V9ug@e&u$hM(LRur^TM_-wrb8=GcymBVXEs!K$87+6X%siO!`ub@ zJC5*baS-(0jTqcG0ht%D6liK95m7s@AX=^o3j=2en~E1qB8jOWR4FyF1V&6odcL;p z*3A{-+YV~W5fA=(@GoPZKUr8dV26Net4`Ul%k3lDvAjAJeHZGX^`iDGmsFM^#7kcQ z{95A7!BCKa1S9FGmgBZ&`CU!osWN<%qPuX+>FW)YnO}BYcI9-+#>npC5alcWYGMtT z&t_D2|My;_Zn6rz3sFvhmI;8g$pGvUg@6c)%BC8$tNSwhm(~30_p8uENQq$L+&|?f z)4w-oH<$C{{r9D$8+QxgT=w0xudp1Th;4*hL%B*9D+%a?U<(dXW^pwAgz?u9>i2ev z>4-nmcMaUxYUjb@a+2yes&x7<}4$&cM%{dpRYiX3viFb=Z93GLEJ_B~|z6S}yh z$kzPy>+FSaL?1!*vgS4lnZjQ8PDKQ7{Azaye=PeFT)p-xA1 zUD}HMO9$`HP8V|sI8|ay5GIJA_90W1_-9e6-$XM+8`!SfMDgJ=6iu<)V5MZ)(Q63d zi%mEA!x14tSzKLb8WCw>SuKJO(;5o2oW^E>fdHfnI#FZb6i*)PATybXd7g8M%( zv;|}i|AH~M7^LAwWA3%X@lP$D@)VesqXI^w(vZKb%*(4T#FAgyEX?ge6rtsE9jl0?!=_T<}-Vf0RF_awP%TsXv*k zFZALx#P|XIPK`X~Oslxe_Jg!OU)W-rhxo-v8*5&@Q2gt4e%+hDQhyw5Nayzs#(W9X^r;oK3!>OJvR20MR12EZtHJ8U`m_!54 z8P-ZzCzd}M@X>Gnax(PH<+{_<}4kjqCZz1=+BieFlsWnt23-{hr@m+k28NQG2 zwS^0as%3$j)>f&*(X1rhS;?o6vh)E!1wY6nIB6|T*3pFS z<$NT(p3@H{*!};^g`Uaa1qIDSH_eR|a1+=>dU`U&aUXGAx2@?reC-glU}){jK3{0`i4SS3BZdpS{TA7_o-%0#b~4}K2LwsdS4Zd+KXKZd95|R0sA1n3Bh0r^ zM{6rqx(Ds!SSz0pz+qv+hnU9QjrL-v{r9^X`ue*lf3Pd4pUpN&ICbf=QGruK_PK{2 zuH(`EzrI<K8`98MsS4m^w^j6P~q2cdv=k?_-g)a73Np(BKRuc{v|sHyR7f^QlO;3 zD}m^501yE6mL>O?`_m1C8lK&s^O)>UUE5ouOl!zCHzH)d{z9p^rX{UTy>{8Ahw@v; z-BYEhC~E2(fjpL3dI9c-?~b=~6-#WaS9pLd&}%oxlMiLtHK*y<6kFNqtT&$uqRJOm zXo(y=1)Z-d_#Uf77p+7~{T=&OvL1b9#{tt4>pLiD8X9`}&iWm@1w)n>>{Y6=o=_M* z>j=HtIm07&H(}MEFKT*{3}v=_&WDU_H)_*Es%lF(I+L` zH!Z(TUA+?!>G1;UOuUmKx_qI@5i`~{8mO%R<~jES zI^!+cmLde&4U_UL7W$t&V?_?&@9Ppx5L~uX$TM^eqT>dfsa%%@s9Z+yV!6BF+mCn0 zsLA9cgl?al=phaq-cb}@7dsq?dS0*(_-GO7xpd9PwQE)rin#&%Z*AbVojx2*GN-rl z%ok=p{|Jdy5eniM6e!7HJpEvbZ{9gEjkdWDezKO}&cCVW&XcmnLxb3qPUEyELn$34 z>o>`&5GWL1E}r5II)b{+YGf*hw%Jg8&hL@RBP#c;BpVyM{?N0{vokpY{FK6y5|qNB zSc1EYe!_E&I#(7zcN;Nqg1*UOlG8wq!5ibBQZDV*fXok=WCGssIvaE!zG0<9qc#sN?V2m2@Mk+oV0twBrCMQ}&ZVD5 z!Z|MFl*<;B$Cg1GGqBvr6FmtLKWHr zU06kLcxv^qQ(;<>N2zc7ZbOvOc|41jy!phNwYR`+J#1MH9@5Pl z@;Qv7hqq&F1Zu}W1f2gplkv~N);e?=Jrk?r1ib+COK>5JVI4Pk+Lg`P4`O29Zhy(vKZ4m%BXM91M8=5|LgqxPMZJwl#v5JBf(n!^ltx!+l#j#c&(;7pLg(KEVxpzR&hnSD(x3l z8S0^{%KMWR)u^MTy>adNKw+z0(@%SRi=4TbY-9gns3y=gz2V4;h?ukx4o7%t`_a*M z098pxnDI-;t7?M|3~cN;8+&`Gq4aA&SsxNUh(gag!Pt1-I|eK^2}2VzQ@|zmdsaO< zxx07W+Cn*3!cWmCnG!wW^Df&>`*Bxk`^*CGxbnz9DtUX0#1h3(&6|o5mXTbHNorFv zCM~C%s$pON;Y`trhr(|FXAv4_W#Gmvw5<;)#PQD_6yuUl?ZSbouP-(6D@!f=!m;~U z^8A92mYU1~uYx^gilAE2kH(XY!3>#xbHr&SkVhONp20_mfWndO~^HFq6@+dgQmeA@QrvvoXWJmoEP(EP_DbL2XV#sTS>*#9(Oan1CsynfOw^>~ z(JfcA@iRwYiwhTP?3zy-tiWosW1s`{`L?YsfR&miO!@1IQHKiLRg~~RyvI;6>aelv zepYul0@r&qL}QR9I5BDd-V!NY>pT%Ja{6XOJkj*1SYz~R!VfAKdV{vi>E|jkJ0Q~+ z6E+2$S)wsh1BD{UfB|M_IrDE_3Tc`ce_9m*iW8m-?uy=|&@IAg}N~+1$o<`X(qY!{WGT*HZ zuZJA%sALT^N`9#!9L>zktn{y4tZDm=eF}yke^np%?XDldQ$5wfJcL+ImoU=QR&4-_ zt2ixR!4}{u8r`f@#90JjC-CJ1D0T_tmiaf z4h=YJ#5{}iB8N6vxw!{-erBDOtNCNd(|9vI4;xgNHYraPHJ#C6n54lYM}X0~lpSO! zv>)^us#c1FhPhP{9AeiSQhQ?RUe}TlijMR5_3tBeWFLdVe#!fbE(>S4v8A0`&JXuQfbuJ=aI#h+L~ed1ArYlJ5k|9~6P zi-6Io1bBK=)OQ#X>gCEkDQQ5@X($HNj*+*u#d<*m_S#E_fel1}8hpbOFpG9t6sO

YS`-BucsL-?Su`@BTb{@Z#8H_{Z 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%0A>Yu>QKD@^xa>spTwhOaGcZdx6S&wQCUBt^BXa6m zfeY1sajWWGIK(6<*-_lMf6exZ2f!Dd|NQ*?d8hc61ck{bH546z^$O@tYT%$xGUy~u z=q-h+W}vyr`>E1zSrkgIetmoP!M-V~$1gl${3+tdf*xThn;n6{Ih%Rs+b!A-W+l1- zdTjreH2<3me1U? z?iA0ri3|2xKB@=iX0HU`LPb~L*`;^O?;m}1w0mRC&mz;ck(=3idwW5n;PKP1@jZQ6 zDJVDNr3k3=1stCc22S~DgKqCV!aQl4gPN`kde^FjCj*#3QVbsKlDl<#^NDRwFU&iu z8R&TJe@^yUrxdnR2M@%jSu063{0dR5mfik-*#ifrf53~27PSEjYmI}A99-aAlh}aU z3_{+qef|1>|6c18z5-oL8ePk(6PSd*?cb@l;1-kVLn(H@tHnZ}B>t%0+4Fs`E6eFk zJeN&)A6w)V&wH+`6QRt+00s|KJ2@Z7zDXDU_99^|+qKG{JO9i#xY4gV$N%^J#h=-Z zZ)VwEc{^=`)jTDOJh2`3gA!gt^fByVHDrV`1+IUFvKR^!)L={}9~i4;28_jl(31pp z0E5C27O1pC2Pc%(ARr9WqBv?GC@3fj!;fFT$Ff5M^nvi4d6i$d3(jP7X5A|J3ljBo L^>bP0l+XkKja4H2 literal 150279 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

kilK#*N0( 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 z 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/static/img/push-notifications/push-notifications-flowchart.svg b/documentation/static/img/push-notifications/push-notifications-flowchart.svg new file mode 100644 index 00000000..4111d279 --- /dev/null +++ b/documentation/static/img/push-notifications/push-notifications-flowchart.svg @@ -0,0 +1 @@ +
User logs in to the app
User enables push notifications
Send a private message to another user
Create a post
Receive a reply to the message
Create a notification event
Receive a comment on the post
Event intercepted by plugin
Get all user push tokens
Construct a message for each token
Send messages to Expo
Expo sends a push notification to the device
User receives a push notification
\ No newline at end of file diff --git a/documentation/static/img/screenshot/Discourse-Plugin-Email-notification.png b/documentation/static/img/screenshot/Discourse-Plugin-Email-notification.png new file mode 100644 index 0000000000000000000000000000000000000000..d0912808802a58aea0de6fd7f4475996da3a612a GIT binary patch literal 67703 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 literal 0 HcmV?d00001 diff --git a/documentation/static/img/screenshot/Discourse-Plugin-EmailDeepLinking-Settings.png b/documentation/static/img/screenshot/Discourse-Plugin-EmailDeepLinking-Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..bafda321cf6b000e010d5e8f294b16703c82897f GIT binary patch literal 138504 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'N*`yvRBIj2 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
RZ?Yh8DC5> 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 literal 0 HcmV?d00001 diff --git a/documentation/static/img/screenshot/Discourse-Plugin-Enable.png b/documentation/static/img/screenshot/Discourse-Plugin-Enable.png new file mode 100644 index 0000000000000000000000000000000000000000..c96f964edc05523a5da58650e604291bde0b183d GIT binary patch literal 129927 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 C!8$< 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%0A9Uc&h1>(B$?7Mrxxdq7rr?_J=f&atgU zh#VB0eHjQLbTNcGnpuaIsQa`HUE0YyzIfe*2&+#Ew7d# zz*FUPemEtP?~+GW#AiSvNR$BPEM6zu$OKa10@k!2ob4YX|6=Sk?6Wmfy_i*GHo4rJ@~S}-h6>mq&+sHWnx12Pud0g2?e z2!Seps$k^vUw|CK)qp~ZU=+lYfH2I}(jQoAF$jX0HZhP1EJ1@HCkvr@A7wO&xF6!k zR-d-eOwQ+;U%luLWD0~j>v$~XgTKe+{3z*wQQt;3#UoBlf-7}c;ify{gT{S1fo3f3 zCrIVz(g#smEcZIf-sAwiT#YQQzB2@q)w#dcYZ_j@rn#fDU7#MBYcA^RK;tw1PgBA&*?)T{hpfU31*%2smj#k7_0|}hUy74 zuT_E>YAHHxjBp1VUd?9SP&(tQ~>`wdTB=i?B#aT~( zeT%v{SiiH}>@@W+sa5a@B#m&o8s%nn+TW|EBzM@bP(w2US5x9SRJ~v63;hE8ry(5@ z=-@SOFcYx#f9?0>kaYC z_Sq13*L%Vve$HhMqUhg`7}QBwN2gUfh94+>CN821{r}>sPZJ`Jn!XF3Ss+cGt*e;a`w{)b z&dV`pVq^+CG0~)vB@SKdZTs0xJ9is~{v3O~hiDH;fqA?*Us6ih#M4%fYlo{EcN6v} zm;~7@Eyx}Ie2MiB>AB@^dI3LV8V50>tE#30A6&j$d`GvofegNM7SfO>0aq%ySG4+Igrt)v0g7nbus?(Wh_gnb0`EJ2zr7-DCm;SQzF$ z+3CfEz%0W5V1~@jTKoz4{BxopI=gc=p+OxrR{&XB9gbdEaul^oY=ohM$mF zxcQdB!)Q1{0;=4*ISU|_nl^wWY@mVNE7V>ZfQNmf*Rr~PcK1S_yAq+hh-n^QCS>;BsGo9}GI&c13D=L~9Rq-WIe{d% z%!;ML@cpqXK&lsKIQw7#(Z;Re`*h6$Z3JZ(V>HEh8l@`4wR^t!Y^>!r(okZdzvUO5 zC*@B&U-3WtJRIvIC7#mqIb=+6xC3yY*BedrCi5DO%sU@H*tl1jZ;#|XuClTdUdwY= z09RanN<0f*NW9l)@a`$o@Wc2x4!Jq3mi4=5K-D}≫j-t?V#$*liibGgv1KIA3IFW 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 G_5TAM|Nj>N literal 0 HcmV?d00001 diff --git a/documentation/static/img/screenshot/Discourse-Plugin-Settings.png b/documentation/static/img/screenshot/Discourse-Plugin-Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..79e23b04408819ceaa87545e783b3d7f27b3597e GIT binary patch literal 107801 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

D%g?j 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

AOLU(^BX{kAG3 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�@rL_bYbUTNYyVaI6WY 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�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

wMELi+}3&{}~W2|)Vy%q<2L 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

sQBKNTfp@0H7gxK2`59QX8=E= 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

_#SUq6M@@r>5p5%}3J6MvZo~ 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ʲ=n<5`g=MrqJ;H2m@ZG?RPU5@ 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

mg3ir_}#u6%-p&Ri^(gp6bgp}{s6hZYP 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%0A9onu( zx{Z>|6khn3%odxU=QZA>9b)E-Pfq^XdH6P`LbqvR;P6l+H5Ut!B!PjRpPxVe?deha ziYi`U5cr2hw_-U_hnFB#7iV{}g|ncbP|2qJo;EBzoQa76kc)0|i=Bu2QS++p0qM>s z)l(ZOuNL|ottgSade{O`$Gcqv9Iv`1s$Tf ztO8Cxz8zPPZHvLhatB%{wHqol2cb{QEAE$O+8`$1?BHFEoH>HxnZH7!aG=C5E_LW^ zOX*%6Yq0eYx3J~M@_OwLP5UMYc_E?D%2F&bbEGfZ027{F5Lal;0II^QJ->?9HP_0< zcV1$+|L%LPnH4OVzEti}I%E)%P#^N?ydi__I!cf-9uEJOf5ex-B??af$4fYjU(<%O_* zoxnvmBAhbAjMA%*Q|XDAWc3u(pedPIP>#}aQDGRgx|t2mCa!(jZ*5QT8hYS*MxUvu zD+@D=bdnb@UB@Bmbxu(Fyr4%nS`S7W3eZeqh@4ZQJN`BC-HRc_Ix@Ww4L6iqLnD2Q zuOgDUCt(;C+j5Xsu#_8ekv|vnc%fgr$O99C6aD^b-=5s^H)0D_(*(D^SMg(EeZ>%? z(X3rZ?+4B7P`BGw^a$tYkMqCwfOe~?F}&WSLGWZSnlo`0CvIu@eLWKm@k^H{=1dD~ zxzUs#TSOCH1{~21OaWRU(5h*V+Ow18KMZEGHtH9wSchl$ubD#v9e-KNO@j@*5f*Q? z)w)2^2xe|igAS`bzUvR=DJV=*jzMF7W-@W@`AeS^T9W>R@3*fNm*)KD(JbysyuTR` zW306xM)Vn#)IO^&vze;DW9NP$0_GDd=MFEOq`cS6TSN#D>rM6ENDU1ubf1rWCzC1u zA6dQ#jDkXkY0N%su_vB2LMHUnq%7$z9CnbISYT6^X^8#!*#s3^~8aSQ0P3whT}P-_mLiiD+Udn%EG8x2y147id73I88sZY zEDR0FdKmBNP4x1bBRQ=iX2}AZZIk}*|EawA*+Tc%i5pokf5_NI^|5F5Eu?$c`x`L# z0X7B3)O+}9ijUQ%qc6j&B{CCkEH{|n@3=bSRX&f{V<&&q8IpRdE4>DxW4sMj=24lB zm1;1l$e63P!tmpme^;?MZ9QYP2W6rBIv*YC0A?u5UdQgpj!!dZ%Kdrzwkgg-A4CZ) z=26{ms#G#9<#sEX3Gf3b;9Rfu9!QF36bx}IL+oNSXx-joxV>&gf$12V00WD?&YZ=R z841}86sh_(sQ*Qt6p+-NeM8HOBd)gg%6Tw#q#tLv2%w4(iH)_(ipkp54xbM-=> zB1uVDmV`L-BXm~{)7wda*6^sqV44GN(4Dk?0Z=y7lPr+quGVS>Ij%-#eF3hq1S}!? zWr8A0XK!45x#pXd3RC*M()PX-DKuJ^!T5437A<*`;h&$*~>JfT_Ebz`lDIDZvY zRq{$|(!594i?HnDJz-<61AT^Gq^Y;p{9&3uCOo_sx1!NpeURN_@>W^rv zk^idfZRm5J-UEB{ovbggQVK9Pd5NE}2<|LU>`*G-Y|C~PlXZ9}P?B5HnL8*Jl(s1; zHM)gt*JgaS54b`KXp_%&Z|aP0K^a83{HGxNB!0>7=M z%Cm6I{vJG?#xl@;9Sn2)<${JI4V0!1S_+DmTVq`V4m$GTv9<(m#zwnQQlk3@;-Iys zebuYRJk~$1H5=MDYbZOqhSc%b)xqi}OSNk+eXCRbo^BTfICXpBPbU}XFVn3d0cUMi z;>Xsk?Wi%L+qG;;hZ;JZ(?kLKfH0@`|?uWCDx5(i!N{ajY`QLvuzoOnIJefHI? z-DFXi!J+vX<>x30xjCh+ORmM~#R~FS-P`V_4aV9C!(pHZKR*zgzIHA}<~fwZ_j
j>yN`j-wx+f5#dLjdpW|#o-mVEo-m`(j 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̇rnyp>!=QKE8 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%0A|lxRc$%J6jnk1Ss#@HY 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 ^K3`3a9|vk&j+btc*y>)~XGFF^N$rdHeF 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 Wssq{D>M7g6kIE$t<;)AWz5gE^0ZDfN diff --git a/documentation/versioned_docs/version-1.0.0/app-store.md b/documentation/versioned_docs/version-1.0.0/app-store.md new file mode 100644 index 00000000..941750d5 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/app-store.md @@ -0,0 +1,276 @@ +--- +title: Publishing to the App Store +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +At this point, you've at least made some minor adjustments to the Lexicon Mobile App, and are ready to publish it so that your users can download it. + +In this page, we'll cover the process of publishing it on iOS. + +## Prerequisites + +- An Apple Developer account +- An Expo account +- XCode is installed on your development machine +- EAS CLI 2.6.0 or newer + +To get started with TestFlight and publishing your app, you'll need an **Apple Developer account**. + +This will enable you to interact with Apple as you go through the process of submitting to TestFlight and, eventually, the App Store. + +You'll also need an [Expo account](https://expo.dev/signup) so you can build your app, download it, and upload it to Apple's servers. + +Finally, you'll want to have already downloaded and installed [Xcode](https://developer.apple.com/xcode/), which is what you'll use to upload your built app to Apple's servers. + +:::note +If you don't yet have an account with Apple, you'll need to enroll in the [Apple Developer Program](https://developer.apple.com/programs/enroll/) first. Note that there is an annual cost associated with this. + +Additionally, you'll want to make sure you have an account with [Expo](https://expo.dev/signup) so you can use features like [EAS Submit](https://docs.expo.dev/submit/introduction/). +::: + +## Register a new Bundle ID + +Each app in Apple's App Store has a unique **Bundle Identifier**, or Bundle ID. + +In order to publish the app anywhere, including to TestFlight, you'll need to have a Bundle ID registered for your app with Apple. + +Typically, this uses the format of `com..`. + +For example, if your company is named Expo, and your app is named Expo Go, your Bundle ID could be: + +``` +com.expo.expogo +``` + +You can follow these instructions to get one. + +- Go to [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/identifiers/bundleId/add/bundle). +- Fill in the following fields, and then click `Continue` + Regsiter App + + - **Description**: You can insert the app name as its description. + + - **Bundle ID**: Select `Explicit`, and then insert then insert your bundle ID in the input field. + +- Capabilities + + - You can leave this section empty. + +## Add a New App in App Store Connect + +Steps: + +- Sign in to your [App Store Connect](https://appstoreconnect.apple.com/) account. +- Click on `My Apps`. + App Connect +- Click on the `+` button to add new app. + Add New App +- Fill out the requested information about your app, and then click `Create`. + Add New App + + - **Platforms**: Select `iOS`. + - **Name**: The name of your app, as it will appear on the App Store and user's devices. + - **Primary Language**: The primary language that will be used if localized app information is not available. + - **Bundle ID**: Choose the Bundle ID you created above. + - **Note**: double-check that it's correct, because you can not change it afterwards. + - **SKU (Stock Keeping Unit)**: A unique ID to differentiate your app from the others, similar to a product ID. + - **User Access**: Full access means all users will have access to the app, while limited access means that the app can only be accessed by certain roles defined within App Store Connect. + +## Configuration + +After creating the app in App Store Connect, you'll want to jump back over to the codebase and make some adjustments. + +### Build Config + +:::note +If you haven't yet installed the EAS CLI, follow the instructions in the [tutorial](tutorial/setup#install-the-eas-cli). +::: + +First, you'll need to ensure you've set your app name and slug in `frontend/app.json`. The [slug](https://docs.expo.dev/workflow/glossary-of-terms/#slug) is used as part of the URL for your app on Expo's web services, so it is recommended to use kebab-case (e.g., `my-lexicon-app`). + +Replace these placeholders with your desired values: + +```json + "name": "", + "slug": "", +``` + +Next, configure EAS Build by running this command from the `frontend/` directory: + +```bash +eas build:configure +``` + +The EAS CLI will prompt you to specify `android.package` and `ios.bundleIdentifier` if those values are not already provided in `app.json`. You'll want to add the bundle ID you just registered in App Store Connect as the `bundleIdentifier`. + +Then you can see that the value has been updated in the `ios` section of `frontend/app.json` file. + +```json + "ios": { + "supportsTablet": false, + "buildNumber": "1.0.0", + "bundleIdentifier": "", + "config": { + "usesNonExemptEncryption" : false + } + }, +``` + +:::note +We set `usesNonExemptEncryption` to `false` because Lexicon doesn't leverage that feature. + +For further details, please take a look at [this link](https://developer.apple.com/documentation/bundleresources/information_property_list/itsappusesnonexemptencryption) from Apple's documentation. +::: + +### Setup Config Values + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](deployment) to deploy Prose if you haven't already. +::: + +Next, configure the **Prose URL** for your build in `Config.ts`. You can set a different URL for each build channel. + +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +```ts +const config = { + // ... + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; +``` + +### Setup Apple Dveloper Account + +Lastly, please adjust these fields in `eas.json` with your account information to submit the app: + +```json + "base": { + "ios": { + "appleId": "", + "ascAppId": "", + "appleTeamId": "" + }, + ... + }, +``` + +- **appleId**: your apple ID (e.g., `john@gmail.com`). +- **ascAppId**: your App Store Connect app ID. Find your ascAppID by following [this guide](https://github.com/expo/fyi/blob/main/asc-app-id.md) (e.g., `1234567890`). +- **appleTeamId**: You can check your apple team ID [here](https://developer.apple.com/account/) (e.g., `12LE34XI45`). + +## Build your App for iOS + +Before publishing, you'll need to build your app by instructing Expo to generate an iOS build. + +It is recommended to build your app with the `preview` profile before releasing to verify that it works as expected. See [this tutorial](tutorial/building) to learn more about build profiles. + +Run this command: + +```bash +eas build --platform ios --profile preview +``` + +When you run the above command, Expo will prompt you for your Apple ID and password. + +Once the above step has been completed, login to your account on [Expo](https://expo.dev) and download your newly built app. + +Navigate to your project in the [Expo web console](https://expo.dev), then click on the **Builds** menu located on the left-hand side of the screen. + +- Click on the project you want to install. + Builds + +- Download the iOS build by pressing the `Download` button in the `Build Artifact` section. + Build Artifact + +This will download a tar file containing your app. Extract the file, then drag it to your simulator to install it. See [this section](tutorial/building#1-preview) of the tutorial to learn about running the app on real devices. + +Once you have verified that the app runs as expected, you can proceed to build it for release: + +```bash +eas build --platform ios --profile production +``` + +The approach for a production build is similar to the one used for generating a preview build. However, unlike a preview build, you won't be able to launch the production build in the iOS simulator—it is intended solely for publishing to the App Store. + +Once this process is completed, you can proceed with submitting it to Apple. This process typically involves Apple's TestFlight service. + +## Submit to TestFlight + +TestFlight is a key aspect of Apple's Developer Program, which enables developers to provide beta users with access to their app under less restrictive review requirements. + +With TestFlight, you're able to invite users to test your app and collect their feedback before releasing it to the public on the App Store. You can learn more about TestFlight [here](https://developer.apple.com/testflight/). + +Submitting an iOS app is much easier with EAS Submit. This is covered in more detail in the [tutorial](tutorial/publishing). + +Run the following command to start publishing the app to TestFlight: + +```bash +eas submit --platform ios --profile production +``` + +Once the process has completed successfully, we can check the build in App Store Connect. + +In App Store Connect, click on the TestFlight Tab. + +You'll see the [status](https://help.apple.com/app-store-connect/#/dev3d6869aff) of your built version. + +- **Red** indicates that you need to perform some action. +- **Yellow** indicates that some aspect of the process is pending—either from you, or from Apple. +- **Green** indicates that the build is being tested in TestFlight, or is ready to be submitted for review. + +You won't be able to begin beta testing with TestFlight until an official tester from Apple verifies your app. + +In order to allow Apple to properly test your Lexicon-powered app, they'll need to have credentials to login your Discourse site. + +Before submitting your app, you'll need to create those credentials in Discourse and specify them in App Store Connect. + +- In App Store Connect, click on your app. +- Click on TestFlight App. +- Click on Test Information in the sidebar on the left-hand side. +- Fill the required fields, then check the `Sign in required` checkbox, and enter the credentials. + Review Information Sign In +- Please also provide information for a person to contact if the review team needs additional information. + Review Information Contact + +### Specify Users for Beta Testing + +Beta Test Users can belong to an Internal Group or an External Group. + +You can specify internal users by going to the Internal Group section, and clicking on **App Store Connect Users**. + +Similarly, you can specify external users by selecting External Groups, and clicking on **Add External Testers**. + +#### More Information + +TestFlight and App Store Connect are sophisticated tools to help with the process of submitting, testing, and publishing your app. + +If you have further questions or just want to learn more, we'd recommend that you make use of Apple's documentation, which is very high quality. + +For more information about TestFlight in general, read the [documentation](https://developer.apple.com/testflight/). + +Similarly, for specific information about beta testing with TestFlight, check out [Testing Apps with TestFlight](https://testflight.apple.com/). + +## Publish to the App Store + +Once you've successfully passed Apple's review process and have received enough feedback from your beta testers, you're ready to publish to the App Store and go live! :tada: + +As a few final reminders, double-check that... + +- Your Discourse instance is online, reachable, and functioning correctly. +- The built version of your app is configured to point at the correct Prose server. +- Your Prose server is online, reachable and healthy. +- Your Prose server is deployed with the [recommended guidlines](dedicated#configure--deploy-prose) for production. + - In particular, ensure that its traffic is encrypted using an SSL certificate. + +Next, we'll guide you through the process of publishing your app for Android devices on the Google Play Store. diff --git a/documentation/versioned_docs/version-1.0.0/assets.md b/documentation/versioned_docs/version-1.0.0/assets.md new file mode 100644 index 00000000..a24dcad0 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/assets.md @@ -0,0 +1,47 @@ +--- +title: App Icon & Other Assets +--- + +The Lexicon Mobile App contains multiple assets that can be replaced in order to White Label it. + +The assets that can be modified are as follows: + +## App Logo + +Used to show the app logo in the application, such as on the Login, Register, and 2FA Scenes. + +The assets are located at `frontend/assets/images/logo.png` and `frontend/assets/images/logoDark.png`. The `logo.png` is used in light color scheme and `logoDark.png` is used in dark color scheme. To customize it, simply replace the existing file with your own `logo.png` and `logoDark.png`. + +## Favicon + +Used to show the app logo. + +The asset is located at `frontend/assets/favicon.png`. To customize it, simply replace the existing file with your own `favicon.png`. + +## Image Placeholder + +Used to temporarily take an image place when it is loading. + +The asset is located at `frontend/assets/images/imagePlaceholder.png`. To customize it, simply replace the existing file with your own `imagePlaceholder.png`. + +## Icons + +Used to display icons inside the application. + +The assets are located in the `frontend/assets/icons` folder. If you want to add more or edit the remaining icons, you need to insert the icons to the `frontend/assets/icons/` folder and import them in `frontend/src/icons.ts`. + +There are some standards applied to the icons, such as: + +#### Uniform Icon Size to Maintain Visual Consistency + +The UI is designed around the default base dimensions of 28x28px for icons. + +If you adjust this, you may need to modify other aspects of the theme or fonts in order to maintain a clean appearance. + +Similarly, if you provide a new icon that does not conform to these dimensions, you may run into visual inconsistencies. + +#### SVG Icons have their Fill Color Controlled via `currentColor` + +If you are adding a new icon that you expect to interact with theme's colors, ensure that its color is not hard-coded, and is instead set to `currentColor`. + +If you are unfamiliar with this concept, take a look at the [MDN Specification on SVG color values](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/color). diff --git a/documentation/versioned_docs/version-1.0.0/commercial-support.md b/documentation/versioned_docs/version-1.0.0/commercial-support.md new file mode 100644 index 00000000..9d164810 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/commercial-support.md @@ -0,0 +1,9 @@ +--- +title: Commercial Support +--- + +With official support, you get expert help straight from the core team. We provide app customization, dedicated support, prioritize feature requests, deployment strategies, advice on best practices, design decisions, and team augmentation. + +Additionally, we are open to engagements for non-technical site owners looking to customize, deploy, and launch a mobile app for their Discourse users. + +Reach out to us for consulting at support@kodefox.com. diff --git a/documentation/versioned_docs/version-1.0.0/concepts.md b/documentation/versioned_docs/version-1.0.0/concepts.md new file mode 100644 index 00000000..f32b0652 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/concepts.md @@ -0,0 +1,63 @@ +--- +title: Concepts and Architecture +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## Prose: Discourse through GraphQL + +It is worth acknowledging upfront that Discourse already provides a traditional, RESTful API for developers out of the box. + +However, [the official documentation](https://docs.discourse.org/) for this API points out that it is incomplete, effectively serving as a starting point. + +> Note: For any endpoints not listed you can follow the reverse engineer the Discourse API guide to figure out how to use an API endpoint. +> +> —**Discourse API Documentation** + +The core team, as well as members of the [support forum](https://meta.discourse.org), regularly respond to questions about the API by [encouraging developers to reverse-engineer the API](https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576). As of this writing, the topic for how to reverse engineer the API has been linked to from nearly 200 other topics on the support forum. + +To help you simplify the process for you, Prose strives to normalize a subset of the API. We have done so with the hope that it will save you some time as you develop against Discourse. + +#### GraphiQL + +Prose's GraphQL implementation includes an [in-browser GraphQL IDE](https://www.graphql-yoga.com/docs/features/graphiql), known as [GraphiQL](https://github.com/graphql/graphiql), which allows developers to easily reference the entire documentation and schema and make queries against a running Discourse instance. + + + +This means you can rapidly get a clear understanding of how a method behaves—and what parameters it requires—without digging through support posts or reverse-engineering the REST API. + +#### Why GraphQL? + +There is no shortage of articles about both the [benefits](https://www.howtographql.com/basics/1-graphql-is-the-better-rest) and [tradeoffs](https://lwhorton.github.io/2019/08/24/graphql-tradeoffs.html) of GraphQL. + +We're well aware that GraphQL isn't some magical solution that solves all the problems of other API paradigms. + +Having said that, we chose to build Lexicon with it for two primary reasons. + +1. Our team is familiar and fluent with GraphQL, and deeply enjoys working with it. + +2. The tooling, libraries, and auto-generated documentation provide out-of-the box benefits which we can pass onto others with no additional effort. + +#### Why Expo? + +[Expo](https://docs.expo.io/) is both a framework and a platform for building universal React applications. In particular, it provides a superior development experience when building mobile apps with React Native. + +We find that Expo makes us much more effective as developers, and also provides excellent services to facilitate the entire process of building and publishing React Native apps. + +## Lexicon Architecture + +The Lexicon Stack is fairly simple, and only consists of 3 major pieces: + +- The Lexicon Mobile App +- The Prose GraphQL API +- A running, accessible Discourse instance + +Below is a diagram illustrating the typical architecture for a Lexicon-powered mobile app. + +IOS Lexicon Login Page + +As indicated above, the mobile app makes requests to a deployed Prose GraphQL server. + +The Prose server has been configured to point at an active Discourse instance of the developer's choice. + +Traffic then flows back from Discourse, through Prose, and returns to the mobile app over a GraphQL interface. diff --git a/documentation/versioned_docs/version-1.0.0/contributing.md b/documentation/versioned_docs/version-1.0.0/contributing.md new file mode 100644 index 00000000..0fe6fbe9 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/contributing.md @@ -0,0 +1,131 @@ +--- +title: Contributing +--- + +Thank you for your interest in contributing! :sparkles: + +We greatly appreciate the time and effort you're willing to put forth to make Lexicon even better. + +There are several ways to help out. + +## Reporting Bugs + +The best way to let us know about a bug is by [creating a new issue](https://github.com/lexiconhq/lexicon/issues/new) on [Github](https://github.com/lexiconhq/lexicon). + +As always, we recommend searching the existing open and closed issues before opening a new one. + +When you create the issue, please be sure to include the following: + +- A detailed description of the bug and its behavior + +- The behavior you expected instead of the bug + +- A list of steps for how to reproduce the bug + +- Details about the device(s) and version(s) you're observing the bug on + +- Screenshots and screen recordings, while not necessary, are very welcome! + +Once we've received your bug report, we will triage it and label it accordingly. + +## Contribute to the Project + +Want the honor of being listed in our contributors section :clap:? + +We'd love to get a PR from you addressing an existing issue, adding a feature, or even just improving the documentation. + +To get started contributing, follow the instructions below. + +### Instructions + +**1. Fork the [official Lexicon repository](https://github.com/lexiconhq/lexicon)** + +You probably already know the drill - click on **Fork** button on the upper-right corner. + +**2. Clone your Fork of Lexicon** + +Be sure to clone **_your_** fork to your development machine (as opposed to cloning the main Lexicon repository). + +``` +$ git clone https://github.com/YOUR_USERNAME/lexicon.git +``` + +If you need further guidance with cloning, head over to our [Quick Start](quick-start#installation) section. + +Just bear in mind that the Quick Start section walks you through cloning the Lexicon repository. So make sure you change the URL to your username as referenced above. + +**3. Run and connect the app with Prose and a Discourse Host** + +For a comprehensive walk-through of this step, follow the instructions in the [**Setup**](setup#discourse-host) section. + +If you already have a deployed Prose instance that is pointing at a Discourse instance, you can simply configure the Lexicon Mobile App to point at the address of your Prose deployment. + +However, if you don't have that, or if you're planning on making adjustments to the Prose server itself, you'll want to ensure the Lexicon Mobile App is configured to point at a Prose server that you have running locally. + +**4. Get Started with your Contribution** + +At this point, you should be setup to dig in on the main work of your feature, bugfix, or other contribution. + +Remember that it's necessary to have the [**ESLint**](https://eslint.org/docs/user-guide/getting-started) and [**Prettier**](https://prettier.io/) plugins installed in your IDE, as those are required in order for the Pull Request checks to pass. + +We would recommend working in [VSCode](https://code.visualstudio.com/), since that is what we used to develop Lexicon. However, it is up to you, you only need to ensure that ESLint and Prettier are functioning properly within your IDE. + +**5. Run the Test Suite** + +Follow these [**steps**](setup#run-the-test-suite) to run the Lexicon test suite. + +In order to speed up the feedback cycle, it is recommended that you ensure that all tests are passing locally before pushing, especially if you already have an open PR. + +This is primarily because we have configured our Github project to block PRs from being merged if any of the build steps fail. + +If the reviewers see that tests are failing, they aren't able to review it as quickly, and will likely request that you resolve any build issues before requesting review again. + +**6. Stage, Commit, and Push your Local Changes** + +If you're unfamiliar with this process, please take a look at this [great article](https://github.com/git-guides/#learning--mastering-git-commands) from Github to bring you up to speed. + +**7. Create a New Pull Request** + +Your code is ready to submit! :tada: + +Go to the Lexicon [Pull Requests tab](https://github.com/lexiconhq/lexicon/pulls), and compare the changes between your branch and the master branch. + +Double-check and make sure you didn't push anything you don't want included in your PR. + +Then, go ahead and create a new Pull Request from your forked repository. + +Please be sure to follow the Pull Request template, add related labels, and please mention the issue you are addressing to help us keep track of what's being worked on. + +## Share Your Thoughts with Us + +We'd love to hear your new ideas! Drop them in the [Issues tab](https://github.com/lexiconhq/lexicon/issues). + +## Spread the Word + +Let others know about your awesome experience using Lexicon on social media, and tag us on Twitter [@GetLexicon](https://twitter.com/GetLexicon). + +And if you build your app using Lexicon, please let us know. We'd love to help you spread the word about what you've built! + +## Improve the Documentation + +As a closing thought, if you find any issues with the Lexicon documentation, or just think you could make it better, you can get started with these brief instructions below. + +To generate and run the documentation locally, from the project root, run: + +```sh +npm run docs:start +``` + +Similarly, you can build the documentation using: + +```sh +npm run docs:build +``` + +All documentation is in the `documentation/` directory, and the Markdown pages used to generate this site are under `documentation/docs`. + +If you end up making a PR to improve the documentation, please be sure to label your PR with the `Documentation` label. + +:::note +Don't hesitate to ask if you have any further questions. We're always happy to help. :smile: +::: diff --git a/documentation/versioned_docs/version-1.0.0/customize.md b/documentation/versioned_docs/version-1.0.0/customize.md new file mode 100644 index 00000000..6797d756 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/customize.md @@ -0,0 +1,28 @@ +--- +title: Customization +--- + +## Theming + +As part of its [White Labeling Support](white-labeling), Lexicon allows you to customize the theme of the mobile app. +You can configure the base and functional colors according to a color scheme of your choosing. +You're also able to customize icons, fonts, and even the error messages that appear inside of the mobile app. +To get started with this, check out the [Theming page](theming) under the [White Labeling](white-labeling) section. + +## White Labeling the Mobile App Assets + +To provide your users with a unique experience that matches your brand, you can customize the splash screen and app icon on their device. + +This will replace all Lexicon branding with your own. + +Further details can be found in both the [Tutorial](tutorial/white-label) and the [White Labeling Section](white-labeling) of this documentation. + +## Enabling Additional Discourse features + +As you might already be aware, Discourse is a highly customizable piece of software. Much of it is customizable from the Admin Site Settings page on your Discourse instance. + +Some of these settings will translate automatically into the Lexicon Mobile App, such as `authorized extensions`. + +In general, we have done our best to get out of the way and use Discourse as the source of truth for how the Lexicon Mobile App should appear and behave. + +If you find any settings that Lexicon is not responding to, but you feel it should, please open an issue and let us know. diff --git a/documentation/versioned_docs/version-1.0.0/dedicated.md b/documentation/versioned_docs/version-1.0.0/dedicated.md new file mode 100644 index 00000000..75fe8afe --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/dedicated.md @@ -0,0 +1,300 @@ +--- +title: Hosting & Configuration +--- + +As mentioned in the [Overview](deployment), this section is meant to guide you through configuring and deploying Prose on a dedicated instance. + +## Decide on Where to Host + +First, you'll need to answer the following question. Where would you like to host Prose? + +While there are many options that vary by project and developer preferences, the simplest way is often to use a cloud provider of your choice. + +In the [Lexicon tutorial](tutorial/setup-cloud-server), we walk you through this process using Digital Ocean. + +If you're confused about this step, or don't have a preference, you should take some time to work through it. + +However, if you already know what you're doing, feel free to use any cloud provider or hosting solution of your choice. + +### Hosting Checklist + +Once you've decided on a host, go through the checklist below to verify that everything is setup as expected. + +#### ✅ Ensure Access & Permissions on the Host + +At a minimum, you will need to be able to login to the host. Some cloud providers offer a virtual, web-based terminal, but ideally you can get credentials to login directly. + +If your host is in a UNIX-based environment, you should also have permissions to run commands as `sudo`. + +A quick way to check this is to simply attempt to run a command with `sudo`: + +```sh +$ sudo ls +``` + +However, if you have a restrictive hosting environment, you will just need a way to place the Lexicon source onto the host, install its dependencies, and expose it on a port. + +Bear in mind that a restrictive hosting environment is not ideal, especially since the recommended setup makes use of Docker. + +#### ✅ Ensure the Host is reachable in the way you need it + +Typically, this means that your host is accessible on the open internet. + +However, you might have different constraints, such as only needing the host to be accessible from within a VPN or a local network. + +
+ +Once you have setup a host which is reachable in the way you need it to be, you can begin configuring Prose on it. + +## Configure & Deploy Prose + +### Without Docker + +Naturally, setting up Prose without Docker involves more manual steps and can be platform-specific. + +We have already covered this approach well in the tutorial. In particular, you can dig in with it on the page, [Setup the Prose GraphQL API](tutorial/install-prose#install-manually) + +### With Docker + +The Prose Docker image comes preconfigured to run Prose using **[PM2](https://pm2.keymetrics.io/)**, which is a sophisticated toolset for running Node processes in production. + +This is typically a reasonable setup, with which you can even expose the PM2 server directly to requests on the host. + +However, if you'd prefer a different setup, perhaps using Nginx as a reverse proxy to the Docker container, feel free to modify the Dockerfile to match your requirements. + +#### Install Docker + +**[Docker](https://www.docker.com/)** is a containerization framework that makes it easy to build, manage, and deploy your application stack in a way that is safer, more reliable, and reproducible across multiple platforms. + +There are countless guides available for installing Docker on a given operating system. + +Ubuntu is one of the more common operating systems avaiable through most cloud providers. + +Docker provides a [full tutorial](https://docs.docker.com/engine/install/ubuntu/) for this, and even provides a convenience script that you can run in two lines: + +```sh +curl -fsSL https://get.docker.com -o get-docker.sh +sudo sh get-docker.sh +``` + +Whichever path you need to take, just make sure that Docker is up and running on your host before continuing. + +#### Configure Environment Variables + +A comprehensive list of all Prose environment variables can be found on the [Environment Variables](env-prose) page. + +In brief, at a minimum, you'll want to ensure that `PROSE_DISCOURSE_HOST` is set. + +Another variable to pay attention to is `PROSE_APP_PORT`. This defaults to port 80, which instructs Prose to listen on that port. + +Depending on your setup, you might want it to listen on a different port. + +
+ +#### Build Prose from the Dockerfile + +If you'd like to use Docker to manually build Prose, run the following command from the **project root**. + +This might be of interest to you if you'd like to make some adjustments to the Dockerfile itself. + +Alternatively, if you simply wish to pull the latest Prose build from Docker Hub, you can [skip to the next step](#pulling-the-prose-docker-image). + +Unless you've made modifications to the Dockerfile and have it stored elsewhere, you can get started building by running: + +```bash +docker build -t prose:latest -f api/deploy/Dockerfile api/ +``` + +The command searches for the `Dockerfile` at `api/deploy/Dockerfile` because we instructed it to look there with the `-f` flag. + +Then, it uses `api/` as the context for the build, which allows the references in the `Dockerfile` to resolve correctly. + +By passing the `-t prose:latest` tag, it tags the locally built image as the latest build. This can be useful for identifying and managing the images in a Docker environment over time. + +#### Pull the Prose Docker Image + +If you'd rather just use the latest release of the Prose image, you can simply run: + +``` +docker pull kodefox/prose:latest +``` + +#### Run the Prose Docker Container + +Next, to run the newly built image, run the following command: + +```bash +docker run -d \ + -e PROSE_DISCOURSE_HOST=https://discourse.example.com \ + -e PROSE_APP_PORT=4000 \ + --name prose \ + -p 5000:4000 \ + kodefox/prose:latest +``` + +:::note +If you built the image by hand, you'll want to substitute `kodefox/prose:latest` with the image name and tag you used, such as `prose:latest`. +::: + +To recap, let's briefly break down that command line-by-line + +**Run in Detached Mode** + +```bash +docker run -d +``` + +The first line lets Docker know to run the container in **detached mode**. + +This means that the command will run in the background, will not be tied to your current session, and will keep running even if you log out. + +If you omitted the `-d` flag, Docker would run the container in the foreground, and exiting the process in the foreground would stop the container. + +**Set Environment Variables** + +```bash +-e PROSE_DISCOURSE_HOST=https://discourse.example.com +-e PROSE_APP_PORT=4000 +``` + +These lines instruct Docker to pass the environment variables of `PROSE_DISCOURSE_HOST` and `PROSE_APP_PORT` to the container when running it. + +These are both application-level environment variables that Prose itself will leverage to run properly. + +The Docker image expects these values to be set and passes them to the container's environment, which Prose then accesses via `process.env`. + +**Name the Container** + +```bash +--name prose +``` + +This line tells Docker to give the running container a name. This makes it easier to identify and interact with via commands, such as: + +```bash +docker stop prose +``` + +**Configure a Port Mapping between the Host and the Container** + +```bash +-p 5000:4000 +``` + +Next, we configure Docker with a port mapping, which tells Docker to listen to map the host port of `5000` to the container port of `4000`. + +Because we previously set `PROSE_APP_PORT=4000`, this means that all requests to the host at port `5000` will be forwarded to Prose inside of its container on port `4000`. + +```bash +kodefox/prose:latest +``` + +The last line of the command tells Docker which image to use for the container. + +Above, if you built the Prose image by hand, it was tagged as `prose:latest`. + +If you chose to pull from Docker Hub, this is simply instructing Docker to pull that image if necessary, and then start the container with it. + +#### Next Steps + +At this point, you should have a Docker container running the Prose server on your host. + +However, in terms of preparing your Prose host for production, you aren't quite there yet. + +Below, we'll guide you through the last steps, finalizing your deployment of the Prose GraphQL Server. + +#### Setup SSL (IMPORTANT) + +:::danger +Deploying Prose without SSL in a way that is publicly accessible is **extremely risky**. + +Doing so could provide an attacker with full access to your Discourse site and all of its data. +::: + +The **most important next-step** to take at this point is to configure an SSL certificate for your Prose host. + +The reason this is so important is that, without SSL, Prose's traffic between your users' devices and Discourse is not encrypted. + +And this means that attackers can snoop on your users' requests to Prose and Discourse—including, importantly, their authentication information. + +To put it bluntly, deploying Prose without configuring SSL is irresponsible and compromises the security of your Discourse instance. + +An attacker could even steal your authentication token and use it to access, and potentially destroy, your Discourse site. + +##### How to Setup SSL + +There are a variety of methods to obtain SSL certificates. Some are free, and some are paid. + +The free route involves using [Let's Encrypt](https://letsencrypt.org/), which is very useful, but can require more technical knowledge to setup correctly—depending on your configuration. A key difference is that you need to renew the certificates more frequently. + +The paid route involves using a provider like [DigiCert](https://www.digicert.com/) to obtain certificates that take longer to expire. + +Either way, you'll end up with certificate files that you can configure and launch your webserver with. + +Ideally, at this point, you've already purchased a domain. If you haven't, we'd recommend using a domain provider to get a low-cost domain name. + +You could host Prose at a subdomain of your existing Discourse site, like `prose.mydiscoursesite.com`. + +Or, you could just get a cheap, nonsense domain, like `purplemonkeydishwasher.tech`—since your users won't typically see it anyway. + +Regardless, to emphasize it again, it is **critical** that you don't deploy Prose into production until you have prepared your host to encrypt the traffic from Prose. + +#### Determine how you'll expose Prose on the host + +When someone navigates to your host which is running Prose, how will their request get routed to Prose? + +If you had exposed Prose directly on port 80—NOT recommended—and your host's domain name was `myproseserver.com`, then a user would navigate to `http://myproseserver.com` and be greeted with the [GraphiQL interface](https://www.graphql-yoga.com/docs/features/graphiql). + +However, a more common approach is to use a dedicated webserver, such as Nginx or Apache, that acts as a reverse-proxy. + +With this approach, the websever listens for all requests on the ports you tell it to, and is configured to route traffic to Prose, which is listening on a non-privileged port, like 8080. + +We recommend this approach more highly for the following reasons: + +- Existing webservers are generally more reliable and performant +- It allows configuration of an SSL certificate, which is necessary for protecting your users' data + +Upon configuring the webserver, you'll need to instruct it to forward traffic to the running Prose server. + +Your setup might look something like this: + +- Nginx is configured to listen on port 80 and port 443 on your domain, `purplemonkeydishwasher.tech` +- Nginx has located and loaded your SSL certificate files for `purplemonkeydishwasher.tech` +- Nginx is configured to upgrade all requests on port 80 to port 443 +- Your Prose server is running inside of Docker on a container port of 80, and exposed to the host on port 8080. +- Your Nginx configuration specifies that requests to `purplemonkeydishwasher.tech` should be forwarded to port 8080. +- Requests come in for `purplemonkeydishwasher.tech`, Nginx routes it to the container running Prose, which handles the requests, and responds. + +#### Configure your Cloud Provider's Firewall, if one exists + +Ideally, you've configured Prose to be exposed on the open internet with the traffic encrypted over port 443. + +Depending on your cloud provider, you may need to go into its settings and expose that port on the firewall. + +For example, in DigitalOcean, this involves going to the Networking section, and creating a new firewall rule. + +From there, it is fairly simple to add common ports, like 80 and 443, to the firewall. + +After that, you simply apply the firewall to your particular instance, and traffic should be allowed through. + +#### Configure DNS Settings for your Domain + +Provided that you've already registered a domain name, you'll need to configure it so that the domain name points to your host which is running Prose. + +Depending on your setup, this will either be done in your domain provider's settings panel, or perhaps within your cloud provider. + +Continuing with the DigitalOcean example from above, you can configure your domain provider to point at DigitalOcean's name servers. + +This effectively tells your domain provider that DigitalOcean will handle everything for you, and allows you to make adjustments to your domain from within DigitalOcean. + +In that case, DigitalOcean makes it seamless to map the domain name to your instance's IP address, and it should then be accessible from the domain name. + +Otherwise, you'll want to get the IP address of your host, go into your domain provider, and instruct it that requests to your domain should be direct to your host's IP address. + +#### Ready to Go + +At this point, your deployed host should be running Prose correctly. When you navigate to the domain name that you configured it with, you should see [GraphiQL](https://www.graphql-yoga.com/docs/features/graphiql), which will allow you to make GraphQL queries against your Discourse instance. + +We understand that the details of your deployment can vary quite a bit depending on how you chose to do it. + +If you run into any issues with this step—as always—don't hesitate to reach out to us for support. diff --git a/documentation/versioned_docs/version-1.0.0/deployment.md b/documentation/versioned_docs/version-1.0.0/deployment.md new file mode 100644 index 00000000..b46ab73b --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/deployment.md @@ -0,0 +1,86 @@ +--- +title: Overview +--- + +As covered in [Concepts and Architecture](concepts#prose-discourse-through-graphql), Prose is Lexicon's GraphQL API layer on top of the traditional RESTful API provided by Discourse. + +## Getting Started with Deployment + +At this point, you're likely to be digging into this section of the documentation for two reasons: + +- You've been developing against a local instance (or container) running Prose, and you're ready to actually deploy your entire Lexicon project to production. + +- You want to simplify your development process by pointing the Lexicon Mobile App at a deployed instance of Prose. + +In either scenario, the end goal of this section is to have a working Prose server accessible on the open internet. + +### 🔐 Note about Access Control + +As a brief aside, please note that Prose cannot expose any information from Discourse that Discourse is not already exposing on its own. + +If your Discourse instance requires authentication, then Prose will be unable to retrieve most queries unless the required authentication information is provided by the user accessing Prose. + +### 🧱 Alternative Deployment Strategies + +Initially, we wanted to provide instructions for an integrated deployment strategy. This would have involved deploying Prose on the same host as your Discourse instance, and ideally finding a way to deploy and expose it within the running Docker host that Discourse uses itself. + +This is still achieveable. But for now, we have opted to focus solely on deploying Prose as a dedicated instance. + +However, should you find yourself preferring a custom deployment of Prose, we would encourage you to do so. + +If you do, and you have some questions or challenges you're encountering, please reach out to us. + +Ideally we can help you sort things out and work your approach into our documentation so that everyone will benefit going forward. + +## Deploying as Dedicated Instance + +As mentioned above, the official deployment strategy for Prose is to host it as a dedicated instance. + +Like anything, this comes with both benefits and trade-offs, which we have outlined for you below. + +### 🚀 Benefits + +A dedicated host for Prose will have better performance and reliability because its only resource usage comes from running Prose. i.e., it has exclusive usage of CPU, RAM, disk space, etc. + +If, on the other hand, you had managed to deploy Prose on the same host as your Discourse instance, this would mean that both Prose and Discourse need to share the host's allocated resources. If your Discourse instance is already running on a fairly light host, running Prose on it might mean that you would need to upgrade to a host with more resources. + +### ⚠️ Possible Trade-offs + +#### Increased Cost + +Naturally, if you're setting up a dedicated host to run Prose, then that involves additional costs on top of what you're already paying to host Discourse. + +Having said that, for most deployments, it is unlikely that you will need to allocate an expensive amount of resources to Prose. + +For example, on Digital Ocean, the $5 Shared CPU node is often sufficient. + +#### Potential for Increased Latency + +By nature, when deploying Prose on a different host from your running Discourse instance, the latency between the mobile app and Discourse increases. + +This is because each request has to make two hops: + +- The first request is from the client (your Lexicon-powered mobile app) to the Prose GraphQL API +- The second request is from Prose to Discourse + +However, the only important questions regarding this point are: + +- How much measurable latency is there? +- Is it noticeably slow to myself or my users? + +This, of course, can depend on several factors: + +- Where your Discourse server is deployed +- Where your Prose server is deployed +- Where your users tend to be +- If the amount of traffic (load) is too much for the system to optimally run both Prose and Discourse. + +If you are observing noticeable latency, we would recommend looking into these factors. + +Ideally, you'll want to deploy Prose in the same region as your Discourse instance; and it is even better if you can deploy Prose in the same datacenter as your Discourse instance. + +## Up Next + +With this overview out of the way, we'll start by introducing you to the list of all possible [environment variables](env-prose) that may be necessary or useful when deploying Prose. + +Lastly, we'll get into the heart of it, by [preparing your host and deploying Prose](dedicated). diff --git a/documentation/versioned_docs/version-1.0.0/discourse-features.md b/documentation/versioned_docs/version-1.0.0/discourse-features.md new file mode 100644 index 00000000..3183014a --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/discourse-features.md @@ -0,0 +1,52 @@ +--- +title: Discourse Features Support +--- + +Below is a table of Discourse features which provides the details and current status about the support for a given feature in the **Lexicon Mobile App**. + +If we missed one, or anything looks out of date here, don't hesitate to submit a Pull Request which updates the table. + +Is the feature you love not supported? [Reach out to us](mailto:support@kodefox.com) to discuss how we can bring it to life for you. + +#### Our General Approach to Feature Support + +Much of our initial focus was on using-facing features, rather than administrative features. + +This is why, for example, users can select categories for their topics, but administrators are unable to create new categories from within the mobile app. + +For this reason, most admin tasks are still best accomplished using the Discourse web app on a larger device. + +### Lexicon Mobile App Features + +| Feature | Description | Supported | Notes | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------- | +| 2FA Login | Allow users with 2FA enabled to be prompted for their 2FA code when logging in | ✅ | Managing 2FA, such as enabling it or disabling it from within the app, is not currently supported | +| Ability to Tag Topics | Create and tag topics to provide relevant metadata for your users | ✅ 🔧 | Configuration required: see [Optimal Experience](optimal#enable-topic-tagging) | +| Topic Previews (Excerpts) | Show an excerpt of the first post in a topic from the Home screen | ✅ 🔧 | Configuration required: see [Optimal Experience](optimal#enable-topic-excerpts) | +| View User Activity | View a user's recent activity—such as topics, posts, and likes—in a single feed from their profile | ✅ | The ability to filter by activity is not currently supported | +| Topic Metrics | Likes, Views, Replies, and Frequent Posters | ✅ | | +| Topic & Post Actions | Ability to like and edit topics and posts | ✅ | | +| View Top & Latest Topics | A Tab View at the top of the main feed provides the ability to switch between Latest and Top activity | ✅ | | +| Search | Search the current Discourse instance for topics and posts based on keywords, categories, and tags | ✅ | | +| Categories | View the category of a topic and filter topics by a given category | ✅ | Categories cannot be created, updated, or deleted | +| Attaching Media to Posts | Users can attach media to a post from the app | ✅ 🔧 | Configuration recommended for supported file extensions-see [Optimal Experience](optimal#configure-upload-extensions) | +| Standard Markdown | Standard Markdown is supported in the editor and rendered correctly in the mobile app | ✅ | Light, incomplete support exists for some of Discourse's custom markup, such as dates | +| Sign Up | Allow users to sign up for an account directly through the mobile app, depending on whether your Discourse instance allows new user registration or not | ✅ | | +| Browsing Public Instances | Allow users to immediately access and browse your Discourse instance from the mobile app if it is not private | ✅ | Users will be prompted to login upon attempting an authenticated action | +| User Profiles | Ability to view users' profiles and edit your own | ✅ | Partial support: displays the user's photo, username, Markdown bio on a single line, and recent activity | +| Post Flagging | Allow users to flag posts for admins to review | ✅ | Admins are not able to review posts in the app, though they will see in-app notifications for flags | +| In-App Notifications | Allow users to see new notifications from the profile screen of the mobile app and mark all notifications as read | ✅ | Some notifications from Discourse are not tappable in the mobile app, such as badge notifications | +| Private messaging | Allow users to start private or group messages with one another | ✅ | | +| Mentions | Allow users to mention a user when creating or editing posts and messages | ✅ | +| Color Scheme | Provides light and dark mode support for users | ✅ | Specify color scheme (light mode, dark mode, or system) from within the app (only local to the user's mobile device) | +| Badges | The ability to see and interact with badges that have been awarded to users on the Discourse instance | ❌ | | +| Post Drafts | Enable users to start composing a draft of a post and return to it later | ❌ | | +| Groups | Enable users to create and participate in private groups of which only group members can view certain topics | ❌ | | +| Admin Features | Discourse admin features generally not available in Lexicon—better suited to a desktop environment | ❌ | Editing posts is supported | +| Post Quotes, Polls, Toggles, and Task Lists | Custom text formatting that enables Discourse-specific features | ❌ | | +| Discourse Emojis | Utilize emojis when creating a topic, making a post, or sending a reply | ❌ | Unicode-based emojis are of course supported | +| Post Bookmarks | Allow users to bookmark certain posts or topics | ❌ | | +| DiscourseConnect (SSO) | Replace Discourse authentication with a Custom Provider | ❌ | | +| Custom Authentication Plugins | Login via OAuth2 or other protocols using custom Discourse Plugins | ❌ | | +| Real-time Chat | Enable users to initiate conversations using the chat feature, either in a channel or through private messaging | ❌ | | +| User Status | Allow other user in community to see user message status | ❌ | | diff --git a/documentation/versioned_docs/version-1.0.0/env-mobile.md b/documentation/versioned_docs/version-1.0.0/env-mobile.md new file mode 100644 index 00000000..79af9933 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/env-mobile.md @@ -0,0 +1,119 @@ +--- +title: Configuration Values +--- + +You can check and set the configuration values in `frontend/Config.ts`. + +The table below describes the configuration values for the Lexicon Mobile App. + +If there is a default value indicated, you do not need to set it. + +| Variable | Required | Notes | Default Value | Example Value(s) | +| -------------------- | -------- | -------------------------------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| proseUrl | Yes | The url of the Prose Server (must start with http or https) | - | https://prose.myserver.com https://prose.myserver.com:8080 https://prose.myserver.com/subpath https://prose.myserver.com:8080/subpath | +| inferDevelopmentHost | No | The flag (true / false) to override localhost with the host of the development machine | (empty) | true | + +## The `config` object + +In the `Config.ts` file, you'll find a `config` object that allows you to specify configuration values by scenario. + +The two primary scenarios are: + +- `localDevelopment`: when developing against the app locally. This configuration is also used as a fallback for an unknown build channel. +- `buildChannels`: used to define configuration by build channel when building the app with the EAS CLI. + +Primarily, you'll only be concerned with configuring `proseUrl` for each of these sections. + +## `proseUrl` + +:::caution +`proseUrl` must always be specified, with or without a port number, and must always start with either `http://` or `https://`. +::: + +`proseUrl` is used to specify the URL of the Prose GraphQL API. + +The Prose GraphQL API acts a middleman between the Lexicon Mobile App and your Discourse instance. Without it, the mobile app cannot interact with your Discourse instance. + +### Example + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com', + }, + production: { + proseUrl: 'https://prose.myserver.com', + }, + }, +}; +``` + +With this configuration above, the app will: + +- point at `http://localhost:8929` when you run the app using `npm run start` +- point at `https://preview.myserver.com` when you build the app using `eas build --profile preview` +- point at `https://prose.myserver.com` when you build the app using `eas build` + +`proseUrl` also can include a subpath if desired: + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com:8080/subpath', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; +``` + +**Different Behavior in Development** + +When running the app locally, if `proseUrl` is set to `http://localhost` or `http://127.0.0.1`, it will replace `proseUrl` with the IP address of your development machine. It does this by using Expo's `debuggerHost` constant. + +_Note: this does not apply when building the app._ + +This addresses multiple issues: + +- Accessing `localhost` from within the Android simulator does not map to your development machine +- Accessing `localhost` from a device running Expo Go does not map to your development machine + +Both of these scenarios would otherwise require you to manually identify and specify your development machine's IP address with `proseUrl`. This is bothersome since your machine's IP address can change over time. + +If you are interested in more details about this, the implementation of this behavior is available in `frontend/constants/app.ts`. + +This behavior of automatically overriding those values can be disabled, with `inferDevelopmentHost`, which is covered below. + +## `inferDevelopmentHost` + +:::info +This flag is only valid under `localDevelopment`. It has no effect when used as part of `buildChannels`. +::: + +When in development, by default, the Lexicon Mobile App will check to see if `proseUrl` is set to either `http://localhost` or `http://127.0.0.1`. + +When detected, either of those values will be overwritten with the IP address of your development machine. + +This is a very useful feature that makes on-device testing simply work out of the box without needing to manually specify your IP address (or update it when it changes). + +For scenarios where this behavior is not desirable, `inferDevelopmentHost` can be used as a flag to disable this behavior. It can be disabled by specifying the value as `false`. + +When set to `false`, this behavior of overriding `proseUrl` with the development machine's IP address will no longer occur, and the original value will be passed through as-is. + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + inferDevelopmentHost: false, + }, +}; +``` diff --git a/documentation/versioned_docs/version-1.0.0/env-prose.md b/documentation/versioned_docs/version-1.0.0/env-prose.md new file mode 100644 index 00000000..59901fd5 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/env-prose.md @@ -0,0 +1,15 @@ +--- +title: Prose Environment Variables +--- + +The table below lays out environment variables for the Prose GraphQL API. + +If there is a default value indicated, you do not need to set it. + +| Environment Variable | Required | Notes | Default Value | Example Value | +| --------------------------- | -------- | ----------------------------------------------------------------------------------- | ---------------------- | ------------------------------------ | +| PROSE_DISCOURSE_HOST | Yes | The specific location of your Discourse instance. | - | https://discourse.example.com | +| PROSE_DISCOURSE_UPLOAD_HOST | No | Instruct Prose to use a different host for file uploads to Discourse. | | https://upload.discourse.example.com | +| PROSE_APP_HOSTNAME | No | The **application-level** hostname that Prose will listen on. | localhost | 0.0.0.0 | +| PROSE_APP_PORT | No | The **application-level** port that Prose will listen on. | 80 | 8080 | +| SKIP_CHECK_DISCOURSE | No | Bypass the startup process of checking the provided Discourse host for reachability | false | true | diff --git a/documentation/versioned_docs/version-1.0.0/intro.md b/documentation/versioned_docs/version-1.0.0/intro.md new file mode 100644 index 00000000..66a89182 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/intro.md @@ -0,0 +1,148 @@ +--- +id: intro +title: Introduction +slug: / +--- + + + --- iOS Auth + + + + --- iOS Dark Mode + + + + --- iOS Comment + + + + --- iOS Message + + --- Android Auth + + + + --- Android Dark Mode + + + + --- Android Comment + + + + --- Android Message + + + +import useBaseUrl from '@docusaurus/useBaseUrl'; +import Carousel from 'react-bootstrap/Carousel'; + +--- + +:::info +Coming Soon! + +Lexicon v2.0.0 is currently in beta, and includes support for push notifications along with other features. + +See the [v2 documentation](../version-2.0.0-beta/intro.md) for more details. +::: + +Lexicon is a customizable, pre-built mobile app that provides an elegant mobile discussions experience. Built on top of [Discourse](#what-is-discourse). + +## Features + +- Topics, Private Messaging, User Signups, Profile Management, and more. +- Straightforward process to [**customize**](white-labeling) the app for your brand +- Rapidly build Android and iPhone apps for your existing Discourse site +- Backed by a [GraphQL](https://graphql.org/) API +- Free and open source! +- [Commercial support](commercial-support) available + +## Benefits + +- Launch a custom mobile discussions app +- Increase engagement with your users by adding a mobile-first Discourse experience—no more [WebViews](https://www.kirupa.com/apps/webview.htm). +- Built with [React Native](https://reactnative.dev/) and [Expo](https://expo.io), delivering a native look-and-feel on both iOS and Android. +- Includes an auto-documented [GraphQL](https://graphql.org/) [interface](concepts#prose-discourse-through-graphql) over the Discourse API, which you can build on top of. + +## Screenshots + +### iOS + + + + IOS Lexicon Login Page + IOS Lexicon Signup Page + IOS Lexicon Home Page + + + IOS Lexicon Dark Mode in Home Page + IOS Lexicon New Post Page + IOS Lexicon Post Detail Page + + + IOS Lexicon Comment Section + IOS Lexicon Profile Page + IOS Lexicon Notification Page + + + IOS Lexicon Message Page + + + +### Android + + + + Android Lexicon Login Page + Android Lexicon Signup Page + Android Lexicon Home Page + + + Android Lexicon Dark Mode in Home Page + Android Lexicon New Post Page + Android Lexicon Post Detail Page + + + Android Lexicon Comment Section + Android Lexicon Profile Page + Android Lexicon Notification Page + + + Android Lexicon Message Page + + + +## How does Lexicon work? + +Lexicon delivers a native mobile Discourse experience with **two key components**: + +- The [**Lexicon Mobile App**](#the-lexicon-mobile-app) - a modern mobile app built with [Expo](https://expo.io) & [React Native](https://reactnative.dev/) +- [**Prose**](#prose-discourse-through-graphql), our GraphQL API on top of the Discourse API + +### The Lexicon Mobile App + +The Lexicon Mobile App is built with [Expo](https://expo.io), which allows us to maintain both the iOS and Android apps with a single codebase. + +For those unfamiliar, Expo provides a superior development and deployment experience on top of [React Native](https://reactnative.dev/). + +### Prose: Discourse through GraphQL + +Prose is Lexicon's [GraphQL](https://graphql.org/) layer built on top of Discourse's API. + +This enables developers to quickly build apps on top of a live Discourse instance while leveraging the [benefits of GraphQL](https://www.apollographql.com/docs/intro/benefits/). + +### What is Discourse? + +Discourse is open-source **discussion software** that is thoughtfully designed, simple to setup, and well-maintained. + +You can learn more about it on the [Discourse website](https://www.discourse.org/). + +### Further Details + +You can learn about the technical details of our approach in [Concepts & Architecture](concepts). + +## License + +MIT. Copyright (c) [Lexicon](https://github.com/lexiconhq) diff --git a/documentation/versioned_docs/version-1.0.0/lexicon-updates.md b/documentation/versioned_docs/version-1.0.0/lexicon-updates.md new file mode 100644 index 00000000..43d95945 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/lexicon-updates.md @@ -0,0 +1,17 @@ +--- +title: Receiving Updates from Lexicon +--- + +Due to the nature of this project, the best way to synchronize bugfixes, updates, and other changes to the Lexicon Mobile App is to treat your app like a fork of our repository. + +In the process of customizing the Lexicon Mobile App for your needs, you might make any number of changes to the theme or assets. + +However, the underlying codebase should be—for the most part—untouched. + +When we release a bugfix or new feature on the `master` branch, you'll be able to pull down our changes, resolve any conflicts with your changes, and have an updated version of your app ready to republish. + +It is worth acknowledging that this approach, which effectively uses Git to solve this problem in a fairly simple way, could be improved. + +Provided that there's enough interest, we might later decide to shape Lexicon into more of a standalone SDK package that you can import and receive updates to via npm. + +If you're interested in making that a reality, please reach out to us! diff --git a/documentation/versioned_docs/version-1.0.0/optimal.md b/documentation/versioned_docs/version-1.0.0/optimal.md new file mode 100644 index 00000000..a06199e7 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/optimal.md @@ -0,0 +1,89 @@ +--- +title: 'Optimal Experience' +--- + +If you're planning to make use of the Lexicon Mobile App, there are a few settings you should tweak on your Discourse instance to provide the best in-app experience to your users. + +## Enable Topic Excerpts + +We have designed the Mobile App so that users can easily see the first few sentences of a topic as they scroll through the topics list. + +However, by default, Discourse does not return excerpts when listing topics. + +Fortunately, there is a secret setting that enables this. + +It just takes a bit of additional configuration to enable. + +While Discourse does enable opting into this behavior as part of a [Theme Component](https://meta.discourse.org/t/topic-list-excerpts-theme-component/151520), we wanted to guide you through the option of toggling the setting itself. + +Should you prefer to enable it using the above theme component, you're free to do so. + +Enabling this setting involves gaining access to the server and changing a setting. + +### Instructions + +The original instructions can be found [here](https://meta.discourse.org/t/discourse-as-a-simple-personal-blog-engine/138244/4). + +Once you've gained access to your server, enter into the running Discourse app. + +```sh +$ /var/discourse/launcher enter app +``` + +Next, enter the Rails CLI: + +```sh +$ rails c +``` + +Finally, set the setting to true: + +```sh +$ SiteSetting.always_include_topic_excerpts = true +``` + +After that, you can exit, and excerpts should now be displaying in the app. + +## Enable Topic Tagging + +The Lexicon Mobile App was designed with the ability to tag topics in mind. + +This allows users to view and manage tags on topics, which is a popular feature on many Discourse servers. + +Unfortunately, this is not enabled by default. + +### Instructions + +In order to enable it, you can take the following steps: + +- Navigate to the Admin Site Settings page at `/admin/site_settings` +- Use the search bar to search for the setting `tagging enabled` +- Ensure that it is checked +- If you made a change, click the green checkbox button to apply it + +Topics should now be taggable, and viewable in the app. + +## Configure Upload Extensions + +Discourse provides a security feature that allows Discourse admins to specify a whitelist of file extensions that their users can upload. +For example, most admins would choose to restrict uploading of `.exe` files. +In order to be compatible with the settings of your Discourse instance, the Lexicon Mobile App simply requests the list of allowed extensions and uses it to enforce allowed extensions in the app. +Out of the box, most Discourse instances support this default list of extensions: + +- `.jpg` +- `.jpeg` +- `.png` +- `.gif` +- `.heic` +- `.heif` + +If you'd like to adjust the list of extensions in your Discourse instance, you can do so by following the instructions below. + +### Adjusting Allowed Extensions in Discourse + +- Navigate to the Admin Site Settings page at `/admin/site_settings` +- Use the search bar to search for the setting `extensions` +- Find the setting labeled `authorized extensions`. +- Adjust the list as you see fit to include the file extensions you'd like your users to be able to upload. +- When you are done making changes, click the green checkbox to apply them. +- The Lexicon Mobile App will receive the updated list of extensions from your site settings and begin enforcing it for your users. diff --git a/documentation/versioned_docs/version-1.0.0/play-store.md b/documentation/versioned_docs/version-1.0.0/play-store.md new file mode 100644 index 00000000..dacdfa8c --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/play-store.md @@ -0,0 +1,162 @@ +--- +title: Publishing to the Play Store +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## Prerequisites + +:::note +If you don't already have a Google Developer account, note that there is a fee to create one. +::: + +- A [Google Developer Account](https://play.google.com/console/signup) to access the [Google Play Console](https://play.google.com/console) +- An Expo account +- EAS CLI 2.6.0 or newer + +## Google Play Console + +The [Google Play Console](https://play.google.com/console) enables you to setup your app, invite beta testers, and publish your app to the [Google Play Store](https://play.google.com/store). + +Because you're publishing an app that was built using Expo, it is **very important** that you follow [Expo's instructions](https://github.com/expo/fyi/blob/master/first-android-submission.md) for submitting an app to the Google Play store correctly. + +## App Configuration + +After setting up your app in the Google Play Console, there are some other adjustments you'll need to make. + +### Build Config + +Similar to the approach for [Publishing to the App Store](app-store), if you haven’t already, you'll need to set your app name and slug in `frontend/app.json`. The [slug](https://docs.expo.dev/workflow/glossary-of-terms/#slug) is used as part of the URL for your app on Expo's web services, so it is recommended to use kebab-case (e.g., `my-lexicon-app`). + +Replace these placeholders with your desired values: + +```json + "name": "", + "slug": "", +``` + +Then, you need to configure EAS Build by running the following command, or skip to the next [step](play-store#setup-config-values): + +```bash +eas build:configure +``` + +The EAS CLI will prompt you to specify `android.package` and `ios.bundleIdentifier` if those values are not already provided in `app.json`. + +Next, verify that the `package` name and other details specific to your app are included in the `android` section of `app.json`. Note that the `versionCode` will be automatically updated when you build the app with the `production` profile, so you don't need to increment the version manually. + +Also, there's one further detail that you might want to add, depending on your app's permissions. + +In the example below, we're providing our app with the ability to read and write to external storage. + +```json + "android": { + "package": "", + "permissions": [ "READ_EXTERNAL_STORAGE" , "WRITE_EXTERNAL_STORAGE" ] + "versionCode": 1, + }, +``` + +If your app requires further permissions, be sure to specify them as needed in this part of the configuration. + +If you don't quite understand how permissions work yet, it's best to check out the [Expo documentation](https://docs.expo.io/versions/latest/sdk/permissions) on this topic in order to get a full understanding. + +### Setup Config Values + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](deployment) to deploy Prose if you haven't already. +::: + +Next, set the **Prose URL** for your builds in `Config.ts`. You can set a different URL for each build channel. + +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +```ts +const config = { + // ... + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; +``` + +### Add the Play Store Secret File + +For the last step, you'll need to provide a `.json` file containing a private key in order to interact with the Play Store. Follow [this guide](https://github.com/expo/fyi/blob/main/creating-google-service-account.md) to generate one. Then, copy the JSON file to your `lexicon/frontend` directory, and rename the file as `playstore_secret.json`. + +The JSON file looks like this: + +```json +{ + "type": "service_account", + "project_id": "", + "private_key_id": "", + "private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n", + "client_email": "", + "client_id": "", + "auth_uri": "", + "token_uri": "", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/lexicon%40api.iam.gserviceaccount.com" +} +``` + +## Build your App for Android + +Because we're working with Expo and React Native, this step isn't too different from building your app for iOS. + +From the `frontend/` directory, you can run this command to check the app before publishing: + +```bash +eas build --platform android --profile preview +``` + +Running `eas build` with the `preview` profile will build the app as an APK. This allows you to quickly load it onto your Android device or emulator. After the build is done, navigate to your project in the [Expo web console](https://expo.dev), then click on the **Builds** menu located on the left-hand side of the screen. + +- Click on the project you want to install. + + Builds + +- Download the app by pressing the `Install` button in the `Build Artifact` section. + + Build Artifact + +You can download and launch the app on your real device, or drag the downloaded APK file to your emulator. + +Once you have verified that the app runs as expected, you can proceed to build it for release: + +```bash +eas build --platform android --profile production +``` + +The approach for a production build is similar to the one used for generating a preview build. However, unlike a preview build, you won't be able to launch the production build in Android emulator—it is intended solely for publishing to the Play Store. + +Once this process is completed, you can proceed with submitting it to the Play Store. + +## Publish to the Play Store + +At this point, you can take your app live on the Google Play Store, or you can proceed with internal testing on the Google Play Console. + +To proceed with internal testing, run this command: + +```bash +eas submit --platform android --profile staging +``` + +To release your app publicly, run this command: + +```bash +eas submit --platform android --profile production +``` + +You can read more about build profiles [here](tutorial/publishing). + +At this point, provided that you've completed all the steps, congratulations! Your Lexicon-powered mobile app is now live and ready to be downloaded by your users. diff --git a/documentation/versioned_docs/version-1.0.0/publish-app.md b/documentation/versioned_docs/version-1.0.0/publish-app.md new file mode 100644 index 00000000..267f3e1a --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/publish-app.md @@ -0,0 +1,11 @@ +--- +title: Publishing your App +--- + +:::danger Progress +This page has not been started yet or needs a lot more work. +::: + +Expo workflow, benefits of, etc. + +Over the air updates? diff --git a/documentation/versioned_docs/version-1.0.0/quick-start.md b/documentation/versioned_docs/version-1.0.0/quick-start.md new file mode 100644 index 00000000..c72f310c --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/quick-start.md @@ -0,0 +1,66 @@ +--- +title: Quick Start +--- + +## Prerequisites + +- Node.js 16.14 or newer +- The latest version of NPM or Yarn, compatible with Node 16.14 or newer +- Expo CLI 6.0.6 or newer +- EAS CLI 2.6.0 or newer to build and publish the App +- An active Discourse site + - If you don’t have one, please follow the instructions in [Development Setup](setup#discourse-host) + +:::note +Follow the instructions in [Setup Guidance](tutorial/setup) to install the prerequisite depedencies, such as NPM, the Expo CLI, and the EAS CLI. +::: + +## Installation + +Clone the repository and navigate into it: + +``` +git clone git@github.com:lexiconhq/lexicon.git +cd lexicon +``` + +Next, install the project's dependencies and generate its GraphQL schema: + +``` +$ npm install && npm run generate +``` + +Note that `npm run generate` involves two steps. + +- First, it will generate a [GraphQL schema](https://nexusjs.org/docs/guides/schema) in the `api` directory. + +- Then, using the generated schema, it will create a new folder called `generated` in the `frontend` directory, containing the resulting query and mutation types. + +- This allows the frontend codebase to stay in sync with, and not duplicate the code for, the types from the `api` directory. + +The code shared from the API is then used by [Apollo](https://github.com/apollographql/apollo-tooling), the GraphQL library we use on the frontend, which enables the Mobile App to query the API correctly. + +## Launch the Mobile App + +You can run the app and test it out by running this command from the project root: + +``` +$ npm run quickstart +``` + +This will simultaneously launch two processes: + +- The Prose GraphQL API Server +- The local Expo dev server, which will enable you to launch the React Native app from your device + +**Please note that this takes some configuration to setup properly**. + +- The `quickstart` command configures the Mobile App and the Prose GraphQL API to point at https://meta.discourse.org, as an example. + +- You'll need to make adjustments to point at a site of your choice. + +- The Lexicon Mobile App (via Expo) must be configured to point at the Prose GraphQL Server + +- The Prose GraphQL Server must be configured to point at an active Discourse instance + +More details are available in the [Development Setup](setup) section diff --git a/documentation/versioned_docs/version-1.0.0/rationale.md b/documentation/versioned_docs/version-1.0.0/rationale.md new file mode 100644 index 00000000..bfb62fa4 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/rationale.md @@ -0,0 +1,73 @@ +--- +title: Background & Motivation +--- + +### Discourse's Approach to a Mobile Experience + +Discourse is a phenomenal, battle-tested piece of software that facilitates thoughtful discussions in countless communities around the globe. It's no secret that we are big fans of it. + +The Discourse core team's strategy for mobile devices was to implement their product as a responsive website, and optimize for mobile use cases. This allowed mobile users to simply go to the same Discourse site as they would have on devices with larger screens— enabling them to view and write posts from their mobile devices. + +However, over time, interest in a dedicated Discourse mobile app grew. The core team addressed this need by building a native mobile app. They chose to reuse their existing work by having the app simply wrap a webview containing the mobile site. + +This was a nice improvement, as it allowed the mobile app to integrate with native SDKs and provide some additional features to Discourse mobile users. + +Overall, their approach to solving this problem was both efficient and well-done. + +However, it is still evident to many users that they're interacting with an embedded web browser, and it's clear that it's not a mobile-_first_ experience. + +For many users and site-owners, what the Discourse team has provided is more than enough, and it solves all of their problems. + +In our case, we were looking for a very specific type of experience. + +### Who We Are + +The Lexicon Team is part of [KodeFox](https://www.kodefox.com/), a software studio comprised of passionate software engineers, designers, and product managers who regularly build world-class software for our customers. + +Interested in custom software development with a personal touch? Drop us a line at [hello@kodefox.com](mailto:hello@kodefox.com). + +### Enter Lexicon + +Lexicon was formed out of the desire to further leverage many of the great features that the Discourse team had worked hard to build. + +In our consulting projects, we found that many of our clients were regularly asking for solutions that Discourse already provides out of the box. + +However, our clients wanted a seamless, native mobile experience, tailored to the brand that their users were already familiar with. + +After digging into the Discourse API documentation, we felt that it was worthy investment to build a mobile-first Discourse experience which also faciliated customizability. + +We were already fluent with the elegant development process provided by React Native and Expo, so it was a natural fit for us to build the mobile app with these technologies. + +This allowed us to achieve a high ratio of code reuse across iOS and Android, making feature implementations and bug fixes a much simpler process in most cases. + +In integrating with Discourse's API, we also noticed that the API documentation contains a disclaimer which encourages reverse-engineering to understand it. + +While we can appreciate the sentiment of figuring things out yourself, we wanted to provide an API experience that makes it easy for developers to dig into interactive documentation and quickly grasp the concepts. + +For this reason, we also chose to build Prose, our GraphQL API layer on top of the Discourse RESTful API. Another motivating factor was our existing fluency with GraphQL. + +This allowed us to quickly implement the mobile app with an intuitive API paradigm that we were already very familiar with. + +#### How Lexicon can help you + +If you already run an existing Discourse site and want a native mobile experience for your users, you can very quickly point Lexicon at your site and browse it in real-time from your device. + +Check out the [Quick Start](quick-start) page to see a rapid example of spinning up a mobile app for Discourse's own [Meta site](https://meta.discourse.org). + +But beyond that, Lexicon is an open source pre-built mobile app. This means that you can customize it to fit your brand. + +You can think of it like a template that you can use to build your own mobile app for your community. + +If you're interested in customizing the Lexicon Mobile app, you can learn more about that in the [White Labeling](white-labeling) section. + +And when you're finished, you can publish it to the Apple App Store or Google Play Store, which we cover in [Publishing your App](app-store). + +### FOSS Mindset + +Finally, while this project will benefit us and our clients in the future, we also wanted it to be a gift to the community. + +We recognize and support the culture of free and open-source software. That's why we're delighted to give back to the community in this way, just as the Discourse team originally did when they chose to open-source their hard work. + +So please engage with us on Github, and don't be shy about opening a new issue or even a PR. + +We look forward to working with you! diff --git a/documentation/versioned_docs/version-1.0.0/setup.md b/documentation/versioned_docs/version-1.0.0/setup.md new file mode 100644 index 00000000..7ef46648 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/setup.md @@ -0,0 +1,362 @@ +--- +title: Development Setup +--- + +### Clone the Lexicon Repository + +If you haven't already, make sure you [clone the Lexicon repository](quick-start#installation) from Github. + +### Setup a Discourse Instance, if necessary + +In order to get started developing against the Lexicon Stack, you'll need a running Discourse instance. + +To recap, the Lexicon Stack consists of: + +- The Lexicon Mobile App +- The Lexicon Prose GraphQL API +- A running Discourse instance + +Without a Discourse instance, the Prose GraphQL API has nowhere to retrieve data from. And when the Prose GraphQL API can't retrieve any data, the Lexicon Mobile App won't be able to receive anything either. + +For detailed instructions on setting up a local development instance of Discourse, head over to the [tutorial](./tutorial/setup-discourse), which will walk you through the process. + +However, if you already have a deployed instance of Discourse, we'd recommend using that instead. + +### Configuration + +The [Lexicon Stack](concepts#architecture-of-the-lexicon-stack) requires some configuration in order to properly interact with your Discourse server. + +This involves configuring both the backend GraphQL API, which interacts with your Discourse instance; as well as the frontend Mobile App, which interacts with the GraphQL API. + +The architecture of this setup is depicted in [Architecture of the Lexicon Stack](concepts#architecture-of-the-lexicon-stack). + +#### Backend GraphQL API Configuration + +The [Prose GraphQL API](concepts#prose-discourse-through-graphql) is fairly simple in terms of configuration. In the simplest case, it only needs to know where your Discourse instance is accessible at. + +It receives its configuration via a [`.env` file](https://www.codementor.io/@parthibakumarmurugesan/what-is-env-how-to-set-up-and-run-a-env-file-in-node-1pnyxw9yxj) in the root of the `api/` directory. + +Here is the simplest configuration of the `api/.env` file: + +``` +PROSE_DISCOURSE_HOST=https://meta.discourse.org +``` + +It is also worth noting that you can optionally configure the **Hostname** and **Port Number** that the Prose API server listens on, both of which default to **localhost** and **port 80**, respectively. + +``` +PROSE_DISCOURSE_HOST=https://meta.discourse.org + +# Instruct Prose to broadcast publicly instead of on localhost +PROSE_APP_HOSTNAME=0.0.0.0 + +# Instruct Prose to listen on port 8929 instead of the default port 80 +PROSE_APP_PORT=8929 +``` + +For a comprehensive list of all environment variables that can be used to configure Prose, check out [Prose Environment Variables](env-prose). + +#### Frontend Mobile App Configuration + +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +To configure the frontend mobile app, you'll first need to set your app name and slug in `frontend/app.json`. The [slug](https://docs.expo.dev/workflow/glossary-of-terms/#slug) is used as part of the URL for your app on Expo's web services, so it is recommended to use kebab-case (e.g., `my-lexicon-app`). + +Replace these placeholders with your desired values: + +```json + "name": "", + "slug": "", +``` + +Next, change the value of `proseUrl` in `frontend/Config.ts` to the URL of your Prose GraphQL API—whether local or already deployed somewhere. + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com:8080/subpath', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; +``` + +`localDevelopment.proseUrl` will be used during development when you run the app using `npm run start` or `expo start`, whereas the specific value within `buildChannels` (e.g., `production.proseUrl`) will be used when actually building the app. + +#### Development Scenarios + +When developing locally, there are at least three scenarios that you may find yourself in. + +Depending on which one applies to you, the config values across `frontend/Config.ts` and `api/.env` may need to be set differently. + +##### Scenario 1: Existing Prose Deployment + +If you've already deployed the Prose GraphQL API to a host that is publicly reachable, you will have already setup `api/.env` with the proper values. + +In that case, `frontend/Config.ts` only needs updated to point at the deployed GraphQL API. + +For example: + +```ts +const config = { + localDevelopment: { + proseUrl: 'https://my-deployed-graphql.api', + }, + buildChannels: { + preview: { + proseUrl: 'https://my-deployed-graphql.api', + }, + production: { + proseUrl: 'https://my-deployed-graphql.api', + }, + }, +}; +``` + +In the example above, we have configured the app to point at `https://my-deployed-graphql.api` in all scenarios, including during development when running with `npm run start`. + +##### Scenario 2: Run Prose Locally & Access from a Simulator + +This approach involves running both the Lexicon Mobile App and the Prose GraphQL API on your development machine. It is accomplished by instructing Expo to launch the Mobile App in the Android or iOS simulator. + +When developing this way, you can simply set `localDevelopment.proseUrl` to `http://localhost` in `frontend/Config.ts`. And then in `api/.env`, you can set `PROSE_APP_HOSTNAME` to `0.0.0.0`. + +Note that if you want to run Prose locally on a specific port, you would need to make sure that the configuration in both `api/.env` and `frontend/Config.ts` reflect that correctly. + +:::caution +If you configure `PROSE_APP_HOSTNAME` in `api/.env` to only listen on `localhost` or `127.0.0.1` (rather than `0.0.0.0`), it prevents others on the same network as your development machine from accessing it. This includes both your mobile device and the Android simulator, which can lead to connectivity issues when developing locally. +::: + +##### Scenario 3: Run Prose Locally & Access from your Mobile Device + +It can be very useful to develop and debug against the app using your actual mobile device with the [Expo Go app](https://expo.dev/client). + +In order to do this, you'll need to have your development machine reachable from your mobile device. + +A simple way to make it reachable is to ensure that your mobile device and development machine are on the same network, and then, in `api/.env`, set `PROSE_APP_HOSTNAME` to `0.0.0.0`. + +In a regular Expo project, you would be required to update the `localDevelopment.proseUrl` value in `frontend/Config.ts` to contain the hardcoded IP address of your development machine on your network. + +However, by setting the value to `http://localhost`, we handle this **automatically** by default, so you don't have to worry about it. Read more about it [here](env-mobile#infer_development_host). + +###### Hardcoding your local IP Address + +:::info +This approach is not ideal. If your local IP address ever changes, you'll need to locate it again, and update `Config.ts` to reflect that. For this reason, it's preferable to just use `http://localhost`. +::: + +To manually instruct the Mobile App how to locate your development machine, you'll need to find out what the **local IP address** of your development machine is on your current network. + +Note that your local IP address is different from your public IP Address. + +If you are not sure how to get your local IP address, you can go to [What Is My Browser: Detect Local IP Address](https://www.whatismybrowser.com/detect/what-is-my-local-ip-address) and follow the instructions. + +The website itself may not be able to automatically detect your local IP address, but it will give you instructions on how to locate it within your specific operating system. + +You will be given an IP address like `10.0.12.121` or `192.168.17.69`. + +You can then update the value in `frontend/Config.ts` to your local IP address. + +This will allow the app running on your mobile device to properly locate the GraphQL API running on your development machine. + +## Configure your Discourse Host + +As mentioned above, you'll need to have setup a Discourse host for the GraphQL API to interact with. + +We'd like to briefly cover the different approaches to setting up a Discourse Host for development before continuing. + +**1. Run a Discourse Instance Locally** + +:::note +Ensure that you are managing all of your ports correctly. + +The development setup of Discourse with Docker makes use of multiple ports, one of which being **port 3000** by default. You'll want to double-check that none of the environment variables are pointing at the ports Discourse is using. +::: + +If you'd like to run a Discourse site for development locally, the recommended way to do this to use **[Docker](https://www.docker.com/)**, so make sure you have it installed. + +Then, as we mentioned above, you can follow [these steps in the tutorial](tutorial/setup-discourse) to install and run a development instance of Discourse in Docker. + +**2. Use try.discourse.org or another popular Discourse site** +:::info +Feel free to use existing public Discourse sites—such as the [Docker Community Forum](https://forums.docker.com/) or the [Rust Programming Language Forum](https://users.rust-lang.org/)—in order to test out the Lexicon Mobile App. + +Just be mindful of how you're contributing to those sites if you do. +::: + +[Try Discourse](https://try.discourse.org/) is a publicly accessible Discourse instance which is intended for testing. As such, it resets every day. + +The only drawback of this approach is that you can only register as a normal user, and therefore cannot modify the site's admin settings. + +With this approach, you'd simply configure Prose in `api/.env` to point `PROSE_DISCOURSE_HOST` at one of these instances. + +```bash +PROSE_DISCOURSE_HOST=https://try.discourse.org +``` + +## Working with the Codebase + +Now that you've prepared everything for development, you can start digging in on the Lexicon codebase. + +### Run the Lexicon Mobile App & Prose GraphQL Server + +You can run the Mobile App and test it out with a local Prose server by running this command **from the project root**: + +``` +$ npm run dev +``` + +This will simultaneously launch two processes: + +- The GraphQL API Server +- The local Expo dev server, which will enable you to launch the React Native app from your device + +However, if you wish to run the frontend and backend seperately, execute the following command in a terminal to run the frontend + +``` +$ npm run --prefix frontend start +``` + +Then execute the following line in another terminal to run the backend + +``` +$ npm run --prefix api dev +``` + +### Debugging + +- Use [Expo Developer Menu](https://docs.expo.io/workflow/debugging/#developer-menu) to make the debugging process easier. + +Opening the Expo Developer Menu depends on your device: + +- On an iOS Device: Shake the device, or touch 3 fingers to the screen. +- On the iOS Simulator: Hit `⌘ + ctrl + Z` on a Mac in the emulator. +- On an Android Device: Shake the device vertically, or run `adb shell input keyevent 82` in the terminal window if the device is connected via USB. +- On the Android Emulator: Hit `⌘ + M`, or run `adb shell input keyevent 82` in your terminal window. + +- If your changes don't show up, it could involve a cache issue. In this case, you should try restarting Expo. + - To do so, quit the process by hitting `Ctrl + C` in the Terminal where it is running. + - Then run `npm run start` again. + - If the issue persists, you should look for the latest guidance from Expo on how to clear the cache, as it has been known to change. + +### Running the Test Suites + +Before running tests, double-check that your changes don't contain any errors. + +You can run tests across both the frontend and backend codebases sequentially by running the following command from the project root: + +``` +$ npm run test +``` + +On top of ensuring that all tests have passed, the command will also notify you if there are any Typescript errors or issues from Prettier or ESLint. + +Also note that the process of running `npm run test` triggers an additional action in the frontend to take place before running the tests. + +A new folder, `frontend/generated`, is created and populated with all the GraphQL Query and Mutation types for use in the codebase. + +If we did not run this before the tests, they would fail due to type errors. + +### Build & Publish the Lexicon Mobile App + +:::note +An Expo account is required in order to use Expo's services. You can create one here: https://expo.io/signup. +Once you have created your Expo account, please ensure that you are signed in with your current shell session, via `expo login` or `eas login`. +::: + +You are required to configure EAS build first by running: + +```bash +eas build:configure +``` + +You will then get a prompt from the EAS CLI related to the EAS project IDs: `android.package` and `ios.bundleIdentifier`. EAS will provide you with an existing project ID if you have one or ask you to create a new one. As for `android.package` and `ios.bundleIdentifier`, you can specify those values with `com.companyname.appname`, or any other patterns you might prefer. + +Once you're done, verify the `proseUrl` value you will use for the actual build of the app in `Config.ts`. + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](deployment) to deploy Prose if you haven't already. +::: + +Now you can build the Mobile App via Expo (EAS) with the preview build profile by running command below: + +```bash +eas build –platform all –profile preview +``` + +When you do this, the packager will minify all your code and generate two versions of your code—one for iOS, and one for Android—and then upload them both to the Expo CDN. + +Additionally, if you haven't yet optimized the app's assets, Expo will ask you if you'd like to do so. + +This has the same effect as manually running `npx expo-optimize` beforehand. It simply compresses all of the image assets in your project to reduce the size of your build. + +When the process is complete, you'll be presented with a shareable QR Code and a URL resembling https://exp.host/@ccheever/an-example, which directs you to the build details in Expo's web console. + +At this point, anyone can then use that link to load your project. + +For Android, you can install the app on an emulator or on your physical device. However, for iOS, you can only install it on the iOS simulator. To run the app on a real iOS device, follow the steps in [this part](tutorial/building#1-preview) of the tutorial. + +When building your app, it is recommended to build it as a preview build first, and make sure everything runs well before building it for release with the production profile. + +To build the app with the production build profile, run this command: + +```bash +eas build –platform all –profile production +``` + +You will also be presented with links directing you to the build details in Expo. + +However, unlike the preview build, the release build cannot be installed directly on your physical device or in an emulator / simulator. You'll need to publish the app and then install it from either the Play Store or App Store. + +You can read a more detailed explanation of this process in [this section](tutorial/building) of the tutorial. + +#### Updates + +If you later want to deploy an update to your version of the Lexicon Mobile App, you can use the EAS update command. + +First, make sure to configure EAS update by running the following command: + +```bash +eas update:configure +``` + +This command will automatically add the `expo.runtimeVersion` field to your `app.json` file. +You'll see a warning in your terminal telling you to add `expo.updates.url` to `app.json`. + +Then run this command to update your project: + +```bash +eas update -–branch +``` + +:::note +The channel name is the same as the build profile, so for the preview builds, you can run: + +```bash +eas update -–branch preview +``` + +::: + +Read more about updating your app [here](tutorial/updating). + +Once published, the new version will be available to your users the next time they open it. + +For more details on this process—including publishing to the App Store and Google Play Store—follow the instructions in [Publishing your App](tutorial/publishing). + +#### Configure the GraphQL API with your Discourse Server + +In order for a published version of the app to be able to contact your Discourse server, you'll need to ensure that: + +- The GraphQL API is deployed and running properly on a host that is reachable from the app itself. +- The GraphQL API is configured to point at the correct host and port of your Discourse server +- Your Discourse server is reachable by the GraphQL API diff --git a/documentation/versioned_docs/version-1.0.0/supported-devices.md b/documentation/versioned_docs/version-1.0.0/supported-devices.md new file mode 100644 index 00000000..148acbb7 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/supported-devices.md @@ -0,0 +1,29 @@ +--- +title: Supported Devices +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## iPhone and Android Phones + +Once you've published to the App Store and Google Play Store, your published app will work out of the box for your users on both iPhone and Android devices with the following specifications: + +| Device | Minimum OS | +| --------------- | ------------------- | +| iPhone | iOS 6 and above | +| Android Devices | Android 5 and above | + +| Android | iOS | +| -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| | | +| | | +| | | +| | | + +## Support for Other Devices + +At this time, **tablets - including iPads** - and other mobile devices are **not supported**. + +We may consider developing support for this in the future. + +If this is critical for you, please drop us a line at support@kodefox.io and let us know. diff --git a/documentation/versioned_docs/version-1.0.0/technologies.md b/documentation/versioned_docs/version-1.0.0/technologies.md new file mode 100644 index 00000000..c4180c4f --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/technologies.md @@ -0,0 +1,23 @@ +--- +title: Technologies +--- + +### 100% React Native and TypeScript built on Expo + +Lexicon was built, and is maintained, with a single code base—meaning that bug fixes, improvements, and new features will (in most cases) automatically apply to both iOS and Android. + +### GraphQL-based API + +Developers who wish to contribute to (or fork) Lexicon can do so with all the benefits of GraphQL. For more information, check out [Concepts and Architecture](concepts#prose-discourse-through-graphql). + +### White Labeling Support + +White Label the Lexicon Mobile App to give your users the familiar look and feel of your brand. Learn more in [White Labeling](white-labeling). + +### Painless integration with existing Discourse instances + +Getting started is as easy as spinning up a new server for the Prose GraphQL API, and pointing it at your Discourse instance. No changes are required on your Discourse instance itself. + +However, to provide an [optimal experience](optimal) with features like Tagging and Topic Excerpts, you will need to make some light adjustments. + +This is covered in detail in [Deploying Prose](deployment). diff --git a/documentation/versioned_docs/version-1.0.0/theming.md b/documentation/versioned_docs/version-1.0.0/theming.md new file mode 100644 index 00000000..04dbc172 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/theming.md @@ -0,0 +1,247 @@ +--- +title: Theming +--- + +:::note +This section will involve reading and modifying Typescript. If you get stuck, reach out to us. +::: + +Lexicon allows you to customize the default theme that the Mobile App provides. + +You can accomplish this by modifying the values in `frontend/src/constants/theme`, or in `frontend/src/theme`. + +There is a difference between the two, and they work in conjunction with one another. + +`frontend/src/constants/theme` defines the underlying base values of the theme. + +`frontend/src/theme` then imports those values, and uses them to compose the actual theme object used throughout the rest of the Mobile App. + +## Colors + +### Adjusting Base & Functional Colors + +There are 2 types of colors in the Mobile App: base colors and functional colors. + +Base colors are the underlying palette of the theme, whereas functional colors define specific use-cases of the base colors. + +For example, you might have noticed that the Mobile App features a nice, eye-catching Royal Blue color as its primary color. + +This is defined in the base colors as: + +```ts +// ... +royalBlue: '#2B6AFF', +// ... +``` + +Then, the functional colors make use of this for particular components in the app. + +To continue with the example, the `royalBlue` base color is referenced in the functional colors as: + +```ts +// ... +activeTab: BASE_COLORS.royalBlue, +// ... +primary: BASE_COLORS.royalBlue, +// ... +``` + +Now, any component can reference the functional colors' `primary` value, and it will be `royalBlue`. + +However, if you wanted a different theme with a new color, such as, `BASE_COLORS.lightningYellow`, then you could adjust it to: + +```ts +// ... +activeTab: BASE_COLORS.lightningYellow, +// ... +primary: BASE_COLORS.lightningYellow, +// ... +``` + +And the Mobile App would replace the Royal Blue with the value you've defined for Lightning Yellow. + +For this reason, if you want to add more colors, you'll need to add base color values first, and then access them within the functional colors. + +This approach keeps a clean separation of concerns, which allows theme changes to seamlessly propagate throughout the Mobile App. + +### Color Scheme (Dark Mode and Light Mode) + +The theme allows you to control how the user can adjust the app's color scheme, if at all. + +There are three choices for this: `dark`, `light`, `no-preference`. + +- Dark: force the color scheme to remain dark +- Light: force the color scheme to remain light +- No Preference (default): allow your users to specify a preference for color scheme + +Note that if you specify `dark` or `light`, your users **will not** have the option of selecting a preference for color scheme. + +This manifests in the Mobile App by hiding the Dark Mode button which normally appears in the Preferences Scene. + +## Fonts + +The theme's fonts are declared in `frontend/src/constants/theme/fonts`. + +Inside of that file, you'll find multiple aspects of the fonts that can be adjusted: + +- Font Variants +- Font Sizes +- Heading Font Sizes + +### Font Variants + +Used to classify multiple font weights into named variants. It supports the following values: + +| Variants | Default font weight | +| -------- | ------------------- | +| bold | 700 | +| semiBold | 600 | +| normal | 400 | + +### Font Sizes + +Used to set a font size scale that is consistent throughout the app. It supports the following values: + +| Variants | Default size | +| ---------------- | ------------ | +| xl (extra large) | 24 | +| l (large) | 18 | +| m (medium) | 16 | +| s (small) | 14 | +| xs (extra small) | 12 | + +### Heading Font Sizes + +Used to classify multiple font sizes for heading elements, such as `h1`, `h2`, etc. + +These values are primarily used for rendering the content of posts and messages from Discourse. + +This is because Discourse posts are written in Markdown, and users will often leverage heading elements to format their posts. + +| Variants | Default size | +| -------------- | ------------ | +| h1 (Heading 1) | 32 | +| h2 (Heading 2) | 24 | +| h3 (Heading 3) | 22 | +| h4 (Heading 4) | 20 | +| h5 (Heading 5) | 18 | +| h6 (Heading 6) | 17 | + +## Icons + +The `icons` theme file is used to store icon-related constants. + +Currently, the ‘icons’ file only contains a constant which declares the icon sizes scale. + +| Variants | Default size | +| ---------------- | ------------ | +| xl (extra large) | 28 | +| l (large) | 24 | +| m (medium) | 20 | +| s (small) | 18 | +| xs (extra small) | 16 | + +## Images + +The `images` theme file is used to store theme constants used in rendering images. + +Currently, this file declares the following theme values: + +- Avatar Icon Size +- Avatar Letter Size +- Avatar Image Size + +Avatars are used throughout the app to display relevant info about a post or message. + +As such, it is typically the user's photo. + +However, when a photo is not provided, we also compose a letter-based avatar based on the user's initials. + +### Avatar Icon Size + +| Variants | Default size | +| ---------------- | ------------ | +| l (large) | 96 | +| m (medium) | 52 | +| s (small) | 40 | +| xs (extra small) | 28 | + +### Avatar Letter Size + +| Variants | Default size | +| ---------------- | ------------ | +| l (large) | 72 | +| m (medium) | 36 | +| s (small) | 28 | +| xs (extra small) | 16 | + +### Avatar Image Size + +This defines the quality of the image used for avatars. + +| Variants | Default size | +| ---------------- | ------------ | +| xl (extra large) | 450 | +| l (large) | 150 | +| m (medium) | 100 | +| s (small) | 50 | + +## Spacing + +The `spacing` theme file defines spacing constants used throughout the Mobile App for padding and margins. + +| Variants | Default size | +| ------------------------- | ------------ | +| xxxl (triple extra large) | 36 | +| xxl (double extra large) | 24 | +| xl (extra large) | 16 | +| l (large) | 12 | +| m (medium) | 8 | +| s (small) | 4 | +| xs (extra small) | 2 | + +## Advanced Customization + +While the above adjustments are generally fairly simple, you can really customize the Mobile App to your heart's content (based on your skill level). + +Here are some additional aexamples. + +### Custom Fonts + +#### Create a folder for the Custom Fonts + +To keep the codebase organized, create a folder named `fonts` inside of `frontend/assets`. + +You can then move your custom font assets into this folder. + +#### Install & Use the `expo-font` Package + +This package eases the process of adding custom fonts into an Expo-based app. + +In particular, you'll want to use the `loadAsync` function from it, which will map your font assets to their variant names throughout the Mobile App. + +While we won't get into too much technical detail here, their [documentation](https://docs.expo.dev/versions/latest/sdk/font/) can guide you through the process. + +### Error Messages + +It is possible to customize both the error messages and the means through which they are presented to the user. + +In order to do this, you should first be aware of two files. + +#### `frontend/src/helpers/errorMessage.ts` + +The Prose GraphQL API forwards on error messages from Discourse. + +This file declares the specific text of those messages as constants so that they can easily be compared in `errorHandler.ts`. + +If you observe any additional error messages that are not being caught, you'll want to add them to this file, and then adjust `errorHandler.ts` below accordingly. + +#### `frontend/src/helpers/errorHandler.ts` + +This file imports from the above `errorMessage.ts`. + +It then defines exactly how errors should be handled, including the above messages, when they are encountered. + +Currently, the default approach is to display the errors using an Alert to the user. + +However, if you wanted to integrate snackbars, you would adjust the code in `errorHandler.ts` to replace the invocations of `Alert.alert`. diff --git a/documentation/versioned_docs/version-1.0.0/troubleshooting-build.md b/documentation/versioned_docs/version-1.0.0/troubleshooting-build.md new file mode 100644 index 00000000..68d75dad --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/troubleshooting-build.md @@ -0,0 +1,128 @@ +--- +title: Troubleshooting when trying out the app +--- + + + + + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## Troubleshooting Connection and Configuration Issues with URL + +

+ please connect to network error +
+ +If you are encountering issues related to the URL, resulting in an error message saying "please connect to network" as shown in the screenshot, it is likely due to incorrect settings. Specifically, if you are attempting to test builds locally on your mobile device and the channel field is not properly configured, the app may continuously fallback to the localDevelopment channel, even if you have set it to something else like "preview." + +Here some steps and notes to help resolve this: + +- Open the `frontend/Config.ts` file in your project. +- Locate the `config` object within the file. +- In the `localDevelopment` section of the `config` object, you can add the Prose URL specific to the channel you are trying to test. This section is used for local development and as a fallback configuration for unknown build channels in EAS Build. Here's an example: + + ```ts + const config: Config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, + }; + ``` + +- The example above shows that the config consists of two main sections: localDevelopment, which specifies the URL during localDevelopment, and buildChannels, which includes configurations for different channels such as preview and production. For local development, it will hit the Prose API with the URL `http://localhost:8929`. If the buildChannel is unknown or not found, it will always default to localDevelopment. +- Update the `proseUrl` value within the desired build channel, such as `preview` or `production`, with the valid and reachable URL of your Prose server. +- Once you have made the necessary changes, save the `frontend/Config.ts` file. + +Now, when you run eas build for a specific build channel, such as `eas build --profile=production`, it will utilize the Prose URL specified in the production configuration. + +:::note +It is important to include the URL in the `frontend/app.json` file, which expo-updates will use to fetch update manifests. Failing to set the URL in the `frontend/app.json` file will result in the expo-update constant always returning undefined for the channel, causing the app to consistently utilize the localDevelopment URL after building. You can specify this URL in the expo and updates sections of the app.json file. For more detailed information on how to configure this, please refer to the [expo documentation](https://docs.expo.dev/versions/latest/config/app/#url) for more detail on this. + +```json +"expo": { + "updates": { + ..., + "url": "https://u.expo.dev/" + } +} +``` + +This configuration is essential for seamless integration with Config.ts in your project. +::: + +In certain cases, you may encounter an issue related to Prose API URLs when the channel name specified in the `frontend/eas.json` file does not match the corresponding key name defined in the `config` variable in `frontend/Config.ts`. This discrepancy can lead to problems because the channel name from `eas.json` is used to determine the URL that will be utilized. If the names do not match, the default `localDevelopment` URL will be used instead. + +To ensure smooth functioning, it is important to use the same channel name in both the `frontend/eas.json` file and the `frontend/Config.ts` file. This will ensure proper mapping of the channel name to the corresponding URL. + +Here is an example to illustrate this: + +```json +// frontend/eas.json + +"build": { + "staging": { + "android": { + "buildType": "apk" + }, + "channel": "staging" + } +} +``` + +```ts +// frontend/Config.ts; + +const config: Config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + inferDevelopmentHost: true, + }, + + buildChannels: { + preview: { + proseUrl: '', + }, + production: { + proseUrl: '', + }, + staging: { + proseUrl: '', + }, + }, +}; +``` + +## The app closes abruptly after the splash screen + +If you encounter a situation where your app closes abruptly after the splash screen, it is likely that there are missing configurations in your `app.json` file. One common cause is the absence of a scheme definition in `app.json`, which is essential during the app build process. + +To resolve this issue, follow these steps: + +1. Open your project's `frontend/app.json` file. +2. Look for the `"expo"` section. +3. If a scheme is not present add this part in `"expo"` section + +```json +"expo":{ + "name": "", + "slug": "", + "scheme": "", + "version": "1.0.0" +} +``` + +Replace `""` with the desired scheme name for your app. + +4. Save the changes to the `app.json` file. +5. Rebuild your app and test it again. + +By ensuring that the scheme is correctly defined in `app.json`, you should be able to resolve the issue of the app closing after the splash screen. diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/building.md b/documentation/versioned_docs/version-1.0.0/tutorial/building.md new file mode 100644 index 00000000..3e261343 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/building.md @@ -0,0 +1,152 @@ +--- +title: Build your App +--- + +## EAS Build + +EAS Build is the upgraded version of `expo build`. This service helps to build app binaries for your Expo and React Native projects. Read more about it in the Expo documentation [here](https://docs.expo.dev/build/introduction/). + +### Configuration + +Let's get started by configuring EAS build. Check [here](https://docs.expo.dev/build-reference/build-configuration/) to see the complete guide from Expo. + +#### Build Setup + +Run this command in `/frontend` directory: + +```bash +eas build:configure +``` + +When running that command, the EAS CLI will typically do the following: + +1. It will prompt you for the EAS project ID, either to use an existing ID if you have one, or create a new one. Then it will automatically add the `expo.extra.eas.projectId` field in `app.json`. +2. It will create a new `eas.json` file if one doesn’t already exist. However, we have that set up for you, so you don't need to worry about creating one. 🎉 +3. It will prompt you to specify `android.package` and `ios.bundleIdentifier` if those values are not already provided in `app.json`. Note that those two values don't have to be the identical. + +You can see that the values in `app.json` are updated after running the command. + +#### Configuration Values + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](../deployment.md) to deploy Prose if you haven't already. + +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +Next, open `Config.ts` and overwrite the placeholder values with the Prose URL you want to use for the build version. You can either set the same values or a different one for each channel. You don't need to adjust the values in `localDevelopment` since that is only used in development, and not when building the app. + +```ts +const config = { + // ... + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; +``` + +### Run a Build + +#### Build for Both Platforms + +To build on both platforms, you can use either of the commands below: + +```bash +eas build --platform all +``` + +```bash +eas build -p all +``` + +#### iOS only + +```bash +eas build --platform ios +``` + +#### Android only + +```bash +eas build --platform android +``` + +#### Run a build with a specific profile + +```bash +eas build --platform all –-profile +``` + +```bash +eas build -p all –e +``` + +:::note +Without --profile, the EAS CLI will default to the `production` profile. +::: + +### Build Profiles + +Build profiles serve as a way of grouping configuration values for different scenarios when building the mobile app. + +You can find more details [here](https://docs.expo.dev/build/eas-json/). + +The `eas.json` file can contain multiple build profiles. However, it typically has 3 profiles: **preview**, **development**, and **production**. + +#### 1. Preview + +Purpose: to internally test the app in production-like circumstances. + +It is recommended to try building with the preview profile **_first_** before building your app with the production profile. That way, you can ensure the app runs as expected before it’s ready to be published. + +The build type for Android will be an **APK** file, whereas the iOS build will output a format that can be installed on the simulator. + +This is because the `ios.simulator` option was specified in `eas.json`: + +```json + "ios": { + "simulator": true + }, +``` + +If you want to run the preview build on a real device, you'll need have an Apple account with Apple Developer Enterprise Program membership, then add the `ios.enterpriseProvisioning` value in `eas.json`: + +```json + "ios": { + "enterpriseProvisioning": "universal" + } +``` + +For the `preview` build profile, we have already set the distribution mode to [internal](https://docs.expo.dev/build/internal-distribution/). This ensures that EAS build provides shareable URLs for builds, with instructions on how to get them running. + +This approach then allows us to test the app without submitting to the App Store or Play Store. + +#### 2. Development + +Purpose: to make debugging easier. Expo will automatically include developer tools in the build. As you may have figured, this build should never be published to either of the app stores. + +Development builds depend on [expo-dev-client](https://docs.expo.dev/development/introduction/), so Expo will prompt us to install the library if needed. + +Similar to preview builds, you can add the iOS options mentioned above to run them on a simulator or real device. + +#### 3. Production + +Purpose: for submission to the App Store and Play Store—as a public release, or as part of testing in each respective ecosystem. + +In order to use builds like this, they must be installed through the respective app stores. + +After running builds with this profile, you'll see that the iOS and Android versions have automatically been incremented. As you might expect, this is because `autoIncrement` has been set to `true`. + +It is worth noting, however, that this behavior only applies to TestFlight and Internal Testing, so you'll need to be sure to also manually increment the `expo.version` in `app.json` for public release. Expo provides further [documentation](https://docs.expo.dev/build-reference/app-versions/) on this topic. + +## The App is Built + +Great work! You can now share the installation link with your peers so they can try out the app. + +In the next section, you'll learn how to [publish](publishing) your app to the App Store and Play Store! 🚀 diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/install-prose.md b/documentation/versioned_docs/version-1.0.0/tutorial/install-prose.md new file mode 100644 index 00000000..d6ecec67 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/install-prose.md @@ -0,0 +1,360 @@ +--- +title: Setup the Prose GraphQL API +--- + +Now that we have a running Discourse instance to interact with, we can move onto setting up the Prose GraphQL Server. + +To recap, Prose is a part of the Lexicon stack. + +It is responsible for providing a [GraphQL](https://graphql.org/) interface on top of Discourse, which the Lexicon Mobile App can then interact with. + +For more information about this, check out [Concepts & Architecture](../concepts). + +## Approaches for Setting Up Prose + +If your Discourse instance is running locally, it is natural that you should also setup your Prose server locally. + +Otherwise, it would be unnecessary extra work to get a remote Prose server communicating with your local Discourse server. + +However, if you've setup your Discourse instance in the cloud, it is up to you if you want to run your Prose server locally or in the cloud as well. + +If you'd like to install it in the cloud, you'll want to setup an additional server - similar to how you would set one up for Discourse. If you're not yet comfortable with this, feel free to jump back to the page, [Setup a Cloud Server (Optional)](setup-cloud-server). + +Bearing all of that in mind, once you have identified where you'd like to host Prose, you should also consider how you'd like to install it onto that machine. + +The first way, which we recommend, is to use **[Docker](https://www.docker.com/)**. + +And of course, the second way is to install it manually, rather than using containers. + +## Install Prose using Docker + +The reason we recommend using Docker is because you won't have to worry about setting up Prose's on your machine. + +We have already published Prose to [Docker Hub](https://hub.docker.com/), which means you can easily pull it down and run it. We'll guide you through that below. + +### Install Docker + +First, just as was necessary for setting up Discourse, you'll want to make sure Docker is installed on your machine. + +You can follow the instructions on the [Docker installation page](https://www.docker.com/get-started) if you are unsure of how to do this. + +### Pull and Run the Prose GraphQL API Image + +After successfully installing Docker, you can use the command below to run the Prose GraphQL image. + +Just bear in mind that you'll want to adjust some of the **environment variables** to your situation before you run the command. + +``` +$ docker run -d \ + -e PROSE_DISCOURSE_HOST=https://meta.discourse.org \ + -e PROSE_APP_PORT=80 \ + -p 5000:80 \ + --name prose-graphql \ + kodefox/prose +``` + +The above command will take care of pulling the Prose GraphQL Docker Image, building it, and running it in a container. + +To help understand everything that's going on there, let's break it down line by line. + +```bash +docker run -d +``` + +This instructs Docker to run our image as a container in **detached mode**. This is similar to backgrounding a process. + +```bash +-e PROSE_DISCOURSE_HOST=https://meta.discourse.org +-e PROSE_APP_PORT=80 +``` + +The `-e` flag instructs Docker that we want to set or override certain environment variables in the container with the values we provided. + +In this case, we're telling Prose to interact with the Discourse instance is running at `https://meta.discourse.org`, and that Prose should run itself _inside of the container_ on a port of `80`. + +``` +-p 5000:80 +``` + +Next, we're telling Docker what ports we want to map from our host machine into the container. + +In the previous step, we established that Prose will run internally on port 80. With the above command, we're telling Docker to expose the container's port 80 as port 5000 on our host. + +This means that Prose will be reachable on port 5000 of the host. + +So, if you're running this locally, you'll be able to interact with Prose at `http://localhost:5000`. + +And if you're running it in the cloud on a domain like `https://prose.mydiscussions.com`, you'd likely want it to be listening on port 443 so the user doesn't have to enter a port number as part of the URL. + +### Configure Prose + +As suggested above, you can configure Prose through the use of environment variables. + +You can find a comprehensive list of all environment variables on the Prose [Environment Variables](../env-prose) page. + +In this case, you really only need to set a value for `PROSE_DISCOURSE_HOST`, which will instruct Prose which Discourse instance you'd like it to interact with. + +Additionally, if you'd like to set a different port mapping, you can adjust the `-p` flag of the `docker run` command to something else, such as: + +```bash +-p 8080:80 +``` + +## Install Manually + +This section, whether being done locally or remotely on a cloud provider, will require you to install and configure the necessary dependencies to build and run Prose from scratch. + +### Setup Development Machine + +If you haven't already, setup your machine for Prose development. You can do so by following the guide at [Setup your Development Machine](setup). + +By the time you're done with this step, you should have a local copy of the Lexicon repository on your desired machine. + +### Configure Environment Variables + +The Prose GraphQL API, at a bare minimum, requires you to provide a URL to an accessible Discourse instance in order to run properly. + +Because we're doing this manually, you'll need to specify this in a different way than you would for Docker. + +Later on, once you've built Prose, one way you can specify this is to simply provide it inline as you launch the server. + +```bash +PROSE_DISCOURSE_HOST=https://discourse.mysite.com node lib/index.js +``` + +However, you might find it more ergonomic to leverage the support we've setup for `.env` files. + +The entire Prose codebase lives in the `api/` directory of the repository, so get started by navigating there from the project root. + +``` +$ cd api/ +``` + +Next, you'll need to create a `.env` file. Simply copy the template file, `.env.example` into the `.env` file using the following command. + +``` +$ cp .env.example .env +``` + +After that, as you'd expect, you want to adjust the `.env` file so that it contains the values specific to your project. + +```bash +PROSE_DISCOURSE_HOST= +PROSE_APP_PORT= +``` + +As was covered in the Docker section above, you can find a comprehensive list of all environment variables on the Prose [Environment Variables](../env-prose) page. + +### Launch the Prose GraphQL API + +:::info +At this point, you should already have all the project's dependencies installed. + +If you encounter any errors about missing packages, go back to the guide at [Setup your Development Machine](setup). +::: + +If you'd just like to launch Prose to check it out quickly, you can simply run (from the `api/` directory): + +```bash +$ npm run dev +``` + +This will prepare and spin up Prose in a way that isn't ideal for production. + +If you wish to run the Prose GraphQL API in the background as a process, there are multiple solutions. + +One method is to use **[Tmux](https://github.com/tmux/tmux)**, which will detach the process from the terminal, allowing you to close it and keep Prose running. + +Another method is to use **[PM2](https://pm2.keymetrics.io/)**, which is a sophisticated toolset for running Node processes in production. + +#### Using Tmux + +**Tmux** can be used to detach processes from their controlling terminals, allowing sessions to remain active without being visible. + +To get started, install `tmux` on your machine. + +If you are unsure of how to install tmux, you can follow the instructions on [this page](https://github.com/tmux/tmux#installation). + +Once it's installed, launch it as follows: + +```bash +$ tmux +``` + +Then you can run Prose in the same way as before. + +```bash +$ npm run dev +``` + +If you want to detach from your current session, press `Ctrl + B` then press `d` on your keyboard. The session will remain active in the background. + +And if you wish to re-attach to your last session, run the following command. + +``` +$ tmux a +``` + +If you want to learn more about the tmux command, check out [this cheat sheet](https://tmuxcheatsheet.com/). + +#### Using PM2 + +Another way to run Prose in the background is to use **pm2** (process manager for NodeJS). + +First, as you'd expect, you'll need to install `pm2` on your machine. + +``` +$ npm install -g pm2 +``` + +Once it's installed, you'll also need to use `pm2` to install [Typescript](https://typescriptlang.org/). + +This is because Prose is written in Typescript, and this allows PM2 to run the Typescript files directly for us (as opposed to transpiling them and outputting them as JS first). + +To do this, simply run the following command: + +``` +$ pm2 install typescript +``` + +After that, you can now launch the Prose GraphQL API in the background with: + +``` +$ pm2 start src/index.ts +``` + +To list all running applications, run the following command. + +``` +$ pm2 list +``` + +These are some of the frequently used commands. + +``` +$ pm2 stop # To stop a process +$ pm2 restart # To restart a process +$ pm2 delete # To delete a process +``` + +## Test the GraphQL API + +Now that you've successfully launched Prose, you can actually interact with it in your web browser. + +Because of the libraries that we leveraged in building Prose, it automatically comes with [GraphiQL](https://www.graphql-yoga.com/docs/features/graphiql). + +This is an in-browser GraphQL IDE that makes it easy to explore the documentation and the schema of the GraphQL API. + +In order to access it, you'll need to make note of the host and port number that you configured the API with. + +For example, if you launched Prose from your local machine on port 5000, you'd navigate to [http://localhost:5000](http://localhost:5000). + +Similarly, if you set it up in the cloud, and all you have is an IP address with Prose listening on port 80, you would navigate to something like [http://174.31.92.1](http://174.31.92.1). + +Once the [GraphiQL](https://www.graphql-yoga.com/docs/features/graphiql) interface loads, you can test out some example queries and mutations, including logging into Discourse through Prose. + +### Login + +:::info +If you're accessing a private Discourse site, you'll need to make note of the token that is returned to make other requests. See below. +::: + +``` +mutation Login { + login(email: "user@lexicon.com", password: "user_password") { + ... on LoginOutput { + token + user { + id + name + username + avatarTemplate + } + } + } +} +``` + +As mentioned in the notice, if you're interacting with a private Discourse site, you'll need to provide a token for other GraphQL requests. + +As part of the response for the above mutation, you'll notice a "token" field which contains your authentication token in Base64. + +You use this token in other queries and mutations by opening the HTTP Headers section on the bottom left-hand side of the page. + +This section expects JSON, with which you'll want to add an Authorization header that contains your token. + +```json +{ + "Authorization": "" +} +``` + +Once you have done that, you can make authenticated GraphQL queries and mutations as the user you logged in with. + +### User Profile + +``` + query UserProfile { + userProfile(username: "john_doe") { + user { + ... on UserDetail { + id + avatarTemplate + username + name + websiteName + bioRaw + location + dateOfBirth + email + } + } + } + } +``` + +### Topic Detail + +``` +query TopicDetail { + topicDetail(topicId: 1) { + id + title + views + likeCount + postsCount + liked + categoryId + tags + createdAt + postStream { + posts { + id + topicId + userId + name + username + avatarTemplate + raw + createdAt + } + stream + } + details { + participants { + id + username + avatarTemplate + } + } + } +} +``` + +### Logout + +``` + mutation Logout { + logout (username: "john_doe") + } +``` diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/intro.md b/documentation/versioned_docs/version-1.0.0/tutorial/intro.md new file mode 100644 index 00000000..54e0d630 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/intro.md @@ -0,0 +1,45 @@ +--- +title: Overview +slug: /tutorial +--- + +## Welcome to the Lexicon Tutorial + +We're really excited to help you dig in with the Lexicon Stack and learn how to deploy it in a way that benefits you and your users. + +## Target Audience & Prerequisites + +In order to complete this tutorial, you should have familiarity with: + +- The command-line +- Git and Github +- Setting up a Discourse instance +- Setting up servers in general + +In terms of prepararation, you will need: + +- NodeJS installed on your development machine + - Use the latest version of Node that is compatible with the project's version of Expo (i.e. `expo-cli`). +- An editor to edit config files + +#### Have some concerns? + +Interested in Lexicon but lacking in technical abilities? We completely understand. + +Reach out to us at support@kodefox.com to chat about how we can help bring your idea to life. + +## Next Steps + +This tutorial will guide you through the process of getting the entire Lexicon Stack up and running **locally** with your Discourse site. + +At the end of the tutorial, you will be able to interact with your Discourse site in the Lexicon Mobile App on your local device or simulator. + +You will also have an understanding of: + +- How to configure and run the Prose GraphQL API locally or on a server you own +- How to configure and run the Lexicon Mobile app on your device or in a simulator +- The next steps needed to make full use of Lexicon + +Please note that this tutorial will not cover the process of actually launching the app, as well as certain details about deploying to production. For support with those tasks, please refer to the documentation. + +Let's get started! diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/publishing.md b/documentation/versioned_docs/version-1.0.0/tutorial/publishing.md new file mode 100644 index 00000000..66005bdd --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/publishing.md @@ -0,0 +1,97 @@ +--- +title: Publish your App +--- + +## EAS Submit + +EAS Submit is a service for uploading and submitting your application binaries to App Store and/or Play Store. +Check [here](https://docs.expo.dev/submit/introduction/) to learn more about EAS Submit. + +### Prerequisites: + +- Registered app in App Store Connect, see the guide [here](../app-store#register-a-new-bundle-id). +- Registered app in Play Store, see the guide [here](../play-store). + +### Configuration + +Before submitting, you are required to specify the credentials to publish your app. + +#### iOS + +For iOS, fill in your account information for `appleId`, `ascAppId`, and `appleTeamId`: + +```json + "base": { + "ios": { + "appleId": "", + "ascAppId": "", + "appleTeamId": "" + }, + ... + }, +``` + +- **appleId**: your apple ID (e.g., `john@gmail.com`). +- **ascAppId**: your App Store Connect app ID. Find your ascAppID by following [this guide](https://github.com/expo/fyi/blob/main/asc-app-id.md) (e.g., `1234567890`). +- **appleTeamId**: You can check your apple team ID [here](https://developer.apple.com/account/) (e.g., `12LE34XI45`). + +#### Android + +For Android, you will need to add a `.json` key file to authenticate with the Google Play Store. Please follow [this guide](https://github.com/expo/fyi/blob/main/creating-google-service-account.md) to generate one. Then, copy the JSON file to your `lexicon/frontend` directory, and rename the file as `playstore_secret.json`. + +The JSON file looks like this: + +```json +{ + "type": "service_account", + "project_id": "", + "private_key_id": "", + "private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n", + "client_email": "", + "client_id": "", + "auth_uri": "", + "token_uri": "", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/lexicon%40api.iam.gserviceaccount.com" +} +``` + +Now that the configuration is done, you can start submitting your app. + +### Submitting + +Use this command to submit the build: + +```bash +eas submit --platform ios --profile +``` + +Then you will see the EAS CLI prompt asking which app you would like to submit. + +There are 4 possible options: + +- Selecting a build from EAS +- Providing the URL of an app archive +- Providing the local path to an app binary file +- Providing the build ID of an existing build on EAS + +If you have built your app using EAS Build or have been following the tutorial from [Build your App](building), then please choose the first option, and select the version you want. + +### Submit Profiles + +By default, `eas.json` has been configured with two submit profiles, which are **staging** and **production**. + +The configuration is mostly the same, the only difference lies in the Android track options. + +- Staging infers the track as `internal`. This means submitting with the staging profile will submit the build for internal testing in the Play Store. +- Production infers the track as `production`, which will submit the build for Public Release in the Play Store. + +With iOS, on the other hand, both profiles will be submitted to TestFlight before you can release them publicly. + +You can reference the Expo documentation to learn more about [Android-specific](https://docs.expo.dev/submit/eas-json/#android-specific-options) and [iOS-specific](https://docs.expo.dev/submit/eas-json/#ios-specific-options) options. + +## Congratulations! + +Your app is now available for users to download from both the Play Store and the App Store! 🥳 + +To learn more about how to update your published app in the case of a bug, as well as OTA updates, check out the [next and final section](updating) of the tutorial. diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/setup-cloud-server.md b/documentation/versioned_docs/version-1.0.0/tutorial/setup-cloud-server.md new file mode 100644 index 00000000..b69659a4 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/setup-cloud-server.md @@ -0,0 +1,27 @@ +--- +title: Setup a Cloud Server (Optional) +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +:::info +This is an optional section for users that don't feel as confident spinning up a new server with a cloud provider. + +If you are already adept at this, you can skip to the next section. +::: + +## DigitalOcean Guide + +### How To Set Up an Ubuntu 20.04 Server on a DigitalOcean Droplet + +For our users that aren't as familiar with setting up servers in the cloud, we wanted to provide you with a solid resource to learn more about it and accomplish something in the process. + +DigitalOcean has already provided an excellent guide to walk you through this, so we're going to link you over to them. + +In this guide, you will create an Ubuntu server through DigitalOcean’s administrative panel and configure it to work with your SSH keys. + +Once you have a solid understanding of how to setup servers in the cloud, you'll be much more capable of deploying the Lexicon Stack for your users. + +You can dig in on the article below. + +[Read: How To Set Up an Ubuntu 20.04 Server on a DigitalOcean Droplet](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ubuntu-20-04-server-on-a-digitalocean-droplet) diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/setup-discourse.md b/documentation/versioned_docs/version-1.0.0/tutorial/setup-discourse.md new file mode 100644 index 00000000..9b5bf97a --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/setup-discourse.md @@ -0,0 +1,306 @@ +--- +title: Prepare a Discourse Instance +--- + +Before you can properly setup Lexicon, you'll need to have a running **[Discourse](https://www.discourse.org/)** instance for Lexicon to interact with. + +For this step, you actually have a few options: + +#### Option 1: Setup a Local Discourse Instance + +The first option is to [setup a development instance](#setup-discourse-locally) of Discourse locally on your development machine. This takes a bit of time and can get a bit technical. + +#### Option 2: Buy a Discourse Instance or Use your Existing One + +The second option is to pay to [setup a Discourse instance in the cloud](#setup-discourse-in-the-cloud) as a live, reachable production verison. This is much simpler, but has the obvious tradeoff of costing money. + +And perhaps it goes without saying, but if you already have a Discourse site, feel free to just use that. + +#### Option 3: Use a Public Discourse Site + +The third option is to use an existing Discourse site just to test things out. + +As you'll see later on, Lexicon allows you to configure which Discourse site it is pointing at. As such, you can instruct it to point at at a publically accessible Discourse site that you don't personally own. + +There are countless examples of active Discourse communities out there. Here are a few examples to choose from: + +##### Discourse Meta + +[https://meta.discourse.org/](https://meta.discourse.org/) + +##### Expo + +[https://forums.expo.dev/](https://forums.expo.dev/) + +##### The Rust Programming Language + +[https://users.rust-lang.org/](https://users.rust-lang.org/) + +##### FreeCodeCamp Forums + +[https://forum.freecodecamp.org/](https://forum.freecodecamp.org/) + +## Setup Discourse Locally + +:::note +This section can take a long time. Depending on the specs of your machine, it could take between 10 - 30 minutes to complete. +::: + +This section of the tutorial is based on the following post on Discourse: [Beginners Guide to Install Discourse for Development using Docker](https://meta.discourse.org/t/beginners-guide-to-install-discourse-for-development-using-docker/102009). + +If you run into any issues, feel free to reference the original post and subsequent discussion. + +### Install Docker + +**[Docker](https://www.docker.com/)** is a containerization framework that makes it easy to build, manage, and deploy your application stack in a way that is safer, more reliable, and repeatable across multiple platforms. + +When developing, building, and testing applications locally, it is an invaluable tool that greatly simplifies the entire process. + +The main way that Docker helps us in this tutorial is that it won't require any modifications to our machine's environment other than installing Docker itself. + +This is as-opposed to needing to install all of Discourse's dependencies on your physical machine, in a way that may take a lot of effort to undo later. + +If you are unsure of how to install Docker, you can follow the instructions on their [website](https://www.docker.com/get-started). + +### Clone Discourse + +Once Docker is up and running, we can get started with setting up Discourse locally. + +The first step is to clone the Discourse repository to your local machine and `cd` into it. + +``` +git clone https://github.com/discourse/discourse.git +cd discourse +``` + +Note the repository is on the larger side (nearly 400mb), so this step may take a while depending on your connection. + +### Pull, Build, and Start the Discourse Dev Container + +:::caution +Make sure that the **host ports** listed below are not already in use on your device. +::: + +Discourse already contains a script to help spin up its entire infrastructure using Docker. + +During this process, the script will do the following: + +- Pull down the necessary "dev" Docker image to bootstrap Discourse +- Build the aforementioned image +- Run the image as a container with multiple ports mapped from your host into the container + - 127.0.0.1:**1080**->1080/tcp + - 127.0.0.1:**3000**->3000/tcp + - 127.0.0.1:**4200**->4200/tcp + - 127.0.0.1:**9292**->9292/tcp + - 127.0.0.1:**9405**->9405/tcp +- Prompt you for an admin email address and password + +To get started, simply run the following command: + +``` +$ d/boot_dev --init +``` + +Note that all of the Docker images add up to about 1GB of disk space usage on your device. + +The command will pause when it needs information from you. As shown below, it will prompt you for an administrator email address and password. + +```bash +# Output omitted +== 20200804144550 AddTitleToPolls: migrating ================================== +-- add_column(:polls, :title, :string) + -> 0.0014s +== 20200804144550 AddTitleToPolls: migrated (0.0021s) ========================= + +Creating admin user... +Email: me@me.com +Password: +Repeat password: + +Ensuring account is active! + +Account created successfully with username me +``` + +Next, it will ask you if you want to make this account an admin account. You do. + +```bash +Do you want to grant Admin privileges to this account? (Y/n) y + +Your account now has Admin privileges! +``` + +Please be aware, as suggested above, that the ports mentioned above are not currently in use by other processes. + +### If something unexpected happened + +It's possible that something strange may have happened at this step. + +Perhaps there was a weird error message, or the process just never displayed the output shown above. + +What we'd recommend doing is the following: + +#### Check if a Docker container named `discourse_dev` is running + +```bash +$ docker ps | grep discourse_dev +CONTAINER ID IMAGE ... NAMES +dc72a4ead10f discourse/discourse_dev:release ... discourse_dev +``` + +If it is, stop and remove the container. + +```bash +$ docker stop discourse_dev +discourse_dev +$ docker rm discourse_dev +discourse_dev +``` + +#### Exit or Kill the Existing Process + +If the existing process (`d/boot_dev --init`) is still occupying your terminal session, attempt to exit it via `Ctrl + C`. + +If the process is not responding to `Ctrl + C` after some time, locate its PID and use `kill -9` to kill it + +```bash +$ ps aux | grep rails +user 81254 0.0 0.1 discourse_dev bin/rails s + +$ kill -9 81254 +``` + +#### Restart Docker or your Machine + +Using the command or interface appropriate for your machine, you should restart all of Docker. + +On Docker for Mac, this is as simple as going into the tray icon and clicking Restart. + +#### Try running the command again + +Sometimes things just go a little haywire with this setup. Try running the command again to see if it works better this time. + +#### If you're absolutely stuck, reach out. + +Don't hestitate to contact us if you're just stuck with this one. + +### Optional: Run the Next Two Commands in the Background + +You can read on to get an understanding of what the two commands are, but it's worth mentioning that you want them to run simultaneously. + +You can do this by _backgrounding_ both processes. + +This means that they won't occupy your current session, requiring you to quit them in order to enter other commands. + +When you run this command, it will show you the process IDs (PIDs) of the processes that were backgrounded. + +To bring them back into the foreground, you can run the `fg` command, and then use `Ctrl + C` or a similar signal to stop them. + +```bash +d/rails s & d/ember-cli & +[2] 59786 +[3] 59787 + +fg +``` + +Just **note** that you won't see the output of the commands, and so you may need to be patient for several minutes until Discourse is reachable at its local address. + +Alternatively, you can use the PIDs to kill the processes outright in another session: + +```bash +kill -9 59786 59787 +``` + +### Start the Rails Server within the Container + +If you hadn't already noticed, Discourse is built in [Ruby](https://www.ruby-lang.org/en/) using the very popular web framework, [Ruby on Rails](https://rubyonrails.org/). + +By running the command below, you will be starting the Rails server, which will take some time, and will produce a tremendous amount of output. + +In particular, you'll see the database being initialized as the dev container bootstraps the Discourse server. + +To get started, simply run the following command. + +``` +d/rails s +``` + +#### If you later can't quit the process + +**Note** that this command can sometimes hang when you're trying to kill it with `Ctrl + C`. + +If that happens, it's recommended that you first stop the Docker container: + +```bash +docker stop docker_dev +``` + +Then, bring the process to the foreground with `fg` if necessary. + +Last, either exit your session if possible - such as by closing the Terminal - or find out the PID of the Rails process and kill it directly. + +```bash +$ ps aux | grep rails +user 81254 0.0 0.1 discourse_dev bin/rails s + +$ kill -9 81254 +``` + +### Run the Ember CLI + +The above section mentioned Ruby on Rails, which handles the backend aspects of the Discourse application. + +However, the Discourse frontend is build in [EmberJS](https://emberjs.com/), which is a batteries-included frontend web framework used by multiple major companies. + +Run the command below to instruct the Ember CLI to start the Discourse frontend. + +``` +d/ember-cli +``` + +Once you have done this, you'll be able to access Disourse at [http://localhost:4200](http://localhost:4200). + +Please note that the output of this command can be a bit confusing. And at times, it can seem like nothing is happening. + +You may see several progress indicators, as well as blank output, for several minutes before the server is ready. + +The output you're looking for will resemble the following: + +```bash +Build successful (72475ms) – Serving on http://localhost:4200/ + +Slowest Nodes (totalTime >= 5%) | Total (avg) +----------------------------------------------------------------------+------------------ +Babel: discourse (2) | 31501ms (15750 ms) +ember-auto-import-analyzer (11) | 10418ms (947 ms) +Bundler (1) | 6119ms +Babel: @ember/test-helpers (2) | 5075ms (2537 ms) +broccoli-persistent-filter:TemplateCompiler (3) | 4596ms (1532 ms) +``` + +## Setup Discourse in the Cloud + +There are several guides with instructions on how to setup Discourse in the Cloud. + +Rather than writing another one, we have found our favorite one and would like to send you over to them to give you a proper walkthrough of the process. + +### Guide by SSDNodes + +The guide is provided by the [SSDNodes](https://www.ssdnodes.com/?e=blog&q=more-about-ssdnodes) Blog, [Serverwise](https://blog.ssdnodes.com/blog/). + +If you aren't familiar, [SSDNodes](https://www.ssdnodes.com) is an excellent, cost-effective VPS hosting provider. + +While we are most familiar with Digital Ocean, we'd strongly encourage you to check them out as an alternative for hosting Discourse. + +The post, titled [How To Install Discourse On Ubuntu](https://blog.ssdnodes.com/blog/install-discourse/), is written by [Joel Hans](https://blog.ssdnodes.com/blog/author/joel/). + +Joel has written an excellent guide. He'll take you through the entire process, including making update to your Discourse instance. + +If you find yourself stuck, or have any questions, feel free to reach out to us. + +## Use a Public Discourse Site + +If you've chosen this option, there's not much to do other than to note the URL of the Discourse site you'll be using. + +Once you have that written down somewhere, you're ready for the next section. diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/setup-mobile.md b/documentation/versioned_docs/version-1.0.0/tutorial/setup-mobile.md new file mode 100644 index 00000000..62ab943a --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/setup-mobile.md @@ -0,0 +1,120 @@ +--- +title: Configure & Launch the Mobile App +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +After following the **[Setup the Prose GraphQL API](install-prose)** section, your GraphQL API should now be connected to your Discourse site. + +Next, we'll guide you through the process of connecting the Lexicon Mobile App to your Discourse site via Prose. + +### Mobile App Configuration + +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +Before launching your local version of the Lexicon Mobile App, you'll need to configure it with at least one piece of information. + +The Lexicon Mobile app relies exclusively on a running instance of the Prose GraphQL API in order to retrieve data from your Discourse instance. + +Therefore, you'll need to instruct it on how to locate your running Prose server. + +In development, it is common to have it running locally. However, if you have already deployed Prose +somewhere, feel free to use that. + +#### Configuring `proseUrl` via `config` + +:::caution + +##### `proseUrl` requirements + +It is worth noting that `proseUrl` **must** start with either `http://` or `https://`. + +If it does not, the Mobile App will throw an error when launching. +::: + +`Config.ts` contains the `config` object, which allows you to specify the Prose URL for each scenario encountered when developing and building the Mobile App. + +The specific configuration value which enables this is `proseUrl`, and it is contained within each scenario expressed by the `config` object. + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com:8080/subpath', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; +``` + +As mentioned earlier—above, the `config` object allows us to express configuration values for multiple scenarios, which are: + +- `localDevelopment`: when developing against the app locally. This configuration is also used as a fallback for an unknown build channel. +- `buildChannels`: used to define configuration by build channel when building the app with the EAS CLI. + +`buildChannels` makes use of Expo's build channels (typically `preview` and `production`) as its keys. + +Each key within `buildChannels` maps to a specific Prose URL, which will be used for the build version based on which channel you build for. + +From the example above, when we create a `preview` build, the app will be built and configured to contact a Prose server located at `https://preview.myserver.com:8080/subpath`. + +The example above expresses a setup in which each build has its own deployed Prose server. However, it is also common to use one server for all scenarios, including development. + +```ts +const config = { + localDevelopment: { + proseUrl: 'https://myserver.com/api/prose', + }, + buildChannels: { + preview: { + proseUrl: 'https://myserver.com/api/prose', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; +``` + +##### Port Number + +Bear in mind that if your Prose server is not running on port 80 or 443, you also need to specify the **port number** via `proseUrl`. + +For example, if you've started a Prose server **locally** on port `8929` and try to run it using `expo start`, your `Config.ts` file would contain `http://myserver.com:8929/api/prose` under `localDevelopment.proseUrl`. + +### Launch the Mobile App + +Once you have configured everything, you'll want to launch the Mobile App to test that it is speaking to the right Prose server. + +To do this, you can simply run the following from the project root: + +```bash +npm run --prefix frontend start +``` + +The Expo development server should launch, and you can follow the instructions to run the app in a simulator or on your actual device. + +#### Troubleshooting + +If the app throws an error upon loading, you should double-check the configuration values you specified, according to the message you've received. + +If the app loads, but you're unable to actually connect, you should verify the following: + +- Your Prose Server is up and running at the location you provided to the Lexicon Mobile App +- Your Prose Server is configured to point at an accessible Discourse instance +- Your Discourse instance is up and running correctly + +## Nice Work! + +At this point, you've already accomplished a lot. + +The Discourse server you started off with is now accessible in a new way from a sleek native mobile app, and you're free to customize it to your heart's content. + +In the next part of the tutorial, we'll briefly get into that very topic: customizing the Mobile App to [white label](white-label) it for your brand. diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/setup.md b/documentation/versioned_docs/version-1.0.0/tutorial/setup.md new file mode 100644 index 00000000..20505940 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/setup.md @@ -0,0 +1,98 @@ +--- +title: Setup your Development Machine +--- + +## Install NodeJS + +If you haven't already, install NodeJS on your machine. + +The tooling needed to setup Lexicon relies heavily on Node and npm. + +If you are unsure of how to install NodeJS, you can follow the instructions on the [NodeJS Website](https://nodejs.org/en/download/). + +#### Supported Node Versions + +It is recommended that you perform this tutorial using the latest version of Node that is compatible with the the project's version of Expo. + +You can always confirm this by viewing the dependencies in [frontend/package.json](https://github.com/lexiconhq/lexicon/blob/master/frontend/package.json). + +If your setup doesn't allow you to easily change your current Node version, we would recommend making use of [`nvm`](https://github.com/nvm-sh/nvm) to quickly switch between Node versions. + +### Install yarn, if you prefer + +Lexicon doesn't leverage any special features of [Yarn](https://yarnpkg.com/) - the alternative package manager for Node. If you prefer it, it will work the same as running `npm install`. + +For the purposes of this tutorial, we will demonstrate all commands using `npm`. + +### Clone the Lexicon Repository + +In a desirable location on your development machine, clone the Lexicon repository and `cd` into it. + +```sh +git clone git@github.com:lexiconhq/lexicon.git +cd lexicon +``` + +### Install Dependencies + +Next, install Lexicon's dependencies: + +```sh +npm install +``` + +This will install dependencies for both the Mobile App and the backend GraphQL API, Prose. + +### Install the Expo CLI + +[Expo](https://expo.io/) is the phenomenal toolchain that Lexicon uses to develop and build the Mobile App. + +We will later use the Expo CLI to launch the Mobile App - either on your device or in a simulator. + +You can install the Expo CLI with the following command: + +```sh +npm install --global expo-cli +``` + +Further information is available in the [Expo docs](https://docs.expo.io/). + +Then, verify that Expo is available in your `PATH` with the following: + +```sh +$ expo --version + +``` + +### Install the EAS CLI + +[Expo Application Services (EAS)](https://expo.dev/eas/) is an integrated set of cloud services for Expo and React Native apps. + +We will use the EAS CLI to build and publish the Mobile App. + +You can install the EAS CLI with the following command: + +```sh +npm install --global eas-cli +``` + +Further information is available in the [Expo docs](https://docs.expo.dev/eas/). + +Then, verify that EAS is available in your `PATH` with the following: + +```sh +$ eas --version +eas-cli/ +``` + +### Ready to Go! + +That's all we need for this step. + +Next, there is an optional guide to help you if you're not too familiar with setting up a server on a cloud provider. + +You're free to skip this if you're already adept at this process. + +After that, we'll look into how we can prepare Discourse to connect with the Lexicon Mobile App. + +If you don't already have a Discourse server setup, we'll get into that as well. diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/updating.md b/documentation/versioned_docs/version-1.0.0/tutorial/updating.md new file mode 100644 index 00000000..46fcfdd1 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/updating.md @@ -0,0 +1,68 @@ +--- +title: Update your App +--- + +## EAS Update + +EAS Update is the successor to `expo publish`. This service helps to update projects using the `expo-updates` library. + +In particular, it enables you to push quick fixes to your users in between full-fledged app store submissions. + +With EAS Update, there is no need to recompile the app with its non-native parts, such as TypeScript code, styling, or image assets. [Click here](https://docs.expo.dev/eas-update/introduction/) to learn more about EAS Update. +:::note +You are required to build the app with [EAS Build](building) before using the EAS Update. +::: + +### Configuration + +Let's get started by configuring EAS update. Feel free to check out the [complete guide](https://docs.expo.dev/build-reference/build-configuration/) from Expo for further details. + +```bash +eas update:configure +``` + +Running this command will add `expo.updates.url` and `runtimeVersion.policy` in `app.json`. + +:::caution + +As mentioned in the [Expo documentation](https://docs.expo.dev/build/updates/#previewing-updates-in-development-builds), you can no longer launch your app in Expo Go (using `expo start`) after adding the `runtimeVersion` field in `app.json`. It is recommended to use `expo-dev-client` instead to create a development build. + +```bash +eas -p all -e development +``` + +or if you still wish to use Expo Go, please remove `runtimeVersion` field from `app.json` before running `expo start`. +::: + +### Updating + +After making the necessary changes, you can push updates using this command: + +```bash +eas update –-branch –-message “” +``` + +The branch name here is the same as the build profile name when building the app. +For example, if you had previously built the app with this command: + +```bash +eas build –p all –e preview +``` + +Then you can later update it using: + +```bash +eas update –-branch preview –-message “Fixing typos” +``` + +Once the update is complete, force close and reopen the installed app twice to view the update. + +## All Done! 🙌 + +That's it for the tutorial. Great work. + +We hope that this has served as an informative guide to help familiarize you with Lexicon and how you can make use of it. + +If you haven't already, check out the [Lexicon Documentation](../) to get a deeper understanding of the project and how it all works. + +If you have any questions, comments, feedback, or want to contribute, please reach out to us on Github! diff --git a/documentation/versioned_docs/version-1.0.0/tutorial/white-label.md b/documentation/versioned_docs/version-1.0.0/tutorial/white-label.md new file mode 100644 index 00000000..f0192667 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/tutorial/white-label.md @@ -0,0 +1,82 @@ +--- +title: White Label your App +--- + +## Customize the Splash Screen and App Icon + +In order to customize the app for your own brand, you will likely want to provide your own assets for the **Splash Screen** and the **App Icon**. + +The **Splash Screen** - sometimes also referred to as the Launch Screen - is what appears while the app is launching. Some apps also display this to help conceal private information when the app is put into background mode. + +The **App Icon** is what is used to represent the app on the user's device, such as on the home screen and when listing it in the device's settings. + +Both of these assets often contain your logo in one form or another. For example, the App Icon for the Gmail app is the multi-colored outline of an envelope. Then, when launching the Gmail app, you will notice that the Splash Screen includes a larger version of the App Icon. + +### Customizing the Splash Screen + +:::info +Expo does not currently support dark mode for splash screens. +::: + +The assets used for the splash screen in the Mobile App are located at `frontend/assets/images/splash.png` and `frontend/assets/images/splashDark.png`. + +Above, we mention splash screen assets for both Dark Mode and Light Mode. + +However, unfortunately at this time, Expo does not support Dark Mode for Splash Screens. We have only included both so that they're ready when Expo finally does support this. + +In the meantime, you're free to adjust `splash.png` to influce what asset appears. + +In order to change it, you can simply replace the existing file with your own `splash.png`. + +To find out more about the Splash Screen image size and other details, please see the [Expo Splash Screen Guide](https://docs.expo.io/guides/splash-screens/). + +#### Futher Configuration + +To resize the Splash Screen image and change its background color, first open `frontend/app.json` and locate the `"splash"` field within it. + +As illustrated by the excerpt below, there are multiple fields that can be used to further adjust the Splash Screen: + +```json +"splash": { + "image": "./assets/splash.png", + "resizeMode": "contain", + "backgroundColor": "#FFFFFF" +}, +``` + +**image** + +The `image` field is fairly self-explanatory - it allows you to adjust what path will be used to locate the Splash Screen image. + +**resizeMode** + +The `resizeMode` field allows you to manage how the Splash Screen image will be resized to maintain its aspect ratio: + +- `contain` - Resize the image to make sure the whole image is visible. This is the default setting. +- `cover` - Resize the image to cover the entire container (in this case the whole screen) by either stretching or cropping the image as needed. + +Further details of how `contain` and `cover` behave are covered in the previously mentioned [Expo Splash Screen guide](https://docs.expo.io/guides/splash-screens/). For an even more detailed explanation, you can read [this post](http://blog.vjeux.com/2013/image/css-container-and-cover.html). + +**backgroundColor** + +The `backgroundColor` field enables you to specify the color of the background behind the Splash Screen image. Removing this value will result in usage of the default value, which is a white background color. + +### Customizing the App Icon + +Customizing the App Icon in Lexicon is nearly the same process as customizing the Splash Screen. + +The image asset for the Mobile App's icon is located at `frontend/assets/icon.png`. To customize it, simply overwrite that file with your own `icon.png`. + +## Further Customization + +We get into more detail about how to white label your app in the [White Labeling](../white-labeling) section of the documentation. + +In particular, this includes customizing and extending the theme's color palette, icons, and even fonts. + +Should you wish to customize anything not covered in that section, get in touch with us, and we'll see how we can help you make it a reality. + +## Awesome Work + +Your app looks cool now 😎. However, it's only accessible to you. + +Next, we'll cover how you can actually [build your app](building), so you can share it with the world. diff --git a/documentation/versioned_docs/version-1.0.0/white-labeling.md b/documentation/versioned_docs/version-1.0.0/white-labeling.md new file mode 100644 index 00000000..be413831 --- /dev/null +++ b/documentation/versioned_docs/version-1.0.0/white-labeling.md @@ -0,0 +1,13 @@ +--- +title: Overview +--- + +The Lexicon Mobile App allows you to customize its appearance through a process known as **White Labeling**. + +If you're unfamiliar with this term, it's essentially the process of branding an existing application specifically for your users. + +White Labeling allows you to configure the app with your own logo, app icon, color theme, fonts, and so on. + +The idea is that your users won't know that the Lexicon team built this app. Its appearance will be completely customized to your brand. + +To learn more about White Labeling the Lexicon Mobile App, continue to the next section. diff --git a/documentation/versioned_docs/version-2.0.0-beta/app-store.md b/documentation/versioned_docs/version-2.0.0-beta/app-store.md new file mode 100644 index 00000000..f91b5fa0 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/app-store.md @@ -0,0 +1,282 @@ +--- +title: Publishing to the App Store +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +At this point, you've at least made some minor adjustments to the Lexicon Mobile App, and are ready to publish it so that your users can download it. + +In this page, we'll cover the process of publishing it on iOS. + +## Prerequisites + +- An Apple Developer account +- An Expo account +- XCode is installed on your development machine +- EAS CLI 2.6.0 or newer +- The [Lexicon Discourse plugin](./discourse-plugin.md) is already installed on your Discourse instance + +To get started with TestFlight and publishing your app, you'll need an **Apple Developer account**. + +This will enable you to interact with Apple as you go through the process of submitting to TestFlight and, eventually, the App Store. + +You'll also need an [Expo account](https://expo.dev/signup) so you can build your app, download it, and upload it to Apple's servers. + +Finally, you'll want to have already downloaded and installed [Xcode](https://developer.apple.com/xcode/), which is what you'll use to upload your built app to Apple's servers. + +:::note +If you don't yet have an account with Apple, you'll need to enroll in the [Apple Developer Program](https://developer.apple.com/programs/enroll/) first. Note that there is an annual cost associated with this. + +Additionally, you'll want to make sure you have an account with [Expo](https://expo.dev/signup) so you can use features like [EAS Submit](https://docs.expo.dev/submit/introduction/). +::: + +## Register a new Bundle ID + +Each app in Apple's App Store has a unique **Bundle Identifier**, or Bundle ID. + +In order to publish the app anywhere, including to TestFlight, you'll need to have a Bundle ID registered for your app with Apple. + +Typically, this uses the format of `com..`. + +For example, if your company is named Expo, and your app is named Expo Go, your Bundle ID could be: + +``` +com.expo.expogo +``` + +You can follow these instructions to get one. + +- Go to [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/identifiers/bundleId/add/bundle). +- Fill in the following fields, and then click `Continue` + Regsiter App + + - **Description**: You can insert the app name as its description. + + - **Bundle ID**: Select `Explicit`, and then insert then insert your bundle ID in the input field. + +- Capabilities + + - You can leave this section empty. + +## Add a New App in App Store Connect + +Steps: + +- Sign in to your [App Store Connect](https://appstoreconnect.apple.com/) account. +- Click on `My Apps`. + App Connect +- Click on the `+` button to add new app. + Add New App +- Fill out the requested information about your app, and then click `Create`. + Add New App + + - **Platforms**: Select `iOS`. + - **Name**: The name of your app, as it will appear on the App Store and user's devices. + - **Primary Language**: The primary language that will be used if localized app information is not available. + - **Bundle ID**: Choose the Bundle ID you created above. + - **Note**: double-check that it's correct, because you can not change it afterwards. + - **SKU (Stock Keeping Unit)**: A unique ID to differentiate your app from the others, similar to a product ID. + - **User Access**: Full access means all users will have access to the app, while limited access means that the app can only be accessed by certain roles defined within App Store Connect. + +## Configuration + +After creating the app in App Store Connect, you'll want to jump back over to the codebase and make some adjustments. + +### Build Config + +:::note +If you haven't yet installed the EAS CLI, follow the instructions in the [tutorial](tutorial/setup#install-the-eas-cli). +::: + +First, you'll need to ensure you've set your app name and slug in `frontend/app.json`. The [slug](https://docs.expo.dev/workflow/glossary-of-terms/#slug) is used as part of the URL for your app on Expo's web services, so it is recommended to use kebab-case (e.g., `my-lexicon-app`). + +Replace these placeholders with your desired values: + +:::info +Note below that `scheme` is included. If you want [email deep linking](./email-deep-linking/intro.md) support in your app, **you must specify a scheme**, and then configure the Lexicon Discourse plugin with the same scheme. +::: + +```json +"name": "", +"slug": "", +"scheme": "", +``` + +Next, configure EAS Build by running this command from the `frontend/` directory: + +```bash +eas build:configure +``` + +The EAS CLI will prompt you to specify `android.package` and `ios.bundleIdentifier` if those values are not already provided in `app.json`. You'll want to add the bundle ID you just registered in App Store Connect as the `bundleIdentifier`. + +Then you can see that the value has been updated in the `ios` section of `frontend/app.json` file. + +```json + "ios": { + "supportsTablet": false, + "buildNumber": "1.0.0", + "bundleIdentifier": "", + "config": { + "usesNonExemptEncryption" : false + } + }, +``` + +:::note +We set `usesNonExemptEncryption` to `false` because Lexicon doesn't leverage that feature. + +For further details, please take a look at [this link](https://developer.apple.com/documentation/bundleresources/information_property_list/itsappusesnonexemptencryption) from Apple's documentation. +::: + +### Setup Config Values + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](deployment) to deploy Prose if you haven't already. +::: + +Next, configure the **Prose URL** for your build in `Config.ts`. You can set a different URL for each build channel. + +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +```ts +const config = { + // ... + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; +``` + +### Setup Apple Dveloper Account + +Lastly, please adjust these fields in `eas.json` with your account information to submit the app: + +```json + "base": { + "ios": { + "appleId": "", + "ascAppId": "", + "appleTeamId": "" + }, + ... + }, +``` + +- **appleId**: your apple ID (e.g., `john@gmail.com`). +- **ascAppId**: your App Store Connect app ID. Find your ascAppID by following [this guide](https://github.com/expo/fyi/blob/main/asc-app-id.md) (e.g., `1234567890`). +- **appleTeamId**: You can check your apple team ID [here](https://developer.apple.com/account/) (e.g., `12LE34XI45`). + +## Build your App for iOS + +Before publishing, you'll need to build your app by instructing Expo to generate an iOS build. + +It is recommended to build your app with the `preview` profile before releasing to verify that it works as expected. See [this tutorial](tutorial/building) to learn more about build profiles. + +Run this command: + +```bash +eas build --platform ios --profile preview +``` + +When you run the above command, Expo will prompt you for your Apple ID and password. + +Once the above step has been completed, login to your account on [Expo](https://expo.dev) and download your newly built app. + +Navigate to your project in the [Expo web console](https://expo.dev), then click on the **Builds** menu located on the left-hand side of the screen. + +- Click on the project you want to install. + Builds + +- Download the iOS build by pressing the `Download` button in the `Build Artifact` section. + Build Artifact + +This will download a tar file containing your app. Extract the file, then drag it to your simulator to install it. See [this section](tutorial/building#1-preview) of the tutorial to learn about running the app on real devices. + +Once you have verified that the app runs as expected, you can proceed to build it for release: + +```bash +eas build --platform ios --profile production +``` + +The approach for a production build is similar to the one used for generating a preview build. However, unlike a preview build, you won't be able to launch the production build in the iOS simulator—it is intended solely for publishing to the App Store. + +Once this process is completed, you can proceed with submitting it to Apple. This process typically involves Apple's TestFlight service. + +## Submit to TestFlight + +TestFlight is a key aspect of Apple's Developer Program, which enables developers to provide beta users with access to their app under less restrictive review requirements. + +With TestFlight, you're able to invite users to test your app and collect their feedback before releasing it to the public on the App Store. You can learn more about TestFlight [here](https://developer.apple.com/testflight/). + +Submitting an iOS app is much easier with EAS Submit. This is covered in more detail in the [tutorial](tutorial/publishing). + +Run the following command to start publishing the app to TestFlight: + +```bash +eas submit --platform ios --profile production +``` + +Once the process has completed successfully, we can check the build in App Store Connect. + +In App Store Connect, click on the TestFlight Tab. + +You'll see the [status](https://help.apple.com/app-store-connect/#/dev3d6869aff) of your built version. + +- **Red** indicates that you need to perform some action. +- **Yellow** indicates that some aspect of the process is pending—either from you, or from Apple. +- **Green** indicates that the build is being tested in TestFlight, or is ready to be submitted for review. + +You won't be able to begin beta testing with TestFlight until an official tester from Apple verifies your app. + +In order to allow Apple to properly test your Lexicon-powered app, they'll need to have credentials to login your Discourse site. + +Before submitting your app, you'll need to create those credentials in Discourse and specify them in App Store Connect. + +- In App Store Connect, click on your app. +- Click on TestFlight App. +- Click on Test Information in the sidebar on the left-hand side. +- Fill the required fields, then check the `Sign in required` checkbox, and enter the credentials. + Review Information Sign In +- Please also provide information for a person to contact if the review team needs additional information. + Review Information Contact + +### Specify Users for Beta Testing + +Beta Test Users can belong to an Internal Group or an External Group. + +You can specify internal users by going to the Internal Group section, and clicking on **App Store Connect Users**. + +Similarly, you can specify external users by selecting External Groups, and clicking on **Add External Testers**. + +#### More Information + +TestFlight and App Store Connect are sophisticated tools to help with the process of submitting, testing, and publishing your app. + +If you have further questions or just want to learn more, we'd recommend that you make use of Apple's documentation, which is very high quality. + +For more information about TestFlight in general, read the [documentation](https://developer.apple.com/testflight/). + +Similarly, for specific information about beta testing with TestFlight, check out [Testing Apps with TestFlight](https://testflight.apple.com/). + +## Publish to the App Store + +Once you've successfully passed Apple's review process and have received enough feedback from your beta testers, you're ready to publish to the App Store and go live! :tada: + +As a few final reminders, double-check that... + +- Your Discourse instance is online, reachable, and functioning correctly. +- The built version of your app is configured to point at the correct Prose server. +- Your Prose server is online, reachable and healthy. +- Your Prose server is deployed with the [recommended guidlines](dedicated#configure--deploy-prose) for production. + - In particular, ensure that its traffic is encrypted using an SSL certificate. + +Next, we'll guide you through the process of publishing your app for Android devices on the Google Play Store. diff --git a/documentation/versioned_docs/version-2.0.0-beta/assets.md b/documentation/versioned_docs/version-2.0.0-beta/assets.md new file mode 100644 index 00000000..a24dcad0 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/assets.md @@ -0,0 +1,47 @@ +--- +title: App Icon & Other Assets +--- + +The Lexicon Mobile App contains multiple assets that can be replaced in order to White Label it. + +The assets that can be modified are as follows: + +## App Logo + +Used to show the app logo in the application, such as on the Login, Register, and 2FA Scenes. + +The assets are located at `frontend/assets/images/logo.png` and `frontend/assets/images/logoDark.png`. The `logo.png` is used in light color scheme and `logoDark.png` is used in dark color scheme. To customize it, simply replace the existing file with your own `logo.png` and `logoDark.png`. + +## Favicon + +Used to show the app logo. + +The asset is located at `frontend/assets/favicon.png`. To customize it, simply replace the existing file with your own `favicon.png`. + +## Image Placeholder + +Used to temporarily take an image place when it is loading. + +The asset is located at `frontend/assets/images/imagePlaceholder.png`. To customize it, simply replace the existing file with your own `imagePlaceholder.png`. + +## Icons + +Used to display icons inside the application. + +The assets are located in the `frontend/assets/icons` folder. If you want to add more or edit the remaining icons, you need to insert the icons to the `frontend/assets/icons/` folder and import them in `frontend/src/icons.ts`. + +There are some standards applied to the icons, such as: + +#### Uniform Icon Size to Maintain Visual Consistency + +The UI is designed around the default base dimensions of 28x28px for icons. + +If you adjust this, you may need to modify other aspects of the theme or fonts in order to maintain a clean appearance. + +Similarly, if you provide a new icon that does not conform to these dimensions, you may run into visual inconsistencies. + +#### SVG Icons have their Fill Color Controlled via `currentColor` + +If you are adding a new icon that you expect to interact with theme's colors, ensure that its color is not hard-coded, and is instead set to `currentColor`. + +If you are unfamiliar with this concept, take a look at the [MDN Specification on SVG color values](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/color). diff --git a/documentation/versioned_docs/version-2.0.0-beta/commercial-support.md b/documentation/versioned_docs/version-2.0.0-beta/commercial-support.md new file mode 100644 index 00000000..9d164810 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/commercial-support.md @@ -0,0 +1,9 @@ +--- +title: Commercial Support +--- + +With official support, you get expert help straight from the core team. We provide app customization, dedicated support, prioritize feature requests, deployment strategies, advice on best practices, design decisions, and team augmentation. + +Additionally, we are open to engagements for non-technical site owners looking to customize, deploy, and launch a mobile app for their Discourse users. + +Reach out to us for consulting at support@kodefox.com. diff --git a/documentation/versioned_docs/version-2.0.0-beta/concepts.md b/documentation/versioned_docs/version-2.0.0-beta/concepts.md new file mode 100644 index 00000000..e1d3f780 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/concepts.md @@ -0,0 +1,68 @@ +--- +title: Concepts and Architecture +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## Prose: Discourse through GraphQL + +It is worth acknowledging upfront that Discourse already provides a traditional, RESTful API for developers out of the box. + +However, [the official documentation](https://docs.discourse.org/) for this API points out that it is incomplete, effectively serving as a starting point. + +> Note: For any endpoints not listed you can follow the reverse engineer the Discourse API guide to figure out how to use an API endpoint. +> +> —**Discourse API Documentation** + +The core team, as well as members of the [support forum](https://meta.discourse.org), regularly respond to questions about the API by [encouraging developers to reverse-engineer the API](https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576). As of this writing, the topic for how to reverse engineer the API has been linked to from nearly 200 other topics on the support forum. + +To help you simplify the process for you, Prose strives to normalize a subset of the API. We have done so with the hope that it will save you some time as you develop against Discourse. + +#### GraphiQL + +Prose's GraphQL implementation includes an [in-browser GraphQL IDE](https://www.graphql-yoga.com/docs/features/graphiql), known as [GraphiQL](https://github.com/graphql/graphiql), which allows developers to easily reference the entire documentation and schema and make queries against a running Discourse instance. + + + +This means you can rapidly get a clear understanding of how a method behaves—and what parameters it requires—without digging through support posts or reverse-engineering the REST API. + +#### Why GraphQL? + +There is no shortage of articles about both the [benefits](https://www.howtographql.com/basics/1-graphql-is-the-better-rest) and [tradeoffs](https://lwhorton.github.io/2019/08/24/graphql-tradeoffs.html) of GraphQL. + +We're well aware that GraphQL isn't some magical solution that solves all the problems of other API paradigms. + +Having said that, we chose to build Lexicon with it for two primary reasons. + +1. Our team is familiar and fluent with GraphQL, and deeply enjoys working with it. + +2. The tooling, libraries, and auto-generated documentation provide out-of-the box benefits which we can pass onto others with no additional effort. + +#### Why Expo? + +[Expo](https://docs.expo.io/) is both a framework and a platform for building universal React applications. In particular, it provides a superior development experience when building mobile apps with React Native. + +We find that Expo makes us much more effective as developers, and also provides excellent services to facilitate the entire process of building and publishing React Native apps. + +In particular, Discourse sites that leverage the [Lexicon Discourse Plugin](./discourse-plugin.md) get the benefit of [push notifications](./push-notifications) through Expo's [push notifications service](https://docs.expo.dev/push-notifications/overview/), which abstracts away Google and Apple's push services into a simple interface. + +## Lexicon Architecture + +The Lexicon Stack is fairly simple, and only consists of 3 major pieces: + +- The Lexicon Mobile App +- The Prose GraphQL API +- A running, accessible Discourse instance + - Optionally, you can install our [Discourse Plugin](./discourse-plugin.md) to enable additional features. + +Below is a diagram illustrating the typical architecture for a Lexicon-powered mobile app. + +IOS Lexicon Login Page + +As indicated above, the mobile app makes requests to a deployed Prose GraphQL server. + +The Prose server has been configured to point at an active Discourse instance of the developer's choice. + +If the [Lexicon Discourse Plugin](./discourse-plugin.md) is installed, additional endpoints will be exposed which Prose already knows how to communicate with. + +Traffic then flows back from Discourse, through Prose, and returns to the mobile app over a GraphQL interface. diff --git a/documentation/versioned_docs/version-2.0.0-beta/contributing.md b/documentation/versioned_docs/version-2.0.0-beta/contributing.md new file mode 100644 index 00000000..0fe6fbe9 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/contributing.md @@ -0,0 +1,131 @@ +--- +title: Contributing +--- + +Thank you for your interest in contributing! :sparkles: + +We greatly appreciate the time and effort you're willing to put forth to make Lexicon even better. + +There are several ways to help out. + +## Reporting Bugs + +The best way to let us know about a bug is by [creating a new issue](https://github.com/lexiconhq/lexicon/issues/new) on [Github](https://github.com/lexiconhq/lexicon). + +As always, we recommend searching the existing open and closed issues before opening a new one. + +When you create the issue, please be sure to include the following: + +- A detailed description of the bug and its behavior + +- The behavior you expected instead of the bug + +- A list of steps for how to reproduce the bug + +- Details about the device(s) and version(s) you're observing the bug on + +- Screenshots and screen recordings, while not necessary, are very welcome! + +Once we've received your bug report, we will triage it and label it accordingly. + +## Contribute to the Project + +Want the honor of being listed in our contributors section :clap:? + +We'd love to get a PR from you addressing an existing issue, adding a feature, or even just improving the documentation. + +To get started contributing, follow the instructions below. + +### Instructions + +**1. Fork the [official Lexicon repository](https://github.com/lexiconhq/lexicon)** + +You probably already know the drill - click on **Fork** button on the upper-right corner. + +**2. Clone your Fork of Lexicon** + +Be sure to clone **_your_** fork to your development machine (as opposed to cloning the main Lexicon repository). + +``` +$ git clone https://github.com/YOUR_USERNAME/lexicon.git +``` + +If you need further guidance with cloning, head over to our [Quick Start](quick-start#installation) section. + +Just bear in mind that the Quick Start section walks you through cloning the Lexicon repository. So make sure you change the URL to your username as referenced above. + +**3. Run and connect the app with Prose and a Discourse Host** + +For a comprehensive walk-through of this step, follow the instructions in the [**Setup**](setup#discourse-host) section. + +If you already have a deployed Prose instance that is pointing at a Discourse instance, you can simply configure the Lexicon Mobile App to point at the address of your Prose deployment. + +However, if you don't have that, or if you're planning on making adjustments to the Prose server itself, you'll want to ensure the Lexicon Mobile App is configured to point at a Prose server that you have running locally. + +**4. Get Started with your Contribution** + +At this point, you should be setup to dig in on the main work of your feature, bugfix, or other contribution. + +Remember that it's necessary to have the [**ESLint**](https://eslint.org/docs/user-guide/getting-started) and [**Prettier**](https://prettier.io/) plugins installed in your IDE, as those are required in order for the Pull Request checks to pass. + +We would recommend working in [VSCode](https://code.visualstudio.com/), since that is what we used to develop Lexicon. However, it is up to you, you only need to ensure that ESLint and Prettier are functioning properly within your IDE. + +**5. Run the Test Suite** + +Follow these [**steps**](setup#run-the-test-suite) to run the Lexicon test suite. + +In order to speed up the feedback cycle, it is recommended that you ensure that all tests are passing locally before pushing, especially if you already have an open PR. + +This is primarily because we have configured our Github project to block PRs from being merged if any of the build steps fail. + +If the reviewers see that tests are failing, they aren't able to review it as quickly, and will likely request that you resolve any build issues before requesting review again. + +**6. Stage, Commit, and Push your Local Changes** + +If you're unfamiliar with this process, please take a look at this [great article](https://github.com/git-guides/#learning--mastering-git-commands) from Github to bring you up to speed. + +**7. Create a New Pull Request** + +Your code is ready to submit! :tada: + +Go to the Lexicon [Pull Requests tab](https://github.com/lexiconhq/lexicon/pulls), and compare the changes between your branch and the master branch. + +Double-check and make sure you didn't push anything you don't want included in your PR. + +Then, go ahead and create a new Pull Request from your forked repository. + +Please be sure to follow the Pull Request template, add related labels, and please mention the issue you are addressing to help us keep track of what's being worked on. + +## Share Your Thoughts with Us + +We'd love to hear your new ideas! Drop them in the [Issues tab](https://github.com/lexiconhq/lexicon/issues). + +## Spread the Word + +Let others know about your awesome experience using Lexicon on social media, and tag us on Twitter [@GetLexicon](https://twitter.com/GetLexicon). + +And if you build your app using Lexicon, please let us know. We'd love to help you spread the word about what you've built! + +## Improve the Documentation + +As a closing thought, if you find any issues with the Lexicon documentation, or just think you could make it better, you can get started with these brief instructions below. + +To generate and run the documentation locally, from the project root, run: + +```sh +npm run docs:start +``` + +Similarly, you can build the documentation using: + +```sh +npm run docs:build +``` + +All documentation is in the `documentation/` directory, and the Markdown pages used to generate this site are under `documentation/docs`. + +If you end up making a PR to improve the documentation, please be sure to label your PR with the `Documentation` label. + +:::note +Don't hesitate to ask if you have any further questions. We're always happy to help. :smile: +::: diff --git a/documentation/versioned_docs/version-2.0.0-beta/customize.md b/documentation/versioned_docs/version-2.0.0-beta/customize.md new file mode 100644 index 00000000..6797d756 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/customize.md @@ -0,0 +1,28 @@ +--- +title: Customization +--- + +## Theming + +As part of its [White Labeling Support](white-labeling), Lexicon allows you to customize the theme of the mobile app. +You can configure the base and functional colors according to a color scheme of your choosing. +You're also able to customize icons, fonts, and even the error messages that appear inside of the mobile app. +To get started with this, check out the [Theming page](theming) under the [White Labeling](white-labeling) section. + +## White Labeling the Mobile App Assets + +To provide your users with a unique experience that matches your brand, you can customize the splash screen and app icon on their device. + +This will replace all Lexicon branding with your own. + +Further details can be found in both the [Tutorial](tutorial/white-label) and the [White Labeling Section](white-labeling) of this documentation. + +## Enabling Additional Discourse features + +As you might already be aware, Discourse is a highly customizable piece of software. Much of it is customizable from the Admin Site Settings page on your Discourse instance. + +Some of these settings will translate automatically into the Lexicon Mobile App, such as `authorized extensions`. + +In general, we have done our best to get out of the way and use Discourse as the source of truth for how the Lexicon Mobile App should appear and behave. + +If you find any settings that Lexicon is not responding to, but you feel it should, please open an issue and let us know. diff --git a/documentation/versioned_docs/version-2.0.0-beta/dedicated.md b/documentation/versioned_docs/version-2.0.0-beta/dedicated.md new file mode 100644 index 00000000..75fe8afe --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/dedicated.md @@ -0,0 +1,300 @@ +--- +title: Hosting & Configuration +--- + +As mentioned in the [Overview](deployment), this section is meant to guide you through configuring and deploying Prose on a dedicated instance. + +## Decide on Where to Host + +First, you'll need to answer the following question. Where would you like to host Prose? + +While there are many options that vary by project and developer preferences, the simplest way is often to use a cloud provider of your choice. + +In the [Lexicon tutorial](tutorial/setup-cloud-server), we walk you through this process using Digital Ocean. + +If you're confused about this step, or don't have a preference, you should take some time to work through it. + +However, if you already know what you're doing, feel free to use any cloud provider or hosting solution of your choice. + +### Hosting Checklist + +Once you've decided on a host, go through the checklist below to verify that everything is setup as expected. + +#### ✅ Ensure Access & Permissions on the Host + +At a minimum, you will need to be able to login to the host. Some cloud providers offer a virtual, web-based terminal, but ideally you can get credentials to login directly. + +If your host is in a UNIX-based environment, you should also have permissions to run commands as `sudo`. + +A quick way to check this is to simply attempt to run a command with `sudo`: + +```sh +$ sudo ls +``` + +However, if you have a restrictive hosting environment, you will just need a way to place the Lexicon source onto the host, install its dependencies, and expose it on a port. + +Bear in mind that a restrictive hosting environment is not ideal, especially since the recommended setup makes use of Docker. + +#### ✅ Ensure the Host is reachable in the way you need it + +Typically, this means that your host is accessible on the open internet. + +However, you might have different constraints, such as only needing the host to be accessible from within a VPN or a local network. + +
+ +Once you have setup a host which is reachable in the way you need it to be, you can begin configuring Prose on it. + +## Configure & Deploy Prose + +### Without Docker + +Naturally, setting up Prose without Docker involves more manual steps and can be platform-specific. + +We have already covered this approach well in the tutorial. In particular, you can dig in with it on the page, [Setup the Prose GraphQL API](tutorial/install-prose#install-manually) + +### With Docker + +The Prose Docker image comes preconfigured to run Prose using **[PM2](https://pm2.keymetrics.io/)**, which is a sophisticated toolset for running Node processes in production. + +This is typically a reasonable setup, with which you can even expose the PM2 server directly to requests on the host. + +However, if you'd prefer a different setup, perhaps using Nginx as a reverse proxy to the Docker container, feel free to modify the Dockerfile to match your requirements. + +#### Install Docker + +**[Docker](https://www.docker.com/)** is a containerization framework that makes it easy to build, manage, and deploy your application stack in a way that is safer, more reliable, and reproducible across multiple platforms. + +There are countless guides available for installing Docker on a given operating system. + +Ubuntu is one of the more common operating systems avaiable through most cloud providers. + +Docker provides a [full tutorial](https://docs.docker.com/engine/install/ubuntu/) for this, and even provides a convenience script that you can run in two lines: + +```sh +curl -fsSL https://get.docker.com -o get-docker.sh +sudo sh get-docker.sh +``` + +Whichever path you need to take, just make sure that Docker is up and running on your host before continuing. + +#### Configure Environment Variables + +A comprehensive list of all Prose environment variables can be found on the [Environment Variables](env-prose) page. + +In brief, at a minimum, you'll want to ensure that `PROSE_DISCOURSE_HOST` is set. + +Another variable to pay attention to is `PROSE_APP_PORT`. This defaults to port 80, which instructs Prose to listen on that port. + +Depending on your setup, you might want it to listen on a different port. + +
+ +#### Build Prose from the Dockerfile + +If you'd like to use Docker to manually build Prose, run the following command from the **project root**. + +This might be of interest to you if you'd like to make some adjustments to the Dockerfile itself. + +Alternatively, if you simply wish to pull the latest Prose build from Docker Hub, you can [skip to the next step](#pulling-the-prose-docker-image). + +Unless you've made modifications to the Dockerfile and have it stored elsewhere, you can get started building by running: + +```bash +docker build -t prose:latest -f api/deploy/Dockerfile api/ +``` + +The command searches for the `Dockerfile` at `api/deploy/Dockerfile` because we instructed it to look there with the `-f` flag. + +Then, it uses `api/` as the context for the build, which allows the references in the `Dockerfile` to resolve correctly. + +By passing the `-t prose:latest` tag, it tags the locally built image as the latest build. This can be useful for identifying and managing the images in a Docker environment over time. + +#### Pull the Prose Docker Image + +If you'd rather just use the latest release of the Prose image, you can simply run: + +``` +docker pull kodefox/prose:latest +``` + +#### Run the Prose Docker Container + +Next, to run the newly built image, run the following command: + +```bash +docker run -d \ + -e PROSE_DISCOURSE_HOST=https://discourse.example.com \ + -e PROSE_APP_PORT=4000 \ + --name prose \ + -p 5000:4000 \ + kodefox/prose:latest +``` + +:::note +If you built the image by hand, you'll want to substitute `kodefox/prose:latest` with the image name and tag you used, such as `prose:latest`. +::: + +To recap, let's briefly break down that command line-by-line + +**Run in Detached Mode** + +```bash +docker run -d +``` + +The first line lets Docker know to run the container in **detached mode**. + +This means that the command will run in the background, will not be tied to your current session, and will keep running even if you log out. + +If you omitted the `-d` flag, Docker would run the container in the foreground, and exiting the process in the foreground would stop the container. + +**Set Environment Variables** + +```bash +-e PROSE_DISCOURSE_HOST=https://discourse.example.com +-e PROSE_APP_PORT=4000 +``` + +These lines instruct Docker to pass the environment variables of `PROSE_DISCOURSE_HOST` and `PROSE_APP_PORT` to the container when running it. + +These are both application-level environment variables that Prose itself will leverage to run properly. + +The Docker image expects these values to be set and passes them to the container's environment, which Prose then accesses via `process.env`. + +**Name the Container** + +```bash +--name prose +``` + +This line tells Docker to give the running container a name. This makes it easier to identify and interact with via commands, such as: + +```bash +docker stop prose +``` + +**Configure a Port Mapping between the Host and the Container** + +```bash +-p 5000:4000 +``` + +Next, we configure Docker with a port mapping, which tells Docker to listen to map the host port of `5000` to the container port of `4000`. + +Because we previously set `PROSE_APP_PORT=4000`, this means that all requests to the host at port `5000` will be forwarded to Prose inside of its container on port `4000`. + +```bash +kodefox/prose:latest +``` + +The last line of the command tells Docker which image to use for the container. + +Above, if you built the Prose image by hand, it was tagged as `prose:latest`. + +If you chose to pull from Docker Hub, this is simply instructing Docker to pull that image if necessary, and then start the container with it. + +#### Next Steps + +At this point, you should have a Docker container running the Prose server on your host. + +However, in terms of preparing your Prose host for production, you aren't quite there yet. + +Below, we'll guide you through the last steps, finalizing your deployment of the Prose GraphQL Server. + +#### Setup SSL (IMPORTANT) + +:::danger +Deploying Prose without SSL in a way that is publicly accessible is **extremely risky**. + +Doing so could provide an attacker with full access to your Discourse site and all of its data. +::: + +The **most important next-step** to take at this point is to configure an SSL certificate for your Prose host. + +The reason this is so important is that, without SSL, Prose's traffic between your users' devices and Discourse is not encrypted. + +And this means that attackers can snoop on your users' requests to Prose and Discourse—including, importantly, their authentication information. + +To put it bluntly, deploying Prose without configuring SSL is irresponsible and compromises the security of your Discourse instance. + +An attacker could even steal your authentication token and use it to access, and potentially destroy, your Discourse site. + +##### How to Setup SSL + +There are a variety of methods to obtain SSL certificates. Some are free, and some are paid. + +The free route involves using [Let's Encrypt](https://letsencrypt.org/), which is very useful, but can require more technical knowledge to setup correctly—depending on your configuration. A key difference is that you need to renew the certificates more frequently. + +The paid route involves using a provider like [DigiCert](https://www.digicert.com/) to obtain certificates that take longer to expire. + +Either way, you'll end up with certificate files that you can configure and launch your webserver with. + +Ideally, at this point, you've already purchased a domain. If you haven't, we'd recommend using a domain provider to get a low-cost domain name. + +You could host Prose at a subdomain of your existing Discourse site, like `prose.mydiscoursesite.com`. + +Or, you could just get a cheap, nonsense domain, like `purplemonkeydishwasher.tech`—since your users won't typically see it anyway. + +Regardless, to emphasize it again, it is **critical** that you don't deploy Prose into production until you have prepared your host to encrypt the traffic from Prose. + +#### Determine how you'll expose Prose on the host + +When someone navigates to your host which is running Prose, how will their request get routed to Prose? + +If you had exposed Prose directly on port 80—NOT recommended—and your host's domain name was `myproseserver.com`, then a user would navigate to `http://myproseserver.com` and be greeted with the [GraphiQL interface](https://www.graphql-yoga.com/docs/features/graphiql). + +However, a more common approach is to use a dedicated webserver, such as Nginx or Apache, that acts as a reverse-proxy. + +With this approach, the websever listens for all requests on the ports you tell it to, and is configured to route traffic to Prose, which is listening on a non-privileged port, like 8080. + +We recommend this approach more highly for the following reasons: + +- Existing webservers are generally more reliable and performant +- It allows configuration of an SSL certificate, which is necessary for protecting your users' data + +Upon configuring the webserver, you'll need to instruct it to forward traffic to the running Prose server. + +Your setup might look something like this: + +- Nginx is configured to listen on port 80 and port 443 on your domain, `purplemonkeydishwasher.tech` +- Nginx has located and loaded your SSL certificate files for `purplemonkeydishwasher.tech` +- Nginx is configured to upgrade all requests on port 80 to port 443 +- Your Prose server is running inside of Docker on a container port of 80, and exposed to the host on port 8080. +- Your Nginx configuration specifies that requests to `purplemonkeydishwasher.tech` should be forwarded to port 8080. +- Requests come in for `purplemonkeydishwasher.tech`, Nginx routes it to the container running Prose, which handles the requests, and responds. + +#### Configure your Cloud Provider's Firewall, if one exists + +Ideally, you've configured Prose to be exposed on the open internet with the traffic encrypted over port 443. + +Depending on your cloud provider, you may need to go into its settings and expose that port on the firewall. + +For example, in DigitalOcean, this involves going to the Networking section, and creating a new firewall rule. + +From there, it is fairly simple to add common ports, like 80 and 443, to the firewall. + +After that, you simply apply the firewall to your particular instance, and traffic should be allowed through. + +#### Configure DNS Settings for your Domain + +Provided that you've already registered a domain name, you'll need to configure it so that the domain name points to your host which is running Prose. + +Depending on your setup, this will either be done in your domain provider's settings panel, or perhaps within your cloud provider. + +Continuing with the DigitalOcean example from above, you can configure your domain provider to point at DigitalOcean's name servers. + +This effectively tells your domain provider that DigitalOcean will handle everything for you, and allows you to make adjustments to your domain from within DigitalOcean. + +In that case, DigitalOcean makes it seamless to map the domain name to your instance's IP address, and it should then be accessible from the domain name. + +Otherwise, you'll want to get the IP address of your host, go into your domain provider, and instruct it that requests to your domain should be direct to your host's IP address. + +#### Ready to Go + +At this point, your deployed host should be running Prose correctly. When you navigate to the domain name that you configured it with, you should see [GraphiQL](https://www.graphql-yoga.com/docs/features/graphiql), which will allow you to make GraphQL queries against your Discourse instance. + +We understand that the details of your deployment can vary quite a bit depending on how you chose to do it. + +If you run into any issues with this step—as always—don't hesitate to reach out to us for support. diff --git a/documentation/versioned_docs/version-2.0.0-beta/deployment.md b/documentation/versioned_docs/version-2.0.0-beta/deployment.md new file mode 100644 index 00000000..b46ab73b --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/deployment.md @@ -0,0 +1,86 @@ +--- +title: Overview +--- + +As covered in [Concepts and Architecture](concepts#prose-discourse-through-graphql), Prose is Lexicon's GraphQL API layer on top of the traditional RESTful API provided by Discourse. + +## Getting Started with Deployment + +At this point, you're likely to be digging into this section of the documentation for two reasons: + +- You've been developing against a local instance (or container) running Prose, and you're ready to actually deploy your entire Lexicon project to production. + +- You want to simplify your development process by pointing the Lexicon Mobile App at a deployed instance of Prose. + +In either scenario, the end goal of this section is to have a working Prose server accessible on the open internet. + +### 🔐 Note about Access Control + +As a brief aside, please note that Prose cannot expose any information from Discourse that Discourse is not already exposing on its own. + +If your Discourse instance requires authentication, then Prose will be unable to retrieve most queries unless the required authentication information is provided by the user accessing Prose. + +### 🧱 Alternative Deployment Strategies + +Initially, we wanted to provide instructions for an integrated deployment strategy. This would have involved deploying Prose on the same host as your Discourse instance, and ideally finding a way to deploy and expose it within the running Docker host that Discourse uses itself. + +This is still achieveable. But for now, we have opted to focus solely on deploying Prose as a dedicated instance. + +However, should you find yourself preferring a custom deployment of Prose, we would encourage you to do so. + +If you do, and you have some questions or challenges you're encountering, please reach out to us. + +Ideally we can help you sort things out and work your approach into our documentation so that everyone will benefit going forward. + +## Deploying as Dedicated Instance + +As mentioned above, the official deployment strategy for Prose is to host it as a dedicated instance. + +Like anything, this comes with both benefits and trade-offs, which we have outlined for you below. + +### 🚀 Benefits + +A dedicated host for Prose will have better performance and reliability because its only resource usage comes from running Prose. i.e., it has exclusive usage of CPU, RAM, disk space, etc. + +If, on the other hand, you had managed to deploy Prose on the same host as your Discourse instance, this would mean that both Prose and Discourse need to share the host's allocated resources. If your Discourse instance is already running on a fairly light host, running Prose on it might mean that you would need to upgrade to a host with more resources. + +### ⚠️ Possible Trade-offs + +#### Increased Cost + +Naturally, if you're setting up a dedicated host to run Prose, then that involves additional costs on top of what you're already paying to host Discourse. + +Having said that, for most deployments, it is unlikely that you will need to allocate an expensive amount of resources to Prose. + +For example, on Digital Ocean, the $5 Shared CPU node is often sufficient. + +#### Potential for Increased Latency + +By nature, when deploying Prose on a different host from your running Discourse instance, the latency between the mobile app and Discourse increases. + +This is because each request has to make two hops: + +- The first request is from the client (your Lexicon-powered mobile app) to the Prose GraphQL API +- The second request is from Prose to Discourse + +However, the only important questions regarding this point are: + +- How much measurable latency is there? +- Is it noticeably slow to myself or my users? + +This, of course, can depend on several factors: + +- Where your Discourse server is deployed +- Where your Prose server is deployed +- Where your users tend to be +- If the amount of traffic (load) is too much for the system to optimally run both Prose and Discourse. + +If you are observing noticeable latency, we would recommend looking into these factors. + +Ideally, you'll want to deploy Prose in the same region as your Discourse instance; and it is even better if you can deploy Prose in the same datacenter as your Discourse instance. + +## Up Next + +With this overview out of the way, we'll start by introducing you to the list of all possible [environment variables](env-prose) that may be necessary or useful when deploying Prose. + +Lastly, we'll get into the heart of it, by [preparing your host and deploying Prose](dedicated). diff --git a/documentation/versioned_docs/version-2.0.0-beta/discourse-features.md b/documentation/versioned_docs/version-2.0.0-beta/discourse-features.md new file mode 100644 index 00000000..2de3d0ec --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/discourse-features.md @@ -0,0 +1,54 @@ +--- +title: Discourse Features Support +--- + +Below is a table of Discourse features which provides the details and current status about the support for a given feature in the **Lexicon Mobile App**. + +If we missed one, or anything looks out of date here, don't hesitate to submit a Pull Request which updates the table. + +Is the feature you love not supported? [Reach out to us](mailto:support@kodefox.com) to discuss how we can bring it to life for you. + +#### Our General Approach to Feature Support + +Much of our initial focus was on using-facing features, rather than administrative features. + +This is why, for example, users can select categories for their topics, but administrators are unable to create new categories from within the mobile app. + +For this reason, most admin tasks are still best accomplished using the Discourse web app on a larger device. + +### Lexicon Mobile App Features + +| Feature | Description | Supported | Notes | +| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------- | +| Push Notifications
Lexicon version 2 | Receive push notifications for new replies, mentions, likes, and more | ✅ 🔧 | Must have the [Lexicon Discourse Plugin](./discourse-plugin.md) installed and configured | +| Email Deep Linking
Lexicon version 2 | Open the mobile app from a Discourse email link to a topic or post | ✅ 🔧 | Must have the [Lexicon Discourse Plugin](./discourse-plugin.md) installed and configured | +| 2FA Login | Allow users with 2FA enabled to be prompted for their 2FA code when logging in | ✅ | Managing 2FA, such as enabling it or disabling it from within the app, is not currently supported | +| Ability to Tag Topics | Create and tag topics to provide relevant metadata for your users | ✅ 🔧 | Configuration required: see [Optimal Experience](optimal#enable-topic-tagging) | +| Topic Previews (Excerpts) | Show an excerpt of the first post in a topic from the Home screen | ✅ 🔧 | Configuration required: see [Optimal Experience](optimal#enable-topic-excerpts) | +| View User Activity | View a user's recent activity—such as topics, posts, and likes—in a single feed from their profile | ✅ | The ability to filter by activity is not currently supported | +| Topic Metrics | Likes, Views, Replies, and Frequent Posters | ✅ | | +| Topic & Post Actions | Ability to like and edit topics and posts | ✅ | | +| View Top & Latest Topics | A Tab View at the top of the main feed provides the ability to switch between Latest and Top activity | ✅ | | +| Search | Search the current Discourse instance for topics and posts based on keywords, categories, and tags | ✅ | | +| Categories | View the category of a topic and filter topics by a given category | ✅ | Categories cannot be created, updated, or deleted | +| Attaching Media to Posts | Users can attach media to a post from the app | ✅ 🔧 | Configuration recommended for supported file extensions-see [Optimal Experience](optimal#configure-upload-extensions) | +| Standard Markdown | Standard Markdown is supported in the editor and rendered correctly in the mobile app | ✅ | Light, incomplete support exists for some of Discourse's custom markup, such as dates | +| Sign Up | Allow users to sign up for an account directly through the mobile app, depending on whether your Discourse instance allows new user registration or not | ✅ | | +| Browsing Public Instances | Allow users to immediately access and browse your Discourse instance from the mobile app if it is not private | ✅ | Users will be prompted to login upon attempting an authenticated action | +| User Profiles | Ability to view users' profiles and edit your own | ✅ | Partial support: displays the user's photo, username, Markdown bio on a single line, and recent activity | +| Post Flagging | Allow users to flag posts for admins to review | ✅ | Admins are not able to review posts in the app, though they will see in-app notifications for flags | +| In-App Notifications | Allow users to see new notifications from the profile screen of the mobile app and mark all notifications as read | ✅ | Some notifications from Discourse are not tappable in the mobile app, such as badge notifications | +| Private messaging | Allow users to start private or group messages with one another | ✅ | | +| Mentions | Allow users to mention a user when creating or editing posts and messages | ✅ | +| Color Scheme | Provides light and dark mode support for users | ✅ | Specify color scheme (light mode, dark mode, or system) from within the app (only local to the user's mobile device) | +| Badges | The ability to see and interact with badges that have been awarded to users on the Discourse instance | ❌ | | +| Post Drafts | Enable users to start composing a draft of a post and return to it later | ❌ | | +| Groups | Enable users to create and participate in private groups of which only group members can view certain topics | ❌ | | +| Admin Features | Discourse admin features generally not available in Lexicon—better suited to a desktop environment | ❌ | Editing posts is supported | +| Post Quotes, Polls, Toggles, and Task Lists | Custom text formatting that enables Discourse-specific features | ❌ | | +| Discourse Emojis | Utilize emojis when creating a topic, making a post, or sending a reply | ❌ | Standard unicode-based emojis are supported | +| Post Bookmarks | Allow users to bookmark certain posts or topics | ❌ | | +| DiscourseConnect (SSO) | Replace Discourse authentication with a Custom Provider | ❌ | | +| Custom Authentication Plugins | Login via OAuth2 or other protocols using custom Discourse Plugins | ❌ | | +| Real-time Chat | Enable users to initiate conversations using the chat feature, either in a channel or through private messaging | ❌ | | +| User Status | Allow other user in community to see user message status | ❌ | | diff --git a/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-enable.md b/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-enable.md new file mode 100644 index 00000000..e33e202a --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-enable.md @@ -0,0 +1,34 @@ +--- +title: Enable the Lexicon Plugin +slug: discourse-plugin/enable +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +--- + +After you have confirmed the plugin has been installed and your Discourse instance is running again, you can follow these steps to enable the plugin: + +1. As an admin user, access your Discourse admin dashboard. + +2. Navigate to the `Plugins` tab. + +You'll notice that the `discourse-lexicon-plugin` is not enabled yet. + +Plugin Admin Page + +3. Click on the `Settings` button for the `discourse-lexicon-plugin` entry. + +4. Select the feature you want to enable and turn it on. + +##### Push Notifications + +For push notifications, all you need to do is check the box for `lexicon push notifications enabled`. This is covered in [Enable Push Notifications](./push-notifications/setup/enable-push-notifications.md). + +##### Email Deep Linking + +For email deep linking, you need to fill in your app scheme first before enabling it. + +Plugin Settings Page + +This is covered in detail in [Enable Email Deep Linking](./email-deep-linking/setup/enable-email-deep-linking.md). diff --git a/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-installation.md b/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-installation.md new file mode 100644 index 00000000..911770b1 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-installation.md @@ -0,0 +1,82 @@ +--- +title: Plugin Installation +slug: discourse-plugin/setup +--- + +Before you can start using the Lexicon Discourse Plugin, there are a few prerequisites and installation steps you need to follow. This documentation will guide you through the process, ensuring a smooth setup of the plugin on your site. + +## Prerequisites + +In order to use this plugin, you must have access to your Discourse server in a way which allows you to modify the server's `app.yml`. If a hosting provider is managing Discourse for you, you will have to contact them to request that they install the plugin on your behalf. + +Specifically, you will need the ability to install plugins, which means directly modifying `/var/discourse/containers/app.yml` to include the [Lexicon Discourse plugin](https://github.com/lexiconhq/discourse-lexicon-plugin.git), and then rebuilding your site. + +## Plugin Installation Steps + +### Access your Server + +Login to your underlying Discourse host server via SSH. + +This is specific to each hosting setup, but typically you will need to use a terminal application such as Terminal on macOS or PuTTY on Windows. + +### Open the Discourse `app.yml` file + +Feel free to use your terminal editor of choice (vim, emacs, nano, etc.). + +:::note +You may need `sudo` access to edit the file, but it depends on how the server was configured. +::: + +```bash +vim /var/discourse/containers/app.yml +``` + +### Get the Plugin’s Git Clone URL + +Discourse plugins are referenced by their reachable Git clone URLs, which typically end with `.git`. + +The Git clone URL for the [Lexicon Discourse plugin](https://github.com/lexiconhq/discourse-lexicon-plugin) can be found below: + +``` +https://github.com/lexiconhq/discourse-lexicon-plugin.git +``` + +Copy it to your clipboard for use in the next step. + +### Add the plugin’s repository URL to your container’s `app.yml` file: + +Add the plugin’s Git clone url to the section below. + +``` +hooks: + after_code: + - exec: + cd: $home/plugins + cmd: + - git clone https://github.com/lexiconhq/discourse-lexicon-plugin.git +``` + +### Rebuild the container, with caution + +:::caution +Please be aware that rebuilding your site will result in your site going offline for a period of time, typically between 5 to 30 minutes. We advise proceeding carefully and taking precautions outlined below. +::: + +#### Precautionary Measures + +1. Before installing the plugin or performing any site rebuild, it is highly recommended to create a backup of your Discourse site. +1. It is advisable to upgrade your Discourse installation and all existing plugins to their latest versions before attempting to install this plugin. +1. Although rare, there may be situations where the site does not come back online after the rebuilding process, and requires further troubleshooting to revive. + - This is always a risk when installing a plugin or performing any task that requires rebuilding the app. + - We recommend that you perform these changes at a time that minimizes the users affected and that you have a well-defined contingency plan in place if something goes wrong. + +#### Run Rebuild Command + +```bash +cd /var/discourse +./launcher rebuild app +``` + +### How to Uninstall the Plugin + +To remove the plugin, simply remove the Git clone URL line from your `app.yml` file and rebuild your site. Please keep in mind that rebuilding your site will will result in your site going offline for a period of time, and poses the same risks that come with rebuilding the app. diff --git a/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin.md b/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin.md new file mode 100644 index 00000000..adf100d2 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin.md @@ -0,0 +1,15 @@ +--- +title: Introduction +slug: discourse-plugin/ +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +--- + +As of Lexicon version 2.0.0, a custom Discourse plugin is available to provide a more seamless mobile integration between Discourse and your Lexicon-powered mobile app. + +The plugin currently offers two key features: + +- **Push notifications**: support for native push notifications on user's mobile devices, according to relevant activity on your Discourse site. Powered by Expo's [push notifications service](https://docs.expo.dev/push-notifications/overview/). +- **Email deep linking**: custom deep links in emails from Discourse, allowing users to seamlessly launch your Lexicon-powered mobile app directly from their mobile email client. diff --git a/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/intro.md b/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/intro.md new file mode 100644 index 00000000..ca863368 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/intro.md @@ -0,0 +1,9 @@ +--- +id: intro +title: Introduction +slug: discourse-plugin/email-deep-linking +--- + +The Lexicon Discourse plugin provides support for integrating Discourse's email notifications with your Lexicon-powered mobile app. Our plugin modifies links in specific Discourse emails so that when a relevant link is tapped and the user has your Lexicon-powered mobile app installed, it will open the app to the relevant topic or post. Otherwise, it will fall back to opening the topic in the device's web browser as it normally would. + +This section of the documentation offers step-by-step instructions to integrate email deep linking into your Discourse site so that your users have a more seamless experience with your Lexicon-powered mobile app. diff --git a/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/enable-email-deep-linking.md b/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/enable-email-deep-linking.md new file mode 100644 index 00000000..60d0d6bd --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/enable-email-deep-linking.md @@ -0,0 +1,33 @@ +--- +title: Enable Email Deep Linking +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +This guide will walk you through the necessary steps to activate email deep linking on your Discourse site. + +## Steps + +1. Ensure the [Lexicon Discourse plugin](../../discourse-plugin-installation.md) is installed and activated. + +1. Access your Discourse admin dashboard. + +1. Navigate to the `Plugins` section. + + + +4. Locate the `discourse-lexicon-plugin` and click on the `Settings` button. + +5. Fill in the `lexicon app scheme` setting with your app scheme. The app scheme is required to enable email deep linking. + +6. Check the `lexicon email deep linking enabled` box in the Lexicon settings section and save your changes. + + + +Once the email deep linking feature is enabled, you will be able to utilize its functionality in your Discourse instance. + +Specifically, when your users receive email notifications for a new message or post, the link will have been overwritten to redirect to a custom endpoint within the Lexicon Discourse plugin. + +If the user is on mobile and has already installed your Lexicon mobile app (according to the app scheme you specified), the page will attempt to open the app and redirect to the appropriate message or post. + +Otherwise, the page will fallback to the default behavior of redirecting to the message or post within the Discourse web app. diff --git a/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/verify-email-deep-linking.md b/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/verify-email-deep-linking.md new file mode 100644 index 00000000..06f51678 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/verify-email-deep-linking.md @@ -0,0 +1,51 @@ +--- +title: Verify Email Deep Linking +slug: verify-email-deep-linking +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +:::note +The steps below assume that **you have already published your Lexicon-powered mobile app** to the App Store and/or Google Play Store **with the correct app scheme**. If you are running the app on your machine locally through Expo, you should not expect the steps to work. +::: + +This guide will provide you with step-by-step instructions to help you validate the functionality of email deep linking within your Lexicon mobile app. + +## Pre-requisites + +:::note +If you have not yet fulfilled all of the pre-requisites below, this test will not work as expected. +::: + +In order to test email deep linking properly: + +1. You **must** have already published your Lexicon-powered mobile app to the App Store and/or Google Play Store. +1. You have already installed and configured the Lexicon Discourse plugin on your Discourse site. +1. You have enabled email deep linking within the Lexicon Discourse plugin settings, and the app scheme matches what you published your app with. +1. You have at least 1 mobile device with your Lexicon-powered mobile app already installed, with the correct app scheme as it was configured in Discourse. +1. You have at least 2 separate Discourse accounts to test with. +1. Ensure your Discourse site allows **mailing list mode**, and that it is turned on for the accounts you are testing with. + - If you do not do this, you will have to wait for Discourse to send its next digest email, which could take a while. + +## Steps + +To test email deep linking within your **published** Lexicon-powered mobile app, follow these steps: + +1. Ensure you have access to at least 2 separate accounts on your Discourse instance. +1. On your mobile device, open your Lexicon-powered mobile app and login using one of your accounts. + - We'll refer to this as the **first** account. + - **Note**: ensure that your email client on your mobile device will receive emails for this account. +1. Open your Discourse site in a web browser on your laptop or desktop computer. +1. Login to your **second** Discourse account in your web browser. +1. On your mobile device, using the **first** account, create a new post. +1. Now, on your laptop or desktop computer, using the **second** account, find the post you created on the mobile app and reply to it. +1. Back on your mobile device, you should receive an email notification from Discourse about the reply from the second account. +1. Click on the button that says `Visit Message` or `Visit Topic`. + - The label depends on what activity generated the email (see screenshot below). +1. The link will first open in your mobile web browser. Provided that the Lexicon-powered mobile app is installed and matches the configured app scheme, it should automatically open your app to the relevant topic or message scene. + +
+ +
+ +And that's it! You have successfully completed the steps to enable and test email deep linking in your app. diff --git a/documentation/versioned_docs/version-2.0.0-beta/env-mobile.md b/documentation/versioned_docs/version-2.0.0-beta/env-mobile.md new file mode 100644 index 00000000..79af9933 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/env-mobile.md @@ -0,0 +1,119 @@ +--- +title: Configuration Values +--- + +You can check and set the configuration values in `frontend/Config.ts`. + +The table below describes the configuration values for the Lexicon Mobile App. + +If there is a default value indicated, you do not need to set it. + +| Variable | Required | Notes | Default Value | Example Value(s) | +| -------------------- | -------- | -------------------------------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| proseUrl | Yes | The url of the Prose Server (must start with http or https) | - | https://prose.myserver.com https://prose.myserver.com:8080 https://prose.myserver.com/subpath https://prose.myserver.com:8080/subpath | +| inferDevelopmentHost | No | The flag (true / false) to override localhost with the host of the development machine | (empty) | true | + +## The `config` object + +In the `Config.ts` file, you'll find a `config` object that allows you to specify configuration values by scenario. + +The two primary scenarios are: + +- `localDevelopment`: when developing against the app locally. This configuration is also used as a fallback for an unknown build channel. +- `buildChannels`: used to define configuration by build channel when building the app with the EAS CLI. + +Primarily, you'll only be concerned with configuring `proseUrl` for each of these sections. + +## `proseUrl` + +:::caution +`proseUrl` must always be specified, with or without a port number, and must always start with either `http://` or `https://`. +::: + +`proseUrl` is used to specify the URL of the Prose GraphQL API. + +The Prose GraphQL API acts a middleman between the Lexicon Mobile App and your Discourse instance. Without it, the mobile app cannot interact with your Discourse instance. + +### Example + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com', + }, + production: { + proseUrl: 'https://prose.myserver.com', + }, + }, +}; +``` + +With this configuration above, the app will: + +- point at `http://localhost:8929` when you run the app using `npm run start` +- point at `https://preview.myserver.com` when you build the app using `eas build --profile preview` +- point at `https://prose.myserver.com` when you build the app using `eas build` + +`proseUrl` also can include a subpath if desired: + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com:8080/subpath', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; +``` + +**Different Behavior in Development** + +When running the app locally, if `proseUrl` is set to `http://localhost` or `http://127.0.0.1`, it will replace `proseUrl` with the IP address of your development machine. It does this by using Expo's `debuggerHost` constant. + +_Note: this does not apply when building the app._ + +This addresses multiple issues: + +- Accessing `localhost` from within the Android simulator does not map to your development machine +- Accessing `localhost` from a device running Expo Go does not map to your development machine + +Both of these scenarios would otherwise require you to manually identify and specify your development machine's IP address with `proseUrl`. This is bothersome since your machine's IP address can change over time. + +If you are interested in more details about this, the implementation of this behavior is available in `frontend/constants/app.ts`. + +This behavior of automatically overriding those values can be disabled, with `inferDevelopmentHost`, which is covered below. + +## `inferDevelopmentHost` + +:::info +This flag is only valid under `localDevelopment`. It has no effect when used as part of `buildChannels`. +::: + +When in development, by default, the Lexicon Mobile App will check to see if `proseUrl` is set to either `http://localhost` or `http://127.0.0.1`. + +When detected, either of those values will be overwritten with the IP address of your development machine. + +This is a very useful feature that makes on-device testing simply work out of the box without needing to manually specify your IP address (or update it when it changes). + +For scenarios where this behavior is not desirable, `inferDevelopmentHost` can be used as a flag to disable this behavior. It can be disabled by specifying the value as `false`. + +When set to `false`, this behavior of overriding `proseUrl` with the development machine's IP address will no longer occur, and the original value will be passed through as-is. + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + inferDevelopmentHost: false, + }, +}; +``` diff --git a/documentation/versioned_docs/version-2.0.0-beta/env-prose.md b/documentation/versioned_docs/version-2.0.0-beta/env-prose.md new file mode 100644 index 00000000..59901fd5 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/env-prose.md @@ -0,0 +1,15 @@ +--- +title: Prose Environment Variables +--- + +The table below lays out environment variables for the Prose GraphQL API. + +If there is a default value indicated, you do not need to set it. + +| Environment Variable | Required | Notes | Default Value | Example Value | +| --------------------------- | -------- | ----------------------------------------------------------------------------------- | ---------------------- | ------------------------------------ | +| PROSE_DISCOURSE_HOST | Yes | The specific location of your Discourse instance. | - | https://discourse.example.com | +| PROSE_DISCOURSE_UPLOAD_HOST | No | Instruct Prose to use a different host for file uploads to Discourse. | | https://upload.discourse.example.com | +| PROSE_APP_HOSTNAME | No | The **application-level** hostname that Prose will listen on. | localhost | 0.0.0.0 | +| PROSE_APP_PORT | No | The **application-level** port that Prose will listen on. | 80 | 8080 | +| SKIP_CHECK_DISCOURSE | No | Bypass the startup process of checking the provided Discourse host for reachability | false | true | diff --git a/documentation/versioned_docs/version-2.0.0-beta/intro.md b/documentation/versioned_docs/version-2.0.0-beta/intro.md new file mode 100644 index 00000000..f358899d --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/intro.md @@ -0,0 +1,142 @@ +--- +id: intro +title: Introduction +slug: / +--- + + + --- iOS Auth + + + + --- iOS Dark Mode + + + + --- iOS Comment + + + + --- iOS Message + + --- Android Auth + + + + --- Android Dark Mode + + + + --- Android Comment + + + + --- Android Message + + + +import useBaseUrl from '@docusaurus/useBaseUrl'; +import Carousel from 'react-bootstrap/Carousel'; + +--- + +Lexicon is a customizable, pre-built mobile app that provides an elegant mobile discussions experience. Built on top of [Discourse](#what-is-discourse). + +## Features + +- Topics, Private Messaging, User Signups, Profile Management, and more +- Rapidly build Android and iPhone apps for your existing Discourse site +- [Push Notifications](./push-notifications/introduction.md) direct to your users' mobile devices +- More seamless native Discourse experience [with Email Deep Linking](./email-deep-linking/intro.md) +- Straightforward process to [**customize**](white-labeling) the app for your brand +- Backed by a [GraphQL](https://graphql.org/) API +- Free and open source! +- [Commercial support](commercial-support) available + +## Benefits + +- Launch a custom mobile discussions app +- Increase engagement with your users by adding a mobile-first Discourse experience—no more [WebViews](https://www.kirupa.com/apps/webview.htm). +- Built with [React Native](https://reactnative.dev/) and [Expo](https://expo.io), delivering a native look-and-feel on both iOS and Android. +- Includes an auto-documented [GraphQL](https://graphql.org/) [interface](concepts#prose-discourse-through-graphql) over the Discourse API, which you can build on top of. + +## Screenshots + +### iOS + + + + IOS Lexicon Login Page + IOS Lexicon Signup Page + IOS Lexicon Home Page + + + IOS Lexicon Dark Mode in Home Page + IOS Lexicon New Post Page + IOS Lexicon Post Detail Page + + + IOS Lexicon Comment Section + IOS Lexicon Profile Page + IOS Lexicon Notification Page + + + IOS Lexicon Message Page + + + +### Android + + + + Android Lexicon Login Page + Android Lexicon Signup Page + Android Lexicon Home Page + + + Android Lexicon Dark Mode in Home Page + Android Lexicon New Post Page + Android Lexicon Post Detail Page + + + Android Lexicon Comment Section + Android Lexicon Profile Page + Android Lexicon Notification Page + + + Android Lexicon Message Page + + + +## How does Lexicon work? + +Lexicon delivers a native mobile Discourse experience with **two key components**: + +- The [**Lexicon Mobile App**](#the-lexicon-mobile-app) - a modern mobile app built with [Expo](https://expo.io) & [React Native](https://reactnative.dev/) +- [**Prose**](#prose-discourse-through-graphql), our GraphQL API on top of the Discourse API + +### The Lexicon Mobile App + +The Lexicon Mobile App is built with [Expo](https://expo.io), which allows us to maintain both the iOS and Android apps with a single codebase. + +For those unfamiliar, Expo provides a superior development and deployment experience on top of [React Native](https://reactnative.dev/). + +### Prose: Discourse through GraphQL + +Prose is Lexicon's [GraphQL](https://graphql.org/) layer built on top of Discourse's API. + +This enables developers to quickly build apps on top of a live Discourse instance while leveraging the [benefits of GraphQL](https://www.apollographql.com/docs/intro/benefits/). + +### What is Discourse? + +Discourse is open-source **discussion software** that is thoughtfully designed, simple to setup, and well-maintained. + +You can learn more about it on the [Discourse website](https://www.discourse.org/). + +### Further Details + +You can learn about the technical details of our approach in [Concepts & Architecture](concepts). + +## License + +MIT. Copyright (c) [Lexicon](https://github.com/lexiconhq) diff --git a/documentation/versioned_docs/version-2.0.0-beta/lexicon-updates.md b/documentation/versioned_docs/version-2.0.0-beta/lexicon-updates.md new file mode 100644 index 00000000..43d95945 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/lexicon-updates.md @@ -0,0 +1,17 @@ +--- +title: Receiving Updates from Lexicon +--- + +Due to the nature of this project, the best way to synchronize bugfixes, updates, and other changes to the Lexicon Mobile App is to treat your app like a fork of our repository. + +In the process of customizing the Lexicon Mobile App for your needs, you might make any number of changes to the theme or assets. + +However, the underlying codebase should be—for the most part—untouched. + +When we release a bugfix or new feature on the `master` branch, you'll be able to pull down our changes, resolve any conflicts with your changes, and have an updated version of your app ready to republish. + +It is worth acknowledging that this approach, which effectively uses Git to solve this problem in a fairly simple way, could be improved. + +Provided that there's enough interest, we might later decide to shape Lexicon into more of a standalone SDK package that you can import and receive updates to via npm. + +If you're interested in making that a reality, please reach out to us! diff --git a/documentation/versioned_docs/version-2.0.0-beta/optimal.md b/documentation/versioned_docs/version-2.0.0-beta/optimal.md new file mode 100644 index 00000000..789e1674 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/optimal.md @@ -0,0 +1,98 @@ +--- +title: 'Optimal Experience' +--- + +If you're planning to make use of the Lexicon Mobile App, there are a few adjustments you should make to your Discourse instance to provide the best in-app experience to your users. + +## Install the Lexicon Discourse Plugin + +The Lexicon Discourse plugin enhances the native mobile experience for your users in two key ways: + +- Adds support for push notifications +- Adds support for email deep linking. + +You can read more about the plugin and how to set it up [here](./discourse-plugin.md). + +## Enable Topic Excerpts + +We have designed the Mobile App so that users can easily see the first few sentences of a topic as they scroll through the topics list. + +However, by default, Discourse does not return excerpts when listing topics. + +Fortunately, there is a secret setting that enables this. + +It just takes a bit of additional configuration to enable. + +While Discourse does enable opting into this behavior as part of a [Theme Component](https://meta.discourse.org/t/topic-list-excerpts-theme-component/151520), we wanted to guide you through the option of toggling the setting itself. + +Should you prefer to enable it using the above theme component, you're free to do so. + +Enabling this setting involves gaining access to the server and changing a setting. + +### Instructions + +The original instructions can be found [here](https://meta.discourse.org/t/discourse-as-a-simple-personal-blog-engine/138244/4). + +Once you've gained access to your server, enter into the running Discourse app. + +```sh +$ /var/discourse/launcher enter app +``` + +Next, enter the Rails CLI: + +```sh +$ rails c +``` + +Finally, set the setting to true: + +```sh +$ SiteSetting.always_include_topic_excerpts = true +``` + +After that, you can exit, and excerpts should now be displaying in the app. + +## Enable Topic Tagging + +The Lexicon Mobile App was designed with the ability to tag topics in mind. + +This allows users to view and manage tags on topics, which is a popular feature on many Discourse servers. + +Unfortunately, this is not enabled by default. + +### Instructions + +In order to enable it, you can take the following steps: + +- Navigate to the Admin Site Settings page at `/admin/site_settings` +- Use the search bar to search for the setting `tagging enabled` +- Ensure that it is checked +- If you made a change, click the green checkbox button to apply it + +Topics should now be taggable, and viewable in the app. + +## Configure Upload Extensions + +Discourse provides a security feature that allows Discourse admins to specify a whitelist of file extensions that their users can upload. +For example, most admins would choose to restrict uploading of `.exe` files. +In order to be compatible with the settings of your Discourse instance, the Lexicon Mobile App simply requests the list of allowed extensions and uses it to enforce allowed extensions in the app. +Out of the box, most Discourse instances support this default list of extensions: + +- `.jpg` +- `.jpeg` +- `.png` +- `.gif` +- `.heic` +- `.heif` + +If you'd like to adjust the list of extensions in your Discourse instance, you can do so by following the instructions below. + +### Adjusting Allowed Extensions in Discourse + +- Navigate to the Admin Site Settings page at `/admin/site_settings` +- Use the search bar to search for the setting `extensions` +- Find the setting labeled `authorized extensions`. +- Adjust the list as you see fit to include the file extensions you'd like your users to be able to upload. +- When you are done making changes, click the green checkbox to apply them. +- The Lexicon Mobile App will receive the updated list of extensions from your site settings and begin enforcing it for your users. diff --git a/documentation/versioned_docs/version-2.0.0-beta/play-store.md b/documentation/versioned_docs/version-2.0.0-beta/play-store.md new file mode 100644 index 00000000..9781ea20 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/play-store.md @@ -0,0 +1,166 @@ +--- +title: Publishing to the Play Store +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## Prerequisites + +:::note +If you don't already have a Google Developer account, note that there is a fee to create one. +::: + +- A [Google Developer Account](https://play.google.com/console/signup) to access the [Google Play Console](https://play.google.com/console) +- An Expo account +- EAS CLI 2.6.0 or newer +- The [Lexicon Discourse plugin](./discourse-plugin.md) is already installed on your Discourse instance + +## Google Play Console + +The [Google Play Console](https://play.google.com/console) enables you to setup your app, invite beta testers, and publish your app to the [Google Play Store](https://play.google.com/store). + +Because you're publishing an app that was built using Expo, it is **very important** that you follow [Expo's instructions](https://github.com/expo/fyi/blob/master/first-android-submission.md) for submitting an app to the Google Play store correctly. + +## App Configuration + +After setting up your app in the Google Play Console, there are some other adjustments you'll need to make. + +### Build Config + +Similar to the approach for [Publishing to the App Store](app-store), if you haven’t already, you'll need to set your app name and slug in `frontend/app.json`. The [slug](https://docs.expo.dev/workflow/glossary-of-terms/#slug) is used as part of the URL for your app on Expo's web services, so it is recommended to use kebab-case (e.g., `my-lexicon-app`). + +:::info +Note below that `scheme` is included. If you want [email deep linking](./email-deep-linking/intro.md) support in your app, **you must specify a scheme**, and then configure the Lexicon Discourse plugin with the same scheme. +::: + +```json +"name": "", +"slug": "", +"scheme": "", +``` + +Then, you need to configure EAS Build by running the following command, or skip to the next [step](play-store#setup-config-values): + +```bash +eas build:configure +``` + +The EAS CLI will prompt you to specify `android.package` and `ios.bundleIdentifier` if those values are not already provided in `app.json`. + +Next, verify that the `package` name and other details specific to your app are included in the `android` section of `app.json`. Note that the `versionCode` will be automatically updated when you build the app with the `production` profile, so you don't need to increment the version manually. + +Also, there's one further detail that you might want to add, depending on your app's permissions. + +In the example below, we're providing our app with the ability to read and write to external storage. + +```json + "android": { + "package": "", + "permissions": [ "READ_EXTERNAL_STORAGE" , "WRITE_EXTERNAL_STORAGE" ] + "versionCode": 1, + }, +``` + +If your app requires further permissions, be sure to specify them as needed in this part of the configuration. + +If you don't quite understand how permissions work yet, it's best to check out the [Expo documentation](https://docs.expo.io/versions/latest/sdk/permissions) on this topic in order to get a full understanding. + +### Setup Config Values + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](deployment) to deploy Prose if you haven't already. +::: + +Next, set the **Prose URL** for your builds in `Config.ts`. You can set a different URL for each build channel. + +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +```ts +const config = { + // ... + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; +``` + +### Add the Play Store Secret File + +For the last step, you'll need to provide a `.json` file containing a private key in order to interact with the Play Store. Follow [this guide](https://github.com/expo/fyi/blob/main/creating-google-service-account.md) to generate one. Then, copy the JSON file to your `lexicon/frontend` directory, and rename the file as `playstore_secret.json`. + +The JSON file looks like this: + +```json +{ + "type": "service_account", + "project_id": "", + "private_key_id": "", + "private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n", + "client_email": "", + "client_id": "", + "auth_uri": "", + "token_uri": "", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/lexicon%40api.iam.gserviceaccount.com" +} +``` + +## Build your App for Android + +Because we're working with Expo and React Native, this step isn't too different from building your app for iOS. + +From the `frontend/` directory, you can run this command to check the app before publishing: + +```bash +eas build --platform android --profile preview +``` + +Running `eas build` with the `preview` profile will build the app as an APK. This allows you to quickly load it onto your Android device or emulator. After the build is done, navigate to your project in the [Expo web console](https://expo.dev), then click on the **Builds** menu located on the left-hand side of the screen. + +- Click on the project you want to install. + + Builds + +- Download the app by pressing the `Install` button in the `Build Artifact` section. + + Build Artifact + +You can download and launch the app on your real device, or drag the downloaded APK file to your emulator. + +Once you have verified that the app runs as expected, you can proceed to build it for release: + +```bash +eas build --platform android --profile production +``` + +The approach for a production build is similar to the one used for generating a preview build. However, unlike a preview build, you won't be able to launch the production build in Android emulator—it is intended solely for publishing to the Play Store. + +Once this process is completed, you can proceed with submitting it to the Play Store. + +## Publish to the Play Store + +At this point, you can take your app live on the Google Play Store, or you can proceed with internal testing on the Google Play Console. + +To proceed with internal testing, run this command: + +```bash +eas submit --platform android --profile staging +``` + +To release your app publicly, run this command: + +```bash +eas submit --platform android --profile production +``` + +You can read more about build profiles [here](tutorial/publishing). + +At this point, provided that you've completed all the steps, congratulations! Your Lexicon-powered mobile app is now live and ready to be downloaded by your users. diff --git a/documentation/versioned_docs/version-2.0.0-beta/publish-app.md b/documentation/versioned_docs/version-2.0.0-beta/publish-app.md new file mode 100644 index 00000000..267f3e1a --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/publish-app.md @@ -0,0 +1,11 @@ +--- +title: Publishing your App +--- + +:::danger Progress +This page has not been started yet or needs a lot more work. +::: + +Expo workflow, benefits of, etc. + +Over the air updates? diff --git a/documentation/versioned_docs/version-2.0.0-beta/push-notifications/introduction.md b/documentation/versioned_docs/version-2.0.0-beta/push-notifications/introduction.md new file mode 100644 index 00000000..619429c6 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/push-notifications/introduction.md @@ -0,0 +1,8 @@ +--- +title: Introduction +slug: /push-notifications +--- + +The Lexicon Discourse plugin provides support for native push notifications for your Lexicon-powered mobile app. This works for both Android and iOS, and is handled by Expo's [push notifications service](https://docs.expo.dev/push-notifications/overview/). + +This documentation offers step-by-step instructions to seamlessly integrate push notifications into your Discourse site so that your users receive them in your Lexicon-powered mobile app. By following this guide, you will be able to enhance the UX of your users by ensuring they receive timely and engaging notifications about activity on your Discourse site. diff --git a/documentation/versioned_docs/version-2.0.0-beta/push-notifications/plugin-interaction.md b/documentation/versioned_docs/version-2.0.0-beta/push-notifications/plugin-interaction.md new file mode 100644 index 00000000..5a424ac4 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/push-notifications/plugin-interaction.md @@ -0,0 +1,31 @@ +--- +title: How Push Notifications work with Lexicon +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +Below, we outline the interaction between the Lexicon mobile app, Prose, and the Discourse Plugin regarding the implementation of push notifications. + +## The Lexicon mobile app + +The Lexicon mobile app plays a crucial role in enabling push notifications for your users. When a user logs into their account using the app, a unique token is generated using the [`expo-notifications`](https://docs.expo.dev/versions/latest/sdk/notifications/) library. This token serves as a unique identifier for the user's device. The app then sends this token to the Prose GraphQL API, which makes a separate request to the Lexicon Discourse plugin. The plugin then inserts a record into your Discourse site's database—ensuring any relevant activity on Discourse triggers a push notification to the user's mobile device. + +## Prose + +As mentioned elsewhere in the documentation, Prose is an intermediary component that facilitates communication between the Lexicon mobile app and your Discourse site. It serves the key role of providing a GraphQL interface over Discourse, which allows the mobile app to communicate with Discourse via GraphQL. + +The latest Prose API exposes a new GraphQL mutation, `pushNotifications`, to receive the unique Expo push token from the mobile app when the user logs in. + +Once Prose receives the token from the app, it forwards the token to the Discourse Plugin running on your site. + +## Discourse Plugin + +The Lexicon Discourse Plugin provides several features. In terms of enabling push notifications, it is responsible for integrating with Expo's [push notifications service](https://docs.expo.dev/push-notifications/overview/). When the Discourse Plugin receives a push token from Prose, it saves the token in your Discourse site's database, associating it with the corresponding user. + +Since the Lexicon Discourse plugin has been configured to respond to events within your Discourse site, it is able to dispatch push notifications based on your users' activity. + +When a relevant event triggers the need for a push notification, such as a new message or reply, the Discourse Plugin retrieves the associated user's token from your Discourse site's database. Using this token, the plugin sends a push notification request to Expo's push notification service, triggering the delivery of the push notification to the user's device. + +## Flowchart + +Build Artifact diff --git a/documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/enable-push-notifications.md b/documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/enable-push-notifications.md new file mode 100644 index 00000000..adcac398 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/enable-push-notifications.md @@ -0,0 +1,32 @@ +--- +title: Enable Push Notifications +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + + + + + + +Below, we'll walk you through the necessary steps to activate push notifications for your Discourse site. + +## Steps + +1. Ensure the [Lexicon Discourse plugin](../../discourse-plugin-installation.md) is installed and activated. + +1. As an admin user, access your Discourse admin dashboard. + +1. Navigate to the Plugins section. + + + +4. Click on the `Settings` button for the `discourse-lexicon-plugin` entry. + +5. Check the `enable Push Notifications` box in the Lexicon settings section and save your changes. + + + +Once the push notifications setting is enabled, your users will be able to login through the mobile app and start receiving push notifications. + +It is important to remember that push notifications are setup specifically when the user logs in through the mobile app. If users are not receiving push notifications, you should instruct them to log out and log back in before attempting any further troubleshooting. diff --git a/documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/verify-push-notifications.md b/documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/verify-push-notifications.md new file mode 100644 index 00000000..26679ffb --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/verify-push-notifications.md @@ -0,0 +1,33 @@ +--- +title: Verify Push Notifications +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + + + + + +Below, we'll walk you through how you can validate the functionality of push notifications within your Lexicon-powered mobile app. + +:::info +In order to properly test push notifications, **you will need two separate accounts** on your Discourse site (to generate notifications). + +Additionally, **you will need at least one mobile device** for testing purposes. +::: + +## Step + +To test push notifications within your Lexicon-powered mobile app, follow these steps: + +1. Ensure that you have completed the [Getting Started](../../quick-start) steps for Lexicon. +1. Start the Lexicon Expo app by navigating to `frontend/` and running `yarn start` from your terminal. +1. Using the Expo link or QR Code, launch the app on a real mobile device. +1. Login to the app using one of your accounts. +1. Using that account, create a post within your Discourse site +1. Using a separate account, reply to the post to trigger a notification for the first account. +1. You should receive a push notification on your phone with the reply content from the other account. + + + +And that's it! The Lexicon Discourse plugin is properly sending push notifications through your Discourse site. diff --git a/documentation/versioned_docs/version-2.0.0-beta/quick-start.md b/documentation/versioned_docs/version-2.0.0-beta/quick-start.md new file mode 100644 index 00000000..89f4c8da --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/quick-start.md @@ -0,0 +1,65 @@ +--- +title: Quick Start +--- + +## Prerequisites + +- Node.js 16.14 or newer +- The latest version of NPM or Yarn, compatible with Node 16.14 or newer +- EAS CLI 3.7.2 or newer to build and publish the app +- An active Discourse site + - If you don’t have one, please follow the instructions in [Development Setup](setup#discourse-host) + +:::note +Follow the instructions in [Setup Guidance](tutorial/setup) to install the prerequisite depedencies, such as NPM and the EAS CLI. +::: + +## Installation + +Clone the repository and navigate into it: + +``` +git clone git@github.com:lexiconhq/lexicon.git +cd lexicon +``` + +Next, install the project's dependencies and generate its GraphQL schema: + +``` +$ npm install && npm run generate +``` + +Note that `npm run generate` involves two steps. + +- First, it will generate a [GraphQL schema](https://nexusjs.org/docs/guides/schema) in the `api` directory. + +- Then, using the generated schema, it will create a new folder called `generated` in the `frontend` directory, containing the resulting query and mutation types. + +- This allows the frontend codebase to stay in sync with, and not duplicate the code for, the types from the `api` directory. + +The code shared from the API is then used by [Apollo](https://github.com/apollographql/apollo-tooling), the GraphQL library we use on the frontend, which enables the Mobile App to query the API correctly. + +## Launch the Mobile App + +You can run the app and test it out by running this command from the project root: + +``` +$ npm run quickstart +``` + +This will simultaneously launch two processes: + +- The Prose GraphQL API Server +- The local Expo dev server, which will enable you to launch the React Native app from your device + +**Please note that this takes some configuration to setup properly**. + +- The `quickstart` command configures the Mobile App and the Prose GraphQL API to point at https://meta.discourse.org, as an example. + +- You'll need to make adjustments to point at a site of your choice. + +- The Lexicon Mobile App (via Expo) must be configured to point at the Prose GraphQL Server + +- The Prose GraphQL Server must be configured to point at an active Discourse instance + +More details are available in the [Development Setup](setup) section diff --git a/documentation/versioned_docs/version-2.0.0-beta/rationale.md b/documentation/versioned_docs/version-2.0.0-beta/rationale.md new file mode 100644 index 00000000..bfb62fa4 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/rationale.md @@ -0,0 +1,73 @@ +--- +title: Background & Motivation +--- + +### Discourse's Approach to a Mobile Experience + +Discourse is a phenomenal, battle-tested piece of software that facilitates thoughtful discussions in countless communities around the globe. It's no secret that we are big fans of it. + +The Discourse core team's strategy for mobile devices was to implement their product as a responsive website, and optimize for mobile use cases. This allowed mobile users to simply go to the same Discourse site as they would have on devices with larger screens— enabling them to view and write posts from their mobile devices. + +However, over time, interest in a dedicated Discourse mobile app grew. The core team addressed this need by building a native mobile app. They chose to reuse their existing work by having the app simply wrap a webview containing the mobile site. + +This was a nice improvement, as it allowed the mobile app to integrate with native SDKs and provide some additional features to Discourse mobile users. + +Overall, their approach to solving this problem was both efficient and well-done. + +However, it is still evident to many users that they're interacting with an embedded web browser, and it's clear that it's not a mobile-_first_ experience. + +For many users and site-owners, what the Discourse team has provided is more than enough, and it solves all of their problems. + +In our case, we were looking for a very specific type of experience. + +### Who We Are + +The Lexicon Team is part of [KodeFox](https://www.kodefox.com/), a software studio comprised of passionate software engineers, designers, and product managers who regularly build world-class software for our customers. + +Interested in custom software development with a personal touch? Drop us a line at [hello@kodefox.com](mailto:hello@kodefox.com). + +### Enter Lexicon + +Lexicon was formed out of the desire to further leverage many of the great features that the Discourse team had worked hard to build. + +In our consulting projects, we found that many of our clients were regularly asking for solutions that Discourse already provides out of the box. + +However, our clients wanted a seamless, native mobile experience, tailored to the brand that their users were already familiar with. + +After digging into the Discourse API documentation, we felt that it was worthy investment to build a mobile-first Discourse experience which also faciliated customizability. + +We were already fluent with the elegant development process provided by React Native and Expo, so it was a natural fit for us to build the mobile app with these technologies. + +This allowed us to achieve a high ratio of code reuse across iOS and Android, making feature implementations and bug fixes a much simpler process in most cases. + +In integrating with Discourse's API, we also noticed that the API documentation contains a disclaimer which encourages reverse-engineering to understand it. + +While we can appreciate the sentiment of figuring things out yourself, we wanted to provide an API experience that makes it easy for developers to dig into interactive documentation and quickly grasp the concepts. + +For this reason, we also chose to build Prose, our GraphQL API layer on top of the Discourse RESTful API. Another motivating factor was our existing fluency with GraphQL. + +This allowed us to quickly implement the mobile app with an intuitive API paradigm that we were already very familiar with. + +#### How Lexicon can help you + +If you already run an existing Discourse site and want a native mobile experience for your users, you can very quickly point Lexicon at your site and browse it in real-time from your device. + +Check out the [Quick Start](quick-start) page to see a rapid example of spinning up a mobile app for Discourse's own [Meta site](https://meta.discourse.org). + +But beyond that, Lexicon is an open source pre-built mobile app. This means that you can customize it to fit your brand. + +You can think of it like a template that you can use to build your own mobile app for your community. + +If you're interested in customizing the Lexicon Mobile app, you can learn more about that in the [White Labeling](white-labeling) section. + +And when you're finished, you can publish it to the Apple App Store or Google Play Store, which we cover in [Publishing your App](app-store). + +### FOSS Mindset + +Finally, while this project will benefit us and our clients in the future, we also wanted it to be a gift to the community. + +We recognize and support the culture of free and open-source software. That's why we're delighted to give back to the community in this way, just as the Discourse team originally did when they chose to open-source their hard work. + +So please engage with us on Github, and don't be shy about opening a new issue or even a PR. + +We look forward to working with you! diff --git a/documentation/versioned_docs/version-2.0.0-beta/setup.md b/documentation/versioned_docs/version-2.0.0-beta/setup.md new file mode 100644 index 00000000..99305a33 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/setup.md @@ -0,0 +1,376 @@ +--- +title: Development Setup +--- + +### Clone the Lexicon Repository + +If you haven't already, make sure you [clone the Lexicon repository](quick-start#installation) from Github. + +### Setup a Discourse Instance, if necessary + +In order to get started developing against the Lexicon Stack, you'll need a running Discourse instance. + +To recap, the Lexicon Stack consists of: + +- The Lexicon Mobile App +- The Lexicon Prose GraphQL API +- A running Discourse instance + +Without a Discourse instance, the Prose GraphQL API has nowhere to retrieve data from. And when the Prose GraphQL API can't retrieve any data, the Lexicon Mobile App won't be able to receive anything either. + +For detailed instructions on setting up a local development instance of Discourse, head over to the [tutorial](./tutorial/setup-discourse), which will walk you through the process. + +However, if you already have a deployed instance of Discourse, we'd recommend using that instead. + +### Install the Lexicon Discourse Plugin + +The Lexicon Discourse Plugin is a Discourse plugin that adds support for [push notifications](./push-notifications/introduction.md) and [email deep linking](./email-deep-linking/intro.md). + +You can install the plugin in your Discourse instance by following the instructions in the [Discourse plugin documentation](./discourse-plugin.md). + +For local development, you're only able to test out push notifications, as email deep linking requires a published app with a [valid app scheme](https://docs.expo.dev/versions/latest/config/app/#scheme). + +If you wish to develop against the plugin itself, you can clone the codebase [here](https://github.com/lexiconhq/discourse-lexicon-plugin.git). + +### Configuration + +The [Lexicon Stack](concepts#architecture-of-the-lexicon-stack) requires some configuration in order to properly interact with your Discourse server. + +This involves configuring both the backend GraphQL API, which interacts with your Discourse instance; as well as the frontend Mobile App, which interacts with the GraphQL API. + +The architecture of this setup is depicted in [Architecture of the Lexicon Stack](concepts#architecture-of-the-lexicon-stack). + +#### Backend GraphQL API Configuration + +The [Prose GraphQL API](concepts#prose-discourse-through-graphql) is fairly simple in terms of configuration. In the simplest case, it only needs to know where your Discourse instance is accessible at. + +It receives its configuration via a [`.env` file](https://www.codementor.io/@parthibakumarmurugesan/what-is-env-how-to-set-up-and-run-a-env-file-in-node-1pnyxw9yxj) in the root of the `api/` directory. + +Here is the simplest configuration of the `api/.env` file: + +``` +PROSE_DISCOURSE_HOST=https://meta.discourse.org +``` + +It is also worth noting that you can optionally configure the **Hostname** and **Port Number** that the Prose API server listens on, both of which default to **localhost** and **port 80**, respectively. + +``` +PROSE_DISCOURSE_HOST=https://meta.discourse.org + +# Instruct Prose to broadcast publicly instead of on localhost +PROSE_APP_HOSTNAME=0.0.0.0 + +# Instruct Prose to listen on port 8929 instead of the default port 80 +PROSE_APP_PORT=8929 +``` + +For a comprehensive list of all environment variables that can be used to configure Prose, check out [Prose Environment Variables](env-prose). + +#### Frontend Mobile App Configuration + +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +To configure the frontend mobile app, you'll first need to set your app name and slug in `frontend/app.json`. The [slug](https://docs.expo.dev/workflow/glossary-of-terms/#slug) is used as part of the URL for your app on Expo's web services, so it is recommended to use kebab-case (e.g., `my-lexicon-app`). + +Replace these placeholders with your desired values: + +```json + "name": "", + "slug": "", +``` + +Next, change the value of `proseUrl` in `frontend/Config.ts` to the URL of your Prose GraphQL API—whether local or already deployed somewhere. + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com:8080/subpath', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; +``` + +`localDevelopment.proseUrl` will be used during development when you run the app using `npm run start` or `expo start`, whereas the specific value within `buildChannels` (e.g., `production.proseUrl`) will be used when actually building the app. + +#### Development Scenarios + +When developing locally, there are at least three scenarios that you may find yourself in. + +Depending on which one applies to you, the config values across `frontend/Config.ts` and `api/.env` may need to be set differently. + +##### Scenario 1: Existing Prose Deployment + +If you've already deployed the Prose GraphQL API to a host that is publicly reachable, you will have already setup `api/.env` with the proper values. + +In that case, `frontend/Config.ts` only needs updated to point at the deployed GraphQL API. + +For example: + +```ts +const config = { + localDevelopment: { + proseUrl: 'https://my-deployed-graphql.api', + }, + buildChannels: { + preview: { + proseUrl: 'https://my-deployed-graphql.api', + }, + production: { + proseUrl: 'https://my-deployed-graphql.api', + }, + }, +}; +``` + +In the example above, we have configured the app to point at `https://my-deployed-graphql.api` in all scenarios, including during development when running with `npm run start`. + +##### Scenario 2: Run Prose Locally & Access from a Simulator + +:::info +If you are running the Prose server locally, you should not expect that the mobile app will continue to function if you turn off your development machine. You must **deploy** the server before attempting to use the mobile app without depending on your development machine. +::: + +This approach involves running both the Lexicon Mobile App and the Prose GraphQL API on your development machine. It is accomplished by instructing Expo to launch the Mobile App in the Android or iOS simulator. + +When developing this way, you can simply set `localDevelopment.proseUrl` to `http://localhost` in `frontend/Config.ts`. And then in `api/.env`, you can set `PROSE_APP_HOSTNAME` to `0.0.0.0`. + +Note that if you want to run Prose locally on a specific port, you would need to make sure that the configuration in both `api/.env` and `frontend/Config.ts` reflect that correctly. + +:::caution +If you configure `PROSE_APP_HOSTNAME` in `api/.env` to only listen on `localhost` or `127.0.0.1` (rather than `0.0.0.0`), it prevents others on the same network as your development machine from accessing it. This includes both your mobile device and the Android simulator, which can lead to connectivity issues when developing locally. +::: + +##### Scenario 3: Run Prose Locally & Access from your Mobile Device + +It can be very useful to develop and debug against the app using your actual mobile device with the [Expo Go app](https://expo.dev/client). + +In order to do this, you'll need to have your development machine reachable from your mobile device. + +A simple way to make it reachable is to ensure that your mobile device and development machine are on the same network, and then, in `api/.env`, set `PROSE_APP_HOSTNAME` to `0.0.0.0`. + +In a regular Expo project, you would be required to update the `localDevelopment.proseUrl` value in `frontend/Config.ts` to contain the hardcoded IP address of your development machine on your network. + +However, by setting the value to `http://localhost`, we handle this **automatically** by default, so you don't have to worry about it. Read more about it [here](env-mobile#infer_development_host). + +###### Hardcoding your local IP Address + +:::info +This approach is not ideal. If your local IP address ever changes, you'll need to locate it again, and update `Config.ts` to reflect that. For this reason, it's preferable to just use `http://localhost`. +::: + +To manually instruct the Mobile App how to locate your development machine, you'll need to find out what the **local IP address** of your development machine is on your current network. + +Note that your local IP address is different from your public IP Address. + +If you are not sure how to get your local IP address, you can go to [What Is My Browser: Detect Local IP Address](https://www.whatismybrowser.com/detect/what-is-my-local-ip-address) and follow the instructions. + +The website itself may not be able to automatically detect your local IP address, but it will give you instructions on how to locate it within your specific operating system. + +You will be given an IP address like `10.0.12.121` or `192.168.17.69`. + +You can then update the value in `frontend/Config.ts` to your local IP address. + +This will allow the app running on your mobile device to properly locate the GraphQL API running on your development machine. + +## Configure your Discourse Host + +As mentioned above, you'll need to have setup a Discourse host for the GraphQL API to interact with. + +We'd like to briefly cover the different approaches to setting up a Discourse Host for development before continuing. + +**1. Run a Discourse Instance Locally** + +:::note +Ensure that you are managing all of your ports correctly. + +The development setup of Discourse with Docker makes use of multiple ports, one of which being **port 3000** by default. You'll want to double-check that none of the environment variables are pointing at the ports Discourse is using. +::: + +If you'd like to run a Discourse site for development locally, the recommended way to do this to use **[Docker](https://www.docker.com/)**, so make sure you have it installed. + +Then, as we mentioned above, you can follow [these steps in the tutorial](tutorial/setup-discourse) to install and run a development instance of Discourse in Docker. + +**2. Use try.discourse.org or another popular Discourse site** +:::info +Feel free to use existing public Discourse sites—such as the [Docker Community Forum](https://forums.docker.com/) or the [Rust Programming Language Forum](https://users.rust-lang.org/)—in order to test out the Lexicon Mobile App. + +Just be mindful of how you're contributing to those sites if you do. +::: + +[Try Discourse](https://try.discourse.org/) is a publicly accessible Discourse instance which is intended for testing. As such, it resets every day. + +The only drawback of this approach is that you can only register as a normal user, and therefore cannot modify the site's admin settings. + +With this approach, you'd simply configure Prose in `api/.env` to point `PROSE_DISCOURSE_HOST` at one of these instances. + +```bash +PROSE_DISCOURSE_HOST=https://try.discourse.org +``` + +## Working with the Codebase + +Now that you've prepared everything for development, you can start digging in on the Lexicon codebase. + +### Run the Lexicon Mobile App & Prose GraphQL Server + +You can run the Mobile App and test it out with a local Prose server by running this command **from the project root**: + +``` +$ npm run dev +``` + +This will simultaneously launch two processes: + +- The GraphQL API Server +- The local Expo dev server, which will enable you to launch the React Native app from your device + +However, if you wish to run the frontend and backend seperately, execute the following command in a terminal to run the frontend + +``` +$ npm run --prefix frontend start +``` + +Then execute the following line in another terminal to run the backend + +``` +$ npm run --prefix api dev +``` + +### Debugging + +- Use [Expo Developer Menu](https://docs.expo.io/workflow/debugging/#developer-menu) to make the debugging process easier. + +Opening the Expo Developer Menu depends on your device: + +- On an iOS Device: Shake the device, or touch 3 fingers to the screen. +- On the iOS Simulator: Hit `⌘ + ctrl + Z` on a Mac in the emulator. +- On an Android Device: Shake the device vertically, or run `adb shell input keyevent 82` in the terminal window if the device is connected via USB. +- On the Android Emulator: Hit `⌘ + M`, or run `adb shell input keyevent 82` in your terminal window. + +- If your changes don't show up, it could involve a cache issue. In this case, you should try restarting Expo. + - To do so, quit the process by hitting `Ctrl + C` in the Terminal where it is running. + - Then run `npm run start` again. + - If the issue persists, you should look for the latest guidance from Expo on how to clear the cache, as it has been known to change. + +### Running the Test Suites + +Before running tests, double-check that your changes don't contain any errors. + +You can run tests across both the frontend and backend codebases sequentially by running the following command from the project root: + +``` +$ npm run test +``` + +On top of ensuring that all tests have passed, the command will also notify you if there are any Typescript errors or issues from Prettier or ESLint. + +Also note that the process of running `npm run test` triggers an additional action in the frontend to take place before running the tests. + +A new folder, `frontend/generated`, is created and populated with all the GraphQL Query and Mutation types for use in the codebase. + +If we did not run this before the tests, they would fail due to type errors. + +### Build & Publish the Lexicon Mobile App + +:::note +An Expo account is required in order to use Expo's services. You can create one here: https://expo.io/signup. +Once you have created your Expo account, please ensure that you are signed in with your current shell session, via `expo login` or `eas login`. +::: + +You are required to configure EAS build first by running: + +```bash +eas build:configure +``` + +You will then get a prompt from the EAS CLI related to the EAS project IDs: `android.package` and `ios.bundleIdentifier`. EAS will provide you with an existing project ID if you have one or ask you to create a new one. As for `android.package` and `ios.bundleIdentifier`, you can specify those values with `com.companyname.appname`, or any other patterns you might prefer. + +Once you're done, verify the `proseUrl` value you will use for the actual build of the app in `Config.ts`. + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](deployment) to deploy Prose if you haven't already. +::: + +Now you can build the Mobile App via Expo (EAS) with the preview build profile by running command below: + +```bash +eas build –platform all –profile preview +``` + +When you do this, the packager will minify all your code and generate two versions of your code—one for iOS, and one for Android—and then upload them both to the Expo CDN. + +Additionally, if you haven't yet optimized the app's assets, Expo will ask you if you'd like to do so. + +This has the same effect as manually running `npx expo-optimize` beforehand. It simply compresses all of the image assets in your project to reduce the size of your build. + +When the process is complete, you'll be presented with a shareable QR Code and a URL resembling https://exp.host/@ccheever/an-example, which directs you to the build details in Expo's web console. + +At this point, anyone can then use that link to load your project. + +For Android, you can install the app on an emulator or on your physical device. However, for iOS, you can only install it on the iOS simulator. To run the app on a real iOS device, follow the steps in [this part](tutorial/building#1-preview) of the tutorial. + +When building your app, it is recommended to build it as a preview build first, and make sure everything runs well before building it for release with the production profile. + +To build the app with the production build profile, run this command: + +```bash +eas build –platform all –profile production +``` + +You will also be presented with links directing you to the build details in Expo. + +However, unlike the preview build, the release build cannot be installed directly on your physical device or in an emulator / simulator. You'll need to publish the app and then install it from either the Play Store or App Store. + +You can read a more detailed explanation of this process in [this section](tutorial/building) of the tutorial. + +#### Updates + +If you later want to deploy an update to your version of the Lexicon Mobile App, you can use the EAS update command. + +First, make sure to configure EAS update by running the following command: + +```bash +eas update:configure +``` + +This command will automatically add the `expo.runtimeVersion` field to your `app.json` file. +You'll see a warning in your terminal telling you to add `expo.updates.url` to `app.json`. + +Then run this command to update your project: + +```bash +eas update -–branch +``` + +:::note +The channel name is the same as the build profile, so for the preview builds, you can run: + +```bash +eas update -–branch preview +``` + +::: + +Read more about updating your app [here](tutorial/updating). + +Once published, the new version will be available to your users the next time they open it. + +For more details on this process—including publishing to the App Store and Google Play Store—follow the instructions in [Publishing your App](tutorial/publishing). + +#### Configure the GraphQL API with your Discourse Server + +In order for a published version of the app to be able to contact your Discourse server, you'll need to ensure that: + +- The GraphQL API is deployed and running properly on a host that is reachable from the app itself. +- The GraphQL API is configured to point at the correct host and port of your Discourse server +- Your Discourse server is reachable by the GraphQL API diff --git a/documentation/versioned_docs/version-2.0.0-beta/supported-devices.md b/documentation/versioned_docs/version-2.0.0-beta/supported-devices.md new file mode 100644 index 00000000..84e6b1bb --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/supported-devices.md @@ -0,0 +1,33 @@ +--- +title: Supported Devices +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## iPhone and Android Phones + +:::info +Older versions of iOS and Android may work, but are not officially supported. +::: + +Once you've published to the App Store and Google Play Store, your published app will work out of the box for your users on both iPhone and Android devices with the following specifications: + +| Device | Minimum OS | +| --------------- | -------------------- | +| iPhone | iOS 16 and above | +| Android Devices | Android 13 and above | + +| Android | iOS | +| -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| | | +| | | +| | | +| | | + +## Support for Other Devices + +At this time, **tablets - including iPads** - and other mobile devices are **not supported**. + +We may consider developing support for this in the future. + +If this is critical for you, please drop us a line at support@kodefox.io and let us know. diff --git a/documentation/versioned_docs/version-2.0.0-beta/technologies.md b/documentation/versioned_docs/version-2.0.0-beta/technologies.md new file mode 100644 index 00000000..8657288a --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/technologies.md @@ -0,0 +1,21 @@ +--- +title: Technologies +--- + +### 100% React Native and TypeScript built on Expo + +Lexicon was built, and is maintained, with a single code base—meaning that bug fixes, improvements, and new features will (in most cases) automatically apply to both iOS and Android. + +### GraphQL-based API + +Developers who wish to contribute to (or fork) Lexicon can do so with all the benefits of GraphQL. For more information, check out [Concepts and Architecture](concepts#prose-discourse-through-graphql). + +### White Labeling Support + +White Label the Lexicon Mobile App to give your users the familiar look and feel of your brand. Learn more in [White Labeling](white-labeling). + +### Painless integration with existing Discourse instances + +Getting started is as easy as spinning up a new server for the Prose GraphQL API, and pointing it at your Discourse instance. No changes are required on your Discourse instance itself. + +Note: to enable features like [Push Notifications](./push-notifications) and [Email Deep Linking](./email-deep-linking/intro.md), you can install our [Discourse Plugin](./discourse-plugin.md). diff --git a/documentation/versioned_docs/version-2.0.0-beta/theming.md b/documentation/versioned_docs/version-2.0.0-beta/theming.md new file mode 100644 index 00000000..04dbc172 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/theming.md @@ -0,0 +1,247 @@ +--- +title: Theming +--- + +:::note +This section will involve reading and modifying Typescript. If you get stuck, reach out to us. +::: + +Lexicon allows you to customize the default theme that the Mobile App provides. + +You can accomplish this by modifying the values in `frontend/src/constants/theme`, or in `frontend/src/theme`. + +There is a difference between the two, and they work in conjunction with one another. + +`frontend/src/constants/theme` defines the underlying base values of the theme. + +`frontend/src/theme` then imports those values, and uses them to compose the actual theme object used throughout the rest of the Mobile App. + +## Colors + +### Adjusting Base & Functional Colors + +There are 2 types of colors in the Mobile App: base colors and functional colors. + +Base colors are the underlying palette of the theme, whereas functional colors define specific use-cases of the base colors. + +For example, you might have noticed that the Mobile App features a nice, eye-catching Royal Blue color as its primary color. + +This is defined in the base colors as: + +```ts +// ... +royalBlue: '#2B6AFF', +// ... +``` + +Then, the functional colors make use of this for particular components in the app. + +To continue with the example, the `royalBlue` base color is referenced in the functional colors as: + +```ts +// ... +activeTab: BASE_COLORS.royalBlue, +// ... +primary: BASE_COLORS.royalBlue, +// ... +``` + +Now, any component can reference the functional colors' `primary` value, and it will be `royalBlue`. + +However, if you wanted a different theme with a new color, such as, `BASE_COLORS.lightningYellow`, then you could adjust it to: + +```ts +// ... +activeTab: BASE_COLORS.lightningYellow, +// ... +primary: BASE_COLORS.lightningYellow, +// ... +``` + +And the Mobile App would replace the Royal Blue with the value you've defined for Lightning Yellow. + +For this reason, if you want to add more colors, you'll need to add base color values first, and then access them within the functional colors. + +This approach keeps a clean separation of concerns, which allows theme changes to seamlessly propagate throughout the Mobile App. + +### Color Scheme (Dark Mode and Light Mode) + +The theme allows you to control how the user can adjust the app's color scheme, if at all. + +There are three choices for this: `dark`, `light`, `no-preference`. + +- Dark: force the color scheme to remain dark +- Light: force the color scheme to remain light +- No Preference (default): allow your users to specify a preference for color scheme + +Note that if you specify `dark` or `light`, your users **will not** have the option of selecting a preference for color scheme. + +This manifests in the Mobile App by hiding the Dark Mode button which normally appears in the Preferences Scene. + +## Fonts + +The theme's fonts are declared in `frontend/src/constants/theme/fonts`. + +Inside of that file, you'll find multiple aspects of the fonts that can be adjusted: + +- Font Variants +- Font Sizes +- Heading Font Sizes + +### Font Variants + +Used to classify multiple font weights into named variants. It supports the following values: + +| Variants | Default font weight | +| -------- | ------------------- | +| bold | 700 | +| semiBold | 600 | +| normal | 400 | + +### Font Sizes + +Used to set a font size scale that is consistent throughout the app. It supports the following values: + +| Variants | Default size | +| ---------------- | ------------ | +| xl (extra large) | 24 | +| l (large) | 18 | +| m (medium) | 16 | +| s (small) | 14 | +| xs (extra small) | 12 | + +### Heading Font Sizes + +Used to classify multiple font sizes for heading elements, such as `h1`, `h2`, etc. + +These values are primarily used for rendering the content of posts and messages from Discourse. + +This is because Discourse posts are written in Markdown, and users will often leverage heading elements to format their posts. + +| Variants | Default size | +| -------------- | ------------ | +| h1 (Heading 1) | 32 | +| h2 (Heading 2) | 24 | +| h3 (Heading 3) | 22 | +| h4 (Heading 4) | 20 | +| h5 (Heading 5) | 18 | +| h6 (Heading 6) | 17 | + +## Icons + +The `icons` theme file is used to store icon-related constants. + +Currently, the ‘icons’ file only contains a constant which declares the icon sizes scale. + +| Variants | Default size | +| ---------------- | ------------ | +| xl (extra large) | 28 | +| l (large) | 24 | +| m (medium) | 20 | +| s (small) | 18 | +| xs (extra small) | 16 | + +## Images + +The `images` theme file is used to store theme constants used in rendering images. + +Currently, this file declares the following theme values: + +- Avatar Icon Size +- Avatar Letter Size +- Avatar Image Size + +Avatars are used throughout the app to display relevant info about a post or message. + +As such, it is typically the user's photo. + +However, when a photo is not provided, we also compose a letter-based avatar based on the user's initials. + +### Avatar Icon Size + +| Variants | Default size | +| ---------------- | ------------ | +| l (large) | 96 | +| m (medium) | 52 | +| s (small) | 40 | +| xs (extra small) | 28 | + +### Avatar Letter Size + +| Variants | Default size | +| ---------------- | ------------ | +| l (large) | 72 | +| m (medium) | 36 | +| s (small) | 28 | +| xs (extra small) | 16 | + +### Avatar Image Size + +This defines the quality of the image used for avatars. + +| Variants | Default size | +| ---------------- | ------------ | +| xl (extra large) | 450 | +| l (large) | 150 | +| m (medium) | 100 | +| s (small) | 50 | + +## Spacing + +The `spacing` theme file defines spacing constants used throughout the Mobile App for padding and margins. + +| Variants | Default size | +| ------------------------- | ------------ | +| xxxl (triple extra large) | 36 | +| xxl (double extra large) | 24 | +| xl (extra large) | 16 | +| l (large) | 12 | +| m (medium) | 8 | +| s (small) | 4 | +| xs (extra small) | 2 | + +## Advanced Customization + +While the above adjustments are generally fairly simple, you can really customize the Mobile App to your heart's content (based on your skill level). + +Here are some additional aexamples. + +### Custom Fonts + +#### Create a folder for the Custom Fonts + +To keep the codebase organized, create a folder named `fonts` inside of `frontend/assets`. + +You can then move your custom font assets into this folder. + +#### Install & Use the `expo-font` Package + +This package eases the process of adding custom fonts into an Expo-based app. + +In particular, you'll want to use the `loadAsync` function from it, which will map your font assets to their variant names throughout the Mobile App. + +While we won't get into too much technical detail here, their [documentation](https://docs.expo.dev/versions/latest/sdk/font/) can guide you through the process. + +### Error Messages + +It is possible to customize both the error messages and the means through which they are presented to the user. + +In order to do this, you should first be aware of two files. + +#### `frontend/src/helpers/errorMessage.ts` + +The Prose GraphQL API forwards on error messages from Discourse. + +This file declares the specific text of those messages as constants so that they can easily be compared in `errorHandler.ts`. + +If you observe any additional error messages that are not being caught, you'll want to add them to this file, and then adjust `errorHandler.ts` below accordingly. + +#### `frontend/src/helpers/errorHandler.ts` + +This file imports from the above `errorMessage.ts`. + +It then defines exactly how errors should be handled, including the above messages, when they are encountered. + +Currently, the default approach is to display the errors using an Alert to the user. + +However, if you wanted to integrate snackbars, you would adjust the code in `errorHandler.ts` to replace the invocations of `Alert.alert`. diff --git a/documentation/versioned_docs/version-2.0.0-beta/troubleshooting-build.md b/documentation/versioned_docs/version-2.0.0-beta/troubleshooting-build.md new file mode 100644 index 00000000..68d75dad --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/troubleshooting-build.md @@ -0,0 +1,128 @@ +--- +title: Troubleshooting when trying out the app +--- + + + + + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +## Troubleshooting Connection and Configuration Issues with URL + +
+ please connect to network error +
+ +If you are encountering issues related to the URL, resulting in an error message saying "please connect to network" as shown in the screenshot, it is likely due to incorrect settings. Specifically, if you are attempting to test builds locally on your mobile device and the channel field is not properly configured, the app may continuously fallback to the localDevelopment channel, even if you have set it to something else like "preview." + +Here some steps and notes to help resolve this: + +- Open the `frontend/Config.ts` file in your project. +- Locate the `config` object within the file. +- In the `localDevelopment` section of the `config` object, you can add the Prose URL specific to the channel you are trying to test. This section is used for local development and as a fallback configuration for unknown build channels in EAS Build. Here's an example: + + ```ts + const config: Config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, + }; + ``` + +- The example above shows that the config consists of two main sections: localDevelopment, which specifies the URL during localDevelopment, and buildChannels, which includes configurations for different channels such as preview and production. For local development, it will hit the Prose API with the URL `http://localhost:8929`. If the buildChannel is unknown or not found, it will always default to localDevelopment. +- Update the `proseUrl` value within the desired build channel, such as `preview` or `production`, with the valid and reachable URL of your Prose server. +- Once you have made the necessary changes, save the `frontend/Config.ts` file. + +Now, when you run eas build for a specific build channel, such as `eas build --profile=production`, it will utilize the Prose URL specified in the production configuration. + +:::note +It is important to include the URL in the `frontend/app.json` file, which expo-updates will use to fetch update manifests. Failing to set the URL in the `frontend/app.json` file will result in the expo-update constant always returning undefined for the channel, causing the app to consistently utilize the localDevelopment URL after building. You can specify this URL in the expo and updates sections of the app.json file. For more detailed information on how to configure this, please refer to the [expo documentation](https://docs.expo.dev/versions/latest/config/app/#url) for more detail on this. + +```json +"expo": { + "updates": { + ..., + "url": "https://u.expo.dev/" + } +} +``` + +This configuration is essential for seamless integration with Config.ts in your project. +::: + +In certain cases, you may encounter an issue related to Prose API URLs when the channel name specified in the `frontend/eas.json` file does not match the corresponding key name defined in the `config` variable in `frontend/Config.ts`. This discrepancy can lead to problems because the channel name from `eas.json` is used to determine the URL that will be utilized. If the names do not match, the default `localDevelopment` URL will be used instead. + +To ensure smooth functioning, it is important to use the same channel name in both the `frontend/eas.json` file and the `frontend/Config.ts` file. This will ensure proper mapping of the channel name to the corresponding URL. + +Here is an example to illustrate this: + +```json +// frontend/eas.json + +"build": { + "staging": { + "android": { + "buildType": "apk" + }, + "channel": "staging" + } +} +``` + +```ts +// frontend/Config.ts; + +const config: Config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + inferDevelopmentHost: true, + }, + + buildChannels: { + preview: { + proseUrl: '', + }, + production: { + proseUrl: '', + }, + staging: { + proseUrl: '', + }, + }, +}; +``` + +## The app closes abruptly after the splash screen + +If you encounter a situation where your app closes abruptly after the splash screen, it is likely that there are missing configurations in your `app.json` file. One common cause is the absence of a scheme definition in `app.json`, which is essential during the app build process. + +To resolve this issue, follow these steps: + +1. Open your project's `frontend/app.json` file. +2. Look for the `"expo"` section. +3. If a scheme is not present add this part in `"expo"` section + +```json +"expo":{ + "name": "", + "slug": "", + "scheme": "", + "version": "1.0.0" +} +``` + +Replace `""` with the desired scheme name for your app. + +4. Save the changes to the `app.json` file. +5. Rebuild your app and test it again. + +By ensuring that the scheme is correctly defined in `app.json`, you should be able to resolve the issue of the app closing after the splash screen. diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/building.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/building.md new file mode 100644 index 00000000..3e261343 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/building.md @@ -0,0 +1,152 @@ +--- +title: Build your App +--- + +## EAS Build + +EAS Build is the upgraded version of `expo build`. This service helps to build app binaries for your Expo and React Native projects. Read more about it in the Expo documentation [here](https://docs.expo.dev/build/introduction/). + +### Configuration + +Let's get started by configuring EAS build. Check [here](https://docs.expo.dev/build-reference/build-configuration/) to see the complete guide from Expo. + +#### Build Setup + +Run this command in `/frontend` directory: + +```bash +eas build:configure +``` + +When running that command, the EAS CLI will typically do the following: + +1. It will prompt you for the EAS project ID, either to use an existing ID if you have one, or create a new one. Then it will automatically add the `expo.extra.eas.projectId` field in `app.json`. +2. It will create a new `eas.json` file if one doesn’t already exist. However, we have that set up for you, so you don't need to worry about creating one. 🎉 +3. It will prompt you to specify `android.package` and `ios.bundleIdentifier` if those values are not already provided in `app.json`. Note that those two values don't have to be the identical. + +You can see that the values in `app.json` are updated after running the command. + +#### Configuration Values + +:::info +When publishing your app, it is necessary to deploy Prose somewhere publicly accessible, perhaps on a cloud hosting provider like AWS or DigitalOcean. If Prose is only running on your local machine, users that download your app won't be able to use it. +Check [the documentation](../deployment.md) to deploy Prose if you haven't already. + +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +Next, open `Config.ts` and overwrite the placeholder values with the Prose URL you want to use for the build version. You can either set the same values or a different one for each channel. You don't need to adjust the values in `localDevelopment` since that is only used in development, and not when building the app. + +```ts +const config = { + // ... + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; +``` + +### Run a Build + +#### Build for Both Platforms + +To build on both platforms, you can use either of the commands below: + +```bash +eas build --platform all +``` + +```bash +eas build -p all +``` + +#### iOS only + +```bash +eas build --platform ios +``` + +#### Android only + +```bash +eas build --platform android +``` + +#### Run a build with a specific profile + +```bash +eas build --platform all –-profile +``` + +```bash +eas build -p all –e +``` + +:::note +Without --profile, the EAS CLI will default to the `production` profile. +::: + +### Build Profiles + +Build profiles serve as a way of grouping configuration values for different scenarios when building the mobile app. + +You can find more details [here](https://docs.expo.dev/build/eas-json/). + +The `eas.json` file can contain multiple build profiles. However, it typically has 3 profiles: **preview**, **development**, and **production**. + +#### 1. Preview + +Purpose: to internally test the app in production-like circumstances. + +It is recommended to try building with the preview profile **_first_** before building your app with the production profile. That way, you can ensure the app runs as expected before it’s ready to be published. + +The build type for Android will be an **APK** file, whereas the iOS build will output a format that can be installed on the simulator. + +This is because the `ios.simulator` option was specified in `eas.json`: + +```json + "ios": { + "simulator": true + }, +``` + +If you want to run the preview build on a real device, you'll need have an Apple account with Apple Developer Enterprise Program membership, then add the `ios.enterpriseProvisioning` value in `eas.json`: + +```json + "ios": { + "enterpriseProvisioning": "universal" + } +``` + +For the `preview` build profile, we have already set the distribution mode to [internal](https://docs.expo.dev/build/internal-distribution/). This ensures that EAS build provides shareable URLs for builds, with instructions on how to get them running. + +This approach then allows us to test the app without submitting to the App Store or Play Store. + +#### 2. Development + +Purpose: to make debugging easier. Expo will automatically include developer tools in the build. As you may have figured, this build should never be published to either of the app stores. + +Development builds depend on [expo-dev-client](https://docs.expo.dev/development/introduction/), so Expo will prompt us to install the library if needed. + +Similar to preview builds, you can add the iOS options mentioned above to run them on a simulator or real device. + +#### 3. Production + +Purpose: for submission to the App Store and Play Store—as a public release, or as part of testing in each respective ecosystem. + +In order to use builds like this, they must be installed through the respective app stores. + +After running builds with this profile, you'll see that the iOS and Android versions have automatically been incremented. As you might expect, this is because `autoIncrement` has been set to `true`. + +It is worth noting, however, that this behavior only applies to TestFlight and Internal Testing, so you'll need to be sure to also manually increment the `expo.version` in `app.json` for public release. Expo provides further [documentation](https://docs.expo.dev/build-reference/app-versions/) on this topic. + +## The App is Built + +Great work! You can now share the installation link with your peers so they can try out the app. + +In the next section, you'll learn how to [publish](publishing) your app to the App Store and Play Store! 🚀 diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/install-prose.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/install-prose.md new file mode 100644 index 00000000..d6ecec67 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/install-prose.md @@ -0,0 +1,360 @@ +--- +title: Setup the Prose GraphQL API +--- + +Now that we have a running Discourse instance to interact with, we can move onto setting up the Prose GraphQL Server. + +To recap, Prose is a part of the Lexicon stack. + +It is responsible for providing a [GraphQL](https://graphql.org/) interface on top of Discourse, which the Lexicon Mobile App can then interact with. + +For more information about this, check out [Concepts & Architecture](../concepts). + +## Approaches for Setting Up Prose + +If your Discourse instance is running locally, it is natural that you should also setup your Prose server locally. + +Otherwise, it would be unnecessary extra work to get a remote Prose server communicating with your local Discourse server. + +However, if you've setup your Discourse instance in the cloud, it is up to you if you want to run your Prose server locally or in the cloud as well. + +If you'd like to install it in the cloud, you'll want to setup an additional server - similar to how you would set one up for Discourse. If you're not yet comfortable with this, feel free to jump back to the page, [Setup a Cloud Server (Optional)](setup-cloud-server). + +Bearing all of that in mind, once you have identified where you'd like to host Prose, you should also consider how you'd like to install it onto that machine. + +The first way, which we recommend, is to use **[Docker](https://www.docker.com/)**. + +And of course, the second way is to install it manually, rather than using containers. + +## Install Prose using Docker + +The reason we recommend using Docker is because you won't have to worry about setting up Prose's on your machine. + +We have already published Prose to [Docker Hub](https://hub.docker.com/), which means you can easily pull it down and run it. We'll guide you through that below. + +### Install Docker + +First, just as was necessary for setting up Discourse, you'll want to make sure Docker is installed on your machine. + +You can follow the instructions on the [Docker installation page](https://www.docker.com/get-started) if you are unsure of how to do this. + +### Pull and Run the Prose GraphQL API Image + +After successfully installing Docker, you can use the command below to run the Prose GraphQL image. + +Just bear in mind that you'll want to adjust some of the **environment variables** to your situation before you run the command. + +``` +$ docker run -d \ + -e PROSE_DISCOURSE_HOST=https://meta.discourse.org \ + -e PROSE_APP_PORT=80 \ + -p 5000:80 \ + --name prose-graphql \ + kodefox/prose +``` + +The above command will take care of pulling the Prose GraphQL Docker Image, building it, and running it in a container. + +To help understand everything that's going on there, let's break it down line by line. + +```bash +docker run -d +``` + +This instructs Docker to run our image as a container in **detached mode**. This is similar to backgrounding a process. + +```bash +-e PROSE_DISCOURSE_HOST=https://meta.discourse.org +-e PROSE_APP_PORT=80 +``` + +The `-e` flag instructs Docker that we want to set or override certain environment variables in the container with the values we provided. + +In this case, we're telling Prose to interact with the Discourse instance is running at `https://meta.discourse.org`, and that Prose should run itself _inside of the container_ on a port of `80`. + +``` +-p 5000:80 +``` + +Next, we're telling Docker what ports we want to map from our host machine into the container. + +In the previous step, we established that Prose will run internally on port 80. With the above command, we're telling Docker to expose the container's port 80 as port 5000 on our host. + +This means that Prose will be reachable on port 5000 of the host. + +So, if you're running this locally, you'll be able to interact with Prose at `http://localhost:5000`. + +And if you're running it in the cloud on a domain like `https://prose.mydiscussions.com`, you'd likely want it to be listening on port 443 so the user doesn't have to enter a port number as part of the URL. + +### Configure Prose + +As suggested above, you can configure Prose through the use of environment variables. + +You can find a comprehensive list of all environment variables on the Prose [Environment Variables](../env-prose) page. + +In this case, you really only need to set a value for `PROSE_DISCOURSE_HOST`, which will instruct Prose which Discourse instance you'd like it to interact with. + +Additionally, if you'd like to set a different port mapping, you can adjust the `-p` flag of the `docker run` command to something else, such as: + +```bash +-p 8080:80 +``` + +## Install Manually + +This section, whether being done locally or remotely on a cloud provider, will require you to install and configure the necessary dependencies to build and run Prose from scratch. + +### Setup Development Machine + +If you haven't already, setup your machine for Prose development. You can do so by following the guide at [Setup your Development Machine](setup). + +By the time you're done with this step, you should have a local copy of the Lexicon repository on your desired machine. + +### Configure Environment Variables + +The Prose GraphQL API, at a bare minimum, requires you to provide a URL to an accessible Discourse instance in order to run properly. + +Because we're doing this manually, you'll need to specify this in a different way than you would for Docker. + +Later on, once you've built Prose, one way you can specify this is to simply provide it inline as you launch the server. + +```bash +PROSE_DISCOURSE_HOST=https://discourse.mysite.com node lib/index.js +``` + +However, you might find it more ergonomic to leverage the support we've setup for `.env` files. + +The entire Prose codebase lives in the `api/` directory of the repository, so get started by navigating there from the project root. + +``` +$ cd api/ +``` + +Next, you'll need to create a `.env` file. Simply copy the template file, `.env.example` into the `.env` file using the following command. + +``` +$ cp .env.example .env +``` + +After that, as you'd expect, you want to adjust the `.env` file so that it contains the values specific to your project. + +```bash +PROSE_DISCOURSE_HOST= +PROSE_APP_PORT= +``` + +As was covered in the Docker section above, you can find a comprehensive list of all environment variables on the Prose [Environment Variables](../env-prose) page. + +### Launch the Prose GraphQL API + +:::info +At this point, you should already have all the project's dependencies installed. + +If you encounter any errors about missing packages, go back to the guide at [Setup your Development Machine](setup). +::: + +If you'd just like to launch Prose to check it out quickly, you can simply run (from the `api/` directory): + +```bash +$ npm run dev +``` + +This will prepare and spin up Prose in a way that isn't ideal for production. + +If you wish to run the Prose GraphQL API in the background as a process, there are multiple solutions. + +One method is to use **[Tmux](https://github.com/tmux/tmux)**, which will detach the process from the terminal, allowing you to close it and keep Prose running. + +Another method is to use **[PM2](https://pm2.keymetrics.io/)**, which is a sophisticated toolset for running Node processes in production. + +#### Using Tmux + +**Tmux** can be used to detach processes from their controlling terminals, allowing sessions to remain active without being visible. + +To get started, install `tmux` on your machine. + +If you are unsure of how to install tmux, you can follow the instructions on [this page](https://github.com/tmux/tmux#installation). + +Once it's installed, launch it as follows: + +```bash +$ tmux +``` + +Then you can run Prose in the same way as before. + +```bash +$ npm run dev +``` + +If you want to detach from your current session, press `Ctrl + B` then press `d` on your keyboard. The session will remain active in the background. + +And if you wish to re-attach to your last session, run the following command. + +``` +$ tmux a +``` + +If you want to learn more about the tmux command, check out [this cheat sheet](https://tmuxcheatsheet.com/). + +#### Using PM2 + +Another way to run Prose in the background is to use **pm2** (process manager for NodeJS). + +First, as you'd expect, you'll need to install `pm2` on your machine. + +``` +$ npm install -g pm2 +``` + +Once it's installed, you'll also need to use `pm2` to install [Typescript](https://typescriptlang.org/). + +This is because Prose is written in Typescript, and this allows PM2 to run the Typescript files directly for us (as opposed to transpiling them and outputting them as JS first). + +To do this, simply run the following command: + +``` +$ pm2 install typescript +``` + +After that, you can now launch the Prose GraphQL API in the background with: + +``` +$ pm2 start src/index.ts +``` + +To list all running applications, run the following command. + +``` +$ pm2 list +``` + +These are some of the frequently used commands. + +``` +$ pm2 stop # To stop a process +$ pm2 restart # To restart a process +$ pm2 delete # To delete a process +``` + +## Test the GraphQL API + +Now that you've successfully launched Prose, you can actually interact with it in your web browser. + +Because of the libraries that we leveraged in building Prose, it automatically comes with [GraphiQL](https://www.graphql-yoga.com/docs/features/graphiql). + +This is an in-browser GraphQL IDE that makes it easy to explore the documentation and the schema of the GraphQL API. + +In order to access it, you'll need to make note of the host and port number that you configured the API with. + +For example, if you launched Prose from your local machine on port 5000, you'd navigate to [http://localhost:5000](http://localhost:5000). + +Similarly, if you set it up in the cloud, and all you have is an IP address with Prose listening on port 80, you would navigate to something like [http://174.31.92.1](http://174.31.92.1). + +Once the [GraphiQL](https://www.graphql-yoga.com/docs/features/graphiql) interface loads, you can test out some example queries and mutations, including logging into Discourse through Prose. + +### Login + +:::info +If you're accessing a private Discourse site, you'll need to make note of the token that is returned to make other requests. See below. +::: + +``` +mutation Login { + login(email: "user@lexicon.com", password: "user_password") { + ... on LoginOutput { + token + user { + id + name + username + avatarTemplate + } + } + } +} +``` + +As mentioned in the notice, if you're interacting with a private Discourse site, you'll need to provide a token for other GraphQL requests. + +As part of the response for the above mutation, you'll notice a "token" field which contains your authentication token in Base64. + +You use this token in other queries and mutations by opening the HTTP Headers section on the bottom left-hand side of the page. + +This section expects JSON, with which you'll want to add an Authorization header that contains your token. + +```json +{ + "Authorization": "" +} +``` + +Once you have done that, you can make authenticated GraphQL queries and mutations as the user you logged in with. + +### User Profile + +``` + query UserProfile { + userProfile(username: "john_doe") { + user { + ... on UserDetail { + id + avatarTemplate + username + name + websiteName + bioRaw + location + dateOfBirth + email + } + } + } + } +``` + +### Topic Detail + +``` +query TopicDetail { + topicDetail(topicId: 1) { + id + title + views + likeCount + postsCount + liked + categoryId + tags + createdAt + postStream { + posts { + id + topicId + userId + name + username + avatarTemplate + raw + createdAt + } + stream + } + details { + participants { + id + username + avatarTemplate + } + } + } +} +``` + +### Logout + +``` + mutation Logout { + logout (username: "john_doe") + } +``` diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/intro.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/intro.md new file mode 100644 index 00000000..0098344d --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/intro.md @@ -0,0 +1,47 @@ +--- +title: Overview +slug: /tutorial +--- + +:::info +This tutorial **does not** cover the process of actually launching the app, as well as certain details about deploying to production. For support with those tasks, please refer to the documentation. +::: + +## Welcome to the Lexicon Tutorial + +We're really excited to help you dig in with the Lexicon Stack and learn how to deploy it in a way that benefits you and your users. + +## Target Audience & Prerequisites + +In order to complete this tutorial, you should have familiarity with: + +- The command-line +- Git and Github +- Setting up a Discourse instance +- Setting up servers in general + +In terms of prepararation, you will need: + +- NodeJS installed on your development machine + - Use the latest version of Node that is compatible with the project's version of Expo (i.e. `expo-cli`). +- An editor to edit config files + +#### Have some concerns? + +Interested in Lexicon but lacking in technical abilities? We completely understand. + +Reach out to us at support@kodefox.com to chat about how we can help bring your idea to life. + +## Next Steps + +This tutorial will guide you through the process of getting the entire Lexicon Stack up and running **locally** with your Discourse site. + +At the end of the tutorial, you will be able to interact with your Discourse site in the Lexicon Mobile App on your local device or simulator. + +You will also have an understanding of: + +- How to configure and run the Prose GraphQL API locally or on a server you own +- How to configure and run the Lexicon Mobile app on your device or in a simulator +- The next steps needed to make full use of Lexicon + +Let's get started! diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/publishing.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/publishing.md new file mode 100644 index 00000000..66005bdd --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/publishing.md @@ -0,0 +1,97 @@ +--- +title: Publish your App +--- + +## EAS Submit + +EAS Submit is a service for uploading and submitting your application binaries to App Store and/or Play Store. +Check [here](https://docs.expo.dev/submit/introduction/) to learn more about EAS Submit. + +### Prerequisites: + +- Registered app in App Store Connect, see the guide [here](../app-store#register-a-new-bundle-id). +- Registered app in Play Store, see the guide [here](../play-store). + +### Configuration + +Before submitting, you are required to specify the credentials to publish your app. + +#### iOS + +For iOS, fill in your account information for `appleId`, `ascAppId`, and `appleTeamId`: + +```json + "base": { + "ios": { + "appleId": "", + "ascAppId": "", + "appleTeamId": "" + }, + ... + }, +``` + +- **appleId**: your apple ID (e.g., `john@gmail.com`). +- **ascAppId**: your App Store Connect app ID. Find your ascAppID by following [this guide](https://github.com/expo/fyi/blob/main/asc-app-id.md) (e.g., `1234567890`). +- **appleTeamId**: You can check your apple team ID [here](https://developer.apple.com/account/) (e.g., `12LE34XI45`). + +#### Android + +For Android, you will need to add a `.json` key file to authenticate with the Google Play Store. Please follow [this guide](https://github.com/expo/fyi/blob/main/creating-google-service-account.md) to generate one. Then, copy the JSON file to your `lexicon/frontend` directory, and rename the file as `playstore_secret.json`. + +The JSON file looks like this: + +```json +{ + "type": "service_account", + "project_id": "", + "private_key_id": "", + "private_key": "-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n", + "client_email": "", + "client_id": "", + "auth_uri": "", + "token_uri": "", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/lexicon%40api.iam.gserviceaccount.com" +} +``` + +Now that the configuration is done, you can start submitting your app. + +### Submitting + +Use this command to submit the build: + +```bash +eas submit --platform ios --profile +``` + +Then you will see the EAS CLI prompt asking which app you would like to submit. + +There are 4 possible options: + +- Selecting a build from EAS +- Providing the URL of an app archive +- Providing the local path to an app binary file +- Providing the build ID of an existing build on EAS + +If you have built your app using EAS Build or have been following the tutorial from [Build your App](building), then please choose the first option, and select the version you want. + +### Submit Profiles + +By default, `eas.json` has been configured with two submit profiles, which are **staging** and **production**. + +The configuration is mostly the same, the only difference lies in the Android track options. + +- Staging infers the track as `internal`. This means submitting with the staging profile will submit the build for internal testing in the Play Store. +- Production infers the track as `production`, which will submit the build for Public Release in the Play Store. + +With iOS, on the other hand, both profiles will be submitted to TestFlight before you can release them publicly. + +You can reference the Expo documentation to learn more about [Android-specific](https://docs.expo.dev/submit/eas-json/#android-specific-options) and [iOS-specific](https://docs.expo.dev/submit/eas-json/#ios-specific-options) options. + +## Congratulations! + +Your app is now available for users to download from both the Play Store and the App Store! 🥳 + +To learn more about how to update your published app in the case of a bug, as well as OTA updates, check out the [next and final section](updating) of the tutorial. diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-cloud-server.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-cloud-server.md new file mode 100644 index 00000000..b69659a4 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-cloud-server.md @@ -0,0 +1,27 @@ +--- +title: Setup a Cloud Server (Optional) +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +:::info +This is an optional section for users that don't feel as confident spinning up a new server with a cloud provider. + +If you are already adept at this, you can skip to the next section. +::: + +## DigitalOcean Guide + +### How To Set Up an Ubuntu 20.04 Server on a DigitalOcean Droplet + +For our users that aren't as familiar with setting up servers in the cloud, we wanted to provide you with a solid resource to learn more about it and accomplish something in the process. + +DigitalOcean has already provided an excellent guide to walk you through this, so we're going to link you over to them. + +In this guide, you will create an Ubuntu server through DigitalOcean’s administrative panel and configure it to work with your SSH keys. + +Once you have a solid understanding of how to setup servers in the cloud, you'll be much more capable of deploying the Lexicon Stack for your users. + +You can dig in on the article below. + +[Read: How To Set Up an Ubuntu 20.04 Server on a DigitalOcean Droplet](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ubuntu-20-04-server-on-a-digitalocean-droplet) diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-discourse.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-discourse.md new file mode 100644 index 00000000..9b5bf97a --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-discourse.md @@ -0,0 +1,306 @@ +--- +title: Prepare a Discourse Instance +--- + +Before you can properly setup Lexicon, you'll need to have a running **[Discourse](https://www.discourse.org/)** instance for Lexicon to interact with. + +For this step, you actually have a few options: + +#### Option 1: Setup a Local Discourse Instance + +The first option is to [setup a development instance](#setup-discourse-locally) of Discourse locally on your development machine. This takes a bit of time and can get a bit technical. + +#### Option 2: Buy a Discourse Instance or Use your Existing One + +The second option is to pay to [setup a Discourse instance in the cloud](#setup-discourse-in-the-cloud) as a live, reachable production verison. This is much simpler, but has the obvious tradeoff of costing money. + +And perhaps it goes without saying, but if you already have a Discourse site, feel free to just use that. + +#### Option 3: Use a Public Discourse Site + +The third option is to use an existing Discourse site just to test things out. + +As you'll see later on, Lexicon allows you to configure which Discourse site it is pointing at. As such, you can instruct it to point at at a publically accessible Discourse site that you don't personally own. + +There are countless examples of active Discourse communities out there. Here are a few examples to choose from: + +##### Discourse Meta + +[https://meta.discourse.org/](https://meta.discourse.org/) + +##### Expo + +[https://forums.expo.dev/](https://forums.expo.dev/) + +##### The Rust Programming Language + +[https://users.rust-lang.org/](https://users.rust-lang.org/) + +##### FreeCodeCamp Forums + +[https://forum.freecodecamp.org/](https://forum.freecodecamp.org/) + +## Setup Discourse Locally + +:::note +This section can take a long time. Depending on the specs of your machine, it could take between 10 - 30 minutes to complete. +::: + +This section of the tutorial is based on the following post on Discourse: [Beginners Guide to Install Discourse for Development using Docker](https://meta.discourse.org/t/beginners-guide-to-install-discourse-for-development-using-docker/102009). + +If you run into any issues, feel free to reference the original post and subsequent discussion. + +### Install Docker + +**[Docker](https://www.docker.com/)** is a containerization framework that makes it easy to build, manage, and deploy your application stack in a way that is safer, more reliable, and repeatable across multiple platforms. + +When developing, building, and testing applications locally, it is an invaluable tool that greatly simplifies the entire process. + +The main way that Docker helps us in this tutorial is that it won't require any modifications to our machine's environment other than installing Docker itself. + +This is as-opposed to needing to install all of Discourse's dependencies on your physical machine, in a way that may take a lot of effort to undo later. + +If you are unsure of how to install Docker, you can follow the instructions on their [website](https://www.docker.com/get-started). + +### Clone Discourse + +Once Docker is up and running, we can get started with setting up Discourse locally. + +The first step is to clone the Discourse repository to your local machine and `cd` into it. + +``` +git clone https://github.com/discourse/discourse.git +cd discourse +``` + +Note the repository is on the larger side (nearly 400mb), so this step may take a while depending on your connection. + +### Pull, Build, and Start the Discourse Dev Container + +:::caution +Make sure that the **host ports** listed below are not already in use on your device. +::: + +Discourse already contains a script to help spin up its entire infrastructure using Docker. + +During this process, the script will do the following: + +- Pull down the necessary "dev" Docker image to bootstrap Discourse +- Build the aforementioned image +- Run the image as a container with multiple ports mapped from your host into the container + - 127.0.0.1:**1080**->1080/tcp + - 127.0.0.1:**3000**->3000/tcp + - 127.0.0.1:**4200**->4200/tcp + - 127.0.0.1:**9292**->9292/tcp + - 127.0.0.1:**9405**->9405/tcp +- Prompt you for an admin email address and password + +To get started, simply run the following command: + +``` +$ d/boot_dev --init +``` + +Note that all of the Docker images add up to about 1GB of disk space usage on your device. + +The command will pause when it needs information from you. As shown below, it will prompt you for an administrator email address and password. + +```bash +# Output omitted +== 20200804144550 AddTitleToPolls: migrating ================================== +-- add_column(:polls, :title, :string) + -> 0.0014s +== 20200804144550 AddTitleToPolls: migrated (0.0021s) ========================= + +Creating admin user... +Email: me@me.com +Password: +Repeat password: + +Ensuring account is active! + +Account created successfully with username me +``` + +Next, it will ask you if you want to make this account an admin account. You do. + +```bash +Do you want to grant Admin privileges to this account? (Y/n) y + +Your account now has Admin privileges! +``` + +Please be aware, as suggested above, that the ports mentioned above are not currently in use by other processes. + +### If something unexpected happened + +It's possible that something strange may have happened at this step. + +Perhaps there was a weird error message, or the process just never displayed the output shown above. + +What we'd recommend doing is the following: + +#### Check if a Docker container named `discourse_dev` is running + +```bash +$ docker ps | grep discourse_dev +CONTAINER ID IMAGE ... NAMES +dc72a4ead10f discourse/discourse_dev:release ... discourse_dev +``` + +If it is, stop and remove the container. + +```bash +$ docker stop discourse_dev +discourse_dev +$ docker rm discourse_dev +discourse_dev +``` + +#### Exit or Kill the Existing Process + +If the existing process (`d/boot_dev --init`) is still occupying your terminal session, attempt to exit it via `Ctrl + C`. + +If the process is not responding to `Ctrl + C` after some time, locate its PID and use `kill -9` to kill it + +```bash +$ ps aux | grep rails +user 81254 0.0 0.1 discourse_dev bin/rails s + +$ kill -9 81254 +``` + +#### Restart Docker or your Machine + +Using the command or interface appropriate for your machine, you should restart all of Docker. + +On Docker for Mac, this is as simple as going into the tray icon and clicking Restart. + +#### Try running the command again + +Sometimes things just go a little haywire with this setup. Try running the command again to see if it works better this time. + +#### If you're absolutely stuck, reach out. + +Don't hestitate to contact us if you're just stuck with this one. + +### Optional: Run the Next Two Commands in the Background + +You can read on to get an understanding of what the two commands are, but it's worth mentioning that you want them to run simultaneously. + +You can do this by _backgrounding_ both processes. + +This means that they won't occupy your current session, requiring you to quit them in order to enter other commands. + +When you run this command, it will show you the process IDs (PIDs) of the processes that were backgrounded. + +To bring them back into the foreground, you can run the `fg` command, and then use `Ctrl + C` or a similar signal to stop them. + +```bash +d/rails s & d/ember-cli & +[2] 59786 +[3] 59787 + +fg +``` + +Just **note** that you won't see the output of the commands, and so you may need to be patient for several minutes until Discourse is reachable at its local address. + +Alternatively, you can use the PIDs to kill the processes outright in another session: + +```bash +kill -9 59786 59787 +``` + +### Start the Rails Server within the Container + +If you hadn't already noticed, Discourse is built in [Ruby](https://www.ruby-lang.org/en/) using the very popular web framework, [Ruby on Rails](https://rubyonrails.org/). + +By running the command below, you will be starting the Rails server, which will take some time, and will produce a tremendous amount of output. + +In particular, you'll see the database being initialized as the dev container bootstraps the Discourse server. + +To get started, simply run the following command. + +``` +d/rails s +``` + +#### If you later can't quit the process + +**Note** that this command can sometimes hang when you're trying to kill it with `Ctrl + C`. + +If that happens, it's recommended that you first stop the Docker container: + +```bash +docker stop docker_dev +``` + +Then, bring the process to the foreground with `fg` if necessary. + +Last, either exit your session if possible - such as by closing the Terminal - or find out the PID of the Rails process and kill it directly. + +```bash +$ ps aux | grep rails +user 81254 0.0 0.1 discourse_dev bin/rails s + +$ kill -9 81254 +``` + +### Run the Ember CLI + +The above section mentioned Ruby on Rails, which handles the backend aspects of the Discourse application. + +However, the Discourse frontend is build in [EmberJS](https://emberjs.com/), which is a batteries-included frontend web framework used by multiple major companies. + +Run the command below to instruct the Ember CLI to start the Discourse frontend. + +``` +d/ember-cli +``` + +Once you have done this, you'll be able to access Disourse at [http://localhost:4200](http://localhost:4200). + +Please note that the output of this command can be a bit confusing. And at times, it can seem like nothing is happening. + +You may see several progress indicators, as well as blank output, for several minutes before the server is ready. + +The output you're looking for will resemble the following: + +```bash +Build successful (72475ms) – Serving on http://localhost:4200/ + +Slowest Nodes (totalTime >= 5%) | Total (avg) +----------------------------------------------------------------------+------------------ +Babel: discourse (2) | 31501ms (15750 ms) +ember-auto-import-analyzer (11) | 10418ms (947 ms) +Bundler (1) | 6119ms +Babel: @ember/test-helpers (2) | 5075ms (2537 ms) +broccoli-persistent-filter:TemplateCompiler (3) | 4596ms (1532 ms) +``` + +## Setup Discourse in the Cloud + +There are several guides with instructions on how to setup Discourse in the Cloud. + +Rather than writing another one, we have found our favorite one and would like to send you over to them to give you a proper walkthrough of the process. + +### Guide by SSDNodes + +The guide is provided by the [SSDNodes](https://www.ssdnodes.com/?e=blog&q=more-about-ssdnodes) Blog, [Serverwise](https://blog.ssdnodes.com/blog/). + +If you aren't familiar, [SSDNodes](https://www.ssdnodes.com) is an excellent, cost-effective VPS hosting provider. + +While we are most familiar with Digital Ocean, we'd strongly encourage you to check them out as an alternative for hosting Discourse. + +The post, titled [How To Install Discourse On Ubuntu](https://blog.ssdnodes.com/blog/install-discourse/), is written by [Joel Hans](https://blog.ssdnodes.com/blog/author/joel/). + +Joel has written an excellent guide. He'll take you through the entire process, including making update to your Discourse instance. + +If you find yourself stuck, or have any questions, feel free to reach out to us. + +## Use a Public Discourse Site + +If you've chosen this option, there's not much to do other than to note the URL of the Discourse site you'll be using. + +Once you have that written down somewhere, you're ready for the next section. diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-mobile.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-mobile.md new file mode 100644 index 00000000..62ab943a --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-mobile.md @@ -0,0 +1,120 @@ +--- +title: Configure & Launch the Mobile App +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +After following the **[Setup the Prose GraphQL API](install-prose)** section, your GraphQL API should now be connected to your Discourse site. + +Next, we'll guide you through the process of connecting the Lexicon Mobile App to your Discourse site via Prose. + +### Mobile App Configuration + +:::note +In the original release of Lexicon, the **Prose URL** was specified in `frontend/.env`. However, as part of migrating to Expo's EAS feature, we centralized the configuration into `frontend/Config.ts` to save you the trouble of needing to maintain it in more than one place, as suggested in the [Expo documentation](https://docs.expo.dev/build-reference/variables/#can-i-share-environment-variables-defined-in-easjson-with-expo-start-and-eas-update) +::: + +Before launching your local version of the Lexicon Mobile App, you'll need to configure it with at least one piece of information. + +The Lexicon Mobile app relies exclusively on a running instance of the Prose GraphQL API in order to retrieve data from your Discourse instance. + +Therefore, you'll need to instruct it on how to locate your running Prose server. + +In development, it is common to have it running locally. However, if you have already deployed Prose +somewhere, feel free to use that. + +#### Configuring `proseUrl` via `config` + +:::caution + +##### `proseUrl` requirements + +It is worth noting that `proseUrl` **must** start with either `http://` or `https://`. + +If it does not, the Mobile App will throw an error when launching. +::: + +`Config.ts` contains the `config` object, which allows you to specify the Prose URL for each scenario encountered when developing and building the Mobile App. + +The specific configuration value which enables this is `proseUrl`, and it is contained within each scenario expressed by the `config` object. + +```ts +const config = { + localDevelopment: { + proseUrl: 'http://localhost:8929', + }, + buildChannels: { + preview: { + proseUrl: 'https://preview.myserver.com:8080/subpath', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; +``` + +As mentioned earlier—above, the `config` object allows us to express configuration values for multiple scenarios, which are: + +- `localDevelopment`: when developing against the app locally. This configuration is also used as a fallback for an unknown build channel. +- `buildChannels`: used to define configuration by build channel when building the app with the EAS CLI. + +`buildChannels` makes use of Expo's build channels (typically `preview` and `production`) as its keys. + +Each key within `buildChannels` maps to a specific Prose URL, which will be used for the build version based on which channel you build for. + +From the example above, when we create a `preview` build, the app will be built and configured to contact a Prose server located at `https://preview.myserver.com:8080/subpath`. + +The example above expresses a setup in which each build has its own deployed Prose server. However, it is also common to use one server for all scenarios, including development. + +```ts +const config = { + localDevelopment: { + proseUrl: 'https://myserver.com/api/prose', + }, + buildChannels: { + preview: { + proseUrl: 'https://myserver.com/api/prose', + }, + production: { + proseUrl: 'https://myserver.com/api/prose', + }, + }, +}; +``` + +##### Port Number + +Bear in mind that if your Prose server is not running on port 80 or 443, you also need to specify the **port number** via `proseUrl`. + +For example, if you've started a Prose server **locally** on port `8929` and try to run it using `expo start`, your `Config.ts` file would contain `http://myserver.com:8929/api/prose` under `localDevelopment.proseUrl`. + +### Launch the Mobile App + +Once you have configured everything, you'll want to launch the Mobile App to test that it is speaking to the right Prose server. + +To do this, you can simply run the following from the project root: + +```bash +npm run --prefix frontend start +``` + +The Expo development server should launch, and you can follow the instructions to run the app in a simulator or on your actual device. + +#### Troubleshooting + +If the app throws an error upon loading, you should double-check the configuration values you specified, according to the message you've received. + +If the app loads, but you're unable to actually connect, you should verify the following: + +- Your Prose Server is up and running at the location you provided to the Lexicon Mobile App +- Your Prose Server is configured to point at an accessible Discourse instance +- Your Discourse instance is up and running correctly + +## Nice Work! + +At this point, you've already accomplished a lot. + +The Discourse server you started off with is now accessible in a new way from a sleek native mobile app, and you're free to customize it to your heart's content. + +In the next part of the tutorial, we'll briefly get into that very topic: customizing the Mobile App to [white label](white-label) it for your brand. diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup.md new file mode 100644 index 00000000..20505940 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup.md @@ -0,0 +1,98 @@ +--- +title: Setup your Development Machine +--- + +## Install NodeJS + +If you haven't already, install NodeJS on your machine. + +The tooling needed to setup Lexicon relies heavily on Node and npm. + +If you are unsure of how to install NodeJS, you can follow the instructions on the [NodeJS Website](https://nodejs.org/en/download/). + +#### Supported Node Versions + +It is recommended that you perform this tutorial using the latest version of Node that is compatible with the the project's version of Expo. + +You can always confirm this by viewing the dependencies in [frontend/package.json](https://github.com/lexiconhq/lexicon/blob/master/frontend/package.json). + +If your setup doesn't allow you to easily change your current Node version, we would recommend making use of [`nvm`](https://github.com/nvm-sh/nvm) to quickly switch between Node versions. + +### Install yarn, if you prefer + +Lexicon doesn't leverage any special features of [Yarn](https://yarnpkg.com/) - the alternative package manager for Node. If you prefer it, it will work the same as running `npm install`. + +For the purposes of this tutorial, we will demonstrate all commands using `npm`. + +### Clone the Lexicon Repository + +In a desirable location on your development machine, clone the Lexicon repository and `cd` into it. + +```sh +git clone git@github.com:lexiconhq/lexicon.git +cd lexicon +``` + +### Install Dependencies + +Next, install Lexicon's dependencies: + +```sh +npm install +``` + +This will install dependencies for both the Mobile App and the backend GraphQL API, Prose. + +### Install the Expo CLI + +[Expo](https://expo.io/) is the phenomenal toolchain that Lexicon uses to develop and build the Mobile App. + +We will later use the Expo CLI to launch the Mobile App - either on your device or in a simulator. + +You can install the Expo CLI with the following command: + +```sh +npm install --global expo-cli +``` + +Further information is available in the [Expo docs](https://docs.expo.io/). + +Then, verify that Expo is available in your `PATH` with the following: + +```sh +$ expo --version + +``` + +### Install the EAS CLI + +[Expo Application Services (EAS)](https://expo.dev/eas/) is an integrated set of cloud services for Expo and React Native apps. + +We will use the EAS CLI to build and publish the Mobile App. + +You can install the EAS CLI with the following command: + +```sh +npm install --global eas-cli +``` + +Further information is available in the [Expo docs](https://docs.expo.dev/eas/). + +Then, verify that EAS is available in your `PATH` with the following: + +```sh +$ eas --version +eas-cli/ +``` + +### Ready to Go! + +That's all we need for this step. + +Next, there is an optional guide to help you if you're not too familiar with setting up a server on a cloud provider. + +You're free to skip this if you're already adept at this process. + +After that, we'll look into how we can prepare Discourse to connect with the Lexicon Mobile App. + +If you don't already have a Discourse server setup, we'll get into that as well. diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/updating.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/updating.md new file mode 100644 index 00000000..46fcfdd1 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/updating.md @@ -0,0 +1,68 @@ +--- +title: Update your App +--- + +## EAS Update + +EAS Update is the successor to `expo publish`. This service helps to update projects using the `expo-updates` library. + +In particular, it enables you to push quick fixes to your users in between full-fledged app store submissions. + +With EAS Update, there is no need to recompile the app with its non-native parts, such as TypeScript code, styling, or image assets. [Click here](https://docs.expo.dev/eas-update/introduction/) to learn more about EAS Update. +:::note +You are required to build the app with [EAS Build](building) before using the EAS Update. +::: + +### Configuration + +Let's get started by configuring EAS update. Feel free to check out the [complete guide](https://docs.expo.dev/build-reference/build-configuration/) from Expo for further details. + +```bash +eas update:configure +``` + +Running this command will add `expo.updates.url` and `runtimeVersion.policy` in `app.json`. + +:::caution + +As mentioned in the [Expo documentation](https://docs.expo.dev/build/updates/#previewing-updates-in-development-builds), you can no longer launch your app in Expo Go (using `expo start`) after adding the `runtimeVersion` field in `app.json`. It is recommended to use `expo-dev-client` instead to create a development build. + +```bash +eas -p all -e development +``` + +or if you still wish to use Expo Go, please remove `runtimeVersion` field from `app.json` before running `expo start`. +::: + +### Updating + +After making the necessary changes, you can push updates using this command: + +```bash +eas update –-branch –-message “” +``` + +The branch name here is the same as the build profile name when building the app. +For example, if you had previously built the app with this command: + +```bash +eas build –p all –e preview +``` + +Then you can later update it using: + +```bash +eas update –-branch preview –-message “Fixing typos” +``` + +Once the update is complete, force close and reopen the installed app twice to view the update. + +## All Done! 🙌 + +That's it for the tutorial. Great work. + +We hope that this has served as an informative guide to help familiarize you with Lexicon and how you can make use of it. + +If you haven't already, check out the [Lexicon Documentation](../) to get a deeper understanding of the project and how it all works. + +If you have any questions, comments, feedback, or want to contribute, please reach out to us on Github! diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/white-label.md b/documentation/versioned_docs/version-2.0.0-beta/tutorial/white-label.md new file mode 100644 index 00000000..f0192667 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/tutorial/white-label.md @@ -0,0 +1,82 @@ +--- +title: White Label your App +--- + +## Customize the Splash Screen and App Icon + +In order to customize the app for your own brand, you will likely want to provide your own assets for the **Splash Screen** and the **App Icon**. + +The **Splash Screen** - sometimes also referred to as the Launch Screen - is what appears while the app is launching. Some apps also display this to help conceal private information when the app is put into background mode. + +The **App Icon** is what is used to represent the app on the user's device, such as on the home screen and when listing it in the device's settings. + +Both of these assets often contain your logo in one form or another. For example, the App Icon for the Gmail app is the multi-colored outline of an envelope. Then, when launching the Gmail app, you will notice that the Splash Screen includes a larger version of the App Icon. + +### Customizing the Splash Screen + +:::info +Expo does not currently support dark mode for splash screens. +::: + +The assets used for the splash screen in the Mobile App are located at `frontend/assets/images/splash.png` and `frontend/assets/images/splashDark.png`. + +Above, we mention splash screen assets for both Dark Mode and Light Mode. + +However, unfortunately at this time, Expo does not support Dark Mode for Splash Screens. We have only included both so that they're ready when Expo finally does support this. + +In the meantime, you're free to adjust `splash.png` to influce what asset appears. + +In order to change it, you can simply replace the existing file with your own `splash.png`. + +To find out more about the Splash Screen image size and other details, please see the [Expo Splash Screen Guide](https://docs.expo.io/guides/splash-screens/). + +#### Futher Configuration + +To resize the Splash Screen image and change its background color, first open `frontend/app.json` and locate the `"splash"` field within it. + +As illustrated by the excerpt below, there are multiple fields that can be used to further adjust the Splash Screen: + +```json +"splash": { + "image": "./assets/splash.png", + "resizeMode": "contain", + "backgroundColor": "#FFFFFF" +}, +``` + +**image** + +The `image` field is fairly self-explanatory - it allows you to adjust what path will be used to locate the Splash Screen image. + +**resizeMode** + +The `resizeMode` field allows you to manage how the Splash Screen image will be resized to maintain its aspect ratio: + +- `contain` - Resize the image to make sure the whole image is visible. This is the default setting. +- `cover` - Resize the image to cover the entire container (in this case the whole screen) by either stretching or cropping the image as needed. + +Further details of how `contain` and `cover` behave are covered in the previously mentioned [Expo Splash Screen guide](https://docs.expo.io/guides/splash-screens/). For an even more detailed explanation, you can read [this post](http://blog.vjeux.com/2013/image/css-container-and-cover.html). + +**backgroundColor** + +The `backgroundColor` field enables you to specify the color of the background behind the Splash Screen image. Removing this value will result in usage of the default value, which is a white background color. + +### Customizing the App Icon + +Customizing the App Icon in Lexicon is nearly the same process as customizing the Splash Screen. + +The image asset for the Mobile App's icon is located at `frontend/assets/icon.png`. To customize it, simply overwrite that file with your own `icon.png`. + +## Further Customization + +We get into more detail about how to white label your app in the [White Labeling](../white-labeling) section of the documentation. + +In particular, this includes customizing and extending the theme's color palette, icons, and even fonts. + +Should you wish to customize anything not covered in that section, get in touch with us, and we'll see how we can help you make it a reality. + +## Awesome Work + +Your app looks cool now 😎. However, it's only accessible to you. + +Next, we'll cover how you can actually [build your app](building), so you can share it with the world. diff --git a/documentation/versioned_docs/version-2.0.0-beta/white-labeling.md b/documentation/versioned_docs/version-2.0.0-beta/white-labeling.md new file mode 100644 index 00000000..be413831 --- /dev/null +++ b/documentation/versioned_docs/version-2.0.0-beta/white-labeling.md @@ -0,0 +1,13 @@ +--- +title: Overview +--- + +The Lexicon Mobile App allows you to customize its appearance through a process known as **White Labeling**. + +If you're unfamiliar with this term, it's essentially the process of branding an existing application specifically for your users. + +White Labeling allows you to configure the app with your own logo, app icon, color theme, fonts, and so on. + +The idea is that your users won't know that the Lexicon team built this app. Its appearance will be completely customized to your brand. + +To learn more about White Labeling the Lexicon Mobile App, continue to the next section. diff --git a/documentation/versioned_sidebars/version-1.0.0-sidebars.json b/documentation/versioned_sidebars/version-1.0.0-sidebars.json new file mode 100644 index 00000000..511494c1 --- /dev/null +++ b/documentation/versioned_sidebars/version-1.0.0-sidebars.json @@ -0,0 +1,39 @@ +{ + "docs": { + "Lexicon": [ + "intro", + "rationale", + "technologies", + "concepts", + "discourse-features", + "supported-devices", + "contributing", + "commercial-support" + ], + "Getting Started": ["quick-start", "setup", "customize"], + "Configuring the Mobile App": ["env-mobile"], + "White Labeling": ["white-labeling", "assets", "theming"], + "Deploying Prose": ["deployment", "env-prose", "dedicated"], + "Configuring Discourse": ["optimal"], + "Publishing your App": [ + "app-store", + "play-store", + "lexicon-updates", + "troubleshooting-build" + ] + }, + "tutorial": { + "Tutorial": [ + "tutorial/intro", + "tutorial/setup", + "tutorial/setup-cloud-server", + "tutorial/setup-discourse", + "tutorial/install-prose", + "tutorial/setup-mobile", + "tutorial/white-label", + "tutorial/building", + "tutorial/publishing", + "tutorial/updating" + ] + } +} diff --git a/documentation/versioned_sidebars/version-2.0.0-beta-sidebars.json b/documentation/versioned_sidebars/version-2.0.0-beta-sidebars.json new file mode 100644 index 00000000..36d1e847 --- /dev/null +++ b/documentation/versioned_sidebars/version-2.0.0-beta-sidebars.json @@ -0,0 +1,57 @@ +{ + "docs": { + "Lexicon": [ + "intro", + "rationale", + "technologies", + "concepts", + "discourse-features", + "supported-devices", + "contributing", + "commercial-support" + ], + "Getting Started": ["quick-start", "setup", "customize"], + "Configuring the Mobile App": ["env-mobile"], + "White Labeling": ["white-labeling", "assets", "theming"], + "Deploying Prose": ["deployment", "env-prose", "dedicated"], + "Configuring Discourse": ["optimal"], + "Discourse Plugin": [ + "discourse-plugin", + "discourse-plugin-installation", + "discourse-plugin-enable", + { + "Push Notifications": [ + "push-notifications/introduction", + "push-notifications/plugin-interaction", + "push-notifications/setup/enable-push-notifications", + "push-notifications/setup/verify-push-notifications" + ], + "Email Deep Linking": [ + "email-deep-linking/intro", + "email-deep-linking/setup/enable-email-deep-linking", + "email-deep-linking/setup/verify-email-deep-linking" + ] + } + ], + "Publishing your App": [ + "app-store", + "play-store", + "lexicon-updates", + "troubleshooting-build" + ] + }, + "tutorial": { + "Tutorial": [ + "tutorial/intro", + "tutorial/setup", + "tutorial/setup-cloud-server", + "tutorial/setup-discourse", + "tutorial/install-prose", + "tutorial/setup-mobile", + "tutorial/white-label", + "tutorial/building", + "tutorial/publishing", + "tutorial/updating" + ] + } +} diff --git a/documentation/versions.json b/documentation/versions.json new file mode 100644 index 00000000..f103ef9d --- /dev/null +++ b/documentation/versions.json @@ -0,0 +1 @@ +["2.0.0-beta", "1.0.0"] diff --git a/documentation/yarn.lock b/documentation/yarn.lock index 14de2301..81b30277 100644 --- a/documentation/yarn.lock +++ b/documentation/yarn.lock @@ -1959,9 +1959,9 @@ "@hapi/hoek" "^9.0.0" "@sideway/formula@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" - integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== "@sideway/pinpoint@^2.0.0": version "2.0.0" @@ -4547,9 +4547,9 @@ htmlparser2@^8.0.1: entities "^4.3.0" http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" @@ -4988,9 +4988,9 @@ json-schema-traverse@^1.0.0: integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" @@ -5051,9 +5051,9 @@ loader-runner@^4.2.0: integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -6751,19 +6751,19 @@ semver@7.0.0: integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== semver@^5.4.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== 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== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -7299,9 +7299,9 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" ua-parser-js@^0.7.18: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + version "0.7.33" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" + integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== uncontrollable@^7.2.1: version "7.2.1" @@ -7690,9 +7690,9 @@ webpack-sources@^3.2.2, webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.74.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" - integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== + version "5.78.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.78.0.tgz#836452a12416af2a7beae906b31644cb2562f9e6" + integrity sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" diff --git a/frontend/.env.example b/frontend/.env.example deleted file mode 100644 index 9accc364..00000000 --- a/frontend/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -MOBILE_PROSE_HOST=http://127.0.0.1 -MOBILE_PROSE_PORT=80 \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore index d513d4bf..4906d099 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -11,7 +11,12 @@ web-build/ src/generated/**/*.ts src/graphql/schema.json .env +playstore_secret.json +dist/ # macOS .DS_Store /coverage + +#firebase +google-services.json diff --git a/frontend/Config.ts b/frontend/Config.ts new file mode 100644 index 00000000..09e46c4b --- /dev/null +++ b/frontend/Config.ts @@ -0,0 +1,70 @@ +/** + * This configuration file allows you to specify the configuration for developing against, + * as well as building and releasing the Lexicon Mobile App. + * Currently, there is only one important config value, which is `proseUrl`. + */ + +import * as Updates from 'expo-updates'; + +/** + * Modify this `config` object to specify the configuration for the Lexicon Mobile App by scenario. + */ +const config: Config = { + /* + * `localDevelopment` is used in local development. It has one extra key, `inferDevelopmentHost`, + * which you can read about in the documentation. + * `localDevelopment` is also used as a fallback configuration if an unknown build channel is provided + * to EAS Build. + */ + localDevelopment: { + proseUrl: 'http://localhost:8929', + inferDevelopmentHost: true, // Specific to local development with Expo Go & the Android simulator. See docs. + }, + /** + * `buildChannels` refers to channels within Expo's EAS Build service, which are defined in + * `eas.json`. These can be named anything you'd like, but the conventional channel names are + * `preview` and `production`. + * + * Make sure you specify the valid, reachable URL of your Prose server before running `eas build` + * for a particular build channel. + * By default, running `eas build` will attempt to use the values in `buildChannels.production`. + * + * If you create a new build profile / channel, be sure to add an entry for it here in `buildChannels`. + */ + buildChannels: { + preview: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + production: { + proseUrl: 'http://PLACEHOLDER.change.this.to.your.prose.url', + }, + }, +}; + +/** `getConfig` contains the minimal business logic for retrieving the config for a given channel, + * and otherwise falling back to the `localDevelopment` config. + */ +function getConfig(): RequiredConfig | LocalConfig { + if (!Updates.channel) { + return config.localDevelopment; + } + + const matchedConfig = config.buildChannels[Updates.channel]; + if (!matchedConfig) { + return config.localDevelopment; + } + + return matchedConfig; +} + +/* Type definitions for the `config` object */ +type RequiredConfig = { proseUrl: `${'http' | 'https'}://${string}` }; +type LocalConfig = RequiredConfig & { + inferDevelopmentHost?: boolean; +}; +type Config = { + localDevelopment: LocalConfig; + buildChannels: Record; +}; + +export default getConfig(); diff --git a/frontend/apollo.config.js b/frontend/apollo.config.js new file mode 100644 index 00000000..3695bc85 --- /dev/null +++ b/frontend/apollo.config.js @@ -0,0 +1,9 @@ +module.exports = { + client: { + service: { + name: 'prose-api-schema', + localSchemaFile: '../api/src/generated/schema.graphql', + }, + excludes: ['**/generated/**/*'], + }, +}; diff --git a/frontend/app.json b/frontend/app.json index 3e2dcdf6..aabfcd9d 100644 --- a/frontend/app.json +++ b/frontend/app.json @@ -1,7 +1,9 @@ { "expo": { - "name": "Lexicon", - "slug": "lexicon", + "name": "", + "slug": "", + "scheme": "", + "currentFullName": "@/", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/icon.png", @@ -32,10 +34,19 @@ ] }, "ios": { - "supportsTablet": false + "supportsTablet": false, + "buildNumber": "1.0.0", + "config": { + "usesNonExemptEncryption": false + } + }, + "android": { + "permissions": [], + "versionCode": 1 }, "web": { "favicon": "./assets/favicon.png" - } + }, + "plugins": ["expo-localization"] } } diff --git a/frontend/assets/icons/adminPanel.svg b/frontend/assets/icons/AdminPanel.svg similarity index 100% rename from frontend/assets/icons/adminPanel.svg rename to frontend/assets/icons/AdminPanel.svg diff --git a/frontend/assets/icons/NoConnection.svg b/frontend/assets/icons/NoConnection.svg new file mode 100644 index 00000000..3a6ac4e6 --- /dev/null +++ b/frontend/assets/icons/NoConnection.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/assets/icons/NotificationActive.svg b/frontend/assets/icons/NotificationActive.svg new file mode 100644 index 00000000..0700a1b5 --- /dev/null +++ b/frontend/assets/icons/NotificationActive.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/assets/icons/Online.svg b/frontend/assets/icons/Online.svg new file mode 100644 index 00000000..d71aa7c3 --- /dev/null +++ b/frontend/assets/icons/Online.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/assets/icons/settings.svg b/frontend/assets/icons/Settings.svg similarity index 100% rename from frontend/assets/icons/settings.svg rename to frontend/assets/icons/Settings.svg diff --git a/frontend/assets/icons/Unreachable.svg b/frontend/assets/icons/Unreachable.svg new file mode 100644 index 00000000..2e3778fc --- /dev/null +++ b/frontend/assets/icons/Unreachable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/babel.config.js b/frontend/babel.config.js index d53bc5f9..1befd4c0 100644 --- a/frontend/babel.config.js +++ b/frontend/babel.config.js @@ -1,9 +1,17 @@ -module.exports = function(api) { +module.exports = function (api) { api.cache(true); return { presets: ['babel-preset-expo'], - plugins: [["module:react-native-dotenv",{ - "allowUndefined": true - }]], + plugins: [ + ['module:react-native-dotenv', { allowUndefined: true }], + /** + * Reanimated plugin has to be listed last + * Added to avoid this error + * `Export namespace should be first transformed by @babel/plugin-proposal-export-namespace-from` + * and as suggested in the docs + * https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/installation/#babel-plugin + */ + 'react-native-reanimated/plugin', + ], }; }; diff --git a/frontend/codegen.ts b/frontend/codegen.ts new file mode 100644 index 00000000..1c62b59b --- /dev/null +++ b/frontend/codegen.ts @@ -0,0 +1,34 @@ +import { CodegenConfig } from '@graphql-codegen/cli'; + +const config: CodegenConfig = { + schema: '../api/src/generated', + documents: ['src/graphql/server/*.{ts,tsx}'], + config: { + namingConvention: { + fileName: 'change-case-all#pascalCase', + }, + }, + generates: { + './src/generated/server.ts': { + config: { + withHooks: true, + dedupeOperationSuffix: true, + }, + plugins: [ + { + add: { + content: '// THIS FILE IS GENERATED, DO NOT EDIT!', + }, + }, + 'typescript', + 'typescript-operations', + 'typescript-react-apollo', + ], + }, + }, + hooks: { + afterAllFileWrite: [`prettier --write "src/generated/**/*.{ts,tsx}"`], + }, +}; + +export default config; diff --git a/frontend/codegen.yml b/frontend/codegen.yml deleted file mode 100644 index 176b155d..00000000 --- a/frontend/codegen.yml +++ /dev/null @@ -1,24 +0,0 @@ -overwrite: true -schema: '../api/src/generated' -documents: src/graphql/server/*.{ts,tsx} - -generates: - src/generated/server/types.ts: - - typescript - src/generated/server: - config: - omitOperationSuffix: true - preset: near-operation-file - presetConfig: - extension: .ts - baseTypesPath: types.ts - folder: ../../generated/server - plugins: - - add: - content: '// THIS FILE IS GENERATED, DO NOT EDIT!' - - typescript-operations - - typescript-react-apollo -hooks: - afterAllFileWrite: - - prettier --write "src/generated/**/*.{ts,tsx}" - - node ./scripts/rename-generated-files.js diff --git a/frontend/docs/DeepLinkRedirect.md b/frontend/docs/DeepLinkRedirect.md new file mode 100644 index 00000000..1a60a944 --- /dev/null +++ b/frontend/docs/DeepLinkRedirect.md @@ -0,0 +1,76 @@ +# Deep Link + +## Overview + +Lexicon supports deep linking with our plugin discourse-lexicon-plugin. Currently, we have two types of deep links: post and message. + +A post deep link will contain information such as the post title and post number. For example: {baseDeepLinkUrl}/post-detail/t/welcome-to-our-community/7. + +On the other hand, a message deep link will include the title and message ID. For instance: {baseDeepLinkUrl}/message-detail/t/test/55/1. + +## Flow Navigate DeepLink in lexicon app + +### Post Detail + +This is a flow of diagram of post detail deep link + +```mermaid +flowchart TD + UserClick[/Click DeepLink /] --> conditionDiscourse{Is Public Discourse?} + + conditionDiscourse -- yes --> yesPublicCondition(Redirect To Post Detail Scene) + yesPublicCondition --> conditionPublicError403{Is GetError 403} + + conditionPublicError403 -- yes --> yes403PublicCondition{Is Already Login} + conditionPublicError403 -- no --> no403PublicCondition{is Get Other Error} + + no403PublicCondition -- yes --> resultGetOtherErrorPost(show error message `some thing wrong`) + no403PublicCondition -- no --> resultPost(show the post) + + + yes403PublicCondition -- yes --> yesPublicIsLoginCondition(Redirect To Home Scene and Show Alert Private Post) + yes403PublicCondition -- no --> noPublicIsLoginCondition(Redirect To Login Scene) + + + conditionDiscourse -- no --> privateCondition{is Already Login} + + privateCondition -- yes --> yesPublicCondition + + privateCondition -- no --> noPublicIsLoginCondition + + noPublicIsLoginCondition --> afterLogin[\Input Login Account\] + + afterLogin --> yesPublicCondition +``` + +### Message Detail + +This is a flow diagram of message detail deep link + +```mermaid +flowchart TD + UserClick[/Click DeepLink /] --> conditionDiscourse{Is Public Discourse?} + + conditionDiscourse -- yes --> yesPublicCondition(Redirect To Message Detail Scene) + + yesPublicCondition --> ErrorCondition{is Get Error} + + ErrorCondition -- yes --> resultGetOtherErrorPost(show error message `sorry we can't get the message`) + ErrorCondition -- no --> resultPost(show the message) + + + conditionDiscourse -- no --> privateCondition{is Already Login} + + privateCondition -- yes --> yesPublicCondition + privateCondition -- no --> noPrivateConditionLogin(Redirect To Login Scene) + + noPrivateConditionLogin --> afterLogin[\Input Login Account\] + + afterLogin --> yesPublicCondition +``` + +## Note + +1. We will encounter a 403 error when attempting to make a request to the topicDetail query for private posts. To provide more details on this issue, please refer to PR [#1100](https://github.com/kodefox/lexicon/pull/1100), which offers a more comprehensive description. + +2. In our code, we store the deep link path in a hook, which can be found in the file `AppNavigator.tsx`. The code checks if the user is not logged in and then saves the path of the deep link, for example, `t/welcome-to-our-community/7`. This path is handled in the login process, where the user is automatically redirected to the specific route, either the message or post detail scene. diff --git a/frontend/docs/authentication.md b/frontend/docs/authentication.md new file mode 100644 index 00000000..46b65372 --- /dev/null +++ b/frontend/docs/authentication.md @@ -0,0 +1,28 @@ +# Authentication + +## Overview +Lexicon have few different cases of different state of authentication that need to be handled. This document will explain how to handle each case. + +## Ingredients +### Session Token +We save session token in async storage. When booting our app, we will load the token from async storage to state. We also use token state to determine whether user is logged in or not. We currently implement this in `AuthProvider` component. The token are in the form of a apollo ReactiveVar because we need to update it in our apollo client and it be hard to update React state from apollo client. + +### SiteSettings Query +SiteSettings query are utilized to determine whether a discourse instance is a private instance where we cannot register new user freely ora public instance where we can register new user freely. In case of public discourse this endpoint should be able to be accessed without authentication. + +## Authentication flow + +1. Load token from async storage to state (inside auth provider) +2. Hit SiteSettings endpoint, several result also depending on token availability would determine where we redirect our user to +3. Redirect user to a page based on combination of token availability and SiteSettings result + +| Token | SiteSettings | Result | +| --- | --- | --- | +| No | Error | Redirect to login | +| No | Success | Redirect to Home| +| Yes | Error | Clean session | +| Yes | Success | Redirect to Home | + + + + diff --git a/frontend/docs/expoExperienceId.md b/frontend/docs/expoExperienceId.md new file mode 100644 index 00000000..6b0d22a4 --- /dev/null +++ b/frontend/docs/expoExperienceId.md @@ -0,0 +1,392 @@ +# Expo Experience Id Push notifications + +## Overview + +In our integration with the Discourse Lexicon plugin, the Expo experience ID is required to support push notifications. We obtain this from Expo in the mobile app by making use of the [`expo-constants`](https://docs.expo.dev/versions/latest/sdk/constants/) package. According to the documentation, we can access the `expoConfig.originalFullName` or `expoConfig.currentFullName` properties to obtain the desired value. + +## Why Experience Id Require + +The requirement for the experience ID in the Discourse Lexicon Plugin arises from the need to handle the error known as `PUSH_TOO_MANY_EXPERIENCE_IDS`. This error occurs when attempting to send push notifications, and it can be further understood and managed by referring to the [documentation here](https://docs.expo.dev/push-notifications/sending-notifications/#request-errors). + +## Result From Researching Experience Id + +The experience ID used for push notifications follows the format `@username/project`. According to the Expo documentation and research conducted within the Lexicon project, we can obtain the experience ID by utilizing `expoConfig.originalFullName` or `expoConfig.currentFullName`. To achieve this, it's necessary to include these values within the `app.json` file of the Lexicon project. Here the example of value + +```json +{ + "name": "", + "slug": "", + "scheme": "", + "currentFullName": "@/", + "originalFullName": "@/" +} +``` + +If we haven't configured these values in the `app.json` file, running the app locally in development mode, building it, or performing an EAS update will result in `undefined` values being returned from the `expo-constants` package. + +Here is the distinction between `currentFullName` and `originalFullName` based on the Expo documentation: + +- `originalFullName`: This constant represents the initial name of your Expo project as defined when the project was created. Even if the project is transferred between accounts or renamed, this value will remain unchanged. + +- `currentFullName`: In contrast, this constant reflects the current name of your app. It might change if you decide to rename your app in the future. When a project is transferred between accounts or renamed, this value may be updated to match the latest name. + +In summary, while "originalFullName" retains the app's original name, "currentFullName" keeps track of the app's current name, which can change due to renaming or transfers. + +Another constant that can be utilized is `manifest2.extra.scopeKey`, which provides the experience ID value. This value can be obtained from `manifest2` when running the APK in local development mode and after performing an EAS update to build the APK. However, it will return null if the APK is built without utilizing an EAS update. + +The value from `manifest2.extra.scopeKey` will be auto-generated based on the `projectId` in `app.json`. If no `projectId` value is set, it will return the value `anonymous` for the user, such as `@anonymous/-2339463f-0c9d-4d59-9898-55d6adf8f37b`. Where UUID will be add in scopeKey if there are no project id to make unique identifier. + +#### Table Constants Experience Id in Lexicon + +| Name | Value | Development | Build | Update | +| -------------------------------- | ------------------- | ----------- | ----- | ------ | +| manifest.extra.scopeKey | @kfox/kf-lounge | ✅ | ❌ | ✅ | +| currentFullName/OriginalFullName | | ✅ | ✅ | ✅ | + +Here Result of expoConfig and manifest2 value in app + +### Local Development + +```json +{ + "expoConfig": { + "name": "KF Lounge", + "slug": "kf-lounge", + "scheme": "kf-lounge", + "version": "1.1.7", + "orientation": "portrait", + "icon": "./assets/icon.png", + "splash": { + "image": "./assets/images/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff", + "imageUrl": "http://192.168.1.4:8081/assets/./assets/images/splash.png" + }, + "userInterfaceStyle": "automatic", + "updates": { + "fallbackToCacheTimeout": 0 + }, + "assetBundlePatterns": ["**/*"], + "packagerOpts": { + "config": "metro.config.js", + "sourceExts": [ + "expo.ts", + "expo.tsx", + "expo.js", + "expo.jsx", + "ts", + "tsx", + "js", + "jsx", + "json", + "wasm", + "svg" + ] + }, + "ios": { + "supportsTablet": false, + "buildNumber": "1.0.0", + "config": { + "usesNonExemptEncryption": false + } + }, + "android": { + "package": "com.kodefox.kflounge", + "permissions": ["READ_EXTERNAL_STORAGE", "WRITE_EXTERNAL_STORAGE"], + "googleServicesFile": "", + "versionCode": 29 + }, + "web": { + "favicon": "./assets/favicon.png" + }, + "plugins": ["expo-localization"], + "_internal": { + "isDebug": false, + "projectRoot": "/Users/switzer/Desktop/lexicon/frontend", + "dynamicConfigPath": {}, + "staticConfigPath": "/Users/switzer/Desktop/lexicon/frontend/app.json", + "packageJsonPath": "/Users/switzer/Desktop/lexicon/frontend/package.json" + }, + "sdkVersion": "49.0.0", + "platforms": ["ios", "android"], + "iconUrl": "http://192.168.1.4:8081/assets/./assets/icon.png", + "hostUri": "192.168.1.4:8081" + }, + "manifest2": { + "id": "fe70a46f-547c-4389-ad96-8dfb9e910dd0", + "createdAt": "2023-08-09T07:55:27.551Z", + "runtimeVersion": "exposdk:49.0.0", + "launchAsset": { + "key": "bundle", + "contentType": "application/javascript", + "url": "http://192.168.1.4:8081/index.bundle?platform=android&dev=true&hot=false&lazy=true" + }, + "assets": [], + "metadata": {}, + "extra": { + "expoClient": { + "name": "KF Lounge", + "slug": "kf-lounge", + "scheme": "kf-lounge", + "version": "1.1.7", + "orientation": "portrait", + "icon": "./assets/icon.png", + "splash": { + "image": "./assets/images/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff", + "imageUrl": "http://192.168.1.4:8081/assets/./assets/images/splash.png" + }, + "userInterfaceStyle": "automatic", + "updates": { + "fallbackToCacheTimeout": 0, + "url": "https://u.expo.dev/74846d43-b313-4543-9590-71704cc3a568" + }, + "assetBundlePatterns": ["**/*"], + "packagerOpts": { + "config": "metro.config.js", + "sourceExts": [ + "expo.ts", + "expo.tsx", + "expo.js", + "expo.jsx", + "ts", + "tsx", + "js", + "jsx", + "json", + "wasm", + "svg" + ] + }, + "ios": { + "supportsTablet": false, + "buildNumber": "1.0.0", + "config": { + "usesNonExemptEncryption": false + } + }, + "android": { + "package": "com.kodefox.kflounge", + "permissions": ["READ_EXTERNAL_STORAGE", "WRITE_EXTERNAL_STORAGE"], + "googleServicesFile": "{\n \"project_info\": {\n \"project_number\": \"301575653646\",\n \"project_id\": \"kflounge-aa9d1\",\n \"storage_bucket\": \"kflounge-aa9d1.appspot.com\"\n },\n \"client\": [\n {\n \"client_info\": {\n \"mobilesdk_app_id\": \"1:301575653646:android:2860ef5ec5c5ceceb02f5f\",\n \"android_client_info\": {\n \"package_name\": \"com.kodefox.kflounge\"\n }\n },\n \"oauth_client\": [\n {\n \"client_id\": \"301575653646-gg3u22vdrmir0aa38uirlvbv433m4c8c.apps.googleusercontent.com\",\n \"client_type\": 3\n }\n ],\n \"api_key\": [\n {\n \"current_key\": \"AIzaSyDV8j1qkZdCdKlvSRvyOI2566cVXGfAnLs\"\n }\n ],\n \"services\": {\n \"appinvite_service\": {\n \"other_platform_oauth_client\": [\n {\n \"client_id\": \"301575653646-gg3u22vdrmir0aa38uirlvbv433m4c8c.apps.googleusercontent.com\",\n \"client_type\": 3\n }\n ]\n }\n }\n }\n ],\n \"configuration_version\": \"1\"\n}\n", + "versionCode": 29 + }, + "web": { + "favicon": "./assets/favicon.png" + }, + "plugins": ["expo-localization"], + "_internal": { + "isDebug": false, + "projectRoot": "/Users/switzer/Desktop/lexicon/frontend", + "dynamicConfigPath": {}, + "staticConfigPath": "/Users/switzer/Desktop/lexicon/frontend/app.json", + "packageJsonPath": "/Users/switzer/Desktop/lexicon/frontend/package.json" + }, + "sdkVersion": "49.0.0", + "platforms": ["ios", "android"], + "iconUrl": "http://192.168.1.4:8081/assets/./assets/icon.png", + "hostUri": "192.168.1.4:8081" + }, + "expoGo": { + "debuggerHost": "192.168.1.4:8081", + "logUrl": "http://192.168.1.4:8081/logs", + "developer": { + "tool": "expo-cli", + "projectRoot": "/Users/switzer/Desktop/lexicon/frontend" + }, + "packagerOpts": { + "dev": true + }, + "mainModuleName": "index", + "__flipperHack": "React Native packager is running" + }, + "scopeKey": "@kfox/kf-lounge" + }, + "isVerified": true, + "name": "My New Experience", + "primaryColor": "#023C69", + "iconUrl": "https://d3lwq5rlu14cro.cloudfront.net/ExponentEmptyManifest_192.png", + "orientation": "default" + } +} +``` + +### Build APK + +```json +{ + "expoConfig": { + "name": "KF Lounge", + "slug": "kf-lounge", + "scheme": "kf-lounge", + "version": "1.1.7", + "orientation": "portrait", + "icon": "./assets/icon.png", + "splash": { + "image": "./assets/images/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "userInterfaceStyle": "automatic", + "updates": { + "fallbackToCacheTimeout": 0, + "url": "https://u.expo.dev/74846d43-b313-4543-9590-71704cc3a568" + }, + "assetBundlePatterns": ["**/*"], + "packagerOpts": { + "config": "metro.config.js", + "sourceExts": [ + "expo.ts", + "expo.tsx", + "expo.js", + "expo.jsx", + "ts", + "tsx", + "js", + "jsx", + "json", + "wasm", + "svg" + ] + }, + "ios": { + "supportsTablet": false, + "buildNumber": "1.0.0" + }, + "android": { + "package": "com.kodefox.kflounge", + "permissions": ["READ_EXTERNAL_STORAGE", "WRITE_EXTERNAL_STORAGE"], + "googleServicesFile": "./google-services.json", + "versionCode": 29 + }, + "web": { + "favicon": "./assets/favicon.png" + }, + "plugins": ["expo-localization"], + "sdkVersion": "49.0.0", + "platforms": ["ios", "android"] + }, + "manifest2": null +} +``` + +### After Eas Update + +> **Note:** for manifest2 value is already inside extra or `manifest2.extra` + +```json +{ + "expoConfig": { + "ios": { + "buildNumber": "31", + "supportsTablet": false, + "bundleIdentifier": "com.kodefox.kflounge" + }, + "web": { + "favicon": "./assets/favicon.png" + }, + "icon": "./assets/icon.png", + "name": "KF Lounge", + "slug": "kf-lounge", + "scheme": "kf-lounge", + "splash": { + "image": "./assets/images/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "android": { + "package": "com.kodefox.kflounge", + "permissions": ["READ_EXTERNAL_STORAGE", "WRITE_EXTERNAL_STORAGE"], + "versionCode": 31, + "googleServicesFile": "./google-services.json" + }, + "updates": { + "url": "https://u.expo.dev/74846d43-b313-4543-9590-71704cc3a568", + "fallbackToCacheTimeout": 0 + }, + "version": "1.1.9", + "platforms": ["ios", "android"], + "sdkVersion": "49.0.0", + "orientation": "portrait", + "packagerOpts": { + "config": "metro.config.js", + "sourceExts": [ + "expo.ts", + "expo.tsx", + "expo.js", + "expo.jsx", + "ts", + "tsx", + "js", + "jsx", + "json", + "wasm", + "svg" + ] + }, + "runtimeVersion": { + "policy": "sdkVersion" + }, + "userInterfaceStyle": "automatic", + "assetBundlePatterns": ["**/*"] + }, + "manifest2": { + "expoClient": { + "ios": { + "buildNumber": "31", + "supportsTablet": false, + "bundleIdentifier": "com.kodefox.kflounge" + }, + "web": { + "favicon": "./assets/favicon.png" + }, + "icon": "./assets/icon.png", + "name": "KF Lounge", + "slug": "kf-lounge", + "scheme": "kf-lounge", + "splash": { + "image": "./assets/images/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "android": { + "package": "com.kodefox.kflounge", + "permissions": ["READ_EXTERNAL_STORAGE", "WRITE_EXTERNAL_STORAGE"], + "versionCode": 31, + "googleServicesFile": "./google-services.json" + }, + "updates": { + "url": "https://u.expo.dev/74846d43-b313-4543-9590-71704cc3a568", + "fallbackToCacheTimeout": 0 + }, + "version": "1.1.9", + "platforms": ["ios", "android"], + "sdkVersion": "49.0.0", + "orientation": "portrait", + "packagerOpts": { + "config": "metro.config.js", + "sourceExts": [ + "expo.ts", + "expo.tsx", + "expo.js", + "expo.jsx", + "ts", + "tsx", + "js", + "jsx", + "json", + "wasm", + "svg" + ] + }, + "runtimeVersion": { + "policy": "sdkVersion" + }, + "userInterfaceStyle": "automatic", + "assetBundlePatterns": ["**/*"] + }, + "scopeKey": "@kfox/kf-lounge" + } +} +``` diff --git a/frontend/eas.json b/frontend/eas.json new file mode 100644 index 00000000..42f2c146 --- /dev/null +++ b/frontend/eas.json @@ -0,0 +1,51 @@ +{ + "cli": { + "version": ">= 2.6.0", + "appVersionSource": "local" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal", + "channel": "development" + }, + "preview": { + "distribution": "internal", + "channel": "preview", + "ios": { + "simulator": true + }, + "android": { + "buildType": "apk" + } + }, + "production": { + "autoIncrement": true, + "channel": "production" + } + }, + "submit": { + "base": { + "ios": { + "appleId": "", + "ascAppId": "", + "appleTeamId": "" + }, + "android": { + "serviceAccountKeyPath": "./playstore_secret.json" + } + }, + "staging": { + "extends": "base", + "android": { + "track": "internal" + } + }, + "production": { + "extends": "base", + "android": { + "track": "production" + } + } + } +} diff --git a/frontend/index.js b/frontend/index.js new file mode 100644 index 00000000..ce8f2073 --- /dev/null +++ b/frontend/index.js @@ -0,0 +1,5 @@ +import { registerRootComponent } from 'expo'; + +import App from './App'; + +registerRootComponent(App); diff --git a/frontend/metro.config.js b/frontend/metro.config.js index 963e0bab..70b5bbe1 100644 --- a/frontend/metro.config.js +++ b/frontend/metro.config.js @@ -1,17 +1,16 @@ // eslint-disable-next-line @typescript-eslint/no-var-requires -const { getDefaultConfig } = require('metro-config'); +const { getDefaultConfig } = require('expo/metro-config'); -module.exports = (async () => { - const { - resolver: { sourceExts, assetExts }, - } = await getDefaultConfig(); - return { - transformer: { - babelTransformerPath: require.resolve('react-native-svg-transformer'), - }, - resolver: { - assetExts: assetExts.filter((ext) => ext !== 'svg'), - sourceExts: [...sourceExts, 'svg'], - }, - }; -})(); +const defaultConfig = getDefaultConfig(__dirname); +const { + transformer, + resolver: { assetExts }, +} = defaultConfig; + +defaultConfig.transformer = { + ...transformer, + babelTransformerPath: require.resolve('react-native-svg-transformer'), +}; +defaultConfig.resolver.assetExts = assetExts.filter((ext) => ext !== 'svg'); +defaultConfig.resolver.sourceExts.push('svg'); +module.exports = defaultConfig; diff --git a/frontend/package.json b/frontend/package.json index d6a5a8c3..8b35a2cf 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,104 +1,130 @@ { - "main": "node_modules/expo/AppEntry.js", "scripts": { "start": "expo start", - "quickstart": "MOBILE_PROSE_HOST=http://127.0.0.1 MOBILE_PROSE_PORT=8929 expo -c", + "quickstart": "expo -c", "typecheck": "tsc --noEmit -p .", "format": "prettier --write \"src/**/*.{ts,tsx}\"", "format:check": "prettier --check \"src/**/*.{ts,tsx}\"", "lint": "eslint --max-warnings 0 \"src/**/*.{ts,tsx}\"", - "jest": "MOBILE_PROSE_HOST=http://localhost jest --coverage --passWithNoTests", - "test": "yarn graphql:generate && yarn lint && yarn typecheck && yarn format:check && yarn jest", + "jestTest": "jest --coverage --passWithNoTests", + "test": "yarn graphql:generate && yarn lint && yarn typecheck && yarn format:check && yarn jestTest", "eject": "expo eject", - "graphql:generate": "graphql-codegen --config codegen.yml" + "graphql:generate": "graphql-codegen --config codegen.ts", + "postinstall": "patch-package", + "eas-build-post-install": "yarn --cwd ../ && yarn --cwd ../ generate", + "android:push:encrypt": "openssl enc -aes-256-cbc -salt -md sha512 -pbkdf2 -in ./google-services.json -out ./google-services.json.enc -k", + "dec-google-services": "openssl enc -aes-256-cbc -d -md sha512 -pbkdf2 -in ./google-services.json.enc -out ./google-services.json -k" }, "dependencies": { - "@apollo/client": "^3.6.9", + "@apollo/client": "^3.7.1", "@expo-google-fonts/courier-prime": "^0.2.2", - "@react-native-async-storage/async-storage": "~1.17.3", - "@react-native-community/datetimepicker": "6.5.2", - "@react-native-community/masked-view": "^0.1.11", + "@react-native-async-storage/async-storage": "1.18.2", + "@react-native-community/datetimepicker": "7.2.0", + "@react-native-masked-view/masked-view": "0.2.9", "@react-navigation/bottom-tabs": "^6.3.2", "@react-navigation/elements": "^1.3.4", "@react-navigation/native": "^6.0.11", "@react-navigation/stack": "^6.2.2", "apollo-upload-client": "^17.0.0", - "expo": "^47.0.0", - "expo-constants": "~14.0.2", - "expo-crypto": "~12.0.0", - "expo-file-system": "~15.1.1", - "expo-image-picker": "~14.0.2", - "expo-localization": "~14.0.0", - "expo-permissions": "~14.0.0", - "expo-status-bar": "~1.4.2", + "expo": "^49.0.6", + "expo-constants": "~14.4.2", + "expo-crypto": "~12.4.1", + "expo-device": "^5.4.0", + "expo-file-system": "~15.4.3", + "expo-image-picker": "~14.3.2", + "expo-linear-gradient": "~12.3.0", + "expo-linking": "~5.0.2", + "expo-localization": "~14.3.0", + "expo-network": "~5.4.0", + "expo-notifications": "~0.20.1", + "expo-permissions": "~14.2.1", + "expo-splash-screen": "~0.20.5", + "expo-status-bar": "~1.6.0", + "expo-system-ui": "~2.4.0", + "expo-updates": "~0.18.12", "graphql": "^16.5.0", "intl": "^1.2.5", "markdown-it-flowdock": "^0.3.8", - "react": "18.1.0", - "react-dom": "18.1.0", - "react-hook-form": "^6", - "react-native": "0.70.8", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.43.9", + "react-native": "0.72.4", "react-native-auto-grow-textinput": "^1.2.1", "react-native-dotenv": "^3.3.1", - "react-native-gesture-handler": "~2.8.0", + "react-native-gesture-handler": "~2.12.0", "react-native-image-viewing": "^0.2.2", "react-native-image-zoom-viewer": "^3.0.1", "react-native-keyboard-accessory": "^0.1.16", "react-native-keyboard-aware-scroll-view": "0.9.5", "react-native-markdown-display": "^7.0.0-alpha.2", "react-native-parsed-text": "^0.0.22", - "react-native-reanimated": "~2.12.0", - "react-native-safe-area-context": "4.4.1", - "react-native-screens": "~3.18.0", - "react-native-svg": "13.4.0", - "react-native-web": "~0.18.7", - "use-debounce": "^8.0.3" + "react-native-reanimated": "~3.3.0", + "react-native-safe-area-context": "4.6.3", + "react-native-screens": "~3.22.0", + "react-native-skeleton-placeholder": "^5.2.4", + "react-native-svg": "13.9.0", + "react-native-toast-message": "^2.1.5", + "use-debounce": "^8.0.4" }, "devDependencies": { "@babel/core": "^7.19.3", - "@graphql-codegen/cli": "2.10.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", + "@graphql-codegen/add": "^3.2.1", + "@graphql-codegen/cli": "^3.3.0", "@graphql-codegen/near-operation-file-preset": "^2.4.0", "@graphql-codegen/typescript": "2.7.2", - "@graphql-codegen/typescript-operations": "2.5.2", + "@graphql-codegen/typescript-operations": "^3.0.3", "@graphql-codegen/typescript-react-apollo": "3.3.2", - "@graphql-codegen/typescript-resolvers": "^2.7.2", - "@types/apollo-upload-client": "^14.1.0", + "@types/apollo-upload-client": "^17.0.2", "@types/jest": "^26.0.9", - "@types/react": "~18.0.24", + "@types/react": "~18.2.14", "@types/react-native": "~0.70.6", "@types/react-native-dotenv": "^0.2.0", - "@types/react-test-renderer": "^16.9.2", - "@typescript-eslint/eslint-plugin": "^5.58.0", - "@typescript-eslint/parser": "^5.58.0", - "apollo": "2.34.0", - "eslint": "^8.38.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-native": "^4.0.0", - "eslint-plugin-styles": "^1.0.0", - "eslint-plugin-t": "^1.6.0", - "jest": "^26.6.3", - "jest-expo": "^47.0.0", + "@types/react-test-renderer": "^18.0.0", + "cross-env": "^7.0.3", + "eslint": "^7.6.0", + "eslint-config-kodefox": "^1.2.0", + "eslint-plugin-styles": "^0.1.0", + "eslint-plugin-t": "^1.2.1", + "jest": "^29.2.1", + "jest-expo": "^49.0.0", + "patch-package": "^6.4.7", + "postinstall-postinstall": "^2.1.0", "prettier": "^2.0.5", + "react-native-console-time-polyfill": "^1.2.3", "react-native-svg-transformer": "^0.14.3", "react-native-testing-library": "^6.0.0", - "react-test-renderer": "^16.13.1", + "react-test-renderer": "18.0.0", "runtypes": "^5.0.1", "ts-jest": "^26.1.4", - "typescript": "^4.9.5" + "typescript": "^5.1.3" }, "jest": { "preset": "jest-expo", "setupFiles": [ - "/src/__mocks__/setup.js" + "/src/__mocks__/setup.js", + "/src/__mocks__/setupLinking.ts" ], "moduleNameMapper": { "\\.svg$": "/src/__mocks__/svgMock.js" } }, + "eslintConfig": { + "extends": "kodefox/react-native", + "plugins": [ + "t", + "styles" + ], + "rules": { + "t/string-literal": 1, + "styles/style-maker-no-unused": 1, + "operator-assignment": [ + "warn", + "always" + ] + } + }, "prettier": { "singleQuote": true, "trailingComma": "all", diff --git a/frontend/patches/@react-navigation+stack+6.2.2.patch b/frontend/patches/@react-navigation+stack+6.2.2.patch new file mode 100644 index 00000000..b1b4d332 --- /dev/null +++ b/frontend/patches/@react-navigation+stack+6.2.2.patch @@ -0,0 +1,20 @@ +diff --git a/node_modules/@react-navigation/stack/src/views/Stack/Card.tsx b/node_modules/@react-navigation/stack/src/views/Stack/Card.tsx +index 4ce3b31..b239b40 100755 +--- a/node_modules/@react-navigation/stack/src/views/Stack/Card.tsx ++++ b/node_modules/@react-navigation/stack/src/views/Stack/Card.tsx +@@ -107,6 +107,7 @@ export default class Card extends React.Component { + componentDidMount() { + this.animate({ closing: this.props.closing }); + this.isCurrentlyMounted = true; ++ this.props.gesture.addListener(()=>{return}); + } + + componentDidUpdate(prevProps: Props) { +@@ -144,6 +145,7 @@ export default class Card extends React.Component { + this.props.gesture.stopAnimation(); + this.isCurrentlyMounted = false; + this.handleEndInteraction(); ++ this.props.gesture.removeAllListeners(); + } + + private isCurrentlyMounted = false; diff --git a/frontend/patches/react-native-markdown-display+7.0.0-alpha.2.patch b/frontend/patches/react-native-markdown-display+7.0.0-alpha.2.patch new file mode 100644 index 00000000..007aafb9 --- /dev/null +++ b/frontend/patches/react-native-markdown-display+7.0.0-alpha.2.patch @@ -0,0 +1,46 @@ +diff --git a/node_modules/react-native-markdown-display/package.json b/node_modules/react-native-markdown-display/package.json +index 0670296..93bc4b5 100644 +--- a/node_modules/react-native-markdown-display/package.json ++++ b/node_modules/react-native-markdown-display/package.json +@@ -35,7 +35,7 @@ + "react-native-fit-image": "^1.5.5" + }, + "peerDependencies": { +- "react": "^16.2.0", ++ "react": ">=16.2.0", + "react-native": ">=0.50.4" + }, + "devDependencies": { +diff --git a/node_modules/react-native-markdown-display/src/index.d.ts b/node_modules/react-native-markdown-display/src/index.d.ts +index f0daf4a..0e46a73 100644 +--- a/node_modules/react-native-markdown-display/src/index.d.ts ++++ b/node_modules/react-native-markdown-display/src/index.d.ts +@@ -1,7 +1,7 @@ + // tslint:disable:max-classes-per-file + import MarkdownIt from 'markdown-it'; + import Token from 'markdown-it/lib/token'; +-import {ComponentType, ReactNode} from 'react'; ++import React, {ComponentType, ReactNode} from 'react'; + import {StyleSheet, View} from 'react-native'; + + export function getUniqueID(): string; +@@ -82,6 +82,7 @@ export function stringToTokens( + export function tokensToAST(tokens: ReadonlyArray): ASTNode[]; + + export interface MarkdownProps { ++ children?: React.ReactNode; + rules?: RenderRules; + style?: StyleSheet.NamedStyles; + renderer?: AstRenderer; +diff --git a/node_modules/react-native-markdown-display/src/lib/util/tokensToAST.js b/node_modules/react-native-markdown-display/src/lib/util/tokensToAST.js +index b0ed265..4b6a6a1 100644 +--- a/node_modules/react-native-markdown-display/src/lib/util/tokensToAST.js ++++ b/node_modules/react-native-markdown-display/src/lib/util/tokensToAST.js +@@ -61,6 +61,7 @@ export default function tokensToAST(tokens) { + ) + ) { + astNode.index = children.length; ++ astNode.key= `${astNode.type}-${astNode.index}` + + if (token.nesting === 1) { + children.push(astNode); diff --git a/frontend/patches/react-native-skeleton-placeholder+5.2.4.patch b/frontend/patches/react-native-skeleton-placeholder+5.2.4.patch new file mode 100644 index 00000000..cc805224 --- /dev/null +++ b/frontend/patches/react-native-skeleton-placeholder+5.2.4.patch @@ -0,0 +1,58 @@ +diff --git a/node_modules/react-native-skeleton-placeholder/lib/skeleton-placeholder.js b/node_modules/react-native-skeleton-placeholder/lib/skeleton-placeholder.js +index 353abb6..6370a37 100644 +--- a/node_modules/react-native-skeleton-placeholder/lib/skeleton-placeholder.js ++++ b/node_modules/react-native-skeleton-placeholder/lib/skeleton-placeholder.js +@@ -36,7 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); + const masked_view_1 = __importDefault(require("@react-native-masked-view/masked-view")); + const React = __importStar(require("react")); + const react_native_1 = require("react-native"); +-const react_native_linear_gradient_1 = __importDefault(require("react-native-linear-gradient")); ++const LinearGradient = require('expo-linear-gradient').LinearGradient; + const WINDOW_WIDTH = react_native_1.Dimensions.get('window').width; + const logEnabled = false; + const SkeletonPlaceholder = ({ children, enabled = true, backgroundColor = '#E1E9EE', highlightColor = '#F2F8FC', speed = 800, direction = 'right', borderRadius, shimmerWidth, }) => { +@@ -56,18 +56,23 @@ const SkeletonPlaceholder = ({ children, enabled = true, backgroundColor = '#E1E + return () => loop.stop(); + }, [isAnimationReady, speed]); + const animatedGradientStyle = React.useMemo(() => { +- const animationWidth = WINDOW_WIDTH + (shimmerWidth !== null && shimmerWidth !== void 0 ? shimmerWidth : 0); +- return Object.assign(Object.assign({}, react_native_1.StyleSheet.absoluteFillObject), { flexDirection: 'row', transform: [ +- { +- translateX: animatedValueRef.current.interpolate({ +- inputRange: [0, 1], +- outputRange: direction === 'right' +- ? [-animationWidth, animationWidth] +- : [animationWidth, -animationWidth], +- }), +- }, +- ] }); +- }, [direction, WINDOW_WIDTH, shimmerWidth]); ++ const animationWidth = (layout?.width || 0) + (shimmerWidth !== null && shimmerWidth !== undefined ? shimmerWidth : 0); ++ return { ++ ...react_native_1.StyleSheet.absoluteFillObject, ++ flexDirection: 'row', ++ transform: [ ++ { ++ translateX: animatedValueRef.current.interpolate({ ++ inputRange: [0, 1], ++ outputRange: direction === 'right' ++ ? [-animationWidth, animationWidth] ++ : [animationWidth, -animationWidth], ++ }), ++ }, ++ ], ++ width: animationWidth, ++ }; ++ }, [direction, layout?.width, shimmerWidth]); + const placeholders = React.useMemo(() => { + if (!enabled) + return null; +@@ -86,7 +91,7 @@ const SkeletonPlaceholder = ({ children, enabled = true, backgroundColor = '#E1E + + + {isAnimationReady && highlightColor !== undefined && transparentColor !== undefined && ( +- ++ + )} + ); + }; diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 63b2841c..4b28a6f1 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -2,35 +2,82 @@ import React from 'react'; import { Platform } from 'react-native'; import { SafeAreaProvider } from 'react-native-safe-area-context'; import { ApolloProvider } from '@apollo/client'; +import { FormProvider, useForm } from 'react-hook-form'; import { client } from './graphql/client'; import { StorageProvider } from './helpers'; import AppNavigator from './navigation/AppNavigator'; import { AppearanceProvider, ThemeProvider } from './theme'; -import { ModalProvider, PostProvider, UserEventProvider } from './utils'; +import { RequestError, Toast } from './components'; +import { + ModalProvider, + OngoingLikedTopicProvider, + PushNotificationsProvider, + RedirectProvider, +} from './utils'; +import { AuthProvider } from './utils/AuthProvider'; +import { NewPostForm } from './types'; +import { NO_CHANNEL_FILTER_ID } from './constants'; if (Platform.OS === 'android') { require('intl'); require('intl/locale-data/jsonp/en-US'); + // required by https://github.com/andyearnshaw/Intl.js/issues/231 + + if (Platform.OS === 'android') { + // See https://github.com/expo/expo/issues/6536 for this issue. + // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-underscore-dangle + if (typeof (Intl as any).__disableRegExpRestore === 'function') { + // eslint-disable-next-line no-underscore-dangle, @typescript-eslint/no-explicit-any + (Intl as any).__disableRegExpRestore(); + } + } +} +if (__DEV__) { + require('react-native-console-time-polyfill'); } export default function App() { + const newPostMethods = useForm({ + mode: 'onChange', + reValidateMode: 'onChange', + defaultValues: { + title: '', + raw: '', + tags: [], + channelId: NO_CHANNEL_FILTER_ID, + editPostId: undefined, + editTopicId: undefined, + }, + }); + return ( - - - - - - - - - - - - - + + + + + <> + + + + + + + + + + + + + + + + + + + ); diff --git a/frontend/src/__mocks__/mockData.ts b/frontend/src/__mocks__/mockData.ts index 44710e86..4e525431 100644 --- a/frontend/src/__mocks__/mockData.ts +++ b/frontend/src/__mocks__/mockData.ts @@ -1,4 +1,4 @@ -import { EmailAddress, Message, Notification, Post } from '../types'; +import { EmailAddress, Notification, Post } from '../types'; const MOCK_IMG = 'https://dummyimage.com/600x400/000/fff'; @@ -86,7 +86,6 @@ const MOCK_POSTS: Array = [ title: 'Example', content: MOCK_CONTENT, hidden: false, - images: [MOCK_IMG], username: MOCK_USERS[0].username, avatar: MOCK_IMG, replyCount: 3010, @@ -138,7 +137,6 @@ const MOCK_POSTS: Array = [ title: 'KodeFox', content: MOCK_CONTENT, hidden: false, - images: [MOCK_IMG, MOCK_IMG, MOCK_IMG], username: MOCK_USERS[1].username, avatar: MOCK_IMG, replyCount: 3, @@ -227,47 +225,6 @@ const MOCK_MESSAGES = [ }, ]; -const MOCK_MESSAGES2: Message = { - members: [ - { id: 1, username: 'Natasha William', avatar: MOCK_IMG }, - { id: 2, username: 'Jacob Alexander', avatar: MOCK_IMG }, - { id: 3, username: 'Me', avatar: MOCK_IMG }, - { id: 4, username: 'NotMe', avatar: MOCK_IMG }, - ], - contents: [ - { - id: 1, - userId: 1, - time: '2020-08-28T22:45:15.634Z', - message: 'Test', - }, - { - id: 2, - userId: 1, - time: '2020-08-28T23:02:15.634Z', - message: 'Hello, Internet Citizens! Welcome to this multi-chat!', - }, - { - id: 3, - userId: 1, - time: '2020-08-28T23:07:15.634Z', - message: 'Here we can talk about anything that is happening in our life!', - }, - { - id: 4, - userId: 2, - time: '2020-08-28T23:12:15.634Z', - message: 'Hello Nat! Nice to meet you', - }, - { - id: 5, - userId: 3, - time: '2020-08-28T23:17:15.634Z', - message: 'Hey guys, nice to meet you all on this platform!', - }, - ], -}; - export default { posts: MOCK_POSTS, channels: MOCK_CHANNELS, @@ -278,5 +235,4 @@ export default { notifications: MOCK_NOTIFICATIONS, emailAddress: MOCK_EMAIL_ADDRESS, messages: MOCK_MESSAGES, - messages2: MOCK_MESSAGES2, }; diff --git a/frontend/src/__mocks__/setupLinking.ts b/frontend/src/__mocks__/setupLinking.ts new file mode 100644 index 00000000..4453ccfa --- /dev/null +++ b/frontend/src/__mocks__/setupLinking.ts @@ -0,0 +1,8 @@ +jest.mock('expo-linking', () => { + const module: typeof import('expo-linking') = { + ...jest.requireActual('expo-linking'), + createURL: jest.fn(), + }; + + return module; +}); diff --git a/frontend/src/components/Author.tsx b/frontend/src/components/Author.tsx index b907b50a..df6aa219 100644 --- a/frontend/src/components/Author.tsx +++ b/frontend/src/components/Author.tsx @@ -24,7 +24,6 @@ type Props = TouchableOpacityProps & imageStyle?: StyleProp; onPressAuthor?: (username: string) => void; onPressEmptySpaceInPost?: () => void; - postList?: boolean; }; export function Author(props: Props) { @@ -44,7 +43,6 @@ export function Author(props: Props) { children, onPressAuthor, onPressEmptySpaceInPost, - postList, ...otherProps } = props; @@ -68,7 +66,7 @@ export function Author(props: Props) { )} - {onPressEmptySpaceInPost && postList && ( + {onPressEmptySpaceInPost && ( ( + render: (props: P, ref: React.Ref) => React.ReactElement | null, + ): (props: P & React.RefAttributes) => React.ReactElement | null; +} + +export type RenderItemCustomOption = { + isItemLoading: boolean; + onLayout: (params: { event: LayoutChangeEvent }) => void; +}; + +type Props = Omit< + FlatListProps, + 'renderItem' | 'refreshControl' +> & { + renderItem: ( + info: ListRenderItemInfo, + customOption: RenderItemCustomOption, + ) => ReactElement; + refreshControlTintColor?: string; + paginationSize?: number; + data: Array; // This change was made because in React Native version 0.72, the type of the FlatList component's data prop was changed to ArrayLike, which does not have the slice method available. Therefore, we cannot use the slice method directly on the data prop. +}; + +type CustomFlatlistRefType = { + scrollToIndex: FlatList['scrollToIndex']; + scrollToEnd: FlatList['scrollToEnd']; +}; + +type ScrollToIndexParams = Parameters[0]; + +const DEFAULT_INITIAL_NUM_TO_RENDER = 10; +const DEFAULT_WINDOW_SIZE = 21; + +const DEFAULT_PAGINATION_SIZE = 5; + +/** + * Custom flatlist to support scroll to any index + * It will internally manage pagination and show correct data on scroll + * + * Notes: + * - Required to put onLayout for items rendered as the scroll depend + * on items layout finished + * - To make illusion of scrolling we wrapped the child in loading state + * it's not required but suggested to do as otherwise it will feel janky + * - Currently to load earlier data in the list we need to pull to refresh + * this limitation is design decision as automatically + * adding data to start of the list (ex: using onStartReached) + * would scroll the list to top on android(https://github.com/facebook/react-native/pull/29466) + * + * TODO: + * - Refactor to auto load earlier data once RN fix mvcp for android (https://github.com/kodefox/lexicon/issues/793) + */ + +function BaseCustomFlatList( + props: Props, + ref: ForwardedRef, +) { + const { + data: propsItemData = [], + initialNumToRender, + windowSize, + renderItem, + onEndReached, + onScroll, + onRefresh, + refreshing = false, + refreshControlTintColor, + paginationSize = DEFAULT_PAGINATION_SIZE, + ...flatListProps + } = props; + const safePropsItemData = useMemo(() => { + return propsItemData ?? []; + }, [propsItemData]); + const [startIndex, setStartIndex] = useState(); + const [lastIndex, setLastIndex] = useState(); + + // use to show loading on all items + const [itemsLoading, setItemsLoading] = useState(false); + + const baseFlatListRef = useRef>(null); + + const scrollToIndexParam = useRef(); + const shouldInternalScroll = useRef(); + const itemRenderCount = useRef(0); + + const internalOnEndReached = () => { + /** + * Compare our internal latestIndex with data props length + * if less load rest of our data from props + * if equal means our props runs out of data, trigger onEndReach + */ + if ( + lastIndex !== undefined && + safePropsItemData && + lastIndex !== safePropsItemData.length + ) { + setLastIndex(safePropsItemData.length); + } + }; + + useImperativeHandle( + ref, + () => { + return { + scrollToIndex: (params) => { + const initialWindow = Math.max( + initialNumToRender || DEFAULT_INITIAL_NUM_TO_RENDER, + windowSize || DEFAULT_WINDOW_SIZE, + ); + const halfInitialWindow = Math.floor(initialWindow / 2); + + // Handle default behavior + if (params.index < initialWindow) { + return baseFlatListRef.current?.scrollToIndex(params); + } + + /** + * Scroll illusion + * 1. turned on loading for all item + * 2. replace with sliced item + * 3. scroll to specific item + */ + setItemsLoading(true); + const newStartIndex = params.index - halfInitialWindow; + const newLastIndex = params.index + halfInitialWindow; + setStartIndex(newStartIndex); + setLastIndex(newLastIndex); + // set param for the scrollToIndex called + itemRenderCount.current = 0; + scrollToIndexParam.current = { + ...params, + index: halfInitialWindow, + }; + shouldInternalScroll.current = true; + }, + scrollToEnd: (params) => { + baseFlatListRef.current?.scrollToEnd(params); + }, + }; + }, + [initialNumToRender, windowSize], + ); + + // debounced scroll to happened after new data layout finished + const internalScroll = () => { + itemRenderCount.current += 1; + if (!shouldInternalScroll.current) { + return; + } + if (!scrollToIndexParam.current) { + return; + } + if (itemRenderCount.current < scrollToIndexParam.current.index + 1) { + return; + } + + shouldInternalScroll.current = false; + // This setTimeout call is an imperfect fix that makes the scrolling transition smoother. We might need to adjust this later after we improve the render latency. + setTimeout(() => { + setItemsLoading(false); + }, 500); + // SetTimeout below needed because even after last item onLayout the scrollToIndex still using old calculation + setTimeout(() => { + scrollToIndexParam.current && + baseFlatListRef.current?.scrollToIndex(scrollToIndexParam.current); + }); + }; + + const internalOnRefresh = () => { + if (propsItemData && startIndex) { + const newStartIndex = Math.max(startIndex - paginationSize, 0); + setStartIndex(newStartIndex); + } else { + onRefresh && onRefresh(); + // removing internal window on true refresh to just pass all data + setStartIndex(undefined); + setLastIndex(undefined); + } + }; + + const slicedFlatListData = safePropsItemData.slice( + startIndex !== undefined ? startIndex : 0, + lastIndex !== undefined ? lastIndex : safePropsItemData.length, + ); + + return ( + { + const customOptions: RenderItemCustomOption = { + isItemLoading: itemsLoading, + onLayout: internalScroll, + }; + return renderItem({ ...params }, customOptions); + }} + refreshControl={ + + } + onEndReached={(info) => { + internalOnEndReached(); + if ( + (lastIndex === safePropsItemData.length || lastIndex === undefined) && + onEndReached + ) { + onEndReached(info); + /** + * removing internal window on true on end reach + * to get all data from current start to the end + */ + setLastIndex(undefined); + } + }} + {...flatListProps} + /> + ); +} +const CustomFlatList = forwardRef(BaseCustomFlatList); + +export { CustomFlatlistRefType, CustomFlatList }; diff --git a/frontend/src/components/CustomFlatList/index.ts b/frontend/src/components/CustomFlatList/index.ts new file mode 100644 index 00000000..74aabdf4 --- /dev/null +++ b/frontend/src/components/CustomFlatList/index.ts @@ -0,0 +1 @@ +export * from './CustomFlatList'; diff --git a/frontend/src/components/LoadingOrError.tsx b/frontend/src/components/LoadingOrError.tsx index 98bda6b5..6cf8d121 100644 --- a/frontend/src/components/LoadingOrError.tsx +++ b/frontend/src/components/LoadingOrError.tsx @@ -1,11 +1,13 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { View } from 'react-native'; import { useNavigation } from '@react-navigation/native'; import { ActivityIndicator, Text } from '../core-ui'; -import { removeToken, showLogoutAlert, useStorage } from '../helpers'; +import { showLogoutAlert } from '../helpers'; import { makeStyles } from '../theme'; import { StackNavProp } from '../types'; +import { useAuth } from '../utils/AuthProvider'; +import { ERROR_NOT_FOUND } from '../constants'; type Props = { message?: string; @@ -14,9 +16,26 @@ type Props = { export function LoadingOrError(props: Props) { const { reset } = useNavigation>(); - const storage = useStorage(); - const styles = useStyles(); + const { cleanSession } = useAuth(); + const { message } = props; + useEffect(() => { + if (message === ERROR_NOT_FOUND) { + /** + * This is a legacy implementation that should be refactored + * We don't want to mixed this view layer with Auth logic + * https://github.com/kodefox/lexicon/issues/1097 + */ + cleanSession(); + reset({ index: 0, routes: [{ name: 'Login' }] }); + showLogoutAlert(); + } + }, [message, reset, cleanSession]); + + return ; +} +export function LoadingOrErrorView(props: Props) { + const styles = useStyles(); const { loading = false, message = loading @@ -24,13 +43,6 @@ export function LoadingOrError(props: Props) { : t('Something unexpected happened. Please try again'), } = props; - if (message === 'Not found or private') { - removeToken(); - storage.removeItem('user'); - reset({ index: 0, routes: [{ name: 'Login' }] }); - showLogoutAlert(); - } - return ( {loading ? : null} diff --git a/frontend/src/components/Markdown.tsx b/frontend/src/components/Markdown.tsx index c5652f7e..d1556ab4 100644 --- a/frontend/src/components/Markdown.tsx +++ b/frontend/src/components/Markdown.tsx @@ -1,50 +1,52 @@ /* eslint-disable styles/style-maker-no-unused */ import React from 'react'; -import { Alert, Platform, StyleProp, View, ViewStyle } from 'react-native'; +import { Platform, StyleProp, View, ViewStyle } from 'react-native'; import BaseMarkdown, { ASTNode, - getUniqueID, MarkdownIt, MarkdownProps, } from 'react-native-markdown-display'; import { useNavigation } from '@react-navigation/core'; import mentionFlowDock from 'markdown-it-flowdock'; +import * as Linking from 'expo-linking'; +import { useReactiveVar } from '@apollo/client'; -import { NO_USERNAME_ALERT, NO_USERNAME_SUB_ALERT } from '../constants'; import { CustomImage } from '../core-ui/CustomImage'; import { Text } from '../core-ui/Text'; import { makeStyles } from '../theme'; import { StackNavProp } from '../types'; +import CachedImage from '../core-ui/CachedImage'; +import { isEmojiImage } from '../helpers/emojiHandler'; +import { extractPathname, getValidDetailParams } from '../helpers'; +import { discourseHostVar } from '../constants'; type Props = Omit & { content: string; fontColor?: string; style?: StyleProp; - imageUrls?: Array; mentionColor?: string; - listOfMention?: Array; + mentions?: Array; nonClickable?: boolean; }; const ios = Platform.OS === 'ios'; export function Markdown(props: Props) { - const { navigate } = useNavigation>(); + const { navigate, push } = useNavigation>(); let styles = useStyles(); + let discourseHost = useReactiveVar(discourseHostVar); let { content, fontColor, mentionColor, style, - listOfMention, + mentions, nonClickable, - imageUrls = [], ...otherProps } = props; content = content || ''; - let image = 0; styles = fontColor ? { ...styles, ...{ body: { ...styles.body, color: fontColor } } } @@ -52,27 +54,24 @@ export function Markdown(props: Props) { const markdownItInstance = MarkdownIt({ typographer: true }).use( mentionFlowDock, - { - containerClassName: 'mention', - }, + { containerClassName: 'mention' }, ); const onPressMention = (username: string) => { - if (listOfMention?.includes(username)) { - navigate('UserInformation', { username }); - } else { - Alert.alert(NO_USERNAME_ALERT, NO_USERNAME_SUB_ALERT, [ - { text: t('Got it') }, - ]); - } + navigate('UserInformation', { username }); }; - const renderImage = (node: ASTNode) => { - let { src } = node.attributes; - const uploadRegex = /upload:\/\//g; - src = uploadRegex.test(src) ? imageUrls[image] || '' : src; - image += 1; - return ; + const renderImage = ({ attributes: { src }, key, content }: ASTNode) => { + if (isEmojiImage(content)) { + return ( + + ); + } + return ; }; const renderMention = ({ key, content }: ASTNode) => ( @@ -92,6 +91,47 @@ export function Markdown(props: Props) { {t('#{content}', { content })} ); + const renderLink = ({ key, attributes }: ASTNode) => { + if (typeof attributes.href !== 'string') { + return; + } + + let url = attributes.href; + const isSameHost = url.startsWith(discourseHost); + const pathname = isSameHost ? extractPathname(url) : ''; + + if (isSameHost && pathname) { + url = `/${pathname.replace(/t\//, 'topics/')}`; + } + + const onLinkPress = () => { + const detailParams = getValidDetailParams(pathname.split('/')); + + if (!detailParams) { + Linking.openURL(url); + return; + } + + const { topicId, postNumber } = detailParams; + push('PostDetail', { topicId, postNumber }); + }; + + const handleLinkPress = () => { + if (!isSameHost || !pathname) { + Linking.openURL(url); + return; + } + + onLinkPress(); + }; + + return ( + + {url} + + ); + }; + return ( ; setRawText?: (value: string) => void; - setMentionValue?: UseFormMethods['setValue']; setShowUserList: (value: boolean) => void; viewStyle?: StyleProp; fontStyle?: StyleProp; + setMentionValue?: (text: string) => void; }; export function MentionList(props: Props) { @@ -48,8 +47,9 @@ export function MentionList(props: Props) { const onPressUser = (username: string) => { const replacedText = rawText.replace(/@[A-Za-z0-9._-]*$/, `@${username}`); textRef.current?.focus(); + if (setMentionValue) { - setMentionValue('raw', replacedText); + setMentionValue(replacedText); } else if (setRawText) { setRawText(replacedText); } diff --git a/frontend/src/components/Metrics/Metrics.tsx b/frontend/src/components/Metrics/Metrics.tsx index e32bbaca..9110d02c 100644 --- a/frontend/src/components/Metrics/Metrics.tsx +++ b/frontend/src/components/Metrics/Metrics.tsx @@ -1,121 +1,213 @@ -import React, { useEffect, useState } from 'react'; +import React, { useState, useEffect, useCallback, memo } from 'react'; import { View, ViewProps } from 'react-native'; +import { useDebouncedCallback } from 'use-debounce'; +import { FIRST_POST_NUMBER } from '../../constants'; import { ActivityIndicator, Divider } from '../../core-ui'; -import { useLikePost } from '../../hooks'; +import { getUpdatedLikeCount } from '../../helpers'; +import { useLikeTopicOrPost } from '../../hooks'; import { makeStyles, useTheme } from '../../theme'; -import { usePost, useUserEvent } from '../../utils'; +import { useOngoingLikedTopic } from '../../utils'; import { MetricItem } from './MetricItem'; -type Props = ViewProps & { - postId: number; - topicId: number; - postList?: boolean; - viewCount?: number; - baseLikeCount: number; - replyCount: number; - onPressReply?: (postId: number) => void; - isCreator?: boolean; - baseIsLiked: boolean; - onPressView?: () => void; +type Props = { title?: string; - likedTopic?: Array; - nestedComment?: boolean; -}; + postNumber?: number; + likePerformedFrom?: 'home-scene' | 'topic-detail'; +} & MetricViewProps; export { Props as MetricsProp }; +const DEBOUNCE_WAIT_TIME = 500; + export function Metrics(props: Props) { - const { onLikedStatusChanged, likedTopic } = usePost(); - const styles = useStyles(); - const { colors } = useTheme(); - const { isScrolled } = useUserEvent(); + const { likedTopics } = useOngoingLikedTopic(); const { postId, topicId, - postList = false, viewCount, replyCount, - baseLikeCount, - baseIsLiked, - onPressReply, + likeCount: likeCountProps = 0, + postNumber, + isLiked, isCreator, - style, - onPressView, title, - nestedComment = false, + likePerformedFrom = 'topic-detail', + onPressReply, + onPressView, ...otherProps } = props; - const [isLiked, setIsLiked] = useState(baseIsLiked); - const [pastRequest, setPastRequest] = useState(baseIsLiked); - const [likeCount, setLikeCount] = useState(0); - const [counter, setCounter] = useState(baseLikeCount); - const [tempLiked, setTempLiked] = useState>([]); - const [tempLikedShadow, setTempLikedShadow] = useState>([]); + const [likeData, setLikeData] = useState({ + liked: isLiked, + likeCount: likeCountProps, + }); + const isFromHomeScene = likePerformedFrom === 'home-scene'; + const performDebouncedLike = useDebouncedCallback((liked: boolean) => { + if (liked === isLiked) { + return; + } + like({ + variables: { + unlike: isLiked, + ...(isFromHomeScene ? { topicId } : { postId }), + likeCount: likeCountProps, + }, + }); + }, DEBOUNCE_WAIT_TIME); + + /** + * Update like count and liked value for topic replies + * This is separated from the other useEffect to prevent + * updating like data for topic replies when ongoing + * likedTopics value changes + */ useEffect(() => { - if (likedTopic) { - setTempLiked(likedTopic); - setTempLikedShadow(likedTopic); + const isFirstPost = postNumber === FIRST_POST_NUMBER; + // Skip updating like count and liked value for topic and first post of topics + if (isFromHomeScene || isFirstPost) { + return; } - }, [likedTopic, postId]); + setLikeData({ likeCount: likeCountProps, liked: isLiked }); + }, [isFromHomeScene, isLiked, likeCountProps, likePerformedFrom, postNumber]); + /** + * Update like count and liked value for topic and first post of topics + * if isFromHomeScene is true, then it's a topic + * if isFirstPost is true, then it's the first post of topics + */ useEffect(() => { - setLikeCount(baseLikeCount); - }, [baseLikeCount]); + const isFirstPost = postNumber === FIRST_POST_NUMBER; + if (!isFromHomeScene && !isFirstPost) { + return; + } - const { like, loading } = useLikePost( - likeCount, - setLikeCount, - postList, - postId, - tempLiked, - setTempLiked, - tempLikedShadow, - setTempLikedShadow, - counter, - setCounter, - ); + const { liked: likedTopic, likeCount: topicLikeCount } = + likedTopics[topicId] ?? {}; + let liked = likedTopic ?? isLiked; + let likeCount = topicLikeCount ?? likeCountProps; - const onPressLike = () => { - if (!isScrolled && !nestedComment) { - if (!likedTopic.includes(topicId)) { - setPastRequest(false); - onLikedStatusChanged(topicId, true); - } else { - setPastRequest(true); - onLikedStatusChanged(topicId, false); - } + if (!isFirstPost) { + setLikeData({ likeCount, liked }); + return; } - if (!postList) { - let currentLikeStatus = nestedComment - ? isLiked - : likedTopic.includes(topicId); - if (currentLikeStatus) { - setLikeCount(likeCount - 1); - setIsLiked(false); - } else { - setLikeCount(likeCount + 1); - setIsLiked(true); - } - like({ - variables: { - postId, - unlike: currentLikeStatus, - }, + + /** + * Revert post like count to not use topic like count + * Liked value of the topic resembles the liked value of the first post. + * However, the like counts are different because topic likeCount + * represents the total of likes within that topic, while post + * likeCount only represents the number of likes for that post + */ + + likeCount = likeCountProps; + + /** + * Update post likeCount if topic liked and post liked values are different + * This means there's an ongoing like action related to this post, so + * post likeCount should get recalculated + */ + if (liked !== isLiked) { + const updatedLikeCount = getUpdatedLikeCount({ + liked, + previousCount: likeCountProps, }); + likeCount = updatedLikeCount; } - }; + + setLikeData({ likeCount, liked }); + }, [ + isFromHomeScene, + isLiked, + likeCountProps, + likedTopics, + postNumber, + topicId, + ]); + + // Ensuring debounced callback is called if it hasn't fired when component unmount + useEffect(() => { + return () => { + performDebouncedLike.flush(); + }; + }, [performDebouncedLike]); + + // TODO: Add navigation #800 + const [like] = useLikeTopicOrPost(); + + const onPressLike = useCallback(() => { + setLikeData(({ liked: prevLiked, likeCount: previousCount }) => { + const liked = !prevLiked; + const likeCount = getUpdatedLikeCount({ + liked, + previousCount, + }); + performDebouncedLike(liked); + return { liked, likeCount }; + }); + }, [performDebouncedLike]); + + return ( + + ); +} + +type MetricViewProps = ViewProps & { + topicId: number; + postList?: boolean; + replyCount: number; + likeCount: number; + isLiked: boolean; + postId?: number; + viewCount?: number; + isCreator?: boolean; + onPressLike?: () => void; + onPressReply?: (params: { postId?: number; topicId: number }) => void; + onPressView?: () => void; +}; + +function BaseMetricsView(props: MetricViewProps) { + const { + topicId, + postList = false, + replyCount, + likeCount, + isLiked, + postId, + viewCount, + isCreator, + onPressReply, + onPressLike, + onPressView, + style, + ...otherProps + } = props; + + const styles = useStyles(); + const { colors } = useTheme(); + let isLoading = !postId && !postList; return ( - {postId === 0 ? ( + {isLoading ? ( ) : ( <> @@ -133,42 +225,14 @@ export function Metrics(props: Props) { type="Likes" count={likeCount} onPress={onPressLike} - onPressOut={() => { - if ( - !isScrolled && - postList && - likedTopic.includes(topicId) !== pastRequest - ) { - setPastRequest(likedTopic.includes(topicId)); - like({ - variables: { - postId, - unlike: !likedTopic.includes(topicId), - postList: true, - }, - }); - } - }} - delayPressOut={1000} - activeOpacity={0.8} - disabled={postList ? !!isCreator : isCreator || loading} - color={ - !nestedComment - ? likedTopic.includes(topicId) - ? colors.liked - : colors.textLighter - : isLiked - ? colors.liked - : colors.textLighter - } + disabled={isCreator} + color={isLiked ? colors.liked : colors.textLighter} style={styles.likes} /> { - onPressReply ? onPressReply(postId) : () => {}; - }} + onPress={() => onPressReply?.({ postId, topicId })} /> )} @@ -176,6 +240,8 @@ export function Metrics(props: Props) { ); } +let MetricsView = memo(BaseMetricsView); + const useStyles = makeStyles(({ spacing }) => ({ container: { flexGrow: 1, diff --git a/frontend/src/components/NestedComment.tsx b/frontend/src/components/NestedComment.tsx index 0c5c0a19..341f4f74 100644 --- a/frontend/src/components/NestedComment.tsx +++ b/frontend/src/components/NestedComment.tsx @@ -1,10 +1,11 @@ -import React, { useEffect, useState } from 'react'; -import { View, ViewProps } from 'react-native'; +import React, { useState } from 'react'; +import { LayoutChangeEvent, View, ViewProps } from 'react-native'; -import { Divider, Icon } from '../core-ui'; +import { ActivityIndicator, Divider, Icon } from '../core-ui'; import { + deleteQuoteBbCode, formatRelativeTime, - handleSpecialMarkdown, + handleUnsupportedMarkdown, useStorage, } from '../helpers'; import { usePostRaw } from '../hooks'; @@ -15,64 +16,81 @@ import { Author } from './Author'; import { Markdown } from './Markdown'; import { Metrics } from './Metrics/Metrics'; import { PostHidden } from './PostItem'; -import { RepliedPost, RepliedPostProps } from './RepliedPost'; +import { + LocalRepliedPostProps, + RepliedPost, + RepliedPostProps, +} from './RepliedPost'; + +export type PressMoreParams = { + id?: number; + canFlag?: boolean; + canEdit?: boolean; + flaggedByCommunity?: boolean; + fromPost?: boolean; + author?: string; +}; -type Props = ViewProps & - RepliedPostProps & { - data: Post; +export type PressReplyParams = Pick; + +/** + * Omitting props below for reasons + * - onLayout : Because we creating customOnLayout + * - postId : Because it is equivalent with id from type Post + */ +type Props = Omit & + Omit & { showOptions: boolean; hasMetrics?: boolean; - onPressReply?: () => void; - onPressMore?: () => void; + isLoading?: boolean; + onLayout?: (params: { event: LayoutChangeEvent }) => void; + onPressReply?: (params: PressReplyParams) => void; + onPressMore?: (params: PressMoreParams) => void; onPressAuthor?: (username: string) => void; - }; + } & Post; -export function NestedComment(props: Props) { +function BaseNestedComment(props: Props) { const storage = useStorage(); const styles = useStyles(); const { colors } = useTheme(); - const { - data: { - id, - topicId, - likeCount, - replyCount, - isLiked, - username, - createdAt, - mentionedUsers, - avatar, - images, - content: contentFromGetTopicDetail, - hidden: flagged, - }, + id, + topicId, + likeCount, + replyCount, + isLiked, + username, + createdAt, + mentionedUsers, + avatar, + canFlag, + canEdit, + content: contentFromGetTopicDetail, + hidden, + replyToPostNumber, hideAuthor, - replyTo, hasMetrics = true, + style, + showOptions, + isLoading = false, + replyToPostId, onPressReply, onPressMore, onPressAuthor, - style, - showOptions, + onLayout, ...otherProps } = props; - const [content, setContent] = useState(''); - const [isHidden, setHidden] = useState(false); + const [content, setContent] = useState(contentFromGetTopicDetail); + const [isHidden, setHidden] = useState(hidden ?? false); const isTopicOwner = username === storage.getItem('user')?.username; const time = formatRelativeTime(createdAt); - const color: Color = flagged ? 'textLight' : 'textNormal'; - - useEffect(() => { - setContent(contentFromGetTopicDetail); - setHidden(flagged || false); - }, [contentFromGetTopicDetail, flagged]); + const color: Color = hidden ? 'textLight' : 'textNormal'; const { postRaw, loading } = usePostRaw({ - onCompleted: ({ postRaw: { raw } }) => { - setContent(raw); + onCompleted: ({ postRaw: { markdownContent } }) => { + setContent(markdownContent); setHidden(false); }, }); @@ -86,60 +104,90 @@ export function NestedComment(props: Props) { }; return ( - - - onPressAuthor && onPressAuthor(username)} - > - {showOptions ? ( - - ) : undefined} - + onLayout?.({ event })} + {...otherProps} + > + + + onPressAuthor && onPressAuthor(username)} + > + {showOptions ? ( + { + onPressMore?.({ + id, + canFlag, + canEdit, + flaggedByCommunity: hidden, + fromPost: false, + author: username, + }); + }} + hitSlop={{ top: 15, right: 15, bottom: 15, left: 15 }} + /> + ) : undefined} + + + {replyToPostId && ( + + )} + {isHidden ? ( + + ) : ( + + )} + {hasMetrics && ( + onPressReply?.({ replyToPostId: id })} + style={styles.metricSpacing} + /> + )} + {/* TODO: Replace with skeleton mask https://github.com/kodefox/lexicon/issues/794 */} + {isLoading ? ( + + + + ) : null} - {replyTo && } - {isHidden ? ( - - ) : ( - - )} - {hasMetrics && ( - - )} ); } -const useStyles = makeStyles(({ fontSizes, spacing }) => ({ +export let NestedComment = React.memo(BaseNestedComment); + +const useStyles = makeStyles(({ fontSizes, spacing, colors }) => ({ authorContainer: { flex: 1, justifyContent: 'space-between', @@ -147,6 +195,14 @@ const useStyles = makeStyles(({ fontSizes, spacing }) => ({ author: { paddingVertical: spacing.xl, }, + loadingContainer: { + position: 'absolute', + height: '100%', + width: '100%', + justifyContent: 'center', + alignItems: 'center', + backgroundColor: colors.backgroundDarker, + }, metricSpacing: { paddingTop: spacing.m, paddingBottom: spacing.xl, diff --git a/frontend/src/components/PostItem/HomePostItem.tsx b/frontend/src/components/PostItem/HomePostItem.tsx new file mode 100644 index 00000000..1c729dcd --- /dev/null +++ b/frontend/src/components/PostItem/HomePostItem.tsx @@ -0,0 +1,119 @@ +import React from 'react'; +import { useNavigation } from '@react-navigation/native'; +import { OperationVariables, useFragment_experimental } from '@apollo/client'; + +import { transformTopicToPost, useStorage } from '../../helpers'; +import { makeStyles } from '../../theme'; +import { StackNavProp } from '../../types'; +import { TopicFragment, TopicFragmentDoc } from '../../generated/server'; +import { LoadingOrError } from '../LoadingOrError'; +import { MetricsProp } from '../Metrics/Metrics'; + +import { PostItemFooter } from './PostItemFooter'; +import { PostItem, PostItemProps } from './PostItem'; + +type Props = Pick & + Pick; + +function BaseHomePostItem(props: Props) { + const { navigate } = useNavigation>(); + const storage = useStorage(); + const styles = useStyles(); + + const { topicId, prevScreen, isHidden = false, onPressReply } = props; + + const cacheTopicResult = useFragment_experimental< + TopicFragment, + OperationVariables + >({ + fragment: TopicFragmentDoc, + fragmentName: 'TopicFragment', + from: { + __typename: 'Topic', + id: topicId, + }, + }); + let cacheTopic = cacheTopicResult.data; + + if (!cacheTopicResult.complete || !cacheTopic) { + /** + * This shouldn't ever happen since postList + * have always already loaded the topic by this point. + */ + return ; + } + + let channelsData = storage.getItem('channels'); + let { + title, + avatar, + username, + channel, + tags, + viewCount, + replyCount, + likeCount, + hidden, + createdAt, + isLiked, + freqPosters, + postNumber, + content, + imageUrls, + } = transformTopicToPost({ ...cacheTopic, channels: channelsData ?? [] }); + + const isCreator = username === storage.getItem('user')?.username; + + const onPressPost = () => { + navigate('PostDetail', { + topicId, + prevScreen, + focusedPostNumber: undefined, + content, + hidden: isHidden, + }); + }; + + return ( + ); } @@ -247,9 +211,6 @@ const useStyles = makeStyles(({ colors, fontSizes, shadow, spacing }) => ({ spacingBottom: { marginBottom: spacing.xl, }, - spacingTop: { - paddingTop: spacing.m, - }, text: { marginTop: spacing.xl, marginBottom: spacing.m, @@ -258,3 +219,5 @@ const useStyles = makeStyles(({ colors, fontSizes, shadow, spacing }) => ({ fontSize: fontSizes.s, }, })); +let PostItem = React.memo(BasePostItem); +export { Props as PostItemProps, PostItem }; diff --git a/frontend/src/components/PostItem/PostItemFooter.tsx b/frontend/src/components/PostItem/PostItemFooter.tsx index 9667e658..56496985 100644 --- a/frontend/src/components/PostItem/PostItemFooter.tsx +++ b/frontend/src/components/PostItem/PostItemFooter.tsx @@ -45,3 +45,5 @@ const useStyles = makeStyles(({ fontSizes, spacing }) => ({ fontSize: fontSizes.s, }, })); + +export { Props as PostItemFooterProps }; diff --git a/frontend/src/components/PostItem/SearchPostItem.tsx b/frontend/src/components/PostItem/SearchPostItem.tsx new file mode 100644 index 00000000..04ec4925 --- /dev/null +++ b/frontend/src/components/PostItem/SearchPostItem.tsx @@ -0,0 +1,84 @@ +import React from 'react'; +import { OperationVariables, useFragment_experimental } from '@apollo/client'; + +import { findChannelByCategoryId, getImage, useStorage } from '../../helpers'; +import { + SearchPostFragment, + SearchPostFragmentDoc, + SearchTopicFragment, + SearchTopicFragmentDoc, +} from '../../generated/server'; +import { LoadingOrError } from '../LoadingOrError'; + +import { PostItem, PostItemProps } from './PostItem'; + +type Props = Pick & { + postId: number; +}; + +function BaseSearchPostItem(props: Props) { + const storage = useStorage(); + + const { topicId, postId } = props; + + const cachedSearchTopicResult = useFragment_experimental< + SearchTopicFragment, + OperationVariables + >({ + fragment: SearchTopicFragmentDoc, + fragmentName: 'SearchTopicFragment', + from: { + __typename: 'SearchTopic', + id: topicId, + }, + }); + const cacheSearchPostResult = useFragment_experimental< + SearchPostFragment, + OperationVariables + >({ + fragment: SearchPostFragmentDoc, + fragmentName: 'SearchPostFragment', + from: { + __typename: 'SearchPost', + id: postId, + }, + }); + let cachedSearchTopic = cachedSearchTopicResult.data; + let cacheSearchPost = cacheSearchPostResult.data; + + if ( + !cachedSearchTopicResult.complete || + !cacheSearchPostResult.complete || + !cachedSearchTopic || + !cacheSearchPost + ) { + /** + * This shouldn't ever happen since SearchTopic and SearchPost already + * fetched in SearchScreen + */ + return ; + } + let channels = storage.getItem('channels'); + const channel = findChannelByCategoryId({ + categoryId: cachedSearchTopic.categoryId, + channels, + }); + + return ( + + ); +} + +let SearchPostItem = React.memo(BaseSearchPostItem); +export { Props as SearchPostItemProps, SearchPostItem }; diff --git a/frontend/src/components/PostItem/UserInformationPostItem.tsx b/frontend/src/components/PostItem/UserInformationPostItem.tsx new file mode 100644 index 00000000..1ff90684 --- /dev/null +++ b/frontend/src/components/PostItem/UserInformationPostItem.tsx @@ -0,0 +1,85 @@ +import React from 'react'; +import { OperationVariables, useFragment_experimental } from '@apollo/client'; + +import { findChannelByCategoryId, getImage, useStorage } from '../../helpers'; +import { + UserActionFragment, + UserActionFragmentDoc, +} from '../../generated/server'; +import { LoadingOrError } from '../LoadingOrError'; + +import { PostItem, PostItemProps } from './PostItem'; + +type Props = Pick & { + postId?: number | null; + actionType: number; +}; +const LIKED_ACTION_TYPE = 1; + +function BaseUserInformationPostItem(props: Props) { + const storage = useStorage(); + + const { topicId, postId, actionType, currentUser } = props; + + const cacheUserActionResult = useFragment_experimental< + UserActionFragment, + OperationVariables + >({ + fragment: UserActionFragmentDoc, + fragmentName: 'UserActionFragment', + from: { + __typename: 'UserActions', + postId: postId, + topicId: topicId, + actionType, + }, + }); + let cacheUserAction = cacheUserActionResult.data; + + if (!cacheUserActionResult.complete || !cacheUserAction) { + /** + * This shouldn't ever happen since UserActions + * have always already loaded the UserInformation screens by this point. + */ + return ; + } + + let { + title, + excerpt: content, + avatarTemplate, + categoryId, + hidden, + createdAt, + username, + } = cacheUserAction; + const channels = storage.getItem('channels'); + + const channel = findChannelByCategoryId({ + categoryId: categoryId, + channels, + }); + + let avatar = getImage(avatarTemplate); + let isLiked = actionType === LIKED_ACTION_TYPE; + + return ( + diff --git a/frontend/src/core-ui/CustomImage.tsx b/frontend/src/core-ui/CustomImage.tsx index 67119825..28572335 100644 --- a/frontend/src/core-ui/CustomImage.tsx +++ b/frontend/src/core-ui/CustomImage.tsx @@ -11,6 +11,7 @@ import { import { DEFAULT_IMAGE } from '../../assets/images'; import { ShowImageModal } from '../components/ShowImageModal'; import { makeStyles } from '../theme'; +import { isImageValidUrl } from '../helpers'; import CachedImage from './CachedImage'; @@ -47,21 +48,17 @@ export function CustomImage(props: Props) { height: variantSize[size], ...(square && { width: variantSize[size] }), }; - const imgSource = { uri: src }; + + const imgSource = isImageValidUrl(src) ? { uri: src } : DEFAULT_IMAGE; + const hideImage = src === '' || error; const onPress = () => { - if (show) { - setShow(false); - } - setTimeout(() => setShow(true), 50); + setShow(true); }; const onPressCancel = () => { - if (!show) { - setShow(true); - } - setTimeout(() => setShow(false), 50); + setShow(false); }; const content = ( @@ -90,13 +87,12 @@ export function CustomImage(props: Props) { > {content} - {show && ( - - )} + + ) : ( diff --git a/frontend/src/core-ui/Icon.tsx b/frontend/src/core-ui/Icon.tsx index ec1a0a7d..d4770e97 100644 --- a/frontend/src/core-ui/Icon.tsx +++ b/frontend/src/core-ui/Icon.tsx @@ -17,7 +17,7 @@ type Props = { size?: IconSize; disabled?: boolean; style?: StyleProp; - hitSlop?: Insets; + hitSlop?: Insets | null | number; }; export { Props as IconProps }; diff --git a/frontend/src/core-ui/Link.tsx b/frontend/src/core-ui/Link.tsx new file mode 100644 index 00000000..843343b6 --- /dev/null +++ b/frontend/src/core-ui/Link.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import * as Linking from 'expo-linking'; + +import { makeStyles } from '../theme'; + +import { Text } from './Text'; + +type Props = { + url: string; +}; + +export let Link = ({ url }: Props) => { + let styles = useStyles(); + return ( + { + Linking.openURL(url); + }} + style={styles.link} + > + {url} + + ); +}; + +let useStyles = makeStyles(({ colors }) => ({ + link: { + color: colors.activeTab, + }, +})); diff --git a/frontend/src/core-ui/index.ts b/frontend/src/core-ui/index.ts index cae6df34..d0d5b82b 100644 --- a/frontend/src/core-ui/index.ts +++ b/frontend/src/core-ui/index.ts @@ -11,6 +11,7 @@ export * from './Dot'; export * from './FloatingButton'; export * from './Icon'; export * from './IconWithLabel'; +export * from './Link'; export * from './MentionedText'; export * from './RadioButton'; export * from './Text'; diff --git a/frontend/src/graphql/client.ts b/frontend/src/graphql/client.ts index b0b57fc2..abca94d9 100644 --- a/frontend/src/graphql/client.ts +++ b/frontend/src/graphql/client.ts @@ -1,35 +1,40 @@ import { createUploadLink } from 'apollo-upload-client'; import { ApolloClient, ApolloLink, InMemoryCache } from '@apollo/client'; import { setContext } from '@apollo/client/link/context'; +import ExpoConstants from 'expo-constants'; +import { onError } from '@apollo/client/link/error'; +import { getNetworkStateAsync } from 'expo-network'; -import { PROSE_ENDPOINT } from '../constants'; +import { + errorTypes, + ERROR_HANDLED_BY_LINK, + getProseEndpoint, + NO_CHANNEL_FILTER, + CUSTOM_HEADER_NEW_TOKEN, +} from '../constants'; import { appendPagination, - getToken, + getTopicDetailOutputCacheBehavior, prependAppendPagination, replaceDataPagination, userActivityPagination, + showLogoutAlert, + handleDuplicates, } from '../helpers'; +import { networkStatusVar, requestFailedVar } from '../components/RequestError'; +import { reset } from '../navigation/NavigationService'; +import Config from '../../Config'; +import { logoutTokenVar, setTokenState, tokenVar } from '../reactiveVars'; const cache = new InMemoryCache({ typePolicies: { - TopicDetailOutput: { - fields: { - title: replaceDataPagination(), - views: replaceDataPagination(), - likeCount: replaceDataPagination(), - postsCount: replaceDataPagination(), - liked: replaceDataPagination(), - categoryId: replaceDataPagination(), - tags: replaceDataPagination(), - createdAt: replaceDataPagination(), - details: replaceDataPagination(), - }, - }, + TopicDetailOutput: getTopicDetailOutputCacheBehavior(), + PrivateMessageDetailOutput: getTopicDetailOutputCacheBehavior(), PostStream: { fields: { posts: prependAppendPagination(), stream: replaceDataPagination(), + firstPost: replaceDataPagination(), }, }, Post: { @@ -44,32 +49,208 @@ const cache = new InMemoryCache({ raw: replaceDataPagination(), }, }, + TopicsOutput: { + keyFields: [], + fields: { + users: { + merge: (existing, incoming) => { + if (!existing || !incoming) { + return incoming || existing; + } + return handleDuplicates({ + oldArray: existing, + newArray: incoming, + newArrayIs: 'appended', + }); + }, + }, + topicList: { + /** + * TODO: refactor this merge function and standarize other pagination approaches + * https://github.com/kodefox/lexicon/issues/926 + */ + keyArgs: (_, context) => { + if (!context.variables || !context.variables.sort) { + return ''; + } + + let { categoryId, sort } = context.variables; + return `${categoryId ?? NO_CHANNEL_FILTER.id}-${sort}`; + }, + merge: (existing, incoming, { variables }) => { + if (!variables) { + return incoming; + } + + if (!existing || !incoming) { + return incoming || existing || undefined; + } + let mergedTopics = []; + if (variables.page > 0) { + mergedTopics = handleDuplicates({ + newArray: incoming.topics, + oldArray: existing.topics, + newArrayIs: 'appended', + }); + } else { + mergedTopics = handleDuplicates({ + newArray: incoming.topics, + oldArray: existing.topics, + newArrayIs: 'prepended', + }); + } + return { + ...existing, + topics: mergedTopics, + }; + }, + }, + }, + }, + UserActions: { + keyFields: ['postId', 'topicId', 'actionType'], + }, Query: { fields: { notification: appendPagination(false, 'NOTIFICATIONS'), + privateMessageDetail: replaceDataPagination(['topicId']), privateMessage: appendPagination(false, 'MESSAGE_DETAIL'), search: appendPagination(false, 'SEARCH'), topicDetail: replaceDataPagination(['topicId']), - topics: appendPagination(['sort', 'categoryId'], 'HOME'), userActivity: userActivityPagination(['username']), + replyingTo: { + read: (_, { args, toReference }) => { + return toReference({ __typename: 'Post', id: args?.replyToPostId }); + }, + }, }, }, }, }); -const authLink = setContext(async (_, { headers }) => { - const token = await getToken(); +const authLink = setContext(async (graphqlRequest, { headers }) => { + const token = tokenVar(); + const logoutToken = logoutTokenVar(); + + // It is recommended to always include `User Agent` header in all requests + const userAgent = await ExpoConstants.getWebViewUserAgentAsync(); + const additionalHeaders: Record = {}; + if (token) { + additionalHeaders.Authorization = token; + } + + /** + * We specifically use different token for logout request + * This is needed as the tokenVar will be turned to null on logout + * Otherwise if we want to stick to using tokenVar, + * we will needed to await the logout request + */ + if (graphqlRequest.operationName === 'Logout' && logoutToken) { + additionalHeaders.Authorization = logoutToken; + logoutTokenVar(null); + } + + if (userAgent) { + additionalHeaders['User-Agent'] = userAgent; + } return { headers: { ...headers, - Authorization: token, + ...additionalHeaders, }, }; }); -const uploadLink = createUploadLink({ uri: PROSE_ENDPOINT }); +export let proseEndpoint = getProseEndpoint( + Config.proseUrl, + 'inferDevelopmentHost' in Config ? Config.inferDevelopmentHost : undefined, +); + +const uploadLink = createUploadLink({ + uri: proseEndpoint, +}); + +const errorLink = onError(({ graphQLErrors, networkError, operation }) => { + if (networkError?.message === 'Network request failed') { + /** + * using then to avoid using observable + * because onError doesn't accept async + */ + getNetworkStateAsync().then(({ isInternetReachable }) => { + networkStatusVar( + isInternetReachable ? 'ProseUnreachable' : 'NoConnection', + ); + }); + return; + } + if (graphQLErrors) { + /** + * Ignore any errors from Site Query because we + * currently use this to check whether our Disccourse + * instance is public or private + */ + if (operation.operationName === 'Site') { + return; + } + + let sessionExpired = graphQLErrors.find(({ message }) => + message.includes(errorTypes.sessionExpired), + ); + if (sessionExpired) { + showLogoutAlert(); + setTokenState(null); + reset({ + index: 0, + routes: [ + { + name: 'InstanceLoading', + }, + ], + }); + + /** + * Setting the error message to ERROR_HANDLED_BY_LINK const to avoid + * showing error alert because it's already handled in error link + */ + sessionExpired.message = ERROR_HANDLED_BY_LINK; + return; + } + + let incorrectCredentials = graphQLErrors.find(({ message }) => { + const normalized = message.toLowerCase(); + return normalized.includes(errorTypes.incorrectCredentials); + }); + + // We don't want to display the error toast from incorrect credentials, because that is + // a valid error for the user to enter incorrect credentials. It doesn't indicate an issue + // with the request itself. + if (incorrectCredentials) { + return; + } + } + + if (networkError || !!graphQLErrors?.length) { + requestFailedVar(true); + } +}); + +const successLink = new ApolloLink((operation, forward) => { + return forward(operation).map((data) => { + const context = operation.getContext(); + const { + response: { headers }, + } = context; + const newToken = headers.map[CUSTOM_HEADER_NEW_TOKEN]; + + if (newToken) { + setTokenState(newToken); + } + + return data; + }); +}); export const client = new ApolloClient({ - link: ApolloLink.from([authLink, uploadLink]), + link: ApolloLink.from([successLink, errorLink, authLink, uploadLink]), cache, }); diff --git a/frontend/src/graphql/server/auth.ts b/frontend/src/graphql/server/auth.ts index 308ca4e6..4cc5fef7 100644 --- a/frontend/src/graphql/server/auth.ts +++ b/frontend/src/graphql/server/auth.ts @@ -42,7 +42,7 @@ export const REGISTER = gql` `; export const LOGOUT = gql` - mutation Logout($username: String!) { - logout(username: $username) + mutation Logout($username: String!, $pushNotificationsToken: String) { + logout(username: $username, pushNotificationsToken: $pushNotificationsToken) } `; diff --git a/frontend/src/graphql/server/getTopicDetail.ts b/frontend/src/graphql/server/getTopicDetail.ts index e14b19b3..70fa61d1 100644 --- a/frontend/src/graphql/server/getTopicDetail.ts +++ b/frontend/src/graphql/server/getTopicDetail.ts @@ -1,7 +1,7 @@ import { gql } from '@apollo/client'; export const USER_FRAGMENT = gql` - fragment TempUsers on UserIcon { + fragment UserFragment on UserIcon { id username name @@ -10,24 +10,92 @@ export const USER_FRAGMENT = gql` `; export const TOPIC_FRAGMENT = gql` - fragment TempTopic on Topic { + fragment TopicFragment on Topic { id title + imageUrl + postsCount + replyCount + createdAt + bumpedAt excerpt - categoryId + visible + liked tags - imageUrl - authorUserId + views + likeCount + categoryId posters { userId + description + user { + id + username + name + avatar: avatarTemplate + } + } + authorUserId + pinned + } +`; + +export const TOPIC_DETAIL_FRAGMENT = gql` + fragment TopicDetailFragment on TopicDetailOutput { + postStream { + posts { + id + postNumber + actionsSummary { + id + count + acted + __typename @skip(if: true) + } + } } - likeCount + } +`; + +export const POST_FRAGMENT = gql` + fragment PostFragment on Post { + id + topicId + username + actionCode + actionCodeWho + avatar: avatarTemplate + hidden + canEdit + markdownContent + mentions + createdAt + replyCount + actionsSummary { + id + count + acted + __typename @skip(if: true) + } + postNumber + replyToPostNumber } `; export const GET_TOPIC_DETAIL = gql` - query GetTopicDetail($topicId: Int!, $posts: [Int!], $postPointer: Int) { - topicDetail(topicId: $topicId, posts: $posts, postPointer: $postPointer) { + ${POST_FRAGMENT} + query GetTopicDetail( + $topicId: Int! + $postIds: [Int!] + $postNumber: Int + $includeFirstPost: Boolean + ) { + topicDetail( + topicId: $topicId + postIds: $postIds + postNumber: $postNumber + includeFirstPost: $includeFirstPost + ) { id title views @@ -39,29 +107,12 @@ export const GET_TOPIC_DETAIL = gql` createdAt postStream { posts { - id - topicId - username - actionCode - actionCodeWho - avatar: avatarTemplate - raw - hidden - canEdit - listOfCooked - listOfMention - createdAt - replyCount - actionsSummary { - id - count - acted - __typename @skip(if: true) - } - postNumber - replyToPostNumber + ...PostFragment } stream + firstPost { + ...PostFragment + } } details { canEdit @@ -97,3 +148,12 @@ export const EDIT_POST = gql` } } `; + +export const REPLIED_POST = gql` + ${POST_FRAGMENT} + query repliedPost($postId: Int!, $replyToPostId: Int) { + replyingTo(postId: $postId, replyToPostId: $replyToPostId) { + ...PostFragment + } + } +`; diff --git a/frontend/src/graphql/server/health.ts b/frontend/src/graphql/server/health.ts new file mode 100644 index 00000000..4f2be472 --- /dev/null +++ b/frontend/src/graphql/server/health.ts @@ -0,0 +1,11 @@ +import { gql } from '@apollo/client'; + +export const ABOUT = gql` + query Health { + health { + isDiscourseReachable + discourseHost + discourseError + } + } +`; diff --git a/frontend/src/graphql/server/likePost.ts b/frontend/src/graphql/server/likePost.ts index 06f0e965..abeb98f5 100644 --- a/frontend/src/graphql/server/likePost.ts +++ b/frontend/src/graphql/server/likePost.ts @@ -1,12 +1,41 @@ import { gql } from '@apollo/client'; -export const likePost = gql` - mutation LikePost($postId: Int!, $unlike: Boolean, $postList: Boolean) { - likePost(postId: $postId, unlike: $unlike, postList: $postList) { - actionsSummary { - id - acted - count +export const POST_LIKE_FRAGMENT = gql` + fragment PostLikeFragment on Post { + id + topicId + postNumber + actionsSummary { + id + count + acted + __typename @skip(if: true) + } + } +`; + +export const TOPIC_LIKE_FRAGMENT = gql` + fragment TopicLikeFragment on Topic { + id + liked + likeCount + } +`; + +export const LIKE_TOPIC_OR_POST = gql` + ${POST_LIKE_FRAGMENT} + mutation likeTopicOrPost($postId: Int, $topicId: Int, $unlike: Boolean) { + likeTopicOrPost(postId: $postId, unlike: $unlike, topicId: $topicId) { + ... on LikedTopic { + __typename + topicId + liked + likeCount + postId + } + ... on Post { + __typename + ...PostLikeFragment } } } diff --git a/frontend/src/graphql/server/message.ts b/frontend/src/graphql/server/message.ts index b0e2d696..6fc17973 100644 --- a/frontend/src/graphql/server/message.ts +++ b/frontend/src/graphql/server/message.ts @@ -60,3 +60,41 @@ export const NEW_PRIVATE_MESSAGE = gql` } } `; + +export const GET_MESSAGE_DETAIL = gql` + query GetMessageDetail($topicId: Int!, $postIds: [Int!], $postNumber: Int) { + privateMessageDetail( + topicId: $topicId + postIds: $postIds + postNumber: $postNumber + ) { + id + title + postStream { + posts { + id + username + actionCode + actionCodeWho + markdownContent + mentions + createdAt + postNumber + } + stream + } + details { + allowedUsers { + id + username + avatarTemplate + } + participants { + id + username + avatar: avatarTemplate + } + } + } + } +`; diff --git a/frontend/src/graphql/server/notification.ts b/frontend/src/graphql/server/notification.ts index d1e6c717..49fa4c0e 100644 --- a/frontend/src/graphql/server/notification.ts +++ b/frontend/src/graphql/server/notification.ts @@ -57,3 +57,19 @@ export const MARK_READ = gql` markRead(notificationId: $notificationId) } `; + +export const PUSH_NOTIF = gql` + mutation PushNotifications( + $PushNotificationsToken: String! + $applicationName: String! + $platform: String! + $experienceId: String! + ) { + pushNotifications( + PushNotificationsToken: $PushNotificationsToken + applicationName: $applicationName + platform: $platform + experienceId: $experienceId + ) + } +`; diff --git a/frontend/src/graphql/server/postRaw.ts b/frontend/src/graphql/server/postRaw.ts index 6d9c48af..d014f386 100644 --- a/frontend/src/graphql/server/postRaw.ts +++ b/frontend/src/graphql/server/postRaw.ts @@ -3,9 +3,8 @@ import { gql } from '@apollo/client'; export const POST_RAW = gql` query PostRaw($postId: Int!) { postRaw(postId: $postId) { - raw - listOfCooked - listOfMention + markdownContent + mentions } } `; diff --git a/frontend/src/graphql/server/reply.ts b/frontend/src/graphql/server/reply.ts index 786ef4ca..3dcd9568 100644 --- a/frontend/src/graphql/server/reply.ts +++ b/frontend/src/graphql/server/reply.ts @@ -3,7 +3,7 @@ import { gql } from '@apollo/client'; export const REPLY = gql` mutation Reply( $replyInput: ReplyInput! - $file: Upload + $file: File $type: UploadTypeEnum $userId: Int ) { @@ -12,6 +12,26 @@ export const REPLY = gql` userId createdAt raw + postNumber + } + } +`; + +export const REPLY_TOPIC = gql` + mutation ReplyTopic( + $content: String! + $topicId: Int! + $replyToPostNumber: Int + ) { + reply( + replyInput: { + raw: $content + topicId: $topicId + replyToPostNumber: $replyToPostNumber + } + ) { + commentId: id + postNumber } } `; diff --git a/frontend/src/graphql/server/search.ts b/frontend/src/graphql/server/search.ts index fd0b847c..5a9cb654 100644 --- a/frontend/src/graphql/server/search.ts +++ b/frontend/src/graphql/server/search.ts @@ -1,30 +1,44 @@ import { gql } from '@apollo/client'; +export const SEARCH_POST_FRAGMENT = gql` + fragment SearchPostFragment on SearchPost { + id + avatarTemplate + blurb + createdAt + username + likeCount + postNumber + topicId + } +`; + +export const SEARCH_TOPIC_FRAGMENT = gql` + fragment SearchTopicFragment on SearchTopic { + id + title + postsCount + replyCount + createdAt + archetype + excerpt + visible + liked + tags + categoryId + } +`; + export const SEARCH = gql` + ${SEARCH_POST_FRAGMENT} + ${SEARCH_TOPIC_FRAGMENT} query Search($search: String!, $page: Int!, $order: String) { search(search: $search, page: $page, order: $order) { posts { - id - avatarTemplate - blurb - createdAt - username - likeCount - postNumber - topicId + ...SearchPostFragment } topics { - id - title - postsCount - replyCount - createdAt - archetype - excerpt - visible - liked - tags - categoryId + ...SearchTopicFragment } } } diff --git a/frontend/src/graphql/server/site.ts b/frontend/src/graphql/server/site.ts index ff640e83..c1bfa0b4 100644 --- a/frontend/src/graphql/server/site.ts +++ b/frontend/src/graphql/server/site.ts @@ -16,6 +16,8 @@ export const SITE = gql` minUsernameLength minPasswordLength fullNameRequired + allowUncategorizedTopics + defaultComposerCategory topicFlagTypes { description id diff --git a/frontend/src/graphql/server/topics.ts b/frontend/src/graphql/server/topics.ts index efa0d040..a53e745f 100644 --- a/frontend/src/graphql/server/topics.ts +++ b/frontend/src/graphql/server/topics.ts @@ -7,6 +7,7 @@ export const TOPICS = gql` $topPeriod: TopPeriodEnum $tag: String $categoryId: Int + $username: String ) { topics( sort: $sort @@ -14,6 +15,7 @@ export const TOPICS = gql` topPeriod: $topPeriod tag: $tag categoryId: $categoryId + username: $username ) { users { id @@ -47,10 +49,11 @@ export const TOPICS = gql` user { id username + name + avatar: avatarTemplate } } authorUserId - frequentPosterUserId pinned } } @@ -58,20 +61,6 @@ export const TOPICS = gql` } `; -export const REPLY_TOPIC = gql` - mutation ReplyTopic($raw: String!, $topicId: Int!, $replyToPostNumber: Int) { - reply( - replyInput: { - raw: $raw - topicId: $topicId - replyToPostNumber: $replyToPostNumber - } - ) { - commentId: id - } - } -`; - export const LOOKUP_URLS = gql` query LookupUrls($shortUrls: [String!]!) { lookupUrls(shortUrls: $shortUrls) { diff --git a/frontend/src/graphql/server/upload.ts b/frontend/src/graphql/server/upload.ts index a20bac87..998fc8ec 100644 --- a/frontend/src/graphql/server/upload.ts +++ b/frontend/src/graphql/server/upload.ts @@ -4,7 +4,7 @@ export const UPLOAD = gql` mutation Upload( $type: UploadTypeEnum! $userId: Int - $file: Upload! + $file: File! $token: Int ) { upload(file: $file, type: $type, userId: $userId, token: $token) { diff --git a/frontend/src/graphql/server/userActivity.ts b/frontend/src/graphql/server/userActivity.ts index 32d5e887..f56a15c4 100644 --- a/frontend/src/graphql/server/userActivity.ts +++ b/frontend/src/graphql/server/userActivity.ts @@ -1,18 +1,26 @@ import { gql } from '@apollo/client'; +export const USER_ACTIONS_FRAGMENT = gql` + fragment UserActionFragment on UserActions { + actionType + avatarTemplate + categoryId + createdAt + excerpt + postId + postNumber + title + topicId + username + hidden + } +`; + export const USER_ACTIVITY = gql` + ${USER_ACTIONS_FRAGMENT} query UserActivity($username: String!, $offset: Int!, $filter: String) { userActivity(username: $username, offset: $offset, filter: $filter) { - actionType - avatarTemplate - categoryId - createdAt - excerpt - postId - postNumber - title - topicId - username + ...UserActionFragment } } `; diff --git a/frontend/src/helpers/PrivateTopicAlert.ts b/frontend/src/helpers/PrivateTopicAlert.ts new file mode 100644 index 00000000..37490fde --- /dev/null +++ b/frontend/src/helpers/PrivateTopicAlert.ts @@ -0,0 +1,21 @@ +import { Alert } from 'react-native'; + +import { ERROR_PRIVATE_POST, ERROR_MESSAGE_INVALID_ACCESS } from '../constants'; + +export function privateTopicAlert() { + Alert.alert( + ERROR_PRIVATE_POST.title, + ERROR_PRIVATE_POST.content, + [{ text: t('Got It') }], + { cancelable: false }, + ); +} + +export function messageInvalidAccessAlert() { + Alert.alert( + ERROR_MESSAGE_INVALID_ACCESS.title, + ERROR_MESSAGE_INVALID_ACCESS.content, + [{ text: t('Got It') }], + { cancelable: false }, + ); +} diff --git a/frontend/src/helpers/PushNotificationsSetupFailAlert.ts b/frontend/src/helpers/PushNotificationsSetupFailAlert.ts new file mode 100644 index 00000000..832eb7d5 --- /dev/null +++ b/frontend/src/helpers/PushNotificationsSetupFailAlert.ts @@ -0,0 +1,12 @@ +import { Alert } from 'react-native'; + +import { ERROR_SETUP_PUSH_NOTIFICATIONS } from '../constants'; + +export function pushNotificationsSetupFailAlert() { + Alert.alert( + ERROR_SETUP_PUSH_NOTIFICATIONS.title, + ERROR_SETUP_PUSH_NOTIFICATIONS.content, + [{ text: t('Got It') }], + { cancelable: false }, + ); +} diff --git a/frontend/src/helpers/__tests__/checkImageFile.test.ts b/frontend/src/helpers/__tests__/checkImageFile.test.ts new file mode 100644 index 00000000..6c1b0d32 --- /dev/null +++ b/frontend/src/helpers/__tests__/checkImageFile.test.ts @@ -0,0 +1,13 @@ +import { isImageValidUrl } from '../checkImageFile'; + +it('should check is image uri or not', () => { + const url1 = 'https://google.com'; + const url2 = 'https://upload/x/imahe.png'; + const url3 = 'video.webm'; + + expect(isImageValidUrl(url1)).toBeFalsy(); + + expect(isImageValidUrl(url2)).toBeTruthy(); + + expect(isImageValidUrl(url3)).toBeFalsy(); +}); diff --git a/frontend/src/helpers/__tests__/deleteQuoteBbCode.test.ts b/frontend/src/helpers/__tests__/deleteQuoteBbCode.test.ts new file mode 100644 index 00000000..d50be0cf --- /dev/null +++ b/frontend/src/helpers/__tests__/deleteQuoteBbCode.test.ts @@ -0,0 +1,63 @@ +import { deleteQuoteBbCode } from '../deleteQuoteBbCode'; + +jest.mock('expo-linking'); + +describe('delete quote bb code', () => { + it('should return string without quote bb code', () => { + expect( + deleteQuoteBbCode(`[quote="Tristan, post:18, topic:240335, username:Tris20"] +has there been any investigation into synching this with outlook or ms teams? +asdasdasdasd +[/quote] + +The idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.`), + ).toEqual( + "\nThe idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.", + ); + }); + + it('should return string without multiple quote bb code', () => { + expect( + deleteQuoteBbCode(`[quote="Tristan, post:18, topic:240335, username:Tris20"] +has there been any investigation into synching this with outlook or ms teams? +asdasdasdasd +[/quote] + +[quote] +has there been any investigation into synching this with outlook or ms teams? +asdasdasdasd +[/quote] + +The idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.`), + ).toEqual( + "\n\nThe idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.", + ); + }); + + it('should return string without multiple quote bb code', () => { + expect( + deleteQuoteBbCode(`[quote="Tristan, post:18, topic:240335, username:Tris20"] +[quote="Tris20"] +[quote] +nested quote 1 +[/quote] +nested quote 2 +[/quote] +nested quote 3 +[/quote] +some comment`), + ).toEqual('some comment'); + }); + + it('should returns the same string if there are no quotes', () => { + expect( + deleteQuoteBbCode(`There's no quote here - line 1 +There's no quote here - line 2 + +There's no quote here - line 3`), + ).toEqual(`There's no quote here - line 1 +There's no quote here - line 2 + +There's no quote here - line 3`); + }); +}); diff --git a/frontend/src/helpers/__tests__/emojiHandler.test.ts b/frontend/src/helpers/__tests__/emojiHandler.test.ts new file mode 100644 index 00000000..e5c2250d --- /dev/null +++ b/frontend/src/helpers/__tests__/emojiHandler.test.ts @@ -0,0 +1,18 @@ +import { isEmojiImage } from '../emojiHandler'; + +describe('check is this image emoji', () => { + test('isEmojiImage should return true for valid emoji image names', () => { + expect(isEmojiImage('emoji-:smile:')).toBe(true); + expect(isEmojiImage('emoji-:heart:')).toBe(true); + expect(isEmojiImage('emoji-:thumbs_up:')).toBe(true); + expect(isEmojiImage('emoji-:thumbs_up:t5:')).toBe(true); + }); + + test('isEmojiImage should return false for invalid emoji image names', () => { + expect(isEmojiImage('emoji-:smile')).toBe(false); + expect(isEmojiImage('emoji-:happy:face:')).toBe(false); + expect(isEmojiImage('emoji-:')).toBe(false); + expect(isEmojiImage('emoji-::')).toBe(false); + expect(isEmojiImage('emoji-:smile:happy:')).toBe(false); + }); +}); diff --git a/frontend/src/helpers/__tests__/existingPostIsValid.test.ts b/frontend/src/helpers/__tests__/existingPostIsValid.test.ts index ccf1210d..76ddad4e 100644 --- a/frontend/src/helpers/__tests__/existingPostIsValid.test.ts +++ b/frontend/src/helpers/__tests__/existingPostIsValid.test.ts @@ -25,7 +25,7 @@ it('should be false if there is no title', () => { tags, oldTags, ); - expect(postIsValid).toEqual(false); + expect(postIsValid).toMatchObject({ isValid: false }); }); it('should be false if there is no content', () => { @@ -41,7 +41,7 @@ it('should be false if there is no content', () => { tags, oldTags, ); - expect(postIsValid).toEqual(false); + expect(postIsValid).toMatchObject({ isValid: false }); }); it('should be false when uploading an image', () => { @@ -60,7 +60,7 @@ it('should be false when uploading an image', () => { tags, oldTags, ); - expect(postIsValid).toEqual(false); + expect(postIsValid).toMatchObject({ isValid: false }); }); it('should be false if nothing changes', () => { @@ -75,7 +75,7 @@ it('should be false if nothing changes', () => { oldTags, oldTags, ); - expect(postIsValid).toEqual(false); + expect(postIsValid).toMatchObject({ isValid: false }); }); it('should be true if the title changes', () => { @@ -90,7 +90,7 @@ it('should be true if the title changes', () => { oldTags, oldTags, ); - expect(postIsValid).toEqual(true); + expect(postIsValid).toMatchObject({ isValid: true }); }); it('should be true if the content changes', () => { @@ -105,7 +105,7 @@ it('should be true if the content changes', () => { oldTags, oldTags, ); - expect(postIsValid).toEqual(true); + expect(postIsValid).toMatchObject({ isValid: true }); }); it('should be true if the channel changes', () => { @@ -120,7 +120,7 @@ it('should be true if the channel changes', () => { oldTags, oldTags, ); - expect(postIsValid).toEqual(true); + expect(postIsValid).toMatchObject({ isValid: true }); }); it('should be true if tags change', () => { @@ -135,7 +135,7 @@ it('should be true if tags change', () => { tags, oldTags, ); - expect(postIsValid).toEqual(true); + expect(postIsValid).toMatchObject({ isValid: true }); }); it('should be true if all data changes', () => { @@ -150,5 +150,5 @@ it('should be true if all data changes', () => { tags, oldTags, ); - expect(postIsValid).toEqual(true); + expect(postIsValid).toMatchObject({ isValid: true }); }); diff --git a/frontend/src/helpers/__tests__/experienceId.test.ts b/frontend/src/helpers/__tests__/experienceId.test.ts new file mode 100644 index 00000000..c94618f6 --- /dev/null +++ b/frontend/src/helpers/__tests__/experienceId.test.ts @@ -0,0 +1,13 @@ +import { isValidExperienceId } from '../experienceId'; + +it('should valid experience id', () => { + expect(isValidExperienceId('@kfox/')).toBeTruthy(); + expect(isValidExperienceId('@username/lexicon-project')).toBeTruthy(); + expect(isValidExperienceId('@anonymous/')).toBeTruthy(); +}); + +it('should invalid experience id', () => { + expect(isValidExperienceId('kfox/')).toBeFalsy(); + expect(isValidExperienceId('@kfox/')).toBeFalsy(); + expect(isValidExperienceId('@kfox/KF.Lounge')).toBeFalsy(); +}); diff --git a/frontend/src/helpers/__tests__/extractAttributes.test.ts b/frontend/src/helpers/__tests__/extractAttributes.test.ts new file mode 100644 index 00000000..6476ddd2 --- /dev/null +++ b/frontend/src/helpers/__tests__/extractAttributes.test.ts @@ -0,0 +1,33 @@ +import { extractAttributes } from '../extractAttributes'; + +describe('return empty object if empty string is passed', () => { + it('should return empty object if empty string is passed', () => { + expect(extractAttributes('')).toEqual({}); + }); +}); + +describe('return empty object if there is no attribute', () => { + it('should return empty object if there is no attribute', () => { + expect( + extractAttributes('no, attributes, will, return, an, empty, object'), + ).toEqual({}); + }); +}); + +describe('return attribute in object if there is attributes', () => { + it('should return attribute in object if there is attributes', () => { + expect( + extractAttributes( + 'one:1,two:2, space-after-comma:ok, space-before-comma:ok ,two-colons::skipped,::empty-key,overwritten-attribute:original,overwritten-attribute:latest', + ), + ).toEqual({ + one: '1', + two: '2', + 'space-after-comma': 'ok', + 'space-before-comma': 'ok', + 'two-colons': '', + '': '', + 'overwritten-attribute': 'latest', + }); + }); +}); diff --git a/frontend/src/helpers/__tests__/getUserImage.test.ts b/frontend/src/helpers/__tests__/getUserImage.test.ts index 5094745e..5b39b447 100644 --- a/frontend/src/helpers/__tests__/getUserImage.test.ts +++ b/frontend/src/helpers/__tests__/getUserImage.test.ts @@ -1,5 +1,7 @@ import { getImage } from '../getUserImage'; +jest.mock('expo-linking'); + it('should replace the size', () => { const url = `www.example.com/user_avatar/wiki.kfox.io/miichael/{size}/15_2.png`; diff --git a/frontend/src/helpers/__tests__/linking.test.ts b/frontend/src/helpers/__tests__/linking.test.ts new file mode 100644 index 00000000..153c00ac --- /dev/null +++ b/frontend/src/helpers/__tests__/linking.test.ts @@ -0,0 +1,45 @@ +import { + getValidDetailParams, + extractPathname, + isRouteBesidePost, +} from '../linking'; + +jest.mock('expo-linking'); + +it('should extract post ID and number and convert it to number', () => { + const detailParams = getValidDetailParams(['t', 'slug', '12', '15']); + expect(detailParams?.topicId).toBe(12); + expect(detailParams?.postNumber).toBe(15); + + expect(getValidDetailParams(['t', 'slug', 'a', '12'])).toBeFalsy(); + + expect(getValidDetailParams(['t', 'slug', '12', 'post'])?.postNumber).toBe(1); + + expect(getValidDetailParams([])).toBeFalsy(); +}); + +it('should extract pathname from URL and check the format', () => { + const url1 = 'https://test.com'; + const url2 = 'https://test.com/12/15'; + const url3 = 'https://test.com/t/12/15'; + const url4 = 'https://test.com/t/test/12/15'; + const url5 = 'https://test.com/c/general/4'; + + expect(extractPathname(url1)).toBeFalsy(); + + expect(extractPathname(url2)).toBeFalsy(); + + expect(extractPathname(url3)).toBeFalsy(); + + expect(extractPathname(url4)).toBe('t/test/12/15'); + + expect(extractPathname(url5)).toBeFalsy(); +}); + +it('should check is route post detail or not', () => { + expect(isRouteBesidePost('post-detail')).toBeFalsy(); + + expect(isRouteBesidePost('message-detail')).toBeTruthy(); + + expect(isRouteBesidePost('random-detail')).toBeTruthy(); +}); diff --git a/frontend/src/helpers/__tests__/paginationHandler.test.ts b/frontend/src/helpers/__tests__/paginationHandler.test.ts new file mode 100644 index 00000000..7c62919b --- /dev/null +++ b/frontend/src/helpers/__tests__/paginationHandler.test.ts @@ -0,0 +1,108 @@ +import { ERROR_PAGINATION } from '../../constants'; +import { getLatestApolloId, mergeReferenceData } from '../paginationHandler'; + +it('should be latest get post Id from apollo cache merge', () => { + const listPosts = [ + { __ref: 'Post:598854' }, + { __ref: 'Post:612147' }, + { __ref: 'Post:620179' }, + { __ref: 'Post:620200' }, + { __ref: 'Post:647845' }, + { __ref: 'Post:651859' }, + { __ref: 'Post:675239' }, + { __ref: 'Post:675375' }, + { __ref: 'Post:682963' }, + { __ref: 'Post:700793' }, + ]; + + const IncorrectFormatListPosts = [ + { __ref: 'Post133332' }, + { __ref: 'Post612147' }, + { __ref: 'Post620179' }, + { __ref: 'Post620200' }, + { __ref: 'Post647845' }, + { __ref: 'Post651859' }, + { __ref: 'Post675239' }, + { __ref: 'Post675375' }, + { __ref: 'Post682963' }, + { __ref: 'Post700793' }, + ]; + + expect(getLatestApolloId(listPosts)).toBe(700793); + + expect(getLatestApolloId(IncorrectFormatListPosts)).toBe(undefined); +}); + +describe('mergeReferenceData', () => { + it('should append incoming data if last existing post ID is less than last incoming post ID', () => { + const existing = [{ __ref: 'Post:1' }, { __ref: 'Post:2' }]; + const incoming = [{ __ref: 'Post:3' }, { __ref: 'Post:4' }]; + const lastExisting = 2; + const lastIncoming = 4; + + const merged = mergeReferenceData({ + existing, + incoming, + lastExisting, + lastIncoming, + }); + + expect(merged).toEqual([...existing, ...incoming]); + }); + + it('should prepend incoming data if last existing post ID is greater than last incoming post ID', () => { + const existing = [{ __ref: 'Post:3' }, { __ref: 'Post:4' }]; + const incoming = [{ __ref: 'Post:1' }, { __ref: 'Post:2' }]; + const lastExisting = 4; + const lastIncoming = 2; + + const merged = mergeReferenceData({ + existing, + incoming, + lastExisting, + lastIncoming, + }); + + expect(merged).toEqual([...incoming, ...existing]); + }); + it('should show alert when compare string id', () => { + const existing = [{ __ref: 'Post:A1' }, { __ref: 'Post:A2' }]; + const incoming = [{ __ref: 'Post:A3' }, { __ref: 'Post:A4' }]; + const lastExisting = undefined; + const lastIncoming = undefined; + const mockAlert = jest.fn(); + + mergeReferenceData({ + existing, + incoming, + lastExisting, + lastIncoming, + mockAlert, + }); + expect(mockAlert).toBeCalled(); + expect(mockAlert).toBeCalledWith(ERROR_PAGINATION); + }); + + it('should show alert when compare cuid', () => { + const existing = [ + { __ref: 'Post:cl9s74pg500051iqsvqmqrbzu' }, + { __ref: 'Post:clhfy59y8000008md9bfe32vh' }, + ]; + const incoming = [ + { __ref: 'Post:clhfzwvoy000008lfcdvf1utb' }, + { __ref: 'Post:clhfzx0wr000108lffymmbsi0' }, + ]; + const lastExisting = undefined; + const lastIncoming = undefined; + const mockAlert = jest.fn(); + mergeReferenceData({ + existing, + incoming, + lastExisting, + lastIncoming, + mockAlert, + }); + expect(mockAlert).toBeCalled(); + expect(mockAlert).toBeCalledWith(ERROR_PAGINATION); + }); +}); diff --git a/frontend/src/helpers/__tests__/postDetailContentHandler.test.ts b/frontend/src/helpers/__tests__/postDetailContentHandler.test.ts index 966a64e9..35e688d1 100644 --- a/frontend/src/helpers/__tests__/postDetailContentHandler.test.ts +++ b/frontend/src/helpers/__tests__/postDetailContentHandler.test.ts @@ -3,6 +3,8 @@ import { ActionsSummaryHandler, } from '../postDetailContentHandler'; +jest.mock('expo-linking'); + describe('actions summary handler', () => { let actionsSummary: Array; it('should return default when param is null', () => { diff --git a/frontend/src/helpers/__tests__/processRawContent.test.ts b/frontend/src/helpers/__tests__/processRawContent.test.ts index 7e044dfc..419beea2 100644 --- a/frontend/src/helpers/__tests__/processRawContent.test.ts +++ b/frontend/src/helpers/__tests__/processRawContent.test.ts @@ -1,10 +1,13 @@ import { NO_EXCERPT_WORDING } from '../../constants'; import { anchorToMarkdown, + generateMarkdownContent, getPostShortUrl, sortImageUrl, } from '../processRawContent'; +jest.mock('expo-linking'); + describe('getPostShortUrl return short urls from raw content', () => { it('should return short url from image markdown', () => { expect( @@ -98,3 +101,55 @@ describe('anchorToMarkdown change anchor tag to markdown', () => { }); }); }); + +describe('generateMarkdownContent returns markdown content with complete urls', () => { + const rawContent = 'Hello Lexicon! ![image](upload://shortUrl.com)'; + const resultRawContent = 'Hello Lexicon! ![image](1)'; + const shortImageUrl = '![image](upload://shortUrl.com)'; + const defaultImageUrl = '![image](1)'; + const imageUrls = ['https://wiki.kfox.io/example.png']; + const markdownContent = + 'Hello Lexicon! ![image](https://wiki.kfox.io/example.png)'; + + it('should return raw content when image urls are empty', () => { + expect(generateMarkdownContent(rawContent, [])).toBe(resultRawContent); + }); + it('should return raw content when there are no short urls in raw content', () => { + const rawContentWithNoImage = 'Hello Lexicon!'; + expect(generateMarkdownContent(rawContentWithNoImage, imageUrls)).toBe( + rawContentWithNoImage, + ); + }); + + it('should return raw content with short urls and complete urls when the total number of short urls is more than the complete image urls', () => { + expect( + generateMarkdownContent(`${rawContent} ${shortImageUrl}`, imageUrls), + ).toBe(`${markdownContent} ${defaultImageUrl}`); + }); + it('should return raw content with no short url when the total number of short urls is less than the complete image urls', () => { + expect( + generateMarkdownContent(rawContent, [...imageUrls, ...imageUrls]), + ).toBe(markdownContent); + }); + + it('should return raw content with no short url when the total number of short urls is the same as the complete image urls', () => { + expect(generateMarkdownContent(rawContent, imageUrls)).toBe( + markdownContent, + ); + }); + it('should only replace short urls and return raw content with complete urls when there are short and complete urls in raw data', () => { + const completeImageUrl = + '![second image](https://wiki.kfox.io/secondExample.png)'; + const secondCompleteUrlInMarkdown = + '![image](https://wiki.kfox.io/example3.png)'; + + expect( + generateMarkdownContent( + `${rawContent} ${completeImageUrl} ${shortImageUrl}`, + [...imageUrls, 'https://wiki.kfox.io/example3.png'], + ), + ).toBe( + `${markdownContent} ${completeImageUrl} ${secondCompleteUrlInMarkdown}`, + ); + }); +}); diff --git a/frontend/src/helpers/__tests__/replaceQuotesWithMarkdown.test.ts b/frontend/src/helpers/__tests__/replaceQuotesWithMarkdown.test.ts new file mode 100644 index 00000000..6d6e761e --- /dev/null +++ b/frontend/src/helpers/__tests__/replaceQuotesWithMarkdown.test.ts @@ -0,0 +1,122 @@ +import { replaceQuotesWithMarkdown } from '../replaceQuotesWithMarkdown'; + +jest.mock('expo-linking'); + +describe('replace quote bb code with blockquote markdown', () => { + it('should replace quote bb code in string with blockquote markdown', () => { + expect( + replaceQuotesWithMarkdown(`[quote="Tristan, post:18, topic:240335, username:Tris20"] +has there been any investigation into synching this with outlook or ms teams? +asdasdasdasd +[/quote] + +The idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.`), + ).toEqual( + `> @Tris20 +> has there been any investigation into synching this with outlook or ms teams? +> asdasdasdasd + + +The idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.`, + ); + }); + + it('should replace multiple quote bb code in string with blockquote markdown', () => { + expect( + replaceQuotesWithMarkdown(`[quote="Tristan, post:18, topic:240335, username:Tris20"] +has there been any investigation into synching this with outlook or ms teams? +asdasdasdasd +[/quote] + +[quote="post:18, topic:240335"] +has there been any investigation into synching this with outlook or ms teams? +asdasdasdasd +[/quote] + +[quote] +has there been any investigation into synching this with outlook or ms teams? +asdasdasdasd +[/quote] + +The idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.`), + ).toEqual( + `> @Tris20 +> has there been any investigation into synching this with outlook or ms teams? +> asdasdasdasd + + +> (unknown user) +> has there been any investigation into synching this with outlook or ms teams? +> asdasdasdasd + + +> has there been any investigation into synching this with outlook or ms teams? +> asdasdasdasd + + +The idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.`, + ); + }); + + it('should replace quote bb code without attribute in string with blockquote markdown', () => { + expect( + replaceQuotesWithMarkdown(`[quote] +has there been any investigation into synching this with outlook or ms teams? +asdasdasdasd +[/quote] + +[quote="Tristan, post:18, topic:240335, username:Tris20"] +has there been any investigation into synching this with outlook or ms teams? +asdasdasdasd +[/quote] + +The idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.`), + ).toEqual( + `> has there been any investigation into synching this with outlook or ms teams? +> asdasdasdasd + + +> @Tris20 +> has there been any investigation into synching this with outlook or ms teams? +> asdasdasdasd + + +The idea of integrating it with calendars has come up. We haven't really done much investigation, but expect there may be some complexity around authentication.`, + ); + }); + + it('should replace nested quote bb code', () => { + expect( + replaceQuotesWithMarkdown(`[quote="Tristan, post:18, topic:240335, username:Tris20"] +[quote="Tris20"] +[quote] +nested quote 1 +[/quote] +nested quote 2 +[/quote] +nested quote 3 +[/quote] +some comment`), + ).toEqual(`> @Tris20 +> > @Tris20 +> > > nested quote 1 +> > +> > nested quote 2 +> +> nested quote 3 + +some comment`); + }); + + it('should returns the same string if there are no quotes', () => { + expect( + replaceQuotesWithMarkdown(`There's no quote here - line 1 +There's no quote here - line 2 + +There's no quote here - line 3`), + ).toEqual(`There's no quote here - line 1 +There's no quote here - line 2 + +There's no quote here - line 3`); + }); +}); diff --git a/frontend/src/helpers/__tests__/updateLike.test.ts b/frontend/src/helpers/__tests__/updateLike.test.ts new file mode 100644 index 00000000..a2e2fc39 --- /dev/null +++ b/frontend/src/helpers/__tests__/updateLike.test.ts @@ -0,0 +1,127 @@ +import { + getUpdatedLikeCount, + getUpdatedSummaryOnToggleLike, + firstLikeActivitySummary, + PostActionsSummary, +} from '../updateLike'; +import { ActionsSummaryType } from '../postDetailContentHandler'; + +jest.mock('expo-linking'); + +describe('Get updated like props', () => { + it('should return the value of previousCount -1 when liked value is false', () => { + const previousCount = 2; + expect(getUpdatedLikeCount({ liked: false, previousCount })).toEqual( + previousCount - 1, + ); + }); + it('should return the value of previousCount +1 when liked value is true', () => { + const previousCount = 2; + expect(getUpdatedLikeCount({ liked: true, previousCount })).toEqual( + previousCount + 1, + ); + }); + it('should return 0 when liked value is false and previous count is less than 1', () => { + expect(getUpdatedLikeCount({ liked: false, previousCount: 0 })).toEqual(0); + expect(getUpdatedLikeCount({ liked: false, previousCount: -9 })).toEqual(0); + }); +}); + +describe('Get updated summary on toggle like', () => { + it('should only return firstLikeActivity when action summary is not found', () => { + const previousCount = 10; + const expectedActionsSummary = [firstLikeActivitySummary]; + expect( + getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: null, + liked: true, + previousCount, + }), + ).toEqual(expectedActionsSummary); + expect( + getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: null, + liked: false, + }), + ).toEqual(expectedActionsSummary); + }); + + it('should only return existing activity with firstLikeActivity when like action is not found', () => { + const mockedActionsSummary: PostActionsSummary = [ + { + __typename: 'ActionSummary', + id: ActionsSummaryType.Bookmark, + acted: true, + }, + ]; + const expectedActionsSummary = [ + ...mockedActionsSummary, + firstLikeActivitySummary, + ]; + expect( + getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: mockedActionsSummary, + liked: true, + }), + ).toEqual(expectedActionsSummary); + + expect( + getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: mockedActionsSummary, + liked: false, + }), + ).toEqual(expectedActionsSummary); + }); + + describe('should return existing activity with modified like activity when like action is found', () => { + const count = 5; + const previousCount = 10; + + const mockedActionsSummary: PostActionsSummary = [ + { ...firstLikeActivitySummary, count }, + ]; + + const likeAction = { ...firstLikeActivitySummary, acted: true, count }; + const unlikeAction = { ...firstLikeActivitySummary, acted: false, count }; + + it('should calculate likeCount based on previousCount params when previousCount is defined', () => { + const likeActionResult = { ...likeAction, count: previousCount + 1 }; + const unlikeActionResult = { ...unlikeAction, count: previousCount - 1 }; + + expect( + getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: mockedActionsSummary, + liked: true, + previousCount, + }), + ).toEqual([likeActionResult]); + + expect( + getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: mockedActionsSummary, + liked: false, + previousCount, + }), + ).toEqual([unlikeActionResult]); + }); + + it('should calculate likeCount based on count prop in Actions Summary when previousCount is undefined', () => { + const likeActionResult = { ...likeAction, count: count + 1 }; + const unlikeActionResult = { ...unlikeAction, count: count - 1 }; + + expect( + getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: mockedActionsSummary, + liked: true, + }), + ).toEqual([likeActionResult]); + + expect( + getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: mockedActionsSummary, + liked: false, + }), + ).toEqual([unlikeActionResult]); + }); + }); +}); diff --git a/frontend/src/helpers/bottomMenu.ts b/frontend/src/helpers/bottomMenu.ts index 0b846657..b054c07c 100644 --- a/frontend/src/helpers/bottomMenu.ts +++ b/frontend/src/helpers/bottomMenu.ts @@ -1,23 +1,36 @@ -import { Post, RootStackParamList, User } from '../types'; +import { RootStackParamList, User } from '../types'; import { errorHandlerAlert } from './errorHandler'; import { imagePickerHandler } from './imagePickerHandler'; -export function bottomMenu( - isKeyboardShow: boolean, - user: User | null, +type BottomMenuParams = { + isKeyboardShow: boolean; + user: User | null; navigate: ( screen: 'PostImagePreview' | 'HyperLink', params: | RootStackParamList['PostImagePreview'] | RootStackParamList['HyperLink'], - ) => void, - prevScreen: 'NewPost' | 'PostReply' | 'NewMessage', - extensions?: Array, - title?: string, - topicId?: number, - post?: Post, -) { + ) => void; + prevScreen: 'NewPost' | 'PostReply' | 'NewMessage'; + extensions?: Array; + title?: string; + topicId?: number; + postId?: number; + replyToPostId?: number; +}; + +export function bottomMenu(params: BottomMenuParams) { + let { + isKeyboardShow, + user, + navigate, + prevScreen, + extensions, + title, + topicId, + replyToPostId, + } = params; const onInsertImage = async () => { if (!isKeyboardShow) { return; @@ -31,6 +44,7 @@ export function bottomMenu( navigate('PostImagePreview', { imageUri, prevScreen, + title, }); } catch (unknownError) { // TODO: Eventually fix this so the type can resolve to ApolloError as well @@ -43,7 +57,12 @@ export function bottomMenu( if (!isKeyboardShow) { return; } - navigate('HyperLink', { title, id: topicId, post, prevScreen }); + navigate('HyperLink', { + title, + id: topicId, + replyToPostId, + prevScreen, + }); }; return { onInsertImage, onInsertLink }; diff --git a/frontend/src/helpers/checkImageFile.ts b/frontend/src/helpers/checkImageFile.ts new file mode 100644 index 00000000..a234dce2 --- /dev/null +++ b/frontend/src/helpers/checkImageFile.ts @@ -0,0 +1,4 @@ +export function isImageValidUrl(imageUri: string) { + let imageRegex = /([^\s]+(\.(jpe?g|png|gif|heic|heif))$)/g; + return imageRegex.test(imageUri); +} diff --git a/frontend/src/helpers/clampWorklet.ts b/frontend/src/helpers/clampWorklet.ts new file mode 100644 index 00000000..2bedfc09 --- /dev/null +++ b/frontend/src/helpers/clampWorklet.ts @@ -0,0 +1,13 @@ +/** + * This is made for reanimated2 hence the 'worklet' keyword + * It will run on UI thread instead of JS thread + * more info on https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/worklets/ + */ +export const clamp = ( + value: number, + lowerBound: number, + upperBound: number, +) => { + 'worklet'; + return Math.min(Math.max(lowerBound, value), upperBound); +}; diff --git a/frontend/src/helpers/createReactNativeFile.ts b/frontend/src/helpers/createReactNativeFile.ts index 41810c05..45fd4c62 100644 --- a/frontend/src/helpers/createReactNativeFile.ts +++ b/frontend/src/helpers/createReactNativeFile.ts @@ -6,13 +6,16 @@ export const createReactNativeFile = ( filePath: string, customPrefix?: string, ) => { - if (filePath) { - return new ReactNativeFile({ - uri: filePath, - type: getMimeFromImagePicker(filePath), - name: `${customPrefix}-${new Date().getTime()}`, - }); + if (!filePath) { + return null; } - return null; + const prefix = customPrefix ? `${customPrefix}-` : ''; + const name = `${prefix}${new Date().getTime()}`; + + return new ReactNativeFile({ + uri: filePath, + type: getMimeFromImagePicker(filePath), + name, + }); }; diff --git a/frontend/src/helpers/deleteQuoteBbCode.ts b/frontend/src/helpers/deleteQuoteBbCode.ts new file mode 100644 index 00000000..c21da333 --- /dev/null +++ b/frontend/src/helpers/deleteQuoteBbCode.ts @@ -0,0 +1,34 @@ +import { QUOTE_CLOSE_REGEX, QUOTE_OPEN_REGEX } from '../constants'; + +export function deleteQuoteBbCode(input: string) { + // Check whether there is a quote or not + if (!input.includes('[quote')) { + return input; + } + + const contentArray = input.split('\n'); + const replacedContent = []; + let indentation = 0; + + for (const content of contentArray) { + const openQuoteArray = content.match(QUOTE_OPEN_REGEX); + const closeQuoteArray = content.match(QUOTE_CLOSE_REGEX); + + // If the current line has no open quote and close quote, + // push the contents to the array and continue to the next loop + if (!openQuoteArray && !closeQuoteArray && indentation === 0) { + replacedContent.push(`${content.trim()}`); + continue; + } + + if (openQuoteArray) { + indentation++; + } + + if (closeQuoteArray) { + indentation--; + } + } + + return replacedContent.join('\n'); +} diff --git a/frontend/src/helpers/emojiHandler.ts b/frontend/src/helpers/emojiHandler.ts new file mode 100644 index 00000000..b64498b3 --- /dev/null +++ b/frontend/src/helpers/emojiHandler.ts @@ -0,0 +1,5 @@ +const emojiImageNameRegex = /^emoji-:[^:]+(?::t\d+)?:$/; + +export function isEmojiImage(nameContent: string) { + return emojiImageNameRegex.test(nameContent); +} diff --git a/frontend/src/helpers/errorHandler.ts b/frontend/src/helpers/errorHandler.ts index dccfedf2..53d207e2 100644 --- a/frontend/src/helpers/errorHandler.ts +++ b/frontend/src/helpers/errorHandler.ts @@ -2,6 +2,7 @@ import { Alert } from 'react-native'; import { ApolloError } from '@apollo/client'; import { StackNavProp } from '../types'; +import { ERROR_HANDLED_BY_LINK } from '../constants'; import { ChangeUsernameError, @@ -10,24 +11,42 @@ import { UsedTitleError, } from './errorMessage'; +/** `isNotFoundError` accepts any object that has a string-based `message` + * field. This includes `Error`, `ApolloError`, and `GraphQLError`. + * + * It then searches for the well-known text, `'could not be found'`, which + * is what our GraphQL server returns when a particular query was not found. + */ +export function isNotFoundError(error: { message: string }) { + return error.message.toLowerCase().includes('could not be found'); +} + export function errorHandler( error: ApolloError, - isFiltered = false, - isTranslated = true, + shouldMaskError = false, + singularEntityName = '', ): string { - let errorMsg: string; - if (error.networkError) { - errorMsg = 'Please connect to a network'; - } else if (error.message === 'Not found or private.') { - errorMsg = 'Not found or private'; - } else { - errorMsg = isFiltered - ? 'Something unexpected happened. Please try again' - : error.message; + return t('Please connect to a network'); + } + + if (isNotFoundError(error)) { + let message = t(`Sorry, we couldn't find what you were looking for.`); + + if (singularEntityName) { + message = t(`Sorry, we couldn't find that {entity} for you.`, { + entity: singularEntityName, + }); + } + + return message; + } + + if (shouldMaskError) { + return t('Something unexpected happened. Please try again.'); } - return isTranslated ? t('{errorMsg}', { errorMsg }) : errorMsg; + return error.message; } export function errorHandlerAlert( @@ -40,21 +59,23 @@ export function errorHandlerAlert( if (typeof error === 'string') { errorMsg = error; } else { - errorMsg = errorHandler(error, isFiltered, false); + // This means the error is handled in error link + if (error?.message === ERROR_HANDLED_BY_LINK) { + return; + } + errorMsg = errorHandler(error, isFiltered); } - - let errorMsgi8n = t('{errorMsg}', { errorMsg }); - + let alertTitle; switch (errorMsg) { case LoginError: - Alert.alert(t('Please Log In'), errorMsgi8n, [ + Alert.alert(t('Please Log In'), errorMsg, [ { text: t('Close') }, { text: t('Log In'), onPress: () => (navigate ? navigate('Login') : undefined), }, ]); - break; + return; case UsedTitleError: Alert.alert( t('Title Already Exists'), @@ -63,16 +84,15 @@ export function errorHandlerAlert( ), [{ text: t('Got it') }], ); - break; + return; case EditPostError: - Alert.alert(t('Unable to Edit'), errorMsgi8n, [{ text: t('Got it') }]); + alertTitle = t('Unable to Edit'); break; case ChangeUsernameError: - Alert.alert(t('Username Unavailable'), errorMsgi8n, [ - { text: t('Got it') }, - ]); + alertTitle = t('Username Unavailable'); break; default: - Alert.alert(t('Error'), errorMsgi8n, [{ text: t('Got it') }]); + alertTitle = t('Error'); } + Alert.alert(alertTitle, errorMsg, [{ text: t('Got it') }]); } diff --git a/frontend/src/helpers/errorMessage.ts b/frontend/src/helpers/errorMessage.ts index a451e45b..716dd1b7 100644 --- a/frontend/src/helpers/errorMessage.ts +++ b/frontend/src/helpers/errorMessage.ts @@ -3,3 +3,4 @@ export let EditPostError = export let ChangeUsernameError = 'This username is already taken'; export let UsedTitleError = 'Title has already been used'; export let LoginError = 'You need to be logged in to do that.'; +export let RepliedPostLoadFail = 'Failed to load replied post'; diff --git a/frontend/src/helpers/existingPostIsValid.ts b/frontend/src/helpers/existingPostIsValid.ts index c0de95c2..eab3b1d1 100644 --- a/frontend/src/helpers/existingPostIsValid.ts +++ b/frontend/src/helpers/existingPostIsValid.ts @@ -1,5 +1,16 @@ import { newPostIsValid } from './newPostIsValid'; +enum EditType { + Topic = 'Topic', + Post = 'Post', + Both = 'Both', +} + +type SubmissionDetails = { + isValid: boolean; + editType: EditType; +}; + export function existingPostIsValid( uploadsInProgress: number, title: string, @@ -10,15 +21,27 @@ export function existingPostIsValid( oldChannel?: number, tags?: Array, oldTags?: Array, -): boolean { +): SubmissionDetails { const titleIsValid = title !== oldTitle; const contentIsValid = content !== oldContent; const channelIsValid = channel !== oldChannel; const tagsIsValid = JSON.stringify(tags) !== JSON.stringify(oldTags); - const postIsValid = - (titleIsValid || contentIsValid || channelIsValid || tagsIsValid) && + const topicModified = titleIsValid || channelIsValid || tagsIsValid; + + let submissionDetails = { isValid: false, editType: EditType.Both }; + + submissionDetails.isValid = + (topicModified || contentIsValid) && newPostIsValid(title, content, uploadsInProgress); - return postIsValid; + if (topicModified && contentIsValid) { + submissionDetails.editType = EditType.Both; + } else if (contentIsValid) { + submissionDetails.editType = EditType.Post; + } else { + submissionDetails.editType = EditType.Topic; + } + + return submissionDetails; } diff --git a/frontend/src/helpers/experienceId.ts b/frontend/src/helpers/experienceId.ts new file mode 100644 index 00000000..f05c3130 --- /dev/null +++ b/frontend/src/helpers/experienceId.ts @@ -0,0 +1,50 @@ +import Constants from 'expo-constants'; + +type ExperienceIdSource = + | 'manifest2.extra.scopeKey' + | 'expoConfig.currentFullName'; + +export type ExperienceIdResult = + | { success: true; result: string; source: ExperienceIdSource } + | { success: false; error: 'ExperienceIdMissing' }; + +export function getExperienceId(): ExperienceIdResult { + const expoConfigKey = Constants.expoConfig?.currentFullName ?? ''; + if (expoConfigKey) { + if (!isValidExperienceId(expoConfigKey)) { + // eslint-disable-next-line no-console + console.warn('experience id in current full name is not valid'); + } else { + return { + success: true, + result: expoConfigKey, + source: 'expoConfig.currentFullName', + }; + } + } + + const manifest2Key = Constants.manifest2?.extra?.scopeKey ?? ''; + + if (manifest2Key) { + return { + success: true, + result: manifest2Key, + source: 'manifest2.extra.scopeKey', + }; + } + + return { success: false, error: 'ExperienceIdMissing' }; +} + +/** + * + * @param experienceId + * @returns boolean + * + * this function will check is format of experience id is valid or not where the valid value is @/ + */ + +export function isValidExperienceId(experienceId: string): boolean { + const regexExperienceIdFormat = /^@[\w-.]+\/[\w-<>]+$/g; + return regexExperienceIdFormat.test(experienceId); +} diff --git a/frontend/src/helpers/extractAttributes.ts b/frontend/src/helpers/extractAttributes.ts new file mode 100644 index 00000000..108d4df1 --- /dev/null +++ b/frontend/src/helpers/extractAttributes.ts @@ -0,0 +1,16 @@ +export function extractAttributes(attributesCSV: string) { + const split = attributesCSV.split(','); + const attributeStrings = split.filter((item) => item.includes(':')); + + return attributeStrings.reduce>( + (accumulator, current) => { + const trimmed = current.trim(); + const [key, value] = trimmed.split(':'); + return { + ...accumulator, + [key]: value, + }; + }, + {}, + ); +} diff --git a/frontend/src/helpers/findChannelByCategoryId.ts b/frontend/src/helpers/findChannelByCategoryId.ts new file mode 100644 index 00000000..9870836f --- /dev/null +++ b/frontend/src/helpers/findChannelByCategoryId.ts @@ -0,0 +1,15 @@ +import { DEFAULT_CHANNEL } from '../constants'; +import { Channel } from '../types'; + +type findChannelByCategoryIdParams = { + categoryId?: number | null; + channels?: Array | null; +}; +export function findChannelByCategoryId({ + categoryId, + channels, +}: findChannelByCategoryIdParams): Channel { + return ( + channels?.find((channel) => channel.id === categoryId) ?? DEFAULT_CHANNEL + ); +} diff --git a/frontend/src/helpers/getExpoPushTokenHandler.ts b/frontend/src/helpers/getExpoPushTokenHandler.ts new file mode 100644 index 00000000..957309a7 --- /dev/null +++ b/frontend/src/helpers/getExpoPushTokenHandler.ts @@ -0,0 +1,84 @@ +import Constants from 'expo-constants'; +import * as Notifications from 'expo-notifications'; +import * as Device from 'expo-device'; +import { Alert, Platform } from 'react-native'; + +import { DEFAULT_NOTIFICATION_CHANNEL_INPUT } from '../constants'; + +interface ExpoPushTokenHandlerBaseResult { + message: string; +} + +interface ExpoPushTokenHandlerSuccessResult + extends ExpoPushTokenHandlerBaseResult { + success: true; + token: string; +} +interface ExpoPushTokenHandlerFailResult + extends ExpoPushTokenHandlerBaseResult { + success: false; + token: null; +} + +type ExpoPushTokenHandlerResult = Promise< + ExpoPushTokenHandlerSuccessResult | ExpoPushTokenHandlerFailResult +>; + +export async function getExpoPushTokenHandler(): ExpoPushTokenHandlerResult { + if (Platform.OS === 'android') { + Notifications.setNotificationChannelAsync( + 'default', + DEFAULT_NOTIFICATION_CHANNEL_INPUT, + ); + } + + if (!Device.isDevice) { + Alert.alert('Push Notifications are only supported on physical devices.'); + return { + success: false, + message: 'PushNotificationsNotSupported: Must use physical device.', + token: null, + }; + } + + try { + const { status: existingStatus } = + await Notifications.getPermissionsAsync(); + let finalStatus = existingStatus; + if (existingStatus !== 'granted') { + const { status } = await Notifications.requestPermissionsAsync(); + finalStatus = status; + } + if (finalStatus !== 'granted') { + Alert.alert('Something went wrong when configuring Push Notifications.'); + return { + success: false, + message: 'PushNotificationsNotSupported: Permission not granted', + token: null, + }; + } + /** + * Add project ID to the getExpoPushTokenAsync function because in the new version, the experience ID is no longer used. The project ID typically generates as @kfox/ during local development. + * Now, it is necessary to declare the project ID in the app.json file before being able to use push notifications. + * + * for more detail. Check this link https://docs.expo.dev/versions/latest/sdk/notifications/#expopushtokenoptions + */ + + let { data: token } = await Notifications.getExpoPushTokenAsync({ + projectId: Constants.expoConfig?.extra?.eas?.projectId, + }); + return { + success: true, + message: '', + token: token, + }; + } catch (error) { + let errorMessage = + error instanceof Error ? error.message : 'Something unexpected happened.'; + return { + success: false, + message: `PushNotificationsNotSupported: ${errorMessage}`, + token: null, + }; + } +} diff --git a/frontend/src/helpers/getFetchMorePostIds.ts b/frontend/src/helpers/getFetchMorePostIds.ts new file mode 100644 index 00000000..a35db870 --- /dev/null +++ b/frontend/src/helpers/getFetchMorePostIds.ts @@ -0,0 +1,45 @@ +type Params = { stream: Array } & ( + | { type: 'older'; firstLoadedPostIndex: number } + | { type: 'newer'; lastLoadedPostIndex: number } +); + +const LOAD_MORE_POST_COUNT = 10; +const START_INDEX = 0; + +export function getFetchMorePostIds(params: Params) { + const { stream } = params; + const totalPostCount = stream.length; + let nextFirstLoadedPostIndex; + let nextLastLoadedPostIndex; + + // Index range to fetch newer posts + if (params.type === 'newer') { + const { lastLoadedPostIndex } = params; + nextFirstLoadedPostIndex = lastLoadedPostIndex + 1; + let newDataCount = Math.min( + LOAD_MORE_POST_COUNT, + totalPostCount - nextFirstLoadedPostIndex, + ); + nextLastLoadedPostIndex = nextFirstLoadedPostIndex + newDataCount; + } else { + // Index range to fetch older posts + const { firstLoadedPostIndex } = params; + nextLastLoadedPostIndex = firstLoadedPostIndex; + let newDataCount = Math.min( + LOAD_MORE_POST_COUNT, + totalPostCount - nextLastLoadedPostIndex, + ); + nextFirstLoadedPostIndex = Math.max( + START_INDEX, + nextLastLoadedPostIndex - newDataCount, + ); + } + + let postIds = stream.slice(nextFirstLoadedPostIndex, nextLastLoadedPostIndex); + /** + * The last index is not included in Array.slice(), so + * we need to substract 1 from nextLastLoadedPostIndex + */ + nextLastLoadedPostIndex -= 1; + return { nextFirstLoadedPostIndex, nextLastLoadedPostIndex, postIds }; +} diff --git a/frontend/src/helpers/getTopicDetailOutputCacheBehavior.ts b/frontend/src/helpers/getTopicDetailOutputCacheBehavior.ts new file mode 100644 index 00000000..d1bb9d89 --- /dev/null +++ b/frontend/src/helpers/getTopicDetailOutputCacheBehavior.ts @@ -0,0 +1,17 @@ +import { replaceDataPagination } from './paginationHandler'; + +export function getTopicDetailOutputCacheBehavior() { + return { + fields: { + title: replaceDataPagination(), + views: replaceDataPagination(), + likeCount: replaceDataPagination(), + postsCount: replaceDataPagination(), + liked: replaceDataPagination(), + categoryId: replaceDataPagination(), + tags: replaceDataPagination(), + createdAt: replaceDataPagination(), + details: replaceDataPagination(), + }, + }; +} diff --git a/frontend/src/helpers/handleDuplicate.ts b/frontend/src/helpers/handleDuplicate.ts deleted file mode 100644 index 4fee44dd..00000000 --- a/frontend/src/helpers/handleDuplicate.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable no-underscore-dangle */ -import { Reference } from '@apollo/client'; - -export function handleDuplicateRef( - firstArray: Array | null, - secondArray: Array | null, -): Array { - if (!secondArray || !firstArray) { - return secondArray || firstArray || []; - } - - const firstArrayIds = firstArray.map(({ __ref }) => __ref); - - const filteredSecondArray = secondArray.filter( - (item) => !firstArrayIds.includes(item.__ref), - ); - - return [...firstArray, ...filteredSecondArray]; -} diff --git a/frontend/src/helpers/handleDuplicates.ts b/frontend/src/helpers/handleDuplicates.ts new file mode 100644 index 00000000..dc5e3891 --- /dev/null +++ b/frontend/src/helpers/handleDuplicates.ts @@ -0,0 +1,39 @@ +/* eslint-disable no-underscore-dangle */ +import { Reference } from '@apollo/client'; + +export function handleDuplicateRef( + firstArray: Array | null, + secondArray: Array | null, +): Array { + if (!secondArray || !firstArray) { + return secondArray || firstArray || []; + } + + const firstArrayIds = firstArray.map(({ __ref }) => __ref); + + const filteredSecondArray = secondArray.filter( + (item) => !firstArrayIds.includes(item.__ref), + ); + + return [...firstArray, ...filteredSecondArray]; +} + +export function handleDuplicates(params: { + newArray: Array | null; + oldArray: Array | null; + newArrayIs: 'prepended' | 'appended'; +}) { + const { newArray, oldArray, newArrayIs } = params; + if (!oldArray || !newArray) { + return oldArray || newArray || []; + } + const newArrayIds = newArray.map(({ __ref }) => __ref); + const filteredOldArray = oldArray.filter((item) => { + return !newArrayIds.includes(item.__ref); + }); + if (newArrayIs === 'prepended') { + return [...newArray, ...filteredOldArray]; + } else { + return [...filteredOldArray, ...newArray]; + } +} diff --git a/frontend/src/helpers/imageUploadHandler.ts b/frontend/src/helpers/imageUploadHandler.ts index eb5ca182..764309a7 100644 --- a/frontend/src/helpers/imageUploadHandler.ts +++ b/frontend/src/helpers/imageUploadHandler.ts @@ -1,5 +1,3 @@ -import { UseFormMethods } from 'react-hook-form'; - import { Image } from '../types'; export function formatImageLink( @@ -11,14 +9,12 @@ export function formatImageLink( return `![${name}|${width} x ${height}](${url})`; } -export function replaceImageUploadStatus( +export function getReplacedImageUploadStatus( raw: string, imageUploadToken: number, url: string, ) { - raw = raw.replace(`[uploading...](${imageUploadToken})`, url); - - return raw; + return raw.replace(`[uploading...](${imageUploadToken})`, url); } export function insertImageUploadStatus( @@ -38,32 +34,6 @@ export function insertImageUploadStatus( return raw; } -export function reformatMarkdownBeforeUpload( - raw: string, - startingCursorPosition: number, - imagesArray: Array, - setValue: UseFormMethods['setValue'], -) { - const result = insertImageUploadStatus( - raw, - startingCursorPosition, - imagesArray.length + 1, - ); - setValue('raw', result); -} - -export function reformatMarkdownAfterUpload( - raw: string, - imagesArray: Array, - token: number, - setValue: UseFormMethods['setValue'], -) { - let newText = raw; - newText = replaceImageUploadStatus(raw, token, imagesArray[token - 1].link); - - setValue('raw', newText); -} - export function updateImagesArray( imagesArray: Array, imageUrl: string, diff --git a/frontend/src/helpers/index.ts b/frontend/src/helpers/index.ts index c53c053a..d7cd335e 100644 --- a/frontend/src/helpers/index.ts +++ b/frontend/src/helpers/index.ts @@ -1,23 +1,31 @@ export * from './automaticFontColor'; export * from './bottomMenu'; +export * from './clampWorklet'; export * from './colorScheme'; export * from './createReactNativeFile'; +export * from './deleteQuoteBbCode'; export * from './errorHandler'; export * from './errorMessage'; export * from './existingPostIsValid'; +export * from './extractAttributes'; +export * from './findChannelByCategoryId'; export * from './formatCount'; export * from './formatDateTime'; export * from './formatExtensions'; export * from './formatRelativeTime'; export * from './formatTag'; +export * from './getFetchMorePostIds'; +export * from './getExpoPushTokenHandler'; export * from './getFormat'; export * from './getHyperlink'; export * from './getTextInputRules'; +export * from './getTopicDetailOutputCacheBehavior'; export * from './getUserImage'; -export * from './handleDuplicate'; +export * from './handleDuplicates'; export * from './imagePickerHandler'; export * from './imageUploadHandler'; export * from './insertHyperlink'; +export * from './isFlatList'; export * from './localStorage'; export * from './mentionHelper'; export * from './messageDetailHandler'; @@ -28,5 +36,13 @@ export * from './pickImage'; export * from './postDetailContentHandler'; export * from './processRawContent'; export * from './relatedUsers'; +export * from './replaceQuotesWithMarkdown'; export * from './showLogoutAlert'; export * from './storage'; +export * from './transformTopicToPost'; +export * from './updateLike'; +export * from './linking'; +export * from './checkImageFile'; +export * from './PrivateTopicAlert'; +export * from './PushNotificationsSetupFailAlert'; +export * from './parser'; diff --git a/frontend/src/helpers/isFlatList.ts b/frontend/src/helpers/isFlatList.ts new file mode 100644 index 00000000..281bd93c --- /dev/null +++ b/frontend/src/helpers/isFlatList.ts @@ -0,0 +1,9 @@ +import { FlatList } from 'react-native'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function isFlatList(list: any): list is FlatList { + if (!list) { + return false; + } + return typeof list?.scrollToIndex === 'function'; +} diff --git a/frontend/src/helpers/linking.ts b/frontend/src/helpers/linking.ts new file mode 100644 index 00000000..926c919b --- /dev/null +++ b/frontend/src/helpers/linking.ts @@ -0,0 +1,158 @@ +import { + FIRST_POST_NUMBER, + deepRoutes, + PostOrMessageDetailRoute, +} from '../constants'; +import { reset } from '../navigation/NavigationService'; +import { MessageDetailParams, Routes } from '../types'; + +import { parseInt } from './parser'; + +export type DetailParamsOutcome = 'valid-params' | 'invalid-post-number'; + +/** + * This function is exclusively for the PostDetail and MessageDetail + * deep link routes. + * + * It accepts an array of path parameters with the leading route already + * stripped off. + * + * It is shared between these two routes because they are effectively the same. + * + * If this function is unable to even parse a `topicId`, it will return `undefined`. + * + * Otherwise, it will attempt to parse and return the `topicId` and `postNumber`. + * + * The `postNumber` is guaranteed to be a valid `postNumber`, meaning it is never less + * than `FIRST_POST_NUMBER`. If `postNumber` is not present or invalid, it will be replaced + * with `FIRST_POST_NUMBER`. + * + * The `outcome` field in the return type is used to communicate whether or not + * a replacement to `postNumber` was necessary, or if a valid `postNumber` was received. + * + */ +export function getValidDetailParams(params: Array): + | { + topicId: number; + postNumber: number; + outcome: DetailParamsOutcome; + } + | undefined { + // `/:topicId/:postNumber?` + // Return `undefined` (failure) if no parameters were passed. + // Otherwise we receive at least 1 parameter, representing the `topicId`. + if (params.length < 1) { + return; + } + + const [, , ...otherParams] = params; + const [topicId, postNumber] = otherParams.map((param) => { + return parseInt(param); + }); + + // If we can't even extract a valid, positive number for `topicId` (non-negative and greater than 0), + // just bail out as a full failure. + if (!topicId || topicId < 0) { + return; + } + + // If `unknownPostNumber` is falsy (0, undefined), or if it is less than `FIRST_POST_NUMBER`, + // (-1, -2, etc.), normalize it to `FIRST_POST_NUMBER`. + if (!postNumber || postNumber < FIRST_POST_NUMBER) { + return { + topicId, + postNumber: FIRST_POST_NUMBER, + outcome: 'invalid-post-number', + }; + } + + return { topicId, postNumber, outcome: 'valid-params' }; +} + +export function navigatePostOrMessageDetail( + route: PostOrMessageDetailRoute, + pathParams: Array, +) { + let navigationRoutes = postOrMessageDetailPathToRoutes({ route, pathParams }); + + reset({ + index: navigationRoutes.length - 1, + routes: navigationRoutes, + }); + + return; +} + +type postOrMessageDetailPathToRoutesParams = { + route: PostOrMessageDetailRoute; + pathParams: Array; +}; +export function postOrMessageDetailPathToRoutes({ + route, + pathParams, +}: postOrMessageDetailPathToRoutesParams): Routes { + const detailParams = getValidDetailParams(pathParams); + if (!detailParams) { + return route === deepRoutes['message-detail'] + ? [ + { name: 'TabNav', state: { routes: [{ name: 'Profile' }] } }, + { name: 'Messages' }, + ] + : [{ name: 'TabNav', state: { routes: [{ name: 'Home' }] } }]; + } + const { topicId, postNumber } = detailParams; + if (route === deepRoutes['message-detail']) { + const messageParams: MessageDetailParams = { + id: topicId, + postNumber, + hyperlinkTitle: '', + hyperlinkUrl: '', + source: 'deeplink', + }; + + return [ + { name: 'TabNav', state: { routes: [{ name: 'Profile' }] } }, + { name: 'Messages' }, + { name: 'MessageDetail', params: messageParams }, + ]; + } else { + return [ + { name: 'TabNav', state: { routes: [{ name: 'Home' }] } }, + { + name: 'PostDetail', + params: { topicId, postNumber, source: 'deeplink' }, + }, + ]; + } +} + +export function extractPathname(url: string) { + /** + * This function is used to check whether or not a slash appeard in the URL after the hostname. + * + * For example this URL: 'https://test-url.com'. + * It doesn't have a '/' after the hostname, so we know that this URL doesn't have a path. + * + * But with this URL: 'https://test-url.com/t'. + * It has a '/' after the hostname, so ther is a posibility that the URL have a path. + * + * The plus 2 is used to skip the '//' after 'https:'. + */ + const slashIndex = url.indexOf('/', url.indexOf('//') + 2); + + if (slashIndex === -1) { + return ''; + } + + const [pathname] = url.slice(slashIndex + 1).split('?'); + let regex = /t\/([a-z'-]+)\/\d+(\/\d)?/; + if (!regex.test(pathname)) { + return ''; + } + + return pathname; +} + +export function isRouteBesidePost(route: string) { + return route !== deepRoutes['post-detail']; +} diff --git a/frontend/src/helpers/localStorage.tsx b/frontend/src/helpers/localStorage.tsx index d1a34de3..e1166d1c 100644 --- a/frontend/src/helpers/localStorage.tsx +++ b/frontend/src/helpers/localStorage.tsx @@ -1,4 +1,4 @@ -import { Literal, Number, Record, String } from 'runtypes'; +import { Boolean, Literal, Number, Record, String } from 'runtypes'; import { ChannelList } from '../types'; @@ -17,12 +17,20 @@ export let User = Record({ avatar: String, }); +export let PushNotificationsPreferences = Record({ + shouldShowAlert: Boolean, + shouldPlaySound: Boolean, + shouldSetBadge: Boolean, +}); + let [StorageProvider, useStorage] = createCachedStorage( { colorScheme: (value) => ColorScheme.check(value), aesthetic: (value) => Aesthetic.check(value), user: (value) => User.check(value), + expoPushToken: (value) => String.check(value), channels: (value) => ChannelList.check(value), + pushNotifications: (value) => PushNotificationsPreferences.check(value), }, '@Cached/', ); diff --git a/frontend/src/helpers/messageDetailHandler.ts b/frontend/src/helpers/messageDetailHandler.ts index 780f7391..6b094326 100644 --- a/frontend/src/helpers/messageDetailHandler.ts +++ b/frontend/src/helpers/messageDetailHandler.ts @@ -1,15 +1,18 @@ +import { GetMessageDetailQuery } from '../generated/server'; import { Message, MessageContent, - PostStream, TopicDetailInner as TopicDetail, } from '../types'; import { formatRelativeTime } from './formatRelativeTime'; import { getImage } from './getUserImage'; +type MessagePostStream = + GetMessageDetailQuery['privateMessageDetail']['postStream']; + type MessageDetailContent = { - postStream: PostStream; + postStream: MessagePostStream; details: TopicDetail | null; }; @@ -17,7 +20,8 @@ export function messageDetailHandler({ postStream, details, }: MessageDetailContent) { - const contents = getSortedContent(postStream, details); + const { posts, stream } = postStream; + const contents = transformPostsToFrontendMessageContent(posts); const members = details?.allowedUsers?.map(({ id, username, avatarTemplate: avatar }) => ({ id, @@ -26,103 +30,60 @@ export function messageDetailHandler({ })) || []; const data: Message = { contents, members }; - const baseStream = postStream.stream || []; const { id: oldestPostId } = contents[0]; const { id: newestPostId } = contents[contents.length - 1]; - const hasOlderMessage = baseStream[0] !== oldestPostId; - const hasNewerMessage = baseStream[baseStream.length - 1] !== newestPostId; + let hasOlderMessage = false; + let hasNewerMessage = false; + let firstPostIndex: number | null = null; + let lastPostIndex: number | null = null; - const firstPostIndex = baseStream.findIndex( - (postId) => postId === oldestPostId, - ); - const lastPostIndex = baseStream.findIndex( - (postId) => postId === newestPostId, - ); + if (stream) { + hasOlderMessage = stream[0] !== oldestPostId; + hasNewerMessage = stream[stream.length - 1] !== newestPostId; + + firstPostIndex = stream.findIndex((postId) => postId === oldestPostId); + lastPostIndex = stream.findIndex((postId) => postId === newestPostId); + } return { data, hasNewerMessage, hasOlderMessage, - baseStream, + stream: stream ?? [], firstPostIndex, lastPostIndex, }; } -function getSortedContent(postStream: PostStream, details: TopicDetail | null) { - let tempContent: Array = []; - const { posts, stream } = postStream; - - if (stream) { - stream.forEach((streamId) => { - const tempPost = posts.find(({ id }) => id === streamId); - - if (tempPost) { - let { - id, - username, - createdAt: time, - actionCode, - actionCodeWho, - listOfCooked: images, - listOfMention, - raw, - } = tempPost; - - tempContent.push({ - id, - userId: - details?.participants.find( - (participant) => participant.username === username, - )?.id || 0, - time, - message: getMessageContent( - username, - raw ?? null, - actionCode ?? null, - actionCodeWho ?? null, - time, - ), - images: images || undefined, - listOfMention: listOfMention || undefined, - }); - } - }); - } else { - posts.forEach( - ({ - id, +function transformPostsToFrontendMessageContent( + posts: MessagePostStream['posts'], +) { + const modifiedPosts: Array = posts.map( + ({ + id, + username, + createdAt: time, + actionCode, + actionCodeWho, + markdownContent, + mentions, + }) => ({ + id, + username, + time, + message: getMessageContent( username, - createdAt: time, - actionCode, - actionCodeWho, - listOfCooked: images, - listOfMention, - raw, - }) => - tempContent.push({ - id, - userId: - details?.participants.find( - (participant) => participant.username === username, - )?.id || 0, - time, - message: getMessageContent( - username, - raw ?? null, - actionCode ?? null, - actionCodeWho ?? null, - time, - ), - images: images || undefined, - listOfMention: listOfMention || undefined, - }), - ); - } - - return tempContent; + markdownContent ?? null, + actionCode ?? null, + actionCodeWho ?? null, + time, + ), + mentions: mentions ?? undefined, + }), + ); + return modifiedPosts; } function getMessageContent( @@ -138,33 +99,60 @@ function getMessageContent( const timeStamp = formatRelativeTime(time); + // TODO: Adjust message content in #865 switch (actionCode) { case 'user_left': { - return `${actionCodeWho} removed themselves ${timeStamp}`; + return t('{actionCodeWho} left.', { actionCodeWho }); } case 'invited_user': { - return `${username} invited ${actionCodeWho} to join ${timeStamp}`; + return t('{username} invited {actionCodeWho} to join {timeStamp}', { + username, + actionCodeWho, + timeStamp, + }); } case 'removed_user': { - return `${username} removed ${actionCodeWho} ${timeStamp}`; + return t('{username} removed {actionCodeWho} {timeStamp}', { + username, + actionCodeWho, + timeStamp, + }); } case 'public_topic': { - return `${username} made this message public ${timeStamp}`; + return t('{username} made this message public {timeStamp}', { + username, + timeStamp, + }); } case 'private_topic': { - return `${username} made this message personal ${timeStamp}`; + return t('{username} made this message personal {timeStamp}', { + username, + timeStamp, + }); } case 'visible.enabled': { - return `${username} listed this message ${timeStamp}`; + return t('{username} listed this message {timeStamp}', { + username, + timeStamp, + }); } case 'visible.disabled': { - return `${username} unlisted this message ${timeStamp}`; + return t('{username} unlisted this message {timeStamp}', { + username, + timeStamp, + }); } case 'closed.enabled': { - return `${username} closed this message ${timeStamp}`; + return t('{username} locked this message {timeStamp}', { + username, + timeStamp, + }); } case 'closed.disabled': { - return `${username} opened this message ${timeStamp}`; + return t('{username} unlocked this message {timeStamp}', { + username, + timeStamp, + }); } default: { return ''; diff --git a/frontend/src/helpers/notificationHandler.ts b/frontend/src/helpers/notificationHandler.ts index 84960ad6..b2011551 100644 --- a/frontend/src/helpers/notificationHandler.ts +++ b/frontend/src/helpers/notificationHandler.ts @@ -1,48 +1,19 @@ /* eslint no-underscore-dangle: 0 */ import { Alert } from 'react-native'; +import { FIRST_POST_NUMBER } from '../constants'; import { Notification as NotificationDataType, + NotificationType, RawNotificationsType, - StackParamList, + RootStackParamList, } from '../types'; -enum NotificationType { - Mention = 1, - ReplyPost = 2, - QuotePost = 3, - EditPost = 4, - LikePost = 5, - SendMessage = 6, - InviteMessage = 7, - // InviteeAccepted = 8, - ReplyMessage = 9, - MovePost = 10, - LinkPost = 11, - // ObtainBadge = 12, - InviteTopic = 13, - Custom = 14, - GroupMention = 15, - // ModeratorsInbox = 16, - WatchingTopic = 17, - TopicReminder = 18, - LikeMultiplePosts = 19, - PostApproved = 20, - CodeReviewCommitApproved = 21, - MembershipRequestAccepted = 22, - MembershipRequestConsolidated = 23, - BookmarkReminder = 24, - Reaction = 25, - VotesReleased = 26, - EventReminder = 27, - EventInvitation = 28, -} - export function notificationHandler( data: Array, - navToPostDetail: (params: StackParamList['PostDetail']) => void, - navToMessageDetail: (params: StackParamList['MessageDetail']) => void, - navToUserInformation: (params: StackParamList['UserInformation']) => void, + navToPostDetail: (params: RootStackParamList['PostDetail']) => void, + navToMessageDetail: (params: RootStackParamList['MessageDetail']) => void, + navToUserInformation: (params: RootStackParamList['UserInformation']) => void, ): Array { let tempNotification: Array = []; @@ -76,14 +47,14 @@ export function notificationHandler( case NotificationType.BookmarkReminder: { return navToPostDetail({ topicId, - postNumber: item.postNumber || undefined, + postNumber: item.postNumber ?? undefined, }); } case NotificationType.SendMessage: case NotificationType.InviteMessage: { return navToMessageDetail({ id: topicId, - postPointer: item.postNumber || 1, + postNumber: item.postNumber ?? FIRST_POST_NUMBER, hyperlinkUrl: '', hyperlinkTitle: '', }); @@ -102,7 +73,7 @@ export function notificationHandler( ) { return navToPostDetail({ topicId, - postNumber: item.postNumber || undefined, + postNumber: item.postNumber ?? undefined, }); } else { Alert.alert(t('Warning'), t('This feature not available yet'), [ @@ -155,7 +126,8 @@ export function notificationHandler( switch (notificationType) { // TODO : Do more research about more notificationTypes case NotificationType.Mention: - case NotificationType.GroupMention: { + case NotificationType.GroupMention: + case NotificationType.ChatMention: { message = t('Mentioned you in ') + topicTitle; break; } diff --git a/frontend/src/helpers/paginationHandler.ts b/frontend/src/helpers/paginationHandler.ts index cd71df96..c9789740 100644 --- a/frontend/src/helpers/paginationHandler.ts +++ b/frontend/src/helpers/paginationHandler.ts @@ -1,20 +1,28 @@ +/* eslint-disable no-underscore-dangle */ /* eslint-disable @typescript-eslint/no-explicit-any */ +import { Alert } from 'react-native'; import { FieldPolicy } from '@apollo/client'; import { Reference } from '@apollo/client/utilities'; -import { UserActivity } from '../types/Types'; +import { ERROR_PAGINATION } from '../constants'; -import { handleDuplicateRef } from './handleDuplicate'; +import { handleDuplicateRef, handleDuplicates } from './handleDuplicates'; type KeyArgs = FieldPolicy['keyArgs']; +/** + * This ApolloRefObject is the type of data coming to this function + * when we define custom keyFields in the typePolicies + */ +type ApolloRefObject = { __ref: string }; + export function userActivityPagination( keyArgs: KeyArgs = false, -): FieldPolicy> { +): FieldPolicy> { return { keyArgs, merge(existing, incoming, { args }) { - let merged: Array = existing ? existing.slice(0) : []; + let merged: Array = existing ? existing.slice(0) : []; if (args) { const { offset = 0 } = args; @@ -25,17 +33,18 @@ export function userActivityPagination( merged = [...merged, ...incoming]; } - const filteredArr = merged.reduce((acc: Array, current) => { - const duplicateValue = acc.find( - (item) => - item.postId === current.postId && - item.actionType === current.actionType, - ); - if (!duplicateValue) { - return acc.concat([current]); - } - return acc; - }, []); + const filteredArr = merged.reduce( + (acc: Array, current) => { + const duplicateValue = acc.find( + (item) => item.__ref === current.__ref, + ); + if (!duplicateValue) { + return acc.concat([current]); + } + return acc; + }, + [], + ); return filteredArr; }, @@ -65,47 +74,39 @@ export function appendPagination( let page; switch (screen) { - case 'HOME': - page = args?.page || 0; - incoming.users = handleDuplicateRef(existing.users, incoming.users); - if (page > 0) { - incoming.topicList.topics = handleDuplicateRef( - existing.topicList.topics, - incoming.topicList.topics, - ); - } else { - incoming.topicList.topics = handleDuplicateRef( - incoming.topicList.topics, - existing.topicList.topics, - ); - } - - break; case 'SEARCH': page = args?.page || 1; if (page > 1) { - incoming.posts = handleDuplicateRef(existing.posts, incoming.posts); - incoming.topics = handleDuplicateRef( - existing.topics, - incoming.topics, - ); + incoming = { + ...incoming, + posts: handleDuplicateRef(existing.posts, incoming.posts), + topics: handleDuplicateRef(existing.topics, incoming.topics), + }; } + break; case 'MESSAGE_DETAIL': page = args?.page || 0; if (page >= 0) { - incoming.topicList.topics = handleDuplicateRef( - incoming.topicList.topics, - existing.topicList.topics, - ); - incoming.users = handleDuplicateRef(incoming.users, existing.users); + incoming = { + ...incoming, + users: handleDuplicateRef(incoming.users, existing.users), + topicList: { + ...incoming.topicList, + topics: handleDuplicateRef( + incoming.topicList.topics, + existing.topicList.topics, + ), + }, + }; } break; case 'NOTIFICATIONS': - incoming.notifications = handleDuplicateRef( + let newData = handleDuplicateRef( existing.notifications, incoming.notifications, ); + incoming = { ...incoming, notifications: newData }; break; } @@ -129,17 +130,106 @@ export function prependAppendPagination( return incoming || existing || null; } - if ( - JSON.stringify(existing[existing.length - 1]) < - JSON.stringify(incoming[incoming.length - 1]) - ) { - return handleDuplicateRef(existing, incoming); - } else { - // Prepending data will trigger data reindexing. - // There's an issue with data reindexing inside a FlatList, - // because the cursor position is not "held" at the current post. - return handleDuplicateRef(incoming, existing); - } + /** + * In this case, the incoming data and existing data format will be [{"__ref": "Post:1135521"}]. + * We want to check if the post id is greater than the incoming postId; + * if it is, we will append it, and if not, we will prepend it. + * + */ + + let lastExisting = getLatestApolloId(existing); + let lastIncoming = getLatestApolloId(incoming); + + return mergeReferenceData({ + existing, + incoming, + lastExisting, + lastIncoming, + }); }, }; } + +/** + * getLatestApolloId + * This function is created to get the id from the Apollo cache. + * + * @param items Argument for a list of Id, where it will take the example format [{"__ref": "Post:598854"}] + * @returns It will return a number if the format is correct, and it will return undefined if the format is incorrect. + */ + +export function getLatestApolloId( + items: Readonly>, +): number | undefined { + if (!Array.isArray(items)) { + return; + } + const lastItem = items[items.length - 1]; + if (!lastItem) { + return; + } + + const { __ref: ref } = lastItem; + if (!ref) { + return; + } + + const [, itemId] = ref.split(':'); + if (!itemId) { + return; + } + + const parsed = Number.parseInt(itemId, 10); + if (Number.isNaN(parsed)) { + return; + } + + return parsed; +} + +type MergeReferenceDataParam = { + existing: Array; + incoming: Array; + lastExisting?: number; + lastIncoming?: number; + mockAlert?: (error: string) => void; +}; +export function mergeReferenceData({ + existing, + incoming, + lastExisting, + lastIncoming, + mockAlert, +}: MergeReferenceDataParam) { + let mergedTopics = []; + + /** + * In this condition is check is format not PostId:number + * we want to compare based on string based on the old format checking + */ + + if (!lastExisting || !lastIncoming) { + if (mockAlert) { + mockAlert(ERROR_PAGINATION); + } else { + Alert.alert(ERROR_PAGINATION); + } + return existing; + } else { + if (lastExisting < lastIncoming) { + mergedTopics = handleDuplicates({ + newArray: incoming, + oldArray: existing, + newArrayIs: 'appended', + }); + } else { + mergedTopics = handleDuplicates({ + newArray: incoming, + oldArray: existing, + newArrayIs: 'prepended', + }); + } + } + + return mergedTopics; +} diff --git a/frontend/src/helpers/parser.ts b/frontend/src/helpers/parser.ts new file mode 100644 index 00000000..287fc9e8 --- /dev/null +++ b/frontend/src/helpers/parser.ts @@ -0,0 +1,4 @@ +export function parseInt(param: string) { + const parsed = Number.parseInt(param, 10); + return Number.isNaN(parsed) ? undefined : parsed; +} diff --git a/frontend/src/helpers/pickImage.ts b/frontend/src/helpers/pickImage.ts index 8e94b59c..e7248205 100644 --- a/frontend/src/helpers/pickImage.ts +++ b/frontend/src/helpers/pickImage.ts @@ -37,7 +37,7 @@ export async function pickImage(extensions?: Array) { : { canceled: true, assets: null }; } - if (result.canceled) { + if (result.canceled || !result.assets.length) { return { error: 'cancelled', }; diff --git a/frontend/src/helpers/postDetailContentHandler.ts b/frontend/src/helpers/postDetailContentHandler.ts index f01ff6ea..6ee86b45 100644 --- a/frontend/src/helpers/postDetailContentHandler.ts +++ b/frontend/src/helpers/postDetailContentHandler.ts @@ -1,10 +1,10 @@ import { DEFAULT_CHANNEL } from '../constants'; -import { ActionSummary as ActionsSummaryServer } from '../generated/server/types'; +import { ActionSummary as ActionsSummaryServer } from '../generated/server'; import { Channel, Post, Topic, TopicDetail, User } from '../types'; import { getImage } from './getUserImage'; -enum ActionsSummaryType { +export enum ActionsSummaryType { Bookmark = 1, Like = 2, FlagOffTopic = 3, @@ -26,8 +26,8 @@ export function ActionsSummaryHandler( actionsSummary?.forEach(({ id, count, acted }) => { switch (id) { case ActionsSummaryType.Like: { - likeCount = count || 0; - isLiked = acted || false; + likeCount = count ?? 0; + isLiked = acted ?? false; break; } case ActionsSummaryType.FlagOffTopic: @@ -86,76 +86,107 @@ export function postDetailContentHandler({ id, title: title || 'Untitled', firstPostId: postStream?.stream ? postStream?.stream[0] : 0, - canEditTopic: details?.canEdit || false, + canEditTopic: details?.canEdit ?? false, replyCount: postsCount ? postsCount - 1 : 0, - likeCount: likeCount ? likeCount : 0, - viewCount: views || 0, - selectedTag: tags || [], - selectedChanelId: categoryId || 1, + likeCount: likeCount ?? 0, + viewCount: views ?? 0, + selectedTag: tags ?? [], + selectedChannelId: categoryId ?? DEFAULT_CHANNEL.id, }; - const posts: Array = []; - let { posts: basePosts, stream } = postStream; - - basePosts.forEach( - ({ - actionsSummary, - id, - topicId, - raw, - hidden, - listOfCooked, - listOfMention, - username, - avatar, - replyCount, - createdAt, - postNumber, - replyToPostNumber, - canEdit, - }) => { - if (!actionsSummary) { - throw new Error('Unexpected condition: actionsSummary was undefined'); - } - - const { isLiked, likeCount, canFlag } = - ActionsSummaryHandler(actionsSummary); - - posts.push({ - id, - topicId, - title: '', - content: raw || '', - hidden, - images: listOfCooked || undefined, - mentionedUsers: listOfMention || undefined, - username, - avatar: getImage(avatar), - replyCount: replyCount || 0, - likeCount, - viewCount: 0, - isLiked, - channel: channel || DEFAULT_CHANNEL, - tags: [], - createdAt, - freqPosters, - postNumber, - replyToPostNumber: replyToPostNumber || -1, - canEdit, - canFlag, - }); - }, - ); + const postComments: Array = []; + let { + stream, + posts: basePostComments, + firstPost: originalFirstPost, + } = postStream; + + basePostComments.forEach((params) => { + postComments.push( + transformPostsToFrontendPost({ post: params, channel, freqPosters }), + ); + }); - const firstPostIndex = - stream?.findIndex((postId) => postId === posts[0].id) || 0; - const lastPostIndex = firstPostIndex + (posts.length - 1); + let firstPost; + if (originalFirstPost) { + firstPost = transformPostsToFrontendPost({ + post: originalFirstPost, + channel, + freqPosters, + }); + } + + let firstLoadedCommentIndex = null; + let lastLoadedCommentIndex = null; + + if (postComments.length && stream) { + const [{ id: firstCommentId }] = postComments; + firstLoadedCommentIndex = stream.findIndex( + (postId) => postId === firstCommentId, + ); + if (firstLoadedCommentIndex === -1) { + firstLoadedCommentIndex = null; + } else { + lastLoadedCommentIndex = + firstLoadedCommentIndex + (postComments.length - 1); + } + } return { stream, topic, - posts, - firstPostIndex, - lastPostIndex, + postComments, + firstPost, + firstLoadedCommentIndex, + lastLoadedCommentIndex, }; } + +let transformPostsToFrontendPost = (params: { + post: TopicDetail['postStream']['posts'][0]; + channel?: Channel; + freqPosters: Array; +}): Post => { + let { + actionsSummary, + id, + topicId, + markdownContent, + hidden, + mentions, + username, + avatar, + replyCount, + createdAt, + postNumber, + replyToPostNumber, + canEdit, + } = params.post; + if (!actionsSummary) { + throw new Error('Unexpected condition: actionsSummary was undefined'); + } + + const { isLiked, likeCount, canFlag } = ActionsSummaryHandler(actionsSummary); + return { + id, + topicId, + title: '', + content: markdownContent ?? '', + hidden, + mentionedUsers: mentions ?? undefined, + username, + avatar: getImage(avatar), + replyCount: replyCount ?? 0, + likeCount, + viewCount: 0, + isLiked, + channel: params.channel ?? DEFAULT_CHANNEL, + tags: [], + createdAt, + freqPosters: params.freqPosters, + postNumber, + replyToPostNumber, + canEdit, + canFlag, + }; +}; diff --git a/frontend/src/helpers/processRawContent.ts b/frontend/src/helpers/processRawContent.ts index b9a2ce0b..85d3d88e 100644 --- a/frontend/src/helpers/processRawContent.ts +++ b/frontend/src/helpers/processRawContent.ts @@ -1,6 +1,8 @@ +import { DEFAULT_IMAGE } from '../../assets/images'; import { NO_EXCERPT_WORDING } from '../constants'; import { formatRelativeTime } from './formatRelativeTime'; +import { replaceQuotesWithMarkdown } from './replaceQuotesWithMarkdown'; export function getPostShortUrl(content: string): Array | undefined { //used in Post Preview scene to get all image shortUrls. @@ -10,11 +12,11 @@ export function getPostShortUrl(content: string): Array | undefined { return result?.map((item) => item.replace(shortUrlRegex, '$1')); } -function formatTime(match: string, s1: string) { +function formatTime(_: string, s1: string) { return formatRelativeTime(s1, true, false); } -export function handleSpecialMarkdown(content?: string) { +export function handleUnsupportedMarkdown(content?: string) { if (!content) { return ''; } @@ -25,8 +27,9 @@ export function handleSpecialMarkdown(content?: string) { { item }, ); - const quoteRegex = /\[(quote)([\s\S]*?)(\[\/\1)\]/g; - let result = content.replace(quoteRegex, message('Quotes')); + let result = content; + + result = replaceQuotesWithMarkdown(result); const toogleRegex = /\[(details)([\s\S]*?)(\[\/\1)\]/g; result = result.replace(toogleRegex, message('Toogles')); @@ -112,3 +115,27 @@ export function anchorToMarkdown(rawContent: string): MarkdownWithImage { return { content, imageUrl, mentionedUsers }; } + +const imageMarkdownRegex = /(!\[.*?\]\()(upload:\/\/\S*)(\))/g; +export function generateMarkdownContent( + raw: string, + imageUrls?: Array, +) { + let imageCount = 0; + const markdown = raw.replace( + imageMarkdownRegex, + ( + _: string, + imageName: string, + _shortImageUrl: string, + closeParenthesis: string, + ) => { + const currentImageUrl = imageUrls?.[imageCount] ?? DEFAULT_IMAGE; + const modifiedImageMarkdown = `${imageName}${currentImageUrl}${closeParenthesis}`; + imageCount += 1; + + return modifiedImageMarkdown; + }, + ); + return markdown; +} diff --git a/frontend/src/helpers/replaceQuotesWithMarkdown.ts b/frontend/src/helpers/replaceQuotesWithMarkdown.ts new file mode 100644 index 00000000..a42c91fc --- /dev/null +++ b/frontend/src/helpers/replaceQuotesWithMarkdown.ts @@ -0,0 +1,71 @@ +import { QUOTE_CLOSE_REGEX, QUOTE_OPEN_REGEX } from '../constants'; + +import { extractAttributes } from './extractAttributes'; + +export function replaceQuotesWithMarkdown(input: string) { + // Check whether there is a quote or not + if (!input.includes('[quote')) { + return input; + } + + const contentArray = input.split('\n'); + const replacedContent = []; + let indentation = 0; + + for (const content of contentArray) { + const openQuoteArray = content.match(QUOTE_OPEN_REGEX); + const closeQuoteArray = content.match(QUOTE_CLOSE_REGEX); + + // If the current line has no open quote and close quote, + // push the contents to the array and continue to the next loop + if (!openQuoteArray && !closeQuoteArray) { + const prefix = '> '.repeat(indentation); + replacedContent.push(`${prefix}${content.trim()}`); + + continue; + } + + let replacedCode = content; + if (openQuoteArray) { + indentation++; + + replacedCode = replacedCode.replace( + QUOTE_OPEN_REGEX, + (_match, attribute: string) => { + if (!attribute) { + return ''; + } + + // If username is not in the attributes + // we will replace it with "(unknown user)". + let username = '(unknown user)'; + const extracted = extractAttributes(attribute); + + if (extracted?.username) { + username = `@${extracted.username}`; + } else { + const quoteAttribute = attribute.split(', '); + + if (quoteAttribute.length > 0 && !quoteAttribute[0].includes(':')) { + username = `@${quoteAttribute[0]}`; + } + } + + return `${'> '.repeat(indentation)}${username}`; + }, + ); + } + + if (closeQuoteArray) { + indentation--; + replacedCode = replacedCode.replace(QUOTE_CLOSE_REGEX, ''); + replacedContent.push(`${'> '.repeat(indentation)}`); + } + + if (replacedCode.length > 0) { + replacedContent.push(`${replacedCode}`); + } + } + + return replacedContent.join('\n'); +} diff --git a/frontend/src/helpers/storage.ts b/frontend/src/helpers/storage.ts index bc1db35c..dee67fae 100644 --- a/frontend/src/helpers/storage.ts +++ b/frontend/src/helpers/storage.ts @@ -3,7 +3,7 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; const TOKEN_KEY = '@auth:sessionToken'; export let setToken = (userToken: string) => { - AsyncStorage.setItem(TOKEN_KEY, userToken); + return AsyncStorage.setItem(TOKEN_KEY, userToken); }; export let getToken = async () => { diff --git a/frontend/src/helpers/transformTopicToPost.ts b/frontend/src/helpers/transformTopicToPost.ts new file mode 100644 index 00000000..9e363975 --- /dev/null +++ b/frontend/src/helpers/transformTopicToPost.ts @@ -0,0 +1,69 @@ +import { NO_EXCERPT_WORDING } from '../constants'; +import { TopicsQuery } from '../generated/server'; +import { Channel, PostWithoutId } from '../types'; + +import { findChannelByCategoryId } from './findChannelByCategoryId'; +import { getImage } from './getUserImage'; + +type Topic = NonNullable< + NonNullable['topics'] +>[0]; + +type Params = Topic & { channels?: Array }; + +/** + * Transforming topic type from our graphql response + * to a Post type that we usually based our component props on + */ +let transformTopicToPost = ({ + posters, + id, + title, + excerpt, + visible, + authorUserId, + pinned, + liked, + likeCount, + postsCount, + tags, + bumpedAt: createdAt, + views, + categoryId, + channels, + imageUrl, +}: Params): PostWithoutId => { + const author = posters.find(({ userId }) => userId === authorUserId); + const frequentUser = posters.map(({ user }) => { + return { + id: user?.id || 0, + username: user?.username ?? '', + avatar: getImage(user?.avatar ?? ''), + }; + }); + const channel = findChannelByCategoryId({ + categoryId, + channels, + }); + const authorUser = author?.user; + return { + topicId: id, + title, + content: excerpt || NO_EXCERPT_WORDING, + hidden: !visible, + username: authorUser?.username ?? '', + avatar: authorUser ? getImage(authorUser.avatar) : '', + pinned, + replyCount: postsCount - 1, + likeCount, + viewCount: views, + isLiked: liked || false, + channel: channel, + tags: tags || [], + createdAt, + freqPosters: frequentUser, + imageUrls: imageUrl ? [imageUrl] : undefined, + }; +}; + +export { transformTopicToPost }; diff --git a/frontend/src/helpers/updateLike.ts b/frontend/src/helpers/updateLike.ts new file mode 100644 index 00000000..e7f54601 --- /dev/null +++ b/frontend/src/helpers/updateLike.ts @@ -0,0 +1,71 @@ +import { ActionSummary, Post } from '../generated/server'; + +import { ActionsSummaryType } from './postDetailContentHandler'; + +export type PostActionsSummary = Post['actionsSummary']; + +type UpdateLikePropsParams = { + liked: boolean; + previousCount: number; +}; + +type UpdateSummaryParams = { + cachedActionsSummary: PostActionsSummary; + previousCount?: number; + liked: boolean; +}; + +export function getUpdatedLikeCount(params: UpdateLikePropsParams) { + const { liked, previousCount } = params; + return liked ? previousCount + 1 : Math.max(0, previousCount - 1); +} + +export function getLikeActionSummary(actionsSummary: PostActionsSummary) { + const likeAction = actionsSummary?.find( + ({ id }: { id: number }) => id === ActionsSummaryType.Like, + ); + return { + liked: likeAction?.acted ?? false, + likeCount: likeAction?.count ?? 0, + }; +} + +export const firstLikeActivitySummary: ActionSummary = { + __typename: 'ActionSummary', + id: ActionsSummaryType.Like, + acted: true, + count: 1, +}; + +export function getUpdatedSummaryOnToggleLike(params: UpdateSummaryParams) { + let { cachedActionsSummary, previousCount, liked } = params; + + if (!cachedActionsSummary) { + return [firstLikeActivitySummary]; + } + + const likeActionIndex = cachedActionsSummary.findIndex( + ({ id }: { id: number }) => id === ActionsSummaryType.Like, + ); + + // Like action index is null or not found means existing post does not have any likes + if (likeActionIndex === -1) { + return [...cachedActionsSummary, firstLikeActivitySummary]; + } + + const actionsSummary = [...cachedActionsSummary]; + const prevLikeActionSummary = cachedActionsSummary[likeActionIndex]; + + // Get previous like count from cache if previousCount param is undefined + if (!previousCount) { + previousCount = prevLikeActionSummary.count ?? 0; + } + + actionsSummary[likeActionIndex] = { + ...prevLikeActionSummary, + acted: liked, + count: getUpdatedLikeCount({ liked, previousCount }), + }; + + return actionsSummary; +} diff --git a/frontend/src/hooks/auth/useLogin.ts b/frontend/src/hooks/auth/useLogin.ts index 752b6974..3f73d4d4 100644 --- a/frontend/src/hooks/auth/useLogin.ts +++ b/frontend/src/hooks/auth/useLogin.ts @@ -1,21 +1,21 @@ import { MutationHookOptions } from '@apollo/client'; import { - Login as LoginType, - LoginVariables, -} from '../../generated/server/Auth'; + LoginMutation as LoginType, + LoginMutationVariables, +} from '../../generated/server'; import { LOGIN } from '../../graphql/server/auth'; import { useMutation } from '../../utils'; export function useLogin( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { - const [login, { loading, error }] = useMutation( - LOGIN, - { - ...options, - }, - ); + const [login, { loading, error }] = useMutation< + LoginType, + LoginMutationVariables + >(LOGIN, { + ...options, + }); return { login, loading, error }; } diff --git a/frontend/src/hooks/auth/useLogout.ts b/frontend/src/hooks/auth/useLogout.ts index cf10f43a..5522f912 100644 --- a/frontend/src/hooks/auth/useLogout.ts +++ b/frontend/src/hooks/auth/useLogout.ts @@ -1,19 +1,30 @@ import { MutationHookOptions } from '@apollo/client'; import { - Logout as LogoutType, - LogoutVariables, -} from '../../generated/server/Auth'; + LogoutMutation as LogoutType, + LogoutMutationVariables, +} from '../../generated/server'; import { LOGOUT } from '../../graphql/server/auth'; import { useMutation } from '../../utils'; +import { getExpoPushTokenHandler } from '../../helpers'; export function useLogout( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { - const [logout, { loading }] = useMutation( - LOGOUT, - { ...options }, - ); + const [mutate, { loading }] = useMutation< + LogoutType, + LogoutMutationVariables + >(LOGOUT, { ...options }); + const logout = async ({ username }: { username: string }) => { + const { token } = await getExpoPushTokenHandler(); + + mutate({ + variables: { + pushNotificationsToken: token, + username, + }, + }); + }; return { logout, loading }; } diff --git a/frontend/src/hooks/auth/usePushNotifications.ts b/frontend/src/hooks/auth/usePushNotifications.ts new file mode 100644 index 00000000..66ed79ad --- /dev/null +++ b/frontend/src/hooks/auth/usePushNotifications.ts @@ -0,0 +1,120 @@ +import { useState, useCallback, useEffect } from 'react'; +import { Platform } from 'react-native'; +import { MutationHookOptions } from '@apollo/client'; +import Constants from 'expo-constants'; +import * as Notifications from 'expo-notifications'; + +import { + PushNotificationsMutation, + PushNotificationsMutationVariables, + PushNotificationsDocument, +} from '../../generated/server'; +import { useMutation } from '../../utils/useMutation'; +import { + getExpoPushTokenHandler, + pushNotificationsSetupFailAlert, + useStorage, +} from '../../helpers'; +import { DEFAULT_NOTIFICATION_BEHAVIOUR } from '../../constants'; +import { getExperienceId } from '../../helpers/experienceId'; + +export function usePushNotificationsToken() { + const mutatePushNotifications = usePushNotificationsMutation(); + const syncToken = useCallback(async () => { + const { success, token } = await getExpoPushTokenHandler(); + if (!success) { + return; + } + mutatePushNotifications?.mutatePushNotifications(token); + }, [mutatePushNotifications]); + + return { syncToken }; +} + +export function usePushNotificationsMutation( + options?: MutationHookOptions< + PushNotificationsMutation, + PushNotificationsMutationVariables + >, +) { + const [mutate, { loading, error }] = useMutation< + PushNotificationsMutation, + PushNotificationsMutationVariables + >(PushNotificationsDocument, { + ...options, + }); + + /** + * According to the Expo documentation, the experienceID format contains `/`. For the username, it uses your Expo account username, and for the slug, it uses the slug of your app from the `app.json` file. + * To configure the experienceID, you can modify the value in the `app.json` file under currentFullName. Simply update the value based on your app. + */ + + const mutatePushNotifications = (expoToken: string) => { + const experienceIdResult = getExperienceId(); + if (!experienceIdResult.success) { + pushNotificationsSetupFailAlert(); + return; + } + + const defaultVariable = { + applicationName: Constants.expoConfig?.name ?? 'Lexicon Mobile App', + experienceId: experienceIdResult.result, + platform: Platform.OS, + }; + + mutate({ + variables: { + ...defaultVariable, + PushNotificationsToken: expoToken, + }, + }); + }; + + return { mutatePushNotifications, loading, error }; +} + +export type PushNotificationsPreferences = { + shouldShowAlert: boolean; + shouldPlaySound: boolean; + shouldSetBadge: boolean; +}; + +export type SetPnPreferences = (params: { + key: keyof PushNotificationsPreferences; + active: boolean; +}) => void; + +export function usePushNotificationsPreferences() { + const storage = useStorage(); + + const cachedPushNotificationsPreferences = + storage.getItem('pushNotifications'); + + const [pushNotificationsPreferences, setPushNotificationsPreferences] = + useState({ + ...DEFAULT_NOTIFICATION_BEHAVIOUR, + ...cachedPushNotificationsPreferences, + }); + + useEffect(() => { + storage.setItem('pushNotifications', pushNotificationsPreferences); + Notifications.setNotificationHandler({ + handleNotification: async () => DEFAULT_NOTIFICATION_BEHAVIOUR, + }); + }, [pushNotificationsPreferences, storage]); + + const setPnPreferences = useCallback( + ({ key, active }) => { + setPushNotificationsPreferences({ + ...pushNotificationsPreferences, + [key]: active, + }); + }, + [pushNotificationsPreferences], + ); + + return { + pushNotificationsPreferences, + setPnPreferences, + }; +} diff --git a/frontend/src/hooks/auth/useRefreshToken.ts b/frontend/src/hooks/auth/useRefreshToken.ts index b2de75c3..eb508981 100644 --- a/frontend/src/hooks/auth/useRefreshToken.ts +++ b/frontend/src/hooks/auth/useRefreshToken.ts @@ -1,16 +1,18 @@ import { LazyQueryHookOptions } from '@apollo/client'; -import { RefreshToken } from '../../generated/server/RefreshToken'; -import { REFRESH_TOKEN } from '../../graphql/server/refreshToken'; +import { + RefreshTokenQuery, + RefreshTokenDocument, +} from '../../generated/server'; import { ErrorAlertOptionType } from '../../types'; import { useLazyQuery } from '../../utils'; export function useRefreshToken( - options?: LazyQueryHookOptions, + options?: LazyQueryHookOptions, errorAlert: ErrorAlertOptionType = 'SHOW_ALERT', ) { - const [getRefreshToken, { data, error }] = useLazyQuery( - REFRESH_TOKEN, + const [getRefreshToken, { data, error }] = useLazyQuery( + RefreshTokenDocument, { ...options, }, diff --git a/frontend/src/hooks/auth/useRegister.ts b/frontend/src/hooks/auth/useRegister.ts index 8e7a9fb1..2d3fe439 100644 --- a/frontend/src/hooks/auth/useRegister.ts +++ b/frontend/src/hooks/auth/useRegister.ts @@ -1,19 +1,19 @@ import { MutationHookOptions } from '@apollo/client'; import { - Register as RegisterType, - RegisterVariables, -} from '../../generated/server/Auth'; -import { REGISTER } from '../../graphql/server/auth'; + RegisterMutation as RegisterType, + RegisterMutationVariables, + RegisterDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useRegister( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { - const [register, { loading }] = useMutation( - REGISTER, - { ...options }, - ); + const [register, { loading }] = useMutation< + RegisterType, + RegisterMutationVariables + >(RegisterDocument, { ...options }); return { register, loading }; } diff --git a/frontend/src/hooks/index.ts b/frontend/src/hooks/index.ts index 0a16b969..f6f798b6 100644 --- a/frontend/src/hooks/index.ts +++ b/frontend/src/hooks/index.ts @@ -1,5 +1,6 @@ export * from './auth/useLogin'; export * from './auth/useLogout'; +export * from './auth/usePushNotifications'; export * from './auth/useRefreshToken'; export * from './auth/useRegister'; @@ -7,9 +8,11 @@ export * from './post/useActivity'; export * from './post/useEditPost'; export * from './post/useEditTopic'; export * from './post/useFlagPost'; -export * from './post/useLikePost'; +export * from './post/useLikeTopicOrPost'; +export * from './post/useLoadMorePost'; export * from './post/useLookupUrls'; export * from './post/useMention'; +export * from './post/useMessageDetail'; export * from './post/useMessageList'; export * from './post/useNewMessage'; export * from './post/useNewTopic'; diff --git a/frontend/src/hooks/post/useActivity.ts b/frontend/src/hooks/post/useActivity.ts index 2373d996..3cb8e29d 100644 --- a/frontend/src/hooks/post/useActivity.ts +++ b/frontend/src/hooks/post/useActivity.ts @@ -1,24 +1,25 @@ import { LazyQueryHookOptions, QueryHookOptions } from '@apollo/client'; import { - UserActivity as UserActivityType, - UserActivityVariables, -} from '../../generated/server/UserActivity'; -import { USER_ACTIVITY } from '../../graphql/server/userActivity'; + UserActivityQuery as UserActivityType, + UserActivityQueryVariables, + UserActivityDocument, +} from '../../generated/server'; import { ErrorAlertOptionType } from '../../types'; import { useLazyQuery, useQuery } from '../../utils'; export function useActivity( - options?: QueryHookOptions, + options?: QueryHookOptions, errorAlert: ErrorAlertOptionType = 'SHOW_ALERT', ) { const { data, loading, error, networkStatus, refetch, fetchMore } = useQuery< UserActivityType, - UserActivityVariables + UserActivityQueryVariables >( - USER_ACTIVITY, + UserActivityDocument, { ...options, + fetchPolicy: 'network-only', }, errorAlert, ); @@ -27,14 +28,14 @@ export function useActivity( } export function useLazyActivity( - options?: LazyQueryHookOptions, + options?: LazyQueryHookOptions, errorAlert: ErrorAlertOptionType = 'SHOW_ALERT', ) { const [getActivity, { data, error }] = useLazyQuery< UserActivityType, - UserActivityVariables + UserActivityQueryVariables >( - USER_ACTIVITY, + UserActivityDocument, { ...options, }, diff --git a/frontend/src/hooks/post/useEditPost.ts b/frontend/src/hooks/post/useEditPost.ts index 32a275c0..5465f92e 100644 --- a/frontend/src/hooks/post/useEditPost.ts +++ b/frontend/src/hooks/post/useEditPost.ts @@ -1,19 +1,19 @@ import { MutationHookOptions } from '@apollo/client'; import { - EditPost as EditPostType, - EditPostVariables, -} from '../../generated/server/GetTopicDetail'; -import { EDIT_POST } from '../../graphql/server/getTopicDetail'; + EditPostMutation as EditPostType, + EditPostMutationVariables, + EditPostDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useEditPost( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { - const [editPost, { loading }] = useMutation( - EDIT_POST, - { ...options }, - ); + const [editPost, { loading }] = useMutation< + EditPostType, + EditPostMutationVariables + >(EditPostDocument, { ...options }); return { editPost, loading }; } diff --git a/frontend/src/hooks/post/useEditTopic.ts b/frontend/src/hooks/post/useEditTopic.ts index 24009d72..d3d2d245 100644 --- a/frontend/src/hooks/post/useEditTopic.ts +++ b/frontend/src/hooks/post/useEditTopic.ts @@ -1,19 +1,19 @@ import { MutationHookOptions } from '@apollo/client'; import { - EditTopic as EditTopicType, - EditTopicVariables, -} from '../../generated/server/GetTopicDetail'; -import { EDIT_TOPIC } from '../../graphql/server/getTopicDetail'; + EditTopicMutation as EditTopicType, + EditTopicMutationVariables, + EditTopicDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useEditTopic( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { const [editTopic, { loading }] = useMutation< EditTopicType, - EditTopicVariables - >(EDIT_TOPIC, { + EditTopicMutationVariables + >(EditTopicDocument, { ...options, }); diff --git a/frontend/src/hooks/post/useFlagPost.ts b/frontend/src/hooks/post/useFlagPost.ts index 28f85d6e..78636c9d 100644 --- a/frontend/src/hooks/post/useFlagPost.ts +++ b/frontend/src/hooks/post/useFlagPost.ts @@ -1,21 +1,21 @@ import { MutationHookOptions } from '@apollo/client'; import { - FlagPost as FlagPostType, - FlagPostVariables, -} from '../../generated/server/FlagPost'; -import { FLAG_POST } from '../../graphql/server/flagPost'; + FlagPostMutation as FlagPostType, + FlagPostMutationVariables, + FlagPostDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useFlagPost( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { - const [flag, { loading }] = useMutation( - FLAG_POST, - { - ...options, - }, - ); + const [flag, { loading }] = useMutation< + FlagPostType, + FlagPostMutationVariables + >(FlagPostDocument, { + ...options, + }); return { flag, loading }; } diff --git a/frontend/src/hooks/post/useLikePost.ts b/frontend/src/hooks/post/useLikePost.ts deleted file mode 100644 index 3cc14bef..00000000 --- a/frontend/src/hooks/post/useLikePost.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { LikePost, LikePostVariables } from '../../generated/server/LikePost'; -import { likePost } from '../../graphql/server/likePost'; -import { errorHandlerAlert } from '../../helpers'; -import { useMutation } from '../../utils'; - -export function useLikePost( - likeCount: number, - setLikeCount: (val: number) => void, - postList?: boolean, - postId?: number, - tempLiked?: Array, - setTempLiked?: (val: Array) => void, - tempLikedShadow?: Array, - setTempLikedShadow?: (val: Array) => void, - counter?: number, - setCounter?: (val: number) => void, -) { - const [like, { loading }] = useMutation( - likePost, - { - onError: (e) => { - if (postList && postId && tempLikedShadow) { - let counter = likeCount; - if (!tempLikedShadow.includes(postId)) { - setTempLikedShadow && - setTempLikedShadow([...tempLikedShadow, postId]); - setCounter && setCounter(counter ? counter + 1 : 0); - } else { - let index = tempLikedShadow.indexOf(postId); - let revertTempLiked = [...tempLikedShadow]; - if (index >= 0) { - revertTempLiked?.splice(index, 1); - } - setTempLikedShadow && setTempLikedShadow(revertTempLiked); - setCounter && setCounter(counter ? counter - 1 : 0); - } - } - setLikeCount && setLikeCount(counter ? counter : 0); - setTempLiked && tempLikedShadow && setTempLiked([...tempLikedShadow]); - errorHandlerAlert(e, undefined, false); - }, - }, - ); - - return { like, loading }; -} diff --git a/frontend/src/hooks/post/useLikeTopicOrPost.ts b/frontend/src/hooks/post/useLikeTopicOrPost.ts new file mode 100644 index 00000000..fd59811c --- /dev/null +++ b/frontend/src/hooks/post/useLikeTopicOrPost.ts @@ -0,0 +1,224 @@ +import { + MutationUpdaterFunction, + DefaultContext, + ApolloCache, + OnQueryUpdated, + FetchResult, + InternalRefetchQueriesInclude, + ApolloError, +} from '@apollo/client'; +import { useNavigation } from '@react-navigation/native'; +import { useRef } from 'react'; + +import { DEFAULT_POST_ID, FIRST_POST_NUMBER } from '../../constants'; +import { + LikeTopicOrPostMutation, + LikeTopicOrPostMutationVariables as BaseLikeTopicOrPostVariables, + TopicDetailFragment, + GetTopicDetailDocument, + TopicDetailFragmentDoc, + LikeTopicOrPostDocument, + PostLikeFragmentDoc, + TopicLikeFragmentDoc, +} from '../../generated/server'; +import { client } from '../../graphql/client'; +import { TOPICS } from '../../graphql/server/topics'; +import { + errorHandlerAlert, + getLikeActionSummary, + getUpdatedLikeCount, + getUpdatedSummaryOnToggleLike, +} from '../../helpers'; +import { StackNavProp } from '../../types'; +import { useOngoingLikedTopic, useMutation } from '../../utils'; + +type LikeTopicOrPostVariables = BaseLikeTopicOrPostVariables & { + likeCount: number; +}; + +type MutationOnError = (error: ApolloError) => void; +type MutationOptimisticResponse = ( + vars: LikeTopicOrPostVariables, +) => LikeTopicOrPostMutation; +type MutationRefetchQueries = ( + result: FetchResult, +) => InternalRefetchQueriesInclude; +type MutationUpdate = MutationUpdaterFunction< + LikeTopicOrPostMutation, + LikeTopicOrPostVariables, + DefaultContext, + ApolloCache +>; + +const optimisticResponse: MutationOptimisticResponse = ({ + unlike, + topicId, + postId, + likeCount: previousCount, +}) => { + const liked = !unlike; + + // Liking Post from Topic List + if (topicId) { + const likeCount = getUpdatedLikeCount({ liked, previousCount }); + // Get first post ID of the topic + const cachedTopicDetail = client.readFragment( + { + id: `TopicDetailOutput:${topicId}`, + fragment: TopicDetailFragmentDoc, + }, + true, + ); + const firstPost = cachedTopicDetail?.postStream.posts.find( + ({ postNumber }) => postNumber === FIRST_POST_NUMBER, + ); + + return { + __typename: 'Mutation', + likeTopicOrPost: { + __typename: 'LikedTopic', + postId: firstPost?.id ?? DEFAULT_POST_ID, + topicId, + likeCount, + liked, + }, + }; + } + + // Liking Post from Post Detail + const cachedPost = client.readFragment( + { id: `Post:${postId}`, fragment: PostLikeFragmentDoc }, + true, + ); + + const actionsSummary = getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: cachedPost?.actionsSummary, + liked, + previousCount, + }); + return { + __typename: 'Mutation', + likeTopicOrPost: { + __typename: 'Post', + ...cachedPost, + actionsSummary, + }, + }; +}; + +const refetchQueries: MutationRefetchQueries = ({ data }) => { + const topicDetailQuery = { + query: GetTopicDetailDocument, + variables: { topicId: data?.likeTopicOrPost.topicId }, + }; + return [TOPICS, topicDetailQuery]; +}; + +const onQueryUpdated: OnQueryUpdated = async (observableQuery) => { + // Ensuring topics list query is being refetched + if (observableQuery.queryName === 'Topics') { + observableQuery.setOptions({ + context: { queryDeduplication: false }, + }); + } + return observableQuery.refetch(); +}; + +export function useLikeTopicOrPost() { + const { navigate } = useNavigation>(); + const { removeOngoingLikedTopic, addOngoingLikedTopic } = + useOngoingLikedTopic(); + let topicIdRef = useRef(); + + const update: MutationUpdate = (cache, { data }) => { + if (!data) { + return; + } + topicIdRef.current = data.likeTopicOrPost.topicId; + + // Liking post from Post Detail Scene + // eslint-disable-next-line no-underscore-dangle + if (data.likeTopicOrPost.__typename !== 'LikedTopic') { + const { actionsSummary, topicId, postNumber } = data.likeTopicOrPost; + const { liked } = getLikeActionSummary(actionsSummary); + + // Updating topic cache + cache.updateFragment( + { id: `Topic:${topicId}`, fragment: TopicLikeFragmentDoc }, + (data) => { + if (!data) { + return; + } + + const { likeCount: previousCount, liked: previousLiked } = data; + const isFirstPost = postNumber === FIRST_POST_NUMBER; + const likeCount = getUpdatedLikeCount({ liked, previousCount }); + + /** + * If it's not the first post, then the new liked value + * doesn't resemble the liked value for topic, + * so we only update the likeCount + */ + const likedData = { + likeCount, + liked: isFirstPost ? liked : previousLiked, + }; + addOngoingLikedTopic(topicId, likedData); + return { ...data, ...likedData }; + }, + ); + // Updating post cache + return data; + } + + // Liking post from Home Scene + const { liked, likeCount, topicId, postId } = data.likeTopicOrPost; + // Updating post cache + cache.updateFragment( + { id: `Post:${postId}`, fragment: PostLikeFragmentDoc }, + (data) => { + if (!data) { + return; + } + const actionsSummary = getUpdatedSummaryOnToggleLike({ + cachedActionsSummary: data.actionsSummary, + liked, + }); + return { ...data, actionsSummary }; + }, + ); + + // Updating topic cache + addOngoingLikedTopic(topicId, { liked, likeCount }); + cache.updateFragment( + { id: `Topic:${topicId}`, fragment: TopicLikeFragmentDoc }, + (data) => ({ ...data, liked, likeCount }), + ); + }; + + const removeTopicFromOngoingLikedTopic = () => { + if (topicIdRef.current) { + removeOngoingLikedTopic(topicIdRef.current); + } + }; + + const onError: MutationOnError = (e) => { + removeTopicFromOngoingLikedTopic(); + // TODO: add navigation #800 + errorHandlerAlert(e, navigate, false); + }; + + const mutation = useMutation< + LikeTopicOrPostMutation, + LikeTopicOrPostVariables + >(LikeTopicOrPostDocument, { + update, + optimisticResponse, + onError, + onCompleted: removeTopicFromOngoingLikedTopic, + refetchQueries, + onQueryUpdated, + }); + + return mutation; +} diff --git a/frontend/src/hooks/post/useLoadMorePost.ts b/frontend/src/hooks/post/useLoadMorePost.ts new file mode 100644 index 00000000..8d3cd87f --- /dev/null +++ b/frontend/src/hooks/post/useLoadMorePost.ts @@ -0,0 +1,99 @@ +import { ApolloQueryResult, FetchMoreQueryOptions } from '@apollo/client'; +import { useCallback, useState } from 'react'; + +import { + GetTopicDetailQuery, + GetTopicDetailQueryVariables, + GetMessageDetailQuery, + GetMessageDetailQueryVariables, +} from '../../generated/server'; +import { getFetchMorePostIds } from '../../helpers'; + +type FetchData = GetTopicDetailQuery | GetMessageDetailQuery; +type FetchVariables = + | GetTopicDetailQueryVariables + | GetMessageDetailQueryVariables; + +export type LoadMorePostsParams< + TFetchVars extends FetchVariables, + TFetchData extends FetchData, +> = { + stream?: Array; + loadNewerPosts: boolean; + hasMorePost: boolean; + lastLoadedPostIndex?: number; + firstLoadedPostIndex?: number; + fetchMoreVariables?: Partial; + fetchMore: ( + fetchMoreOptions: FetchMoreQueryOptions, + ) => Promise>; +}; + +export function useLoadMorePost(topicId: number) { + const [isLoadingOlderPost, setisLoadingOlderPost] = useState(false); + const [isLoadingNewerPost, setisLoadingNewerPost] = useState(false); + + const loadMorePosts = useCallback( + async ( + params: LoadMorePostsParams, + ) => { + const { + stream, + fetchMore, + firstLoadedPostIndex, + hasMorePost, + lastLoadedPostIndex, + loadNewerPosts, + fetchMoreVariables, + } = params; + if ( + !stream || + !hasMorePost || + !firstLoadedPostIndex || + !lastLoadedPostIndex || + (loadNewerPosts ? isLoadingNewerPost : isLoadingOlderPost) + ) { + return; + } + + if (loadNewerPosts) { + setisLoadingNewerPost(true); + } else { + setisLoadingOlderPost(true); + } + + const { nextFirstLoadedPostIndex, nextLastLoadedPostIndex, postIds } = + getFetchMorePostIds({ + stream, + ...(loadNewerPosts + ? { type: 'newer', lastLoadedPostIndex } + : { type: 'older', firstLoadedPostIndex }), + }); + + if (!postIds?.length) { + return; + } + + let { error } = await fetchMore({ + variables: { + topicId, + postIds, + postNumber: undefined, + ...fetchMoreVariables, + } as Partial, + }); + + setisLoadingNewerPost(false); + setisLoadingOlderPost(false); + + if (error) { + return; + } + + return { nextLastLoadedPostIndex, nextFirstLoadedPostIndex }; + }, + [isLoadingNewerPost, isLoadingOlderPost, topicId], + ); + + return { loadMorePosts, isLoadingNewerPost, isLoadingOlderPost }; +} diff --git a/frontend/src/hooks/post/useLookupUrls.ts b/frontend/src/hooks/post/useLookupUrls.ts index 24e951de..eb895483 100644 --- a/frontend/src/hooks/post/useLookupUrls.ts +++ b/frontend/src/hooks/post/useLookupUrls.ts @@ -1,16 +1,19 @@ import { LazyQueryHookOptions } from '@apollo/client'; -import { LookupUrls, LookupUrlsVariables } from '../../generated/server/Topics'; -import { LOOKUP_URLS } from '../../graphql/server/topics'; +import { + LookupUrlsQuery, + LookupUrlsQueryVariables, + LookupUrlsDocument, +} from '../../generated/server'; import { useLazyQuery } from '../../utils'; export function useLookupUrls( - options?: LazyQueryHookOptions, + options?: LazyQueryHookOptions, ) { - const [getImageUrls] = useLazyQuery( - LOOKUP_URLS, - { ...options }, - ); + const [getImageUrls, { loading }] = useLazyQuery< + LookupUrlsQuery, + LookupUrlsQueryVariables + >(LookupUrlsDocument, { ...options }); - return { getImageUrls }; + return { getImageUrls, loading }; } diff --git a/frontend/src/hooks/post/useMention.ts b/frontend/src/hooks/post/useMention.ts index 2b1e06f8..4f3f64b6 100644 --- a/frontend/src/hooks/post/useMention.ts +++ b/frontend/src/hooks/post/useMention.ts @@ -1,7 +1,10 @@ import { useEffect, useState } from 'react'; -import { SearchUser, SearchUserVariables } from '../../generated/server/Search'; -import { SEARCH_USER } from '../../graphql/server/search'; +import { + SearchUserQuery, + SearchUserQueryVariables, + SearchUserDocument, +} from '../../generated/server'; import { getImage } from '../../helpers'; import { SelectedUserProps } from '../../types'; import { useLazyQuery } from '../../utils'; @@ -15,9 +18,9 @@ export function useMention( useState>(); const [getMentionList, { data: searchData, loading }] = useLazyQuery< - SearchUser, - SearchUserVariables - >(SEARCH_USER, { + SearchUserQuery, + SearchUserQueryVariables + >(SearchUserDocument, { variables: { search: mentionKeyword }, onCompleted: () => { let formattedMember = searchData?.searchUser.users.map( diff --git a/frontend/src/hooks/post/useMessageDetail.ts b/frontend/src/hooks/post/useMessageDetail.ts new file mode 100644 index 00000000..7cd10fae --- /dev/null +++ b/frontend/src/hooks/post/useMessageDetail.ts @@ -0,0 +1,24 @@ +import { QueryHookOptions } from '@apollo/client'; + +import { + GetMessageDetailQuery, + GetMessageDetailQueryVariables, + GetMessageDetailDocument, +} from '../../generated/server'; +import { ErrorAlertOptionType } from '../../types'; +import { useQuery } from '../../utils'; + +export function useMessageDetail( + options?: QueryHookOptions< + GetMessageDetailQuery, + GetMessageDetailQueryVariables + >, + errorAlert: ErrorAlertOptionType = 'SHOW_ALERT', +) { + const { data, loading, error, fetchMore, refetch } = useQuery< + GetMessageDetailQuery, + GetMessageDetailQueryVariables + >(GetMessageDetailDocument, { ...options }, errorAlert); + + return { data, loading, error, refetch, fetchMore }; +} diff --git a/frontend/src/hooks/post/useMessageList.ts b/frontend/src/hooks/post/useMessageList.ts index 66cc4868..71289dd8 100644 --- a/frontend/src/hooks/post/useMessageList.ts +++ b/frontend/src/hooks/post/useMessageList.ts @@ -1,10 +1,10 @@ import { QueryHookOptions } from '@apollo/client'; import { - Message as MessageListType, - MessageVariables as MessageListVariables, -} from '../../generated/server/Message'; -import { MESSAGE } from '../../graphql/server/message'; + MessageQuery as MessageListType, + MessageQueryVariables as MessageListVariables, + MessageDocument, +} from '../../generated/server'; import { ErrorAlertOptionType } from '../../types'; import { useQuery } from '../../utils'; @@ -16,7 +16,7 @@ export function useMessageList( MessageListType, MessageListVariables >( - MESSAGE, + MessageDocument, { ...options, }, diff --git a/frontend/src/hooks/post/useNewMessage.ts b/frontend/src/hooks/post/useNewMessage.ts index 13a31636..52e585a0 100644 --- a/frontend/src/hooks/post/useNewMessage.ts +++ b/frontend/src/hooks/post/useNewMessage.ts @@ -1,10 +1,10 @@ import { MutationHookOptions } from '@apollo/client'; import { - NewPrivateMessage as NewMessageType, - NewPrivateMessageVariables as NewMessageVariables, -} from '../../generated/server/Message'; -import { NEW_PRIVATE_MESSAGE } from '../../graphql/server/message'; + NewPrivateMessageMutation as NewMessageType, + NewPrivateMessageMutationVariables as NewMessageVariables, + NewPrivateMessageDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useNewMessage( @@ -13,7 +13,7 @@ export function useNewMessage( const [newMessage, { loading }] = useMutation< NewMessageType, NewMessageVariables - >(NEW_PRIVATE_MESSAGE, { ...options }); + >(NewPrivateMessageDocument, { ...options }); return { newMessage, loading }; } diff --git a/frontend/src/hooks/post/useNewTopic.ts b/frontend/src/hooks/post/useNewTopic.ts index d84fa318..cded7473 100644 --- a/frontend/src/hooks/post/useNewTopic.ts +++ b/frontend/src/hooks/post/useNewTopic.ts @@ -1,19 +1,19 @@ import { MutationHookOptions } from '@apollo/client'; import { - NewTopic as NewTopicType, - NewTopicVariables, -} from '../../generated/server/NewTopic'; -import { NEW_TOPIC } from '../../graphql/server/newTopic'; + NewTopicMutation as NewTopicType, + NewTopicMutationVariables, + NewTopicDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useNewTopic( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { - const [newTopic, { loading }] = useMutation( - NEW_TOPIC, - { ...options }, - ); + const [newTopic, { loading }] = useMutation< + NewTopicType, + NewTopicMutationVariables + >(NewTopicDocument, { ...options }); return { newTopic, loading }; } diff --git a/frontend/src/hooks/post/usePostRaw.ts b/frontend/src/hooks/post/usePostRaw.ts index b7d5b4a1..7ad2cdf1 100644 --- a/frontend/src/hooks/post/usePostRaw.ts +++ b/frontend/src/hooks/post/usePostRaw.ts @@ -1,19 +1,19 @@ import { MutationHookOptions } from '@apollo/client'; import { - PostRaw as PostRawType, - PostRawVariables, -} from '../../generated/server/PostRaw'; -import { POST_RAW } from '../../graphql/server/postRaw'; + PostRawQuery as PostRawType, + PostRawQueryVariables, + PostRawDocument, +} from '../../generated/server'; import { useLazyQuery } from '../../utils'; export function usePostRaw( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { - const [postRaw, { loading }] = useLazyQuery( - POST_RAW, - { ...options }, - ); + const [postRaw, { loading }] = useLazyQuery< + PostRawType, + PostRawQueryVariables + >(PostRawDocument, { ...options }); return { postRaw, loading }; } diff --git a/frontend/src/hooks/post/useReplyPost.ts b/frontend/src/hooks/post/useReplyPost.ts index fba4f717..53eedb4d 100644 --- a/frontend/src/hooks/post/useReplyPost.ts +++ b/frontend/src/hooks/post/useReplyPost.ts @@ -1,17 +1,17 @@ import { MutationHookOptions } from '@apollo/client'; import { - Reply as ReplyPostType, - ReplyVariables as ReplyPostVariables, -} from '../../generated/server/Reply'; -import { REPLY } from '../../graphql/server/reply'; + ReplyMutation as ReplyPostType, + ReplyMutationVariables as ReplyPostVariables, + ReplyDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useReplyPost( options?: MutationHookOptions, ) { const [reply, { loading }] = useMutation( - REPLY, + ReplyDocument, { ...options }, ); diff --git a/frontend/src/hooks/post/useReplyTopic.ts b/frontend/src/hooks/post/useReplyTopic.ts index 80055fdd..7e5581d1 100644 --- a/frontend/src/hooks/post/useReplyTopic.ts +++ b/frontend/src/hooks/post/useReplyTopic.ts @@ -1,19 +1,19 @@ import { MutationHookOptions } from '@apollo/client'; import { - ReplyTopic as ReplyTopicType, - ReplyTopicVariables, -} from '../../generated/server/Topics'; -import { REPLY_TOPIC } from '../../graphql/server/topics'; + ReplyTopicMutation as ReplyTopicType, + ReplyTopicMutationVariables, + ReplyTopicDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useReplyTopic( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { - const [reply, { loading }] = useMutation( - REPLY_TOPIC, - { ...options }, - ); + const [reply, { loading }] = useMutation< + ReplyTopicType, + ReplyTopicMutationVariables + >(ReplyTopicDocument, { ...options }); return { reply, loading }; } diff --git a/frontend/src/hooks/post/useSearchPost.ts b/frontend/src/hooks/post/useSearchPost.ts index 721bf6d0..bbbe863f 100644 --- a/frontend/src/hooks/post/useSearchPost.ts +++ b/frontend/src/hooks/post/useSearchPost.ts @@ -1,10 +1,10 @@ import { LazyQueryHookOptions } from '@apollo/client'; -import { SEARCH } from '../../graphql/server/search'; import { - Search as SearchPostType, - SearchVariables as SearchPostVariables, -} from '../../generated/server/Search'; + SearchQuery as SearchPostType, + SearchQueryVariables as SearchPostVariables, + SearchDocument, +} from '../../generated/server'; import { useLazyQuery } from '../../utils'; export function useSearchPost( @@ -13,7 +13,7 @@ export function useSearchPost( const [getPosts, { error, refetch, fetchMore }] = useLazyQuery< SearchPostType, SearchPostVariables - >(SEARCH, { + >(SearchDocument, { ...options, }); diff --git a/frontend/src/hooks/post/useTiming.ts b/frontend/src/hooks/post/useTiming.ts index 7f6fbf45..cd3d1793 100644 --- a/frontend/src/hooks/post/useTiming.ts +++ b/frontend/src/hooks/post/useTiming.ts @@ -1,9 +1,12 @@ import { useEffect } from 'react'; import { PureQueryOptions } from '@apollo/client'; -import { Timings, TimingsVariables } from '../../generated/server/Timings'; -import { MESSAGE } from '../../graphql/server/message'; -import { TIMINGS } from '../../graphql/server/timings'; +import { + TimingsMutation, + TimingsMutationVariables, + MessageDocument, + TimingsDocument, +} from '../../generated/server'; import { MessageContent } from '../../types'; import { useStorage } from '../../helpers'; import { useMutation } from '../../utils'; @@ -17,10 +20,13 @@ function useTiming( skip = false, refetchQueries?: Array, ) { - const [submitTiming] = useMutation(TIMINGS, { - refetchQueries, - awaitRefetchQueries: !!refetchQueries, - }); + const [submitTiming] = useMutation( + TimingsDocument, + { + refetchQueries, + awaitRefetchQueries: !!refetchQueries, + }, + ); useEffect(() => { if (skip || !posts) { @@ -53,7 +59,7 @@ export function useMessageTiming( // should not try to report timing information. const skip = !username; - let refetchQueries = [{ query: MESSAGE, variables: { username } }]; + let refetchQueries = [{ query: MessageDocument, variables: { username } }]; useTiming(topicId, startIndex, posts, skip, refetchQueries); } diff --git a/frontend/src/hooks/post/useTopicDetail.ts b/frontend/src/hooks/post/useTopicDetail.ts index 4b594231..f62afe4b 100644 --- a/frontend/src/hooks/post/useTopicDetail.ts +++ b/frontend/src/hooks/post/useTopicDetail.ts @@ -1,10 +1,10 @@ import { QueryHookOptions } from '@apollo/client'; import { - GetTopicDetail as TopicDetailType, - GetTopicDetailVariables as TopicDetailVariables, -} from '../../generated/server/GetTopicDetail'; -import { GET_TOPIC_DETAIL } from '../../graphql/server/getTopicDetail'; + GetTopicDetailQuery as TopicDetailType, + GetTopicDetailQueryVariables as TopicDetailVariables, + GetTopicDetailDocument, +} from '../../generated/server'; import { ErrorAlertOptionType } from '../../types'; import { useQuery } from '../../utils'; @@ -15,7 +15,7 @@ export function useTopicDetail( const { data, loading, error, fetchMore, refetch } = useQuery< TopicDetailType, TopicDetailVariables - >(GET_TOPIC_DETAIL, { ...options }, errorAlert); + >(GetTopicDetailDocument, { ...options }, errorAlert); return { data, loading, error, refetch, fetchMore }; } diff --git a/frontend/src/hooks/post/useTopicList.ts b/frontend/src/hooks/post/useTopicList.ts index b8f1ce3a..210032e1 100644 --- a/frontend/src/hooks/post/useTopicList.ts +++ b/frontend/src/hooks/post/useTopicList.ts @@ -1,20 +1,18 @@ import { LazyQueryHookOptions, QueryHookOptions } from '@apollo/client'; import { - Topics as TopicListType, - TopicsVariables as TopicListVariables, -} from '../../generated/server/Topics'; -import { TOPICS } from '../../graphql/server/topics'; + TopicsQuery as TopicListType, + TopicsQueryVariables as TopicListVariables, + TopicsDocument, +} from '../../generated/server'; import { useLazyQuery, useQuery } from '../../utils'; export function useTopicList( options?: QueryHookOptions, ) { const { data, loading, error } = useQuery( - TOPICS, - { - ...options, - }, + TopicsDocument, + { context: { queryDeduplication: true }, ...options }, ); return { data, loading, error }; @@ -26,7 +24,10 @@ export function useLazyTopicList( const [getTopicList, { loading, error, refetch, fetchMore }] = useLazyQuery< TopicListType, TopicListVariables - >(TOPICS, { ...options }); + >(TopicsDocument, { + context: { queryDeduplication: true }, + ...options, + }); return { getTopicList, loading, error, refetch, fetchMore }; } diff --git a/frontend/src/hooks/profile/useChangePassword.ts b/frontend/src/hooks/profile/useChangePassword.ts index c6c2226f..4cf4143a 100644 --- a/frontend/src/hooks/profile/useChangePassword.ts +++ b/frontend/src/hooks/profile/useChangePassword.ts @@ -1,22 +1,22 @@ import { MutationHookOptions } from '@apollo/client'; import { - ChangeNewPassword as ChangeNewPasswordType, - ChangeNewPasswordVariables, -} from '../../generated/server/ChangePassword'; -import { CHANGE_PASSWORD } from '../../graphql/server/changePassword'; + ChangeNewPasswordMutation as ChangeNewPasswordType, + ChangeNewPasswordMutationVariables, + ChangeNewPasswordDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useChangePassword( options?: MutationHookOptions< ChangeNewPasswordType, - ChangeNewPasswordVariables + ChangeNewPasswordMutationVariables >, ) { const [changeNewPassword, { loading, error }] = useMutation< ChangeNewPasswordType, - ChangeNewPasswordVariables - >(CHANGE_PASSWORD, { + ChangeNewPasswordMutationVariables + >(ChangeNewPasswordDocument, { ...options, }); diff --git a/frontend/src/hooks/profile/useEmail.ts b/frontend/src/hooks/profile/useEmail.ts index 94513969..3fb8d7e7 100644 --- a/frontend/src/hooks/profile/useEmail.ts +++ b/frontend/src/hooks/profile/useEmail.ts @@ -1,29 +1,28 @@ import { MutationHookOptions } from '@apollo/client'; import { - AddEmailAddress as AddEmailAddressType, - AddEmailAddressVariables, -} from '../../generated/server/AddEmailAddress'; -import { - DeleteEmail as DeleteEmailType, - DeleteEmailVariables, -} from '../../generated/server/DeleteEmail'; -import { - SetPrimaryEmail as SetPrimaryEmailType, - SetPrimaryEmailVariables, -} from '../../generated/server/SetPrimaryEmail'; -import { ADD_EMAIL_ADDRESS } from '../../graphql/server/addEmailAddress'; -import { DELETE_EMAIL } from '../../graphql/server/deleteEmail'; -import { SET_PRIMARY_EMAIL } from '../../graphql/server/setPrimaryEmail'; + AddEmailAddressMutation as AddEmailAddressType, + AddEmailAddressMutationVariables, + AddEmailAddressDocument, + DeleteEmailMutation as DeleteEmailType, + DeleteEmailMutationVariables, + DeleteEmailDocument, + SetPrimaryEmailMutation as SetPrimaryEmailType, + SetPrimaryEmailMutationVariables, + SetPrimaryEmailDocument, +} from '../../generated/server'; import { useMutation } from '../../utils'; export function useAddEmail( - options?: MutationHookOptions, + options?: MutationHookOptions< + AddEmailAddressType, + AddEmailAddressMutationVariables + >, ) { const [addEmailAddress, { loading, error }] = useMutation< AddEmailAddressType, - AddEmailAddressVariables - >(ADD_EMAIL_ADDRESS, { + AddEmailAddressMutationVariables + >(AddEmailAddressDocument, { ...options, }); @@ -31,12 +30,12 @@ export function useAddEmail( } export function useDeleteEmail( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { const [deleteEmail, { loading }] = useMutation< DeleteEmailType, - DeleteEmailVariables - >(DELETE_EMAIL, { + DeleteEmailMutationVariables + >(DeleteEmailDocument, { ...options, }); @@ -44,12 +43,15 @@ export function useDeleteEmail( } export function useSetPrimaryEmail( - options?: MutationHookOptions, + options?: MutationHookOptions< + SetPrimaryEmailType, + SetPrimaryEmailMutationVariables + >, ) { const [setPrimaryEmail, { loading }] = useMutation< SetPrimaryEmailType, - SetPrimaryEmailVariables - >(SET_PRIMARY_EMAIL, { + SetPrimaryEmailMutationVariables + >(SetPrimaryEmailDocument, { ...options, }); diff --git a/frontend/src/hooks/profile/useNotification.ts b/frontend/src/hooks/profile/useNotification.ts index e3d6dbbe..38cc3208 100644 --- a/frontend/src/hooks/profile/useNotification.ts +++ b/frontend/src/hooks/profile/useNotification.ts @@ -1,21 +1,22 @@ import { MutationHookOptions, QueryHookOptions } from '@apollo/client'; import { - MarkRead as MarkReadType, - MarkReadVariables, - Notification as NotificationQueryType, - NotificationVariables, -} from '../../generated/server/Notification'; -import { MARK_READ, NOTIFICATION } from '../../graphql/server/notification'; + MarkReadMutation as MarkReadType, + MarkReadMutationVariables, + MarkReadDocument, + NotificationQuery as NotificationQueryType, + NotificationQueryVariables, + NotificationDocument, +} from '../../generated/server'; import { useMutation, useQuery } from '../../utils'; export function useNotification( - options?: QueryHookOptions, + options?: QueryHookOptions, ) { const { data, loading, error, refetch, fetchMore } = useQuery< NotificationQueryType, - NotificationVariables - >(NOTIFICATION, { + NotificationQueryVariables + >(NotificationDocument, { ...options, }); @@ -23,12 +24,12 @@ export function useNotification( } export function useMarkRead( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { const [markAsRead, { loading }] = useMutation< MarkReadType, - MarkReadVariables - >(MARK_READ, { + MarkReadMutationVariables + >(MarkReadDocument, { ...options, }); diff --git a/frontend/src/hooks/profile/useProfile.ts b/frontend/src/hooks/profile/useProfile.ts index e4fb1c04..cdccf57f 100644 --- a/frontend/src/hooks/profile/useProfile.ts +++ b/frontend/src/hooks/profile/useProfile.ts @@ -5,27 +5,25 @@ import { } from '@apollo/client'; import { - EditProfile as EditProfileType, - EditProfileVariables, -} from '../../generated/server/EditProfile'; -import { - Profile as ProfileType, - ProfileVariables, -} from '../../generated/server/Profile'; -import { EDIT_PROFILE } from '../../graphql/server/editProfile'; -import { PROFILE } from '../../graphql/server/profile'; + EditProfileMutation as EditProfileType, + EditProfileMutationVariables, + ProfileQuery as ProfileType, + ProfileQueryVariables, + EditProfileDocument, + ProfileDocument, +} from '../../generated/server'; import { ErrorAlertOptionType } from '../../types'; import { useLazyQuery, useMutation, useQuery } from '../../utils'; export function useProfile( - options?: QueryHookOptions, + options?: QueryHookOptions, errorAlert: ErrorAlertOptionType = 'SHOW_ALERT', ) { const { data, loading, error, refetch } = useQuery< ProfileType, - ProfileVariables + ProfileQueryVariables >( - PROFILE, + ProfileDocument, { ...options, }, @@ -36,11 +34,14 @@ export function useProfile( } export function useLazyProfile( - options?: LazyQueryHookOptions, + options?: LazyQueryHookOptions, errorAlert: ErrorAlertOptionType = 'SHOW_ALERT', ) { - const [getProfile, { data }] = useLazyQuery( - PROFILE, + const [getProfile, { data }] = useLazyQuery< + ProfileType, + ProfileQueryVariables + >( + ProfileDocument, { ...options, }, @@ -51,12 +52,12 @@ export function useLazyProfile( } export function useEditProfile( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { const [editProfile, { loading }] = useMutation< EditProfileType, - EditProfileVariables - >(EDIT_PROFILE, { + EditProfileMutationVariables + >(EditProfileDocument, { ...options, }); diff --git a/frontend/src/hooks/site/useAbout.ts b/frontend/src/hooks/site/useAbout.ts index b9c33dce..98f3a56e 100644 --- a/frontend/src/hooks/site/useAbout.ts +++ b/frontend/src/hooks/site/useAbout.ts @@ -1,7 +1,6 @@ import { LazyQueryHookOptions } from '@apollo/client'; -import { About as AboutType } from '../../generated/server/About'; -import { ABOUT } from '../../graphql/server/about'; +import { AboutQuery as AboutType, AboutDocument } from '../../generated/server'; import { ErrorAlertOptionType } from '../../types'; import { useLazyQuery } from '../../utils'; @@ -10,7 +9,7 @@ export function useAbout( errorAlert: ErrorAlertOptionType = 'SHOW_ALERT', ) { const [getAbout, { error }] = useLazyQuery( - ABOUT, + AboutDocument, { ...options, }, diff --git a/frontend/src/hooks/site/useChannels.ts b/frontend/src/hooks/site/useChannels.ts index 575c9c79..f6aaab0b 100644 --- a/frontend/src/hooks/site/useChannels.ts +++ b/frontend/src/hooks/site/useChannels.ts @@ -1,7 +1,9 @@ import { QueryHookOptions } from '@apollo/client'; -import { GetChannels as ChannelsType } from '../../generated/server/Channels'; -import { GET_CHANNELS } from '../../graphql/server/channels'; +import { + GetChannelsQuery as ChannelsType, + GetChannelsDocument, +} from '../../generated/server'; import { ErrorAlertOptionType } from '../../types'; import { useQuery } from '../../utils'; @@ -10,7 +12,7 @@ export function useChannels( errorAlert: ErrorAlertOptionType = 'SHOW_ALERT', ) { const { data, loading, error } = useQuery( - GET_CHANNELS, + GetChannelsDocument, { ...options, }, diff --git a/frontend/src/hooks/site/useSearchUsers.ts b/frontend/src/hooks/site/useSearchUsers.ts index 501dd460..04c13997 100644 --- a/frontend/src/hooks/site/useSearchUsers.ts +++ b/frontend/src/hooks/site/useSearchUsers.ts @@ -1,22 +1,22 @@ import { QueryHookOptions } from '@apollo/client'; import { - SearchUser as SearchUserType, - SearchUserVariables, -} from '../../generated/server/Search'; -import { SEARCH_USER } from '../../graphql/server/search'; + SearchUserQuery as SearchUserType, + SearchUserQueryVariables, + SearchUserDocument, +} from '../../generated/server'; import { ErrorAlertOptionType } from '../../types'; import { useQuery } from '../../utils'; export function useSearchUsers( - options?: QueryHookOptions, + options?: QueryHookOptions, errorAlert: ErrorAlertOptionType = 'SHOW_ALERT', ) { const { data, loading, error } = useQuery< SearchUserType, - SearchUserVariables + SearchUserQueryVariables >( - SEARCH_USER, + SearchUserDocument, { ...options, }, diff --git a/frontend/src/hooks/site/useSingleBadge.ts b/frontend/src/hooks/site/useSingleBadge.ts index 5899e069..cd516aa6 100644 --- a/frontend/src/hooks/site/useSingleBadge.ts +++ b/frontend/src/hooks/site/useSingleBadge.ts @@ -1,21 +1,21 @@ import { LazyQueryHookOptions } from '@apollo/client'; import { - SingleBadge, - SingleBadgeVariables, -} from '../../generated/server/SingleBadge'; -import { SINGLE_BADGE } from '../../graphql/server/singleBadge'; + SingleBadgeQuery, + SingleBadgeQueryVariables, + SingleBadgeDocument, +} from '../../generated/server'; import { useLazyQuery } from '../../utils'; export function useSingleBadge( - options?: LazyQueryHookOptions, + options?: LazyQueryHookOptions, ) { - const [singleBadge] = useLazyQuery( - SINGLE_BADGE, - { - ...options, - }, - ); + const [singleBadge] = useLazyQuery< + SingleBadgeQuery, + SingleBadgeQueryVariables + >(SingleBadgeDocument, { + ...options, + }); return { singleBadge }; } diff --git a/frontend/src/hooks/site/useSiteSettings.ts b/frontend/src/hooks/site/useSiteSettings.ts index d4015642..61210251 100644 --- a/frontend/src/hooks/site/useSiteSettings.ts +++ b/frontend/src/hooks/site/useSiteSettings.ts @@ -1,20 +1,25 @@ -import { useQuery } from '@apollo/client'; +import { QueryHookOptions } from '@apollo/client'; -import { DEFAULT_CHANNEL } from '../../constants'; -import { Site } from '../../generated/server/Site'; -import { SITE } from '../../graphql/server/site'; +import { SiteQuery, SiteDocument } from '../../generated/server'; +import { useQuery } from '../../utils'; -export function useSiteSettings() { - let { data, loading, error, refetch } = useQuery(SITE, { - notifyOnNetworkStatusChange: true, - }); +export function useSiteSettings(options?: QueryHookOptions) { + let { data, loading, error, refetch } = useQuery( + SiteDocument, + { + notifyOnNetworkStatusChange: true, + nextFetchPolicy: 'cache-and-network', + ...options, + }, + 'HIDE_ALERT', + ); const { canTagTopics, canCreateTag, canSignUp, authorizedExtensions, - uncategorizedCategoryId = DEFAULT_CHANNEL.id, + uncategorizedCategoryId, minSearchLength, taggingEnabled, maxTagLength, @@ -25,6 +30,8 @@ export function useSiteSettings() { fullNameRequired, topicFlagTypes, postActionTypes, + defaultComposerCategory, + allowUncategorizedTopics, } = data?.site || {}; return { @@ -43,6 +50,8 @@ export function useSiteSettings() { fullNameRequired, topicFlagTypes, postActionTypes, + allowUncategorizedTopics, + defaultComposerCategory, loading, error, refetch, diff --git a/frontend/src/hooks/site/useTags.ts b/frontend/src/hooks/site/useTags.ts index 57e9c53f..4ea0fb18 100644 --- a/frontend/src/hooks/site/useTags.ts +++ b/frontend/src/hooks/site/useTags.ts @@ -1,10 +1,10 @@ import { LazyQueryHookOptions } from '@apollo/client'; import { - SearchTags as TagsType, - SearchTagsVariables as TagsVariables, -} from '../../generated/server/Search'; -import { SEARCH_TAGS } from '../../graphql/server/search'; + SearchTagsQuery as TagsType, + SearchTagsQueryVariables as TagsVariables, + SearchTagsDocument, +} from '../../generated/server'; import { useLazyQuery } from '../../utils'; export function useTags( @@ -13,7 +13,7 @@ export function useTags( const [getTags, { data, loading, error, refetch }] = useLazyQuery< TagsType, TagsVariables - >(SEARCH_TAGS, { + >(SearchTagsDocument, { ...options, }); diff --git a/frontend/src/hooks/useInitialLoad.tsx b/frontend/src/hooks/useInitialLoad.tsx new file mode 100644 index 00000000..e773ebe2 --- /dev/null +++ b/frontend/src/hooks/useInitialLoad.tsx @@ -0,0 +1,46 @@ +import { discourseHostVar } from '../constants'; +import { useHealthQuery } from '../generated/server'; +import { useAuth } from '../utils/AuthProvider'; + +import useLoadFonts from './useLoadFonts'; + +type UseInitialLoadResult = + | { + loading: true; + } + | { + loading: false; + isLoggedIn: boolean; + isPublicDiscourse: boolean; + }; +/** + * Hook to load fonts and other resources on initial app load. + * Also determined whether the app is loading or ready + */ +export function useInitialLoad(): UseInitialLoadResult { + const { loading: fontsLoading } = useLoadFonts(); + const useAuthResults = useAuth(); + let { loading: getHostLoading } = useHealthQuery({ + onCompleted: ({ health }) => { + if (health.discourseHost) { + // NOTE: `discourseHostVar` has nothing to do with the health check + // We needed the Discourse host for In-App Linking (#1012), so we are + // opportunistically grabbing it when we already have it from the health check. + discourseHostVar(health.discourseHost); + } + }, + }); + + const loading = fontsLoading || useAuthResults.isLoading || getHostLoading; + if (loading) { + return { loading: true }; + } + + return { + loading, + isLoggedIn: !!useAuthResults.token, + isPublicDiscourse: + (!useAuthResults.token && !useAuthResults.siteSettingsError) || + !!useAuthResults.canSignUp, + }; +} diff --git a/frontend/src/hooks/useUpload.ts b/frontend/src/hooks/useUpload.ts index fd0a3904..3b34f255 100644 --- a/frontend/src/hooks/useUpload.ts +++ b/frontend/src/hooks/useUpload.ts @@ -2,58 +2,61 @@ import { MutationHookOptions } from '@apollo/client'; import { useState } from 'react'; import { - Upload as UploadType, - UploadVariables, -} from '../generated/server/Upload'; -import { UPLOAD } from '../graphql/server/upload'; + UploadMutation as UploadType, + UploadMutationVariables, + UploadDocument, +} from '../generated/server'; import { errorHandlerAlert, formatImageLink } from '../helpers'; import { Image } from '../types'; import { useMutation } from '../utils'; export function useStatelessUpload( - options?: MutationHookOptions, + options?: MutationHookOptions, ) { - const [upload, { loading }] = useMutation( - UPLOAD, - { - ...options, - }, - ); + const [upload, { loading }] = useMutation< + UploadType, + UploadMutationVariables + >(UploadDocument, { + ...options, + }); return { upload, loading }; } export function useStatefulUpload( imagesArray: Array, currentToken: number, - options?: MutationHookOptions, + options?: MutationHookOptions, ) { const [completedToken, setCompletedToken] = useState(1); const [tempArray, setTempArray] = useState>(imagesArray); let newArray = imagesArray; - let [upload] = useMutation(UPLOAD, { - ...options, - onCompleted: ({ upload: result }) => { - const { - originalFilename: name, - width, - height, - shortUrl: url, - token, - } = result; - if (token) { - const imageUrl = formatImageLink(name, width, height, url); - newArray[token - 1] = { link: imageUrl, done: true }; + let [upload] = useMutation( + UploadDocument, + { + ...options, + onCompleted: ({ upload: result }) => { + const { + originalFilename: name, + width, + height, + shortUrl: url, + token, + } = result; + if (token) { + const imageUrl = formatImageLink(name, width, height, url); + newArray[token - 1] = { link: imageUrl, done: true }; + setTempArray(newArray); + setCompletedToken(token); + } + }, + onError: (error) => { + newArray[currentToken - 2] = { link: '', done: true }; setTempArray(newArray); - setCompletedToken(token); - } + errorHandlerAlert(error); + }, }, - onError: (error) => { - newArray[currentToken - 2] = { link: '', done: true }; - setTempArray(newArray); - errorHandlerAlert(error); - }, - }); + ); return { upload, tempArray, completedToken }; } diff --git a/frontend/src/icons.ts b/frontend/src/icons.ts index 58d3ef4f..82b72333 100644 --- a/frontend/src/icons.ts +++ b/frontend/src/icons.ts @@ -1,6 +1,6 @@ import Add from '../assets/icons/Add.svg'; import AddCircle from '../assets/icons/AddCircle.svg'; -import Admin from '../assets/icons/adminPanel.svg'; +import Admin from '../assets/icons/AdminPanel.svg'; import AlternateEmail from '../assets/icons/AlternateEmail.svg'; import ArrowUpward from '../assets/icons/ArrowUpward.svg'; import Cancel from '../assets/icons/Cancel.svg'; @@ -20,6 +20,7 @@ import Lock from '../assets/icons/Lock.svg'; import Mail from '../assets/icons/Mail.svg'; import More from '../assets/icons/More.svg'; import MoreVert from '../assets/icons/MoreVert.svg'; +import NotificationActive from '../assets/icons/NotificationActive.svg'; import Notifications from '../assets/icons/Notifications.svg'; import Person from '../assets/icons/Person.svg'; import Photo from '../assets/icons/Photo.svg'; @@ -28,9 +29,12 @@ import Power from '../assets/icons/Power.svg'; import Replies from '../assets/icons/Replies.svg'; import Search from '../assets/icons/Search.svg'; import Send from '../assets/icons/Send.svg'; -import Settings from '../assets/icons/settings.svg'; +import Settings from '../assets/icons/Settings.svg'; import Triangle from '../assets/icons/Triangle.svg'; import Views from '../assets/icons/Views.svg'; +import NoConnection from '../assets/icons/NoConnection.svg'; +import Online from '../assets/icons/Online.svg'; +import Unreachable from '../assets/icons/Unreachable.svg'; export const Icons = { Add, @@ -55,6 +59,7 @@ export const Icons = { Mail, More, MoreVert, + NotificationActive, Notifications, Person, Photo, @@ -66,6 +71,9 @@ export const Icons = { Settings, Triangle, Views, + NoConnection, + Online, + Unreachable, }; export type IconName = keyof typeof Icons; diff --git a/frontend/src/navigation/AppNavigator.tsx b/frontend/src/navigation/AppNavigator.tsx index dc9fa913..e8218b44 100644 --- a/frontend/src/navigation/AppNavigator.tsx +++ b/frontend/src/navigation/AppNavigator.tsx @@ -2,24 +2,124 @@ import React from 'react'; import { DarkTheme, DefaultTheme, + getStateFromPath, + LinkingOptions, NavigationContainer, } from '@react-navigation/native'; import { StatusBar } from 'expo-status-bar'; +import * as Linking from 'expo-linking'; +import * as Notifications from 'expo-notifications'; import { useColorScheme } from '../theme'; +import { RootStackParamList } from '../types'; +import { + DEEP_LINK_SCREEN_CONFIG, + EXPO_PREFIX, + handleUrl, + isPostOrMessageDetail, + onSubscribe, +} from '../constants'; +import { isRouteBesidePost, postOrMessageDetailPathToRoutes } from '../helpers'; +import { useRedirect } from '../utils'; +import { useInitialLoad } from '../hooks/useInitialLoad'; +import { LoadingOrErrorView } from '../components'; import RootStackNavigator from './RootStackNavigator'; +import { navigationRef } from './NavigationService'; export default function AppNavigator() { const { colorScheme } = useColorScheme(); + const useInitialLoadResult = useInitialLoad(); + const { setRedirectPath } = useRedirect(); + const darkMode = colorScheme === 'dark'; return ( <> - - - + {useInitialLoadResult.loading ? ( + + ) : ( + + + + )} ); } + +type CreateLinkingConfigParams = { + setRedirectPath: (path: string) => void; + isLoggedIn: boolean; + isPublicDiscourse: boolean; +}; +const createLinkingConfig = (params: CreateLinkingConfigParams) => { + const { setRedirectPath, isLoggedIn, isPublicDiscourse } = params; + const linking: LinkingOptions = { + prefixes: [EXPO_PREFIX], + config: { screens: DEEP_LINK_SCREEN_CONFIG }, + subscribe: onSubscribe, + async getInitialURL() { + // Handle app was opened from a deep link + + const url = await Linking.getInitialURL(); + + if (url != null) { + return url; + } + + // Handle app was opened from expo push notification + + const response = await Notifications.getLastNotificationResponseAsync(); + if (response) { + return handleUrl(response); + } + }, + getStateFromPath: (fullPath, config) => { + // Split off any search params (`?a=1&b=2`) + // Then, Extract the leading part of the path as the `route`. + // e.g., `'post-detail'`. + // The remainder of the params are `pathParams`. + // e.g., `['11', '3']`, representing `topicId` and `postNumber`, respectively. + const [pathname] = fullPath.split('?'); + const [route, ...pathParams] = pathname.split('/'); + + const routeToLogin = { routes: [{ name: 'Login' }] }; + // If we're not on a known deep link path, fallback to the default behavior + // from React Navigation. + if (!isPostOrMessageDetail(route)) { + return getStateFromPath(fullPath, config); + } + + if (!isLoggedIn) { + setRedirectPath(pathname); + /** + * it will check if deep link is for beside post it will require user to login scene + * for example in this case is message-detail where user must be login to send message + * + * And for another condition, we want to redirect the user to the login scene if the discourse is not publicly accessible and the user is not logged in. + */ + + if (isRouteBesidePost(route) || !isPublicDiscourse) { + return routeToLogin; + } + } + + let routes = postOrMessageDetailPathToRoutes({ route, pathParams }); + + return { + routes, + index: routes.length - 1, + }; + }, + }; + return linking; +}; diff --git a/frontend/src/navigation/NavigationService.tsx b/frontend/src/navigation/NavigationService.tsx new file mode 100644 index 00000000..df966f2d --- /dev/null +++ b/frontend/src/navigation/NavigationService.tsx @@ -0,0 +1,31 @@ +import { + createNavigationContainerRef, + NavigationState, + PartialState, +} from '@react-navigation/native'; + +import { RootStackParamList, RootStackRouteName } from '../types'; + +export const navigationRef = createNavigationContainerRef(); + +export function navigate( + params: + | [screen: RootStackRouteName] + | [ + screen: RootStackRouteName, + params: RootStackParamList[RootStackRouteName], + ], +) { + if (navigationRef.isReady()) { + navigationRef.navigate(...params); + } +} +export function reset( + params: + | PartialState> + | NavigationState, +) { + if (navigationRef.isReady()) { + navigationRef.reset(params); + } +} diff --git a/frontend/src/navigation/RootStackNavigator.tsx b/frontend/src/navigation/RootStackNavigator.tsx index 5ecfd54b..6bde153d 100644 --- a/frontend/src/navigation/RootStackNavigator.tsx +++ b/frontend/src/navigation/RootStackNavigator.tsx @@ -2,102 +2,227 @@ import React from 'react'; import { createStackNavigator } from '@react-navigation/stack'; import { + Activity, + AddEmail, + ChangePassword, Channels, DarkMode, + EditProfile, + EmailAddress, FlagPost, Hyperlink, + ImagePreview, + Login, + MessageDetail, + Messages, NewMessage, NewMessagePreview, NewPost, + Notifications, + PostDetail, PostImagePreview, PostPreview, PostReply, + Preferences, + PushNotifications, + Register, + Search, SelectUser, Tags, + Troubleshoot, + TwoFactorAuth, + UserInformation, + InstanceLoading, } from '../screens'; import { useTheme } from '../theme'; import { RootStackParamList } from '../types'; -import StackNavigator from './StackNavigator'; +import TabNavigator from './TabNavigator'; const RootStack = createStackNavigator(); -export default function RootStackNavigator() { - const { navHeader, navModal, navNoShadow } = useTheme(); +type RootStackNavigatorProps = { + initialRouteName?: keyof RootStackParamList | undefined; +}; +export default function RootStackNavigator(props: RootStackNavigatorProps) { + const { initialRouteName } = props; + const { navHeader, navModal, navNoShadow, shadow } = useTheme(); return ( - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } diff --git a/frontend/src/navigation/StackNavigator.tsx b/frontend/src/navigation/StackNavigator.tsx deleted file mode 100644 index aa0d92de..00000000 --- a/frontend/src/navigation/StackNavigator.tsx +++ /dev/null @@ -1,131 +0,0 @@ -import React from 'react'; -import { Platform } from 'react-native'; -import { createStackNavigator } from '@react-navigation/stack'; - -import { - Activity, - AddEmail, - ChangePassword, - EditProfile, - EmailAddress, - ImagePreview, - InstanceLoading, - Login, - MessageDetail, - Messages, - Notifications, - PostDetail, - Preferences, - Register, - Search, - TwoFactorAuth, - UserInformation, -} from '../screens'; -import { useTheme } from '../theme'; -import { StackParamList } from '../types'; - -import TabNavigator from './TabNavigator'; - -const Stack = createStackNavigator(); - -export default function StackNavigator() { - const { navHeader } = useTheme(); - const ios = Platform.OS === 'ios'; - - return ( - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/frontend/src/reactiveVars/index.tsx b/frontend/src/reactiveVars/index.tsx new file mode 100644 index 00000000..52842473 --- /dev/null +++ b/frontend/src/reactiveVars/index.tsx @@ -0,0 +1 @@ +export * from './tokenReactive'; diff --git a/frontend/src/reactiveVars/tokenReactive.tsx b/frontend/src/reactiveVars/tokenReactive.tsx new file mode 100644 index 00000000..73bf2417 --- /dev/null +++ b/frontend/src/reactiveVars/tokenReactive.tsx @@ -0,0 +1,25 @@ +import { makeVar } from '@apollo/client'; + +/** + * We use reactive variable for token state instead of useState because we need to be able to update token state from apollo link + * Token state is undefined when we are still loading token from storage and null when we are not logged in. + */ +const tokenVar = makeVar(undefined); + +/** + * Logout token hold the last token we have before user logged out + * We need this to be able to logout user even when token state is already null + */ +const logoutTokenVar = makeVar(undefined); + +/** + * Update token state when successfully logged in + */ +const setTokenState = (token: string | null) => { + tokenVar(token); + if (token) { + logoutTokenVar(token); + } +}; + +export { tokenVar, logoutTokenVar, setTokenState }; diff --git a/frontend/src/screens/Activity.tsx b/frontend/src/screens/Activity.tsx index a82dd005..290a24cc 100644 --- a/frontend/src/screens/Activity.tsx +++ b/frontend/src/screens/Activity.tsx @@ -1,114 +1,70 @@ import React from 'react'; import { View } from 'react-native'; -import { LoadingOrError, PostList } from '../components'; -import { DEFAULT_CHANNEL } from '../constants'; -import { Text } from '../core-ui'; -import { TopicsSortEnum } from '../generated/server/types'; import { - anchorToMarkdown, - errorHandler, - getImage, - useStorage, -} from '../helpers'; -import { useActivity, useTopicList } from '../hooks'; + LoadingOrError, + PostList, + UserInformationPostItem, +} from '../components'; +import { Text } from '../core-ui'; +import { errorHandler, useStorage } from '../helpers'; +import { useActivity } from '../hooks'; import { makeStyles } from '../theme'; -import { Post } from '../types'; export default function Activity() { const styles = useStyles(); const storage = useStorage(); - const channels = storage.getItem('channels'); const user = storage.getItem('user'); const username = user ? user.username : ''; - const { - data: topicsData, - loading: topicsLoading, - error: topicsError, - } = useTopicList({ - variables: { sort: TopicsSortEnum.Latest }, - }); - const { data, loading, error, refetch, fetchMore } = useActivity({ variables: { username, offset: 0 }, }); const activities = data?.userActivity ?? []; - let postActivities: Array = []; - - postActivities = activities.map((activity) => { - const channel = channels?.find( - (channel) => channel.id === activity.categoryId, - ); - let topic; - const listedTopics = topicsData?.topics.topicList; - if (listedTopics?.topics) { - topic = listedTopics.topics.find( - (topic) => topic.id === activity.topicId, - ); - } - const { content, imageUrl, mentionedUsers } = anchorToMarkdown( - activity.excerpt, - ); - - return { - ...activity, - id: activity.postId ?? 0, - content, - images: imageUrl ? [imageUrl] : undefined, - avatar: getImage(activity.avatarTemplate), - viewCount: 0, - replyCount: 0, - likeCount: 0, - isLiked: activity.actionType === 1, - channel: channel || DEFAULT_CHANNEL, - tags: topic?.tags || [], - freqPosters: [], - mentionedUsers, - }; - }); const onEndReached = (distanceFromEnd: number) => { if (distanceFromEnd === 0) { return; } - fetchMore({ variables: { offset: postActivities.length } }); + fetchMore({ variables: { offset: activities.length } }); }; const onRefresh = () => refetch(); - if (error || topicsError) { - let errorMessage = error - ? errorHandler(error, true) - : topicsError - ? errorHandler(topicsError, true) - : undefined; + if (error) { + let errorMessage = error ? errorHandler(error, true) : undefined; return ; } - if ((loading || topicsLoading) && postActivities.length < 1) { + if (loading && activities.length < 1) { return ; } let content; - if (postActivities.length !== 0) { + if (activities.length !== 0) { content = ( onEndReached(distanceFromEnd)} onRefresh={onRefresh} refreshing={loading} + renderItem={({ item }) => { + return ( + + ); + }} /> ); } else { diff --git a/frontend/src/screens/AddEmail.tsx b/frontend/src/screens/AddEmail.tsx index f55fbf95..572b1a28 100644 --- a/frontend/src/screens/AddEmail.tsx +++ b/frontend/src/screens/AddEmail.tsx @@ -18,11 +18,15 @@ type Form = { export default function AddEmail() { const styles = useStyles(); - const { control, handleSubmit, errors, getValues, formState } = useForm
( - { - mode: 'onChange', - }, - ); + const { + control, + handleSubmit, + formState: { errors }, + getValues, + formState, + } = useForm({ + mode: 'onChange', + }); const [success, setSuccess] = useState(false); @@ -118,7 +122,7 @@ export default function AddEmail() { }, }} control={control} - render={({ onChange, value }) => ( + render={({ field: { onChange, value } }) => ( >(); const { - params: { selectedChannelId, prevScreen }, + params: { prevScreen }, } = useRoute>(); const storage = useStorage(); const channels = storage.getItem('channels'); + const { setValue, getValues } = useFormContext(); + const { channelId: selectedChannelId } = getValues(); const ios = Platform.OS === 'ios'; const onPress = (id: number) => { + setValue('channelId', id); if (prevScreen === 'Home') { - navigate('Main', { - screen: 'TabNav', - params: { - screen: 'Home', - params: { - selectedChannelId: id, - }, - }, - }); + navigate('TabNav', { screen: 'Home' }); } else { - navigate(prevScreen, { selectedChannelId: id }); + navigate(prevScreen); } }; diff --git a/frontend/src/screens/EditProfile.tsx b/frontend/src/screens/EditProfile.tsx index 2d4f6ff7..92e3975d 100644 --- a/frontend/src/screens/EditProfile.tsx +++ b/frontend/src/screens/EditProfile.tsx @@ -26,7 +26,7 @@ import { TextInput, TextInputType, } from '../core-ui'; -import { UploadTypeEnum } from '../generated/server/types'; +import { UploadTypeEnum } from '../generated/server'; // import { formatDateTime } from '../helpers/formatDateTime'; import { createReactNativeFile, @@ -83,10 +83,15 @@ export default function EditProfile(props: ProfileProps) { const extensions = authorizedExtensions?.split('|'); const normalizedExtensions = formatExtensions(extensions); - const { control, handleSubmit, errors, setValue, getValues } = - useForm({ - mode: 'onChange', - }); + const { + control, + handleSubmit, + formState: { errors }, + setValue, + getValues, + } = useForm({ + mode: 'onChange', + }); const [show, setShow] = useState(false); const [currentUserData, setCurrentUserData] = useState(selectedUser); @@ -251,10 +256,7 @@ export default function EditProfile(props: ProfileProps) { // }; const onPressCancel = () => { - if (!show) { - setShow(true); - } - setTimeout(() => setShow(false), 50); + setShow(false); }; const pickImage = async () => { @@ -267,7 +269,7 @@ export default function EditProfile(props: ProfileProps) { aspect: [1, 1], quality: 1, }); - if (!result.canceled) { + if (!result.canceled && result.assets.length) { let format = getFormat(result.assets[0].uri); if (normalizedExtensions.includes(format)) { const reactNativeFile = createReactNativeFile(result.assets[0].uri); @@ -377,7 +379,7 @@ export default function EditProfile(props: ProfileProps) { defaultValue={currentUserData.username} rules={usernameInputRules} control={control} - render={({ onChange, value }) => ( + render={({ field: { onChange, value } }) => ( ( + render={({ field: { onChange, value } }) => ( ( + render={({ field: { onChange, value } }) => ( ( + render={({ field: { onChange, value } }) => ( ( + render={({ field: { onChange, value } }) => ( )} /> */} - {show && ( - - )} + + )} diff --git a/frontend/src/screens/EmailAddress/components/EmailAddressItem.tsx b/frontend/src/screens/EmailAddress/components/EmailAddressItem.tsx index 156f9fdf..e3e8759c 100644 --- a/frontend/src/screens/EmailAddress/components/EmailAddressItem.tsx +++ b/frontend/src/screens/EmailAddress/components/EmailAddressItem.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { ActionSheetIOS, Alert, @@ -46,6 +46,7 @@ export default function EmailAddressItem(props: Props) { }, onError: (error) => { errorHandlerAlert(error); + onSetLoading(false); }, refetchQueries: [ { @@ -69,6 +70,7 @@ export default function EmailAddressItem(props: Props) { }, onError: (error) => { errorHandlerAlert(error); + onSetLoading(false); }, refetchQueries: [ { @@ -78,6 +80,12 @@ export default function EmailAddressItem(props: Props) { ], }); + useEffect(() => { + if (setPrimaryEmailLoading || deleteEmailLoading) { + onSetLoading(true); + } + }, [setPrimaryEmailLoading, deleteEmailLoading, onSetLoading]); + const onSetPrimaryEmail = () => { if (!ios) { setShowOptions(false); @@ -139,10 +147,6 @@ export default function EmailAddressItem(props: Props) { } }; - if (setPrimaryEmailLoading || deleteEmailLoading) { - onSetLoading(true); - } - return ( <> <> diff --git a/frontend/src/screens/Home/Home.tsx b/frontend/src/screens/Home/Home.tsx index cc35c38f..6aa44966 100644 --- a/frontend/src/screens/Home/Home.tsx +++ b/frontend/src/screens/Home/Home.tsx @@ -5,9 +5,17 @@ import React, { useRef, useState, } from 'react'; -import { Animated, PixelRatio, Platform, View } from 'react-native'; +import { Dimensions, PixelRatio, Platform, View } from 'react-native'; import { useNavigation, useRoute } from '@react-navigation/native'; import Constants from 'expo-constants'; +import Animated, { + Extrapolate, + interpolate, + useAnimatedScrollHandler, + useAnimatedStyle, + useSharedValue, +} from 'react-native-reanimated'; +import { useFormContext } from 'react-hook-form'; import { FooterLoadingIndicator, @@ -17,39 +25,43 @@ import { SegmentedControl, } from '../../components'; import { - DEFAULT_CHANNEL, NO_CHANNEL_FILTER, isNoChannelFilter, - NO_EXCERPT_WORDING, isChannelFilter, } from '../../constants'; import { FloatingButton } from '../../core-ui'; -import { TopicsSortEnum } from '../../generated/server/types'; -import { Topics, TopicsVariables } from '../../generated/server/Topics'; +import { + TopicsSortEnum, + TopicsQuery, + TopicsQueryVariables, + TopicsDocument, + TopicFragmentDoc, + TopicFragment, +} from '../../generated/server'; import { client } from '../../graphql/client'; -import { TOPICS } from '../../graphql/server/topics'; import { + clamp, errorHandler, errorHandlerAlert, - getImage, - getToken, + isFlatList, LoginError, - removeToken, - setToken, - showLogoutAlert, + transformTopicToPost, useStorage, } from '../../helpers'; import { useAbout, useChannels, - useLazyActivity, useLazyTopicList, - useRefreshToken, useSiteSettings, } from '../../hooks'; import { makeStyles } from '../../theme'; -import { Post, StackNavProp, TabNavProp, TabRouteProp } from '../../types'; -import { usePost } from '../../utils'; +import { + PostWithoutId, + StackNavProp, + TabNavProp, + TabRouteProp, +} from '../../types'; +import { HomePostItem } from '../../components/PostItem/HomePostItem'; import { HomeNavBar, SearchBar } from './components'; @@ -65,6 +77,15 @@ let sortOptionsArray = Object.entries(sortTypes).map( const NAV_BAR_TITLE_SIZE = 24; const IOS_BAR = 60; const ANDROID_BAR = 64; +const MAX_SCROLL = 300; // at maximum 300 unit will be calculated for interpolation + +/** + * Ensure that the minimum scroll value is not greater than the minimum y value from the scroll when refreshing. + * In this case, we set the minimum scroll value to be half of the device height to account for situations where users may pull the scroll forcefully. + * if dimensions height is 0 we will set min scroll to be 400 + */ + +const MIN_SCROLL = -((Dimensions.get('screen').height || 800) / 2); const fontScale = PixelRatio.getFontScale(); const normalizedSize = NAV_BAR_TITLE_SIZE * (fontScale - 1); @@ -78,15 +99,16 @@ const headerViewHeight = 92; type SortOption = typeof sortOptionsArray[number]; export default function Home() { - const { topicsData, likedTopic, setTopicsData, setLikedTopic } = usePost(); - const { refetch: siteRefetch, error: siteError } = useSiteSettings(); + const { refetch: siteRefetch } = useSiteSettings(); const styles = useStyles(); const tabNavigation = useNavigation>(); - const stackNavigation = useNavigation>(); + const { addListener, navigate } = useNavigation>(); const { params } = useRoute>(); - const receivedChannelId = params === undefined ? 0 : params.selectedChannelId; + const { getValues } = useFormContext(); + const { channelId: receivedChannelId } = getValues(); + const routeParams = params === undefined ? false : params.backToTop; const FIRST_PAGE = 0; @@ -94,23 +116,41 @@ export default function Home() { const storage = useStorage(); const username = storage.getItem('user')?.username || ''; - const headerY = useRef(new Animated.Value(0)).current; - const diffClamp = Animated.diffClamp(headerY, -200, 500); - const headerTranslateY = diffClamp.interpolate({ - inputRange: [0, 500], - outputRange: [actionBarHeight, -(actionBarHeight + headerViewHeight)], - extrapolateLeft: 'clamp', + const scrollOffset = useSharedValue(0); + const scrollHandler = useAnimatedScrollHandler<{ prevY?: number }>({ + onScroll: (event, ctx) => { + const { y } = event.contentOffset; + + const diff = y - (ctx?.prevY ?? 0); + + scrollOffset.value = clamp( + scrollOffset.value + diff, + MIN_SCROLL, + MAX_SCROLL, + ); + + ctx.prevY = event.contentOffset.y; + }, + onBeginDrag: (event, ctx) => { + ctx.prevY = event.contentOffset.y; + }, + }); + const headerTranslateY = useAnimatedStyle(() => { + const interpolateY = interpolate( + scrollOffset.value, + [0, MAX_SCROLL], + [actionBarHeight, -(actionBarHeight + headerViewHeight)], + Extrapolate.CLAMP, + ); + + return { + transform: [{ translateY: interpolateY }], + }; }); useEffect(() => { - if (siteError) { - if (siteError.message === 'Not found or private.') { - stackNavigation.reset({ index: 0, routes: [{ name: 'Login' }] }); - } - } else if (siteRefetch) { - siteRefetch(); - } - }, [siteError, stackNavigation, siteRefetch]); + siteRefetch?.(); + }, [siteRefetch]); useEffect(() => { if (routeParams === true) { @@ -123,33 +163,17 @@ export default function Home() { ); const [refreshing, setRefreshing] = useState(false); const [loading, setLoading] = useState(false); - const [activityLoading, setActivityLoading] = useState(false); const [selectedChannelId, setSelectedChannelId] = useState( NO_CHANNEL_FILTER.id, ); - const [dataReady, setDataReady] = useState(false); + const [topicsData, setTopicsData] = useState | null>( + null, + ); const [page, setPage] = useState(FIRST_PAGE); - const [hasOlderTopics, setHasOlderTopics] = useState(false); + const [hasMoreTopics, setHasMoreTopics] = useState(false); const [allTopicCount, setAllTopicCount] = useState(0); const [width, setWidth] = useState(0); - const { - getRefreshToken, - data: tokenResponse, - error: tokenError, - } = useRefreshToken({ fetchPolicy: 'network-only' }, 'HIDE_ALERT'); - - useEffect(() => { - const currentUserId = storage.getItem('user')?.id; - if (tokenResponse && tokenResponse.refreshToken.id === currentUserId) { - setToken(tokenResponse.refreshToken.token); - } else if (tokenError && currentUserId) { - removeToken(); - storage.removeItem('user'); - showLogoutAlert(); - } - }, [tokenResponse, tokenError, stackNavigation.reset, storage]); - const { loading: channelsLoading, error: channelsError } = useChannels( { onCompleted: (data) => { @@ -165,7 +189,7 @@ export default function Home() { 'HIDE_ALERT', ); - const { getAbout, error: aboutError } = useAbout( + const { getAbout } = useAbout( { onCompleted: (data) => { if (data) { @@ -177,112 +201,39 @@ export default function Home() { 'HIDE_ALERT', ); - const { - getActivity, - data: activityData, - error: activityError, - } = useLazyActivity( - { - variables: { username, offset: 0, filter: '1' }, - onCompleted: ({ userActivity }) => { - let likedTopic = userActivity.filter( - (topic) => topic.actionType === 1 && topic.postNumber === 1, - ); - let tempTopic: Array = []; - likedTopic.forEach((topic) => { - tempTopic.push(topic.topicId ? topic.topicId : 0); - }); - setLikedTopic(tempTopic); - setActivityLoading(false); - }, - onError: () => setActivityLoading(false), - }, - 'HIDE_ALERT', - ); - const setData = useCallback( - ({ topics }: Topics) => { + ({ topics }: TopicsQuery) => { let rawTopicsData = topics?.topicList?.topics ? topics.topicList.topics : []; - let usersData = topics?.users || []; let channelsData = storage.getItem('channels'); - let normalizedTopicsData: Array = rawTopicsData.map( - ({ - posters, - id, - title, - excerpt, - visible, - authorUserId, - pinned, - liked, - likeCount, - postsCount, - imageUrl, - tags, - bumpedAt: createdAt, - views, - categoryId, - }) => { - let authorUser = usersData.find(({ id }) => id === authorUserId); - let frequentUser = posters.map(({ userId, user }) => { - let userData = usersData.find( - ({ id }) => id === userId || user?.id === id, - ); - return { - id: userData?.id || 0, - username: userData?.username || '', - avatar: getImage(userData?.avatar ?? ''), - }; + let normalizedTopicsData: Array = rawTopicsData.map( + (topic) => { + return transformTopicToPost({ + ...topic, + channels: channelsData ?? [], }); - let channel = channelsData?.find( - (channel) => channel.id === categoryId, - ); - - return { - id, - topicId: id, - title, - content: excerpt || NO_EXCERPT_WORDING, - hidden: !visible, - username: authorUser?.username || '', - postId: authorUserId || 0, - images: imageUrl ? [imageUrl] : undefined, - avatar: authorUser ? getImage(authorUser.avatar) : '', - pinned, - replyCount: postsCount - 1, - likeCount, - viewCount: views, - isLiked: liked || false, - channel: channel || DEFAULT_CHANNEL, - tags: tags || [], - createdAt, - freqPosters: frequentUser, - }; }, ); if (normalizedTopicsData.length === allTopicCount) { - setHasOlderTopics(false); + setHasMoreTopics(false); } else { - setHasOlderTopics(true); + setHasMoreTopics(true); } setTopicsData(normalizedTopicsData); - setDataReady(true); }, - [allTopicCount, setTopicsData, storage], + [allTopicCount, storage], ); const { getTopicList, - loading: topicsLoading, error: topicsError, refetch: refetchTopics, fetchMore: fetchMoreTopics, } = useLazyTopicList({ variables: isNoChannelFilter(selectedChannelId) - ? { sort: sortState, page } - : { sort: sortState, categoryId: selectedChannelId, page }, + ? { sort: sortState, page, username } + : { sort: sortState, categoryId: selectedChannelId, page, username }, onError: () => { setRefreshing(false); setLoading(false); @@ -296,10 +247,10 @@ export default function Home() { }); const getData = useCallback( - (variables: TopicsVariables) => { + (variables: TopicsQueryVariables) => { try { - const data: Topics | null = client.readQuery({ - query: TOPICS, + const data: TopicsQuery | null = client.readQuery({ + query: TopicsDocument, variables, }); data && setData(data); @@ -312,98 +263,87 @@ export default function Home() { ); useLayoutEffect(() => { - postListRef.current?.scrollToIndex({ index: 0, viewOffset: 80 }); + if (!isFlatList(postListRef.current)) { + return; + } + postListRef.current.scrollToIndex({ + index: 0, + viewOffset: headerViewHeight, + }); }, [selectedChannelId]); useEffect(() => { let channels = storage.getItem('channels'); if (channels && receivedChannelId) { setSelectedChannelId(receivedChannelId); - setPage(0); } else if (channels) { setSelectedChannelId(NO_CHANNEL_FILTER.id); } - const unsubscribe = stackNavigation.addListener('focus', () => { + const unsubscribe = addListener('focus', () => { let categoryId = receivedChannelId; if (receivedChannelId) { categoryId = isNoChannelFilter(receivedChannelId) - ? 0 + ? undefined : receivedChannelId; } + let currentPage = page; - const variables: TopicsVariables = { + if (receivedChannelId && receivedChannelId !== selectedChannelId) { + currentPage = 0; + } + + const variables: TopicsQueryVariables = { sort: sortState, categoryId, - page: FIRST_PAGE, + page: currentPage, }; - setPage(FIRST_PAGE); + setPage(currentPage); getData(variables); - getToken().then((token) => { - if (token) { - return getRefreshToken(); - } - }); + getAbout(); - if (username) { - getActivity(); - } }); return unsubscribe; }, [ - getRefreshToken, + selectedChannelId, getAbout, - getActivity, - stackNavigation, receivedChannelId, username, storage, sortState, page, getData, + addListener, ]); - useEffect(() => { - if (!aboutError) { - return; - } - stackNavigation.reset({ index: 0, routes: [{ name: 'Login' }] }); - }, [aboutError, stackNavigation]); - - const postListRef = useRef(null); - if (routeParams) { - postListRef.current?.scrollToIndex({ index: 0, viewOffset: 80 }); + const postListRef = useRef>(null); + if (routeParams && isFlatList(postListRef.current)) { + postListRef.current.scrollToIndex({ + index: 0, + viewOffset: headerViewHeight, + }); } const onPressTitle = () => { - stackNavigation.navigate('Channels', { - prevScreen: 'Home', - selectedChannelId: selectedChannelId, - }); + navigate('Channels', { prevScreen: 'Home' }); }; const onPressAdd = () => { const currentUserId = storage.getItem('user')?.id; if (currentUserId) { - stackNavigation.navigate('NewPost', { - selectedChannelId, - selectedTagsIds: [], - }); + navigate('NewPost'); } else { - errorHandlerAlert(LoginError, stackNavigation.navigate); + errorHandlerAlert(LoginError, navigate); } }; const onPressSearch = () => { - stackNavigation.navigate('Search'); + navigate('Search'); }; const onRefresh = () => { setRefreshing(true); - let { cache } = client; - cache.evict({ id: 'ROOT_QUERY', fieldName: 'topics' }); - cache.gc(); if (refetchTopics) { setPage(FIRST_PAGE); refetchTopics().then(() => setRefreshing(false)); @@ -414,52 +354,69 @@ export default function Home() { const sortState: TopicsSortEnum = name === 'LATEST' ? TopicsSortEnum.Latest : TopicsSortEnum.Top; setSortState(sortState); - const variables: TopicsVariables = isNoChannelFilter(selectedChannelId) + const variables: TopicsQueryVariables = isNoChannelFilter(selectedChannelId) ? { sort: sortState, page: FIRST_PAGE } : { sort: sortState, categoryId: selectedChannelId, page: FIRST_PAGE, }; - setTopicsData([]); + setTopicsData(null); setPage(FIRST_PAGE); getData(variables); }; - const onPressReply = (postId: number) => { - let clickedPost = topicsData.filter((post) => post.id === postId); - stackNavigation.navigate('PostReply', { - topicId: postId, - title: clickedPost[0].title, - focusedPostNumber: clickedPost[0].replyCount, - }); - }; + const onPressReply = useCallback( + (param: { topicId: number }) => { + let { topicId } = param; + const cacheTopic = client.readFragment({ + id: `Topic:${topicId}`, + fragment: TopicFragmentDoc, + }); + if (!cacheTopic) { + return null; + } + let { title, replyCount } = transformTopicToPost(cacheTopic); + navigate('PostReply', { + topicId, + title, + focusedPostNumber: replyCount, + }); + }, + [navigate], + ); + + let isFetchingMoreTopics = useRef(false); const onEndReached = async () => { - if (!hasOlderTopics) { + if (!hasMoreTopics || isFetchingMoreTopics.current || !fetchMoreTopics) { return; } - const nextPage = page + 1; - if (fetchMoreTopics) { - let variables: TopicsVariables; - if (isNoChannelFilter(selectedChannelId)) { - variables = { sort: sortState, page: nextPage }; - } else { - variables = { - sort: sortState, - page: nextPage, - categoryId: selectedChannelId, - }; - } + const nextPage = page + 1; + let variables: TopicsQueryVariables; + if (isNoChannelFilter(selectedChannelId)) { + variables = { sort: sortState, page: nextPage }; + } else { + variables = { + sort: sortState, + page: nextPage, + categoryId: selectedChannelId, + }; + } + try { + isFetchingMoreTopics.current = true; let result = await fetchMoreTopics({ variables }); + isFetchingMoreTopics.current = false; if (result.data.topics.topicList?.topics?.length === 0) { - setHasOlderTopics(false); + setHasMoreTopics(false); } else { - setData(result.data); setPage(nextPage); } setLoading(false); + } catch (error) { + isFetchingMoreTopics.current = false; + setLoading(false); } }; @@ -487,30 +444,19 @@ export default function Home() { if (channelsError) { return ; } - if (activityError) { - return ; - } if (topicsError) { return ; } - if ( - (((topicsLoading && topicsData.length < 1) || - channelsLoading || - (activityLoading && !activityData)) && - !refreshing) || - loading - ) { + if (!topicsData || channelsLoading || loading) { return ; } - if (topicsData.length < 1 && dataReady) { + if (topicsData && topicsData.length < 1) { return ; } return ( { + return ( + + ); + }} ListFooterComponent={ - + } /> ); @@ -554,12 +503,7 @@ export default function Home() { onPressAdd={onPressAdd} style={styles.navBar} /> - + >(); const { - params: { prevScreen, title, id, post, postPointer }, + params: { prevScreen, title, id, replyToPostId, postNumber }, } = useRoute>(); - const { control, errors, formState, getValues } = useForm({ + const { + control, + formState: { errors }, + formState, + getValues, + } = useForm({ mode: 'onChange', }); @@ -42,22 +47,19 @@ export default function Hyperlink() { navigate(prevScreen, { title, topicId: id, - post, + replyToPostId, hyperlinkUrl, hyperlinkTitle, }); } } else if (prevScreen === 'MessageDetail') { - if (id && postPointer) { - navigate('Main', { - screen: prevScreen, - params: { - id, - postPointer, - emptied: false, - hyperlinkUrl, - hyperlinkTitle, - }, + if (id && postNumber) { + navigate(prevScreen, { + id, + postNumber, + emptied: false, + hyperlinkUrl, + hyperlinkTitle, }); } } @@ -92,7 +94,7 @@ export default function Hyperlink() { defaultValue="" rules={{ required: true }} control={control} - render={({ value, onChange, onBlur }) => ( + render={({ field: { value, onChange, onBlur } }) => ( ( + render={({ field: { value, onChange, onBlur } }) => ( >(); - // TODO: Make use of error from useLoadFonts - const { loading: fontsLoading } = useLoadFonts(); - const { + loading, canSignUp, - loading: settingsLoading, - error: settingsError, - } = useSiteSettings(); - - const loading = fontsLoading || settingsLoading; + error: siteSettingsError, + } = useSiteSettings({ fetchPolicy: 'network-only' }); useEffect(() => { if (loading) { return; } - if (!settingsError || canSignUp) { + if (!siteSettingsError || canSignUp) { reset({ index: 0, routes: [{ name: 'TabNav' }] }); } else { // TODO: We should only do this if error is the specific @@ -35,7 +29,7 @@ export default function Loading() { // contact an administrator, etc. reset({ index: 0, routes: [{ name: 'Login' }] }); } - }, [loading, settingsError, canSignUp, reset]); + }, [canSignUp, siteSettingsError, loading, reset]); - return <>{settingsLoading && }; + return <>{loading && }; } diff --git a/frontend/src/screens/Login.tsx b/frontend/src/screens/Login.tsx index a31678db..f0b9e049 100644 --- a/frontend/src/screens/Login.tsx +++ b/frontend/src/screens/Login.tsx @@ -7,10 +7,12 @@ import { Controller, useForm } from 'react-hook-form'; import { DarkLogo, LightLogo } from '../../assets/images'; import { CustomHeader } from '../components'; import { Button, Text, TextInput, TextInputType } from '../core-ui'; -import { errorHandler, getImage, setToken, useStorage } from '../helpers'; -import { useLogin, useSiteSettings } from '../hooks'; +import { errorHandler, getImage, useStorage } from '../helpers'; +import { useLogin, usePushNotificationsToken, useSiteSettings } from '../hooks'; import { makeStyles, useColorScheme } from '../theme'; import { StackNavProp } from '../types'; +import { useRedirect } from '../utils'; +import { useAuth } from '../utils/AuthProvider'; type Form = { email: string; @@ -23,17 +25,19 @@ export default function Login() { const { colorScheme } = useColorScheme(); const { canSignUp = false } = useSiteSettings(); const storage = useStorage(); + const { setTokenState } = useAuth(); const styles = useStyles(); + const { redirectPath, setRedirectPath, handleRedirect } = useRedirect(); const [hidePassword, setHidePassword] = useState(true); const { reset, navigate } = useNavigation>(); - + const { syncToken } = usePushNotificationsToken(); const { login, loading, error } = useLogin({ - onCompleted: ({ login: authUser }) => { + onCompleted: async ({ login: authUser }) => { // eslint-disable-next-line no-underscore-dangle if (authUser.__typename === 'LoginOutput') { - setToken(authUser.token); + setTokenState(authUser.token); let { user } = authUser; storage.setItem('user', { id: user.id, @@ -41,8 +45,14 @@ export default function Login() { name: user.name ?? '', avatar: getImage(user.avatar), }); + syncToken(); - reset({ index: 0, routes: [{ name: 'TabNav' }] }); + if (redirectPath) { + handleRedirect(); + setRedirectPath(''); + } else { + reset({ index: 0, routes: [{ name: 'TabNav' }] }); + } // eslint-disable-next-line no-underscore-dangle } else if (authUser.__typename === 'SecondFactorRequired') { navigate('TwoFactorAuth', tempUser); @@ -53,7 +63,12 @@ export default function Login() { const passwordInputRef = useRef(null); - const { control, handleSubmit, errors, formState } = useForm({ + const { + control, + handleSubmit, + formState: { errors }, + formState, + } = useForm({ mode: 'onChange', }); @@ -62,8 +77,9 @@ export default function Login() { navigate('Register'); }; - const onSubmit = handleSubmit(({ email, password }) => { + const onSubmit = handleSubmit(async ({ email, password }) => { Keyboard.dismiss(); + tempUser = { email, password }; login({ variables: { @@ -101,7 +117,7 @@ export default function Login() { defaultValue="" rules={{ required: true }} control={control} - render={({ onChange, value, onBlur }) => ( + render={({ field: { onChange, value, onBlur } }) => ( ( + render={({ field: { onChange, value, onBlur } }) => ( >(); const { params } = useRoute>(); - const { topicId, imageUri, postPointer, message } = params; + const { topicId, imageUri, message } = params; const [loading, setLoading] = useState(false); const [imageMessage, setImageMessage] = useState(message); @@ -46,10 +46,10 @@ export default function ImagePreview() { const user = useStorage().getItem('user'); const { reply } = useReplyPost({ - onCompleted: () => { + onCompleted: ({ reply: { postNumber } }) => { navigate('MessageDetail', { id: topicId, - postPointer: postPointer + 1, + postNumber, emptied: true, hyperlinkUrl: '', hyperlinkTitle: '', diff --git a/frontend/src/screens/MessageDetail/MessageDetail.tsx b/frontend/src/screens/MessageDetail/MessageDetail.tsx index 110b733b..917adaf5 100644 --- a/frontend/src/screens/MessageDetail/MessageDetail.tsx +++ b/frontend/src/screens/MessageDetail/MessageDetail.tsx @@ -22,6 +22,7 @@ import { } from '../../components'; import { Divider, Icon, TextInputType } from '../../core-ui'; import { + errorHandler, errorHandlerAlert, formatExtensions, getHyperlink, @@ -30,6 +31,7 @@ import { insertHyperlink, mentionHelper, messageDetailHandler, + messageInvalidAccessAlert, useStorage, } from '../../helpers'; import { @@ -37,7 +39,8 @@ import { useMessageTiming, useReplyPost, useSiteSettings, - useTopicDetail, + useMessageDetail, + useLoadMorePost, } from '../../hooks'; import { makeStyles, useTheme } from '../../theme'; import { @@ -48,6 +51,8 @@ import { StackRouteProp, User, } from '../../types'; +import { FIRST_POST_NUMBER, MAX_POST_COUNT_PER_REQUEST } from '../../constants'; +import { useInitialLoad } from '../../hooks/useInitialLoad'; import { MessageItem, ReplyInputField } from './components'; @@ -67,9 +72,18 @@ enum Operation { 'CHAT', } +/** + * Index starts with 0, while count starts with 1, + * so the max initial last index would be max count - 1, + * assuming the server returns the maximum number of posts + */ +const MAX_INITIAL_LAST_INDEX = MAX_POST_COUNT_PER_REQUEST - 1; +const SYSTEM_USERNAME = 'system'; + export default function MessageDetail() { const styles = useStyles(); const { colors } = useTheme(); + const useInitialLoadResult = useInitialLoad(); const storage = useStorage(); const user = storage.getItem('user'); @@ -81,22 +95,14 @@ export default function MessageDetail() { const ios = Platform.OS === 'ios'; const screen = Dimensions.get('screen'); - const { navigate } = useNavigation>(); + const { navigate, reset } = useNavigation>(); const { - params: { - id, - postPointer, - emptied, - hyperlinkUrl = '', - hyperlinkTitle = '', - }, + params: { id, postNumber, emptied, hyperlinkUrl = '', hyperlinkTitle = '' }, } = useRoute>(); const [hasOlderMessages, setHasOlderMessages] = useState(true); const [hasNewerMessages, setHasNewerMessages] = useState(true); - const [loadingOlderMessages, setLoadingOlderMessages] = useState(false); - const [loadingNewerMessages, setLoadingNewerMessages] = useState(false); const [refetching, setRefetching] = useState(false); const [isInitialRequest, setIsInitialRequest] = useState(true); const [textInputFocused, setInputFocused] = useState(false); @@ -104,13 +110,15 @@ export default function MessageDetail() { const [title, setTitle] = useState(''); const [message, setMessage] = useState(''); - const [startIndex, setStartIndex] = useState(0); - const [endIndex, setEndIndex] = useState(0); + const [firstLoadedPostIndex, setFirstLoadedPostIndex] = useState(0); + const [lastLoadedPostIndex, setLastLoadedPostIndex] = useState(0); const [initialHeight, setInitialHeight] = useState(); const [data, setData] = useState(); + // Members are all users who can read or send messages const [members, setMembers] = useState>([]); - const [userWhoComment, setUserWhoComment] = useState>([]); + // Participants are users who have sent messages at least once + const [participants, setParticipants] = useState>([]); const [stream, setStream] = useState>([]); const virtualListRef = useRef>(null); @@ -137,42 +145,64 @@ export default function MessageDetail() { loading: messageDetailLoading, refetch, fetchMore, - } = useTopicDetail({ - variables: { - topicId: id, - postPointer, - }, - onCompleted: ({ topicDetail: result }) => { - if (result) { - setIsInitialRequest(true); - setTitle(result.title || ''); - - const tempParticipants: Array = []; - result.details?.allowedUsers?.forEach((allowedUser) => - tempParticipants.push({ - id: allowedUser.id, - username: allowedUser.username, - avatar: getImage(allowedUser.avatarTemplate), - }), - ); - setMembers(tempParticipants); - let userWhoComment: Array = []; - result.details?.participants.forEach((user) => { - userWhoComment.push({ - id: user.id, - username: user.username, - avatar: getImage(user.avatar), - }); - }); - setUserWhoComment(userWhoComment); - } - }, - onError: (error) => { - loadingOlderMessages && setLoadingOlderMessages(false); - errorHandlerAlert(error); + error, + } = useMessageDetail( + { + variables: { topicId: id, postNumber }, + onCompleted: ({ privateMessageDetail: result }) => { + if (result) { + setTitle(result.title || ''); + + if (!result.details) { + return; + } + const messageMembers = result.details.allowedUsers?.map( + ({ avatarTemplate, __typename, ...otherProps }) => ({ + ...otherProps, + avatar: getImage(avatarTemplate), + }), + ); + messageMembers && setMembers(messageMembers); + let participants: Array = result.details.participants.map( + ({ avatar, __typename, ...otherProps }) => ({ + ...otherProps, + avatar: getImage(avatar), + }), + ); + setParticipants(participants); + } + }, + onError: (error) => { + /** + * if we get error about private post which cannot be access. + * we need check first it is because user haven't login or because post it self only open to specific group + * if user not login we will redirect to login scene. + * But if user already login still get same error will redirect to home scene and show private post alert + */ + + if (error.message.includes('Invalid Access')) { + if ( + !useInitialLoadResult.loading && + !useInitialLoadResult.isLoggedIn + ) { + reset({ + index: 1, + routes: [ + { name: 'TabNav', state: { routes: [{ name: 'Home' }] } }, + { + name: 'Login', + }, + ], + }); + } else { + navigate('TabNav', { state: { routes: [{ name: 'Home' }] } }); + messageInvalidAccessAlert(); + } + } + }, }, - fetchPolicy: 'cache-and-network', - }); + 'HIDE_ALERT', + ); useEffect(() => { if (emptied) { @@ -186,7 +216,7 @@ export default function MessageDetail() { } const { - topicDetail: { postStream, details }, + privateMessageDetail: { details, postStream }, } = baseData; if (!details) { @@ -197,7 +227,7 @@ export default function MessageDetail() { data: tempData, hasNewerMessage: newMessage, hasOlderMessage: oldMessage, - baseStream, + stream: baseStream, firstPostIndex, lastPostIndex, } = messageDetailHandler({ postStream, details }); @@ -206,8 +236,13 @@ export default function MessageDetail() { setStream(baseStream); setHasNewerMessages(newMessage); setHasOlderMessages(oldMessage); - setStartIndex(firstPostIndex); - setEndIndex(lastPostIndex); + if (firstPostIndex) { + setFirstLoadedPostIndex(firstPostIndex); + } + + if (lastPostIndex) { + setLastLoadedPostIndex(lastPostIndex); + } }, [baseData]); useEffect(() => { @@ -231,7 +266,7 @@ export default function MessageDetail() { const { reply, loading: replyLoading } = useReplyPost({ onCompleted: () => { setMessage(''); - refetch({ postPointer: stream.length || 1 }).then(() => { + refetch({ postNumber: stream.length }).then(() => { if (textInputFocused && data?.contents.length) { if (ios) { virtualListRef.current?.scrollToIndex({ @@ -252,63 +287,30 @@ export default function MessageDetail() { }, }); - useMessageTiming(id, startIndex, data?.contents); + useMessageTiming(id, firstLoadedPostIndex, data?.contents); - const loadStartMore = async () => { - if ( - loadingOlderMessages || - !hasOlderMessages || - !stream || - messageDetailLoading - ) { + const { loadMorePosts, isLoadingOlderPost } = useLoadMorePost(id); + const loadMoreMessages = async (loadNewerMessages: boolean) => { + if (messageDetailLoading) { return; } - setLoadingOlderMessages(true); - let nextEndIndex = startIndex; - let newDataCount = Math.min(10, stream.length - nextEndIndex); - let nextStartIndex = Math.max(0, nextEndIndex - newDataCount); - - let nextPosts = stream.slice(nextStartIndex, nextEndIndex); - if (!nextPosts.length) { - return; - } - await fetchMore({ - variables: { - topicId: id, - posts: nextPosts, - }, - }).then(() => { - setStartIndex(nextStartIndex); - setLoadingOlderMessages(false); + let newPostIndex = await loadMorePosts({ + fetchMore, + firstLoadedPostIndex, + lastLoadedPostIndex, + stream, + loadNewerPosts: loadNewerMessages, + hasMorePost: loadNewerMessages ? hasNewerMessages : hasOlderMessages, }); - }; - - const loadEndMore = async () => { - if ( - loadingNewerMessages || - !hasNewerMessages || - !stream || - messageDetailLoading - ) { + if (!newPostIndex) { return; } - setLoadingNewerMessages(true); - let nextStartIndex = endIndex + 1; - let newDataCount = Math.min(10, stream.length - nextStartIndex); - let nextEndIndex = nextStartIndex + newDataCount; - - let nextPosts = stream.slice(nextStartIndex, nextEndIndex); - if (!nextPosts.length) { + const { nextLastLoadedPostIndex, nextFirstLoadedPostIndex } = newPostIndex; + if (loadNewerMessages) { + setLastLoadedPostIndex(nextLastLoadedPostIndex); return; } - await fetchMore({ - variables: { - topicId: id, - posts: nextPosts, - }, - }); - setEndIndex(nextEndIndex - 1); - setLoadingNewerMessages(false); + setFirstLoadedPostIndex(nextFirstLoadedPostIndex); }; const onPressSend = (message: string) => { @@ -336,7 +338,6 @@ export default function MessageDetail() { navigate('ImagePreview', { topicId: id, imageUri, - postPointer: stream.length, message, }); } catch (unknownError) { @@ -368,10 +369,9 @@ export default function MessageDetail() { if (currIndex === 0) { return; } - const currUserId = data.contents[currIndex].userId; - const prevUserId = data.contents[currIndex - 1].userId; - - return currUserId === prevUserId; + const currUser = data.contents[currIndex].username; + const prevUser = data.contents[currIndex - 1].username; + return currUser === prevUser; } return false; }; @@ -395,7 +395,7 @@ export default function MessageDetail() { const onPressLink = () => { navigate('HyperLink', { id, - postPointer, + postNumber, prevScreen: 'MessageDetail', }); }; @@ -407,10 +407,15 @@ export default function MessageDetail() { const renderItem = ({ item, index }: MessageDetailRenderItem) => { let user; - if (item.userId === 0) { + /** + * System is only included in members. + * Other message senders are included in participants, but may not + * be included as members if they are removed. + */ + if (item.username === SYSTEM_USERNAME) { user = members.find((member) => member.id === -1); } else { - user = userWhoComment.find((member) => member.id === item.userId); + user = participants.find((member) => member.username === item.username); } const newTimestamp = compareTime(index); @@ -468,7 +473,12 @@ export default function MessageDetail() { inputRef={messageRef} loading={replyLoading} onPressSend={onPressSend} - style={styles.inputContainer} + style={[ + styles.inputContainer, + message.trim() !== '' && { + paddingVertical: 6, + }, + ]} message={message} setMessage={setMessage} onSelectedChange={(cursor) => { @@ -536,8 +546,9 @@ export default function MessageDetail() { const onContentSizeChange = () => { if (isInitialRequest) { - let pointerToIndex = postPointer - 1 - startIndex; - let index = Math.min(19, pointerToIndex); + let postIndex = postNumber - FIRST_POST_NUMBER; + let postIndexInLoadedList = postIndex - firstLoadedPostIndex; + let index = Math.min(MAX_INITIAL_LAST_INDEX, postIndexInLoadedList); try { virtualListRef.current?.scrollToIndex({ animated: true, @@ -554,29 +565,41 @@ export default function MessageDetail() { return ; } + const Header = ios ? ( + + ) : ( + + ); + + if (error) { + return ( + + {Header} + + + ); + } + return ( - {ios ? ( - - ) : ( - - )} + {Header} + loadMoreMessages(false)} tintColor={colors.primary} /> } - data={data?.contents} + data={data?.contents ?? []} getItem={getItem} getItemCount={getItemCount} renderItem={renderItem} @@ -586,7 +609,7 @@ export default function MessageDetail() { top: contentHeight ? ((5 * screen.height) / 100) * -1 : 0, }} onEndReachedThreshold={0.1} - onEndReached={loadEndMore} + onEndReached={() => loadMoreMessages(true)} onContentSizeChange={onContentSizeChange} contentContainerStyle={styles.messages} ListFooterComponent={ @@ -638,7 +661,7 @@ const useStyles = makeStyles(({ colors, shadow, spacing }) => { inputContainer: { flex: 1, paddingLeft: spacing.xl, - paddingVertical: spacing.s, + paddingVertical: spacing.m, paddingRight: spacing.s, backgroundColor: colors.background, }, diff --git a/frontend/src/screens/MessageDetail/components/MessageItem.tsx b/frontend/src/screens/MessageDetail/components/MessageItem.tsx index eac6db78..62710ffe 100644 --- a/frontend/src/screens/MessageDetail/components/MessageItem.tsx +++ b/frontend/src/screens/MessageDetail/components/MessageItem.tsx @@ -4,7 +4,7 @@ import { Platform, View } from 'react-native'; import { Avatar, ChatBubble, Divider, Text } from '../../../core-ui'; import { formatDateTime, - handleSpecialMarkdown, + handleUnsupportedMarkdown, useStorage, } from '../../../helpers'; import { makeStyles, useTheme } from '../../../theme'; @@ -30,7 +30,7 @@ export function MessageItem(props: Props) { const myUsername = storage.getItem('user')?.username || ''; const isMe = sender?.username === myUsername; const noUsername = sender?.username === undefined; - const mentionedUsers = content.listOfMention; + const mentionedUsers = content.mentions; return ( @@ -56,9 +56,8 @@ export function MessageItem(props: Props) { onPress={onPressAvatar} /> @@ -74,11 +73,10 @@ export function MessageItem(props: Props) { > )} diff --git a/frontend/src/screens/MessageDetail/components/ReplyInputField.tsx b/frontend/src/screens/MessageDetail/components/ReplyInputField.tsx index 1351e4f0..c4e79e13 100644 --- a/frontend/src/screens/MessageDetail/components/ReplyInputField.tsx +++ b/frontend/src/screens/MessageDetail/components/ReplyInputField.tsx @@ -101,6 +101,7 @@ const useStyles = makeStyles(({ colors, fontSizes, spacing }) => { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', + flex: 1, backgroundColor: colors.backgroundDarker, borderColor: colors.border, @@ -120,6 +121,13 @@ const useStyles = makeStyles(({ colors, fontSizes, spacing }) => { textInput: { color: colors.textNormal, fontSize: fontSizes.m, + /** + * By default, the height for the textInput is 24.3. + * However, because we set the height based on the native layout size, + * the default size becomes 19.3, causing the placeholder text in the text input to be cut off. + * To address this issue, we have set the minimum height as 25, which should fix the problem. + */ + minHeight: 25, }, }; }); diff --git a/frontend/src/screens/Messages/Components/MessageCard.tsx b/frontend/src/screens/Messages/Components/MessageCard.tsx index 76e26de2..fcece601 100644 --- a/frontend/src/screens/Messages/Components/MessageCard.tsx +++ b/frontend/src/screens/Messages/Components/MessageCard.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { TouchableOpacity, TouchableOpacityProps } from 'react-native'; +import { TouchableOpacity } from 'react-native'; import { useNavigation } from '@react-navigation/native'; import { formatRelativeTime } from '../../../helpers'; @@ -10,11 +10,11 @@ import { MessageAvatar } from './MessageAvatar'; import { MessageContent } from './MessageContent'; import { MessageNotification } from './MessageNotification'; -type Props = TouchableOpacityProps & { +type Props = { id: number; message: string; messageParticipants: MessageParticipants; - postPointer: number; + postNumber: number; allowedUserCount?: number | null; date: string; seen?: boolean; @@ -33,7 +33,7 @@ export function MessageCard(props: Props) { date, seen: seenProps, allowedUserCount, - postPointer, + postNumber, } = props; const { participantsToShow } = messageParticipants ?? { @@ -52,7 +52,7 @@ export function MessageCard(props: Props) { } navigate('MessageDetail', { id, - postPointer, + postNumber, hyperlinkUrl: '', hyperlinkTitle: '', }); diff --git a/frontend/src/screens/Messages/Messages.tsx b/frontend/src/screens/Messages/Messages.tsx index 3563490d..f36c6790 100644 --- a/frontend/src/screens/Messages/Messages.tsx +++ b/frontend/src/screens/Messages/Messages.tsx @@ -13,16 +13,17 @@ import { LoadingOrError, } from '../../components'; import { FloatingButton } from '../../core-ui'; -import { Message } from '../../generated/server/Message'; +import { MessageQuery } from '../../generated/server'; import { errorHandler, getParticipants, useStorage } from '../../helpers'; import { useMessageList } from '../../hooks'; import { makeStyles, useTheme } from '../../theme'; import { MessageParticipants, StackNavProp } from '../../types'; +import { FIRST_POST_NUMBER } from '../../constants'; import { MessageCard } from './Components'; type MessageType = NonNullable< - Message['privateMessage']['topicList']['topics'] + MessageQuery['privateMessage']['topicList']['topics'] >[number]; type MessageRenderItem = { item: MessageType; index: number }; @@ -145,7 +146,7 @@ export default function Messages() { message={item.title} messageParticipants={participants[index]} allowedUserCount={item.allowedUserCount} - postPointer={item.lastReadPostNumber || 1} + postNumber={item.lastReadPostNumber ?? FIRST_POST_NUMBER} date={item.lastPostedAt || ''} seen={!item.unseen} /> diff --git a/frontend/src/screens/NewMessage.tsx b/frontend/src/screens/NewMessage.tsx index de64a5cf..f30dd176 100644 --- a/frontend/src/screens/NewMessage.tsx +++ b/frontend/src/screens/NewMessage.tsx @@ -21,7 +21,7 @@ import { TextArea, } from '../components'; import { Divider, Icon, Text, TextInputType } from '../core-ui'; -import { UploadTypeEnum } from '../generated/server/types'; +import { UploadTypeEnum } from '../generated/server'; import { bottomMenu, createReactNativeFile, @@ -29,9 +29,9 @@ import { getHyperlink, getImage, insertHyperlink, + insertImageUploadStatus, mentionHelper, - reformatMarkdownAfterUpload, - reformatMarkdownBeforeUpload, + getReplacedImageUploadStatus, useStorage, } from '../helpers'; import { @@ -43,6 +43,7 @@ import { import { makeStyles, useTheme } from '../theme'; import { CursorPosition, + FormTitle, Image, RootStackNavProp, RootStackParamList, @@ -51,11 +52,6 @@ import { } from '../types'; import { useModal } from '../utils'; -type Form = { - title: string; - raw: string; -}; - export default function NewMessage() { const { modal, setModal } = useModal(); const styles = useStyles(); @@ -84,7 +80,7 @@ export default function NewMessage() { } = useRoute>(); const { control, handleSubmit, setValue, getValues, formState } = - useForm({ mode: 'onChange' }); + useForm({ mode: 'onChange' }); const kasv = useKASVWorkaround(); @@ -103,7 +99,13 @@ export default function NewMessage() { const debounced = useDebouncedCallback((value, token) => { if (imagesArray[token - 1]) { - reformatMarkdownAfterUpload(value, imagesArray, token, setValue); + let newText = getReplacedImageUploadStatus( + value, + token, + imagesArray[token - 1].link, + ); + + setValue('raw', newText); } }, 1500); @@ -148,12 +150,12 @@ export default function NewMessage() { setCurrentUploadToken(currentUploadToken + 1); const reactNativeFile = createReactNativeFile(uri); const { raw } = getValues(); - reformatMarkdownBeforeUpload( + let result = insertImageUploadStatus( raw, cursorPosition.start, - imagesArray, - setValue, + imagesArray.length + 1, ); + setValue('raw', result); upload({ variables: { file: reactNativeFile, @@ -184,13 +186,13 @@ export default function NewMessage() { navigate(screen, params); }; - const { onInsertImage, onInsertLink } = bottomMenu( + const { onInsertImage, onInsertLink } = bottomMenu({ isKeyboardShow, user, - onNavigate, - 'NewMessage', - normalizedExtensions, - ); + navigate: onNavigate, + prevScreen: 'NewMessage', + extensions: normalizedExtensions, + }); useEffect(() => { setSelectedUsers(users); @@ -259,6 +261,10 @@ export default function NewMessage() { navigate('SelectUser', { users, listOfUser }); }; + const setMentionValue = (text: string) => { + setValue('raw', text); + }; + const Header = () => ios ? ( ( + render={({ field: { onChange, value } }) => ( ( + render={({ field: { onChange, value } }) => (

#!_w(%2SyZ(uTegO0Q#(7G!r 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%0D->f|+xAnXf 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%0Aj2Je)HQ0#EX*9^%J(B)L6m8PgtRvo8K1Z=A7BK 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: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 diff --git a/documentation/static/img/guides/testFlight/build-artifact.png b/documentation/static/img/guides/testFlight/build-artifact.png index d16c0a93a12337cf9a14fd18c5b0a6a0ee6f1901..491277ac15a71656b23d739236f24f3bf88ef9dd 100644 GIT binary patch literal 56098 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%0DrM|B&eU*YQE1s22$JVu{$TO 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 literal 27621 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