diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3fb0781e..64c8c7c8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [master, v2.0.0-beta] + branches: [master] pull_request: - branches: [master, v2.0.0-beta] + branches: [master] jobs: build: diff --git a/api/package.json b/api/package.json index 3f57cdc3..d51a9ae6 100644 --- a/api/package.json +++ b/api/package.json @@ -25,7 +25,7 @@ "camelcase-keys": "^6.2.2", "dotenv": "^8.2.0", "form-data": "^4.0.0", - "graphql": "^16.5.0", + "graphql": "^16.8.1", "nexus": "^1.4.0-next.11", "querystring": "^0.2.0", "set-cookie-parser": "^2.5.1", @@ -33,7 +33,7 @@ "tough-cookie": "^4.1.3", "winston": "^3.10.0", "winston-daily-rotate-file": "^4.7.1", - "zod": "^3.22.0" + "zod": "^3.22.3" }, "devDependencies": { "@total-typescript/ts-reset": "^0.4.2", diff --git a/api/src/__tests__/getTopicAuthor.ts b/api/src/__tests__/getTopicAuthor.ts index 4f693d69..3168d75c 100644 --- a/api/src/__tests__/getTopicAuthor.ts +++ b/api/src/__tests__/getTopicAuthor.ts @@ -2,23 +2,26 @@ import { getTopicAuthor, getTopicAuthorUserId, } from '../helpers/getTopicAuthor'; -import { TopicPoster } from '../types'; +import { PosterUnion } from '../types'; -function getUserWithId( - userId: number | null, - description: string, -): TopicPoster { +function getUserWithId(userId: number, description: string): PosterUnion { return { userId, description, extras: null, - user: null, + user: { + id: userId, + name: '', + username: '', + avatarTemplate: '', + }, }; } -function getUserWithObject(userId: number, description: string): TopicPoster { +function getUserWithObject(userId: number, description: string): PosterUnion { return { - ...getUserWithId(null, description), + description, + extras: null, user: { id: userId, username: 'bill', @@ -30,7 +33,7 @@ function getUserWithObject(userId: number, description: string): TopicPoster { describe('getTopicAuthor', () => { it('returns the author of the topic when present', () => { - const posters: Array = [ + const posters: Array = [ getUserWithId(1, 'Frequent Poster'), getUserWithId(2, 'Most Recent Poster'), getUserWithId(3, 'Frequent Poster, Original Poster'), @@ -40,7 +43,7 @@ describe('getTopicAuthor', () => { }); it('returns the first author when multiple are somehow present', () => { - const posters: Array = [ + const posters: Array = [ getUserWithId(1, 'Original Poster'), getUserWithId(2, 'Most Recent Poster'), getUserWithId(3, 'Frequent Poster, Original Poster'), @@ -50,7 +53,7 @@ describe('getTopicAuthor', () => { }); it('returns undefined when no author is present', () => { - const posters: Array = [ + const posters: Array = [ getUserWithId(1, 'Frequent Poster'), getUserWithId(2, 'Frequent Poster'), getUserWithId(3, 'Frequent Poster, Most Recent Poster'), @@ -66,7 +69,7 @@ describe('getTopicAuthor', () => { describe('getTopicAuthorUserId', () => { it(`returns the author's userId when present`, () => { - const posters: Array = [ + const posters: Array = [ getUserWithId(1, 'Frequent Poster'), getUserWithId(2, 'Most Recent Poster'), getUserWithId(3, 'Frequent Poster, Original Poster'), @@ -75,7 +78,7 @@ describe('getTopicAuthorUserId', () => { }); it(`returns the author's user.id when present`, () => { - const posters: Array = [ + const posters: Array = [ getUserWithId(1, 'Frequent Poster'), getUserWithId(2, 'Most Recent Poster'), getUserWithObject(3, 'Frequent Poster, Original Poster'), @@ -84,7 +87,7 @@ describe('getTopicAuthorUserId', () => { }); it(`prefers the author's userId when the user object is set too`, () => { - const posters: Array = [ + const posters: Array = [ getUserWithId(1, 'Frequent Poster'), getUserWithId(2, 'Most Recent Poster'), { diff --git a/api/src/helpers/getTopicAuthor.ts b/api/src/helpers/getTopicAuthor.ts index 54a275e5..ddaa5298 100644 --- a/api/src/helpers/getTopicAuthor.ts +++ b/api/src/helpers/getTopicAuthor.ts @@ -1,10 +1,10 @@ -import { TopicPoster } from '../types'; +import { PosterUnion } from '../types'; import { getPosterTypeDetails } from './getPosterTypeDetails'; export function getTopicAuthor( - posters: Readonly>, -): TopicPoster | undefined { + posters: Readonly>, +): PosterUnion | undefined { return posters.find((poster) => { const { isAuthor } = getPosterTypeDetails(poster.description); return isAuthor; @@ -12,9 +12,15 @@ export function getTopicAuthor( } export function getTopicAuthorUserId( - posters: Readonly>, + posters: Readonly>, ): number | undefined { const author = getTopicAuthor(posters); - return author?.userId ?? author?.user?.id; + if (author) { + if ('userId' in author) { + return author.userId; + } else if ('user' in author) { + return author.user.id; + } + } } diff --git a/api/src/helpers/index.ts b/api/src/helpers/index.ts index 66448a4a..24ef6acb 100644 --- a/api/src/helpers/index.ts +++ b/api/src/helpers/index.ts @@ -11,3 +11,4 @@ export * from './parseTopicUrl'; export * from './privateMessagesMerger'; export * from './processRawContent'; export * from './topicDetail'; +export * from './poll'; diff --git a/api/src/helpers/poll.ts b/api/src/helpers/poll.ts new file mode 100644 index 00000000..31aed26a --- /dev/null +++ b/api/src/helpers/poll.ts @@ -0,0 +1,49 @@ +import { Poll, PollsVotes } from '../types'; + +/** + * This helper is used for formatting preloadedVoters data + * that is returned in a poll, from a key-value object to an array. + */ +export function formatPreloadedVoters(poll: Poll) { + if (!poll.preloadedVoters) { + return { ...poll, preloadedVoters: null }; + } + const pollOptionIds = Object.keys(poll.preloadedVoters); + const formattedPreloadedVoters = pollOptionIds.map((pollOptionId) => ({ + pollOptionId, + users: poll.preloadedVoters[pollOptionId], + })); + + return { ...poll, preloadedVoters: formattedPreloadedVoters }; +} + +export function formatPolls( + polls?: Array | null, + pollsVotes?: PollsVotes | null, +) { + if (!polls) { + return { formattedPolls: null, formattedPollsVotes: null }; + } + + const formattedPolls = polls.map((poll) => formatPreloadedVoters(poll)); + const formattedPollsVotes = formatPollsVotes(pollsVotes); + + return { formattedPolls, formattedPollsVotes }; +} + +/** + * This helper is used for formatting pollsVotes data + * that is returned in a post, from a key-value object to an array. + */ +export function formatPollsVotes(pollsVotes?: PollsVotes | null) { + if (!pollsVotes) { + return null; + } + const pollNames = Object.keys(pollsVotes); + const formattedPollVotes = pollNames.map((pollName) => ({ + pollName, + pollOptionIds: pollsVotes[pollName], + })); + + return formattedPollVotes; +} diff --git a/api/src/helpers/processRawContent.ts b/api/src/helpers/processRawContent.ts index 7656dae1..0eff6be5 100644 --- a/api/src/helpers/processRawContent.ts +++ b/api/src/helpers/processRawContent.ts @@ -4,13 +4,13 @@ import { PROSE_DISCOURSE_UPLOAD_HOST } from '../constants'; const imageRegex = //g; + //g; const srcSetRegex = /srcset="(.+?)"/g; -const imageUrlRegex = /(https?:\/\/[^ ]*\.(?:jpe?g|png|gif|heic|heif))/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; + /(?:]*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; @@ -34,14 +34,30 @@ function handleRegexResult( optimizedUrl.push(url[url.length - 1]); } }); - return optimizedUrl.map((item) => item.replace(transparantRegex, '')); + return optimizedUrl.map((item) => { + const itemReplace = item.replace(transparantRegex, ''); + /** + * This changes is used to handle some image which using local url into https url example : + * + * //kflounge-staging.kfox.io/uploads/default/optimized/1X/1a4ea5cb345d30d4230bdfa3671d1bc1026c772e_2_690x388.jpeg + * into + * https://kflounge-staging.kfox.io/uploads/default/optimized/1X/1a4ea5cb345d30d4230bdfa3671d1bc1026c772e_2_690x388.jpeg + */ + + return itemReplace[0] === '/' ? `https:${itemReplace}` : itemReplace; + }); } else if ( regex === anchoredImageVideoRegex || regex === imageRegex || regex === mentionRegex ) { result = result.map((item) => item.replace(regex, '$1')); - return result.map((item) => item.replace(transparantRegex, '')); + + return result.map((item) => { + const itemReplace = item.replace(transparantRegex, ''); + + return itemReplace[0] === '/' ? `https:${itemReplace}` : itemReplace; + }); } } @@ -62,6 +78,7 @@ export function getPostImageUrl( host: string = PROSE_DISCOURSE_UPLOAD_HOST, ): string | undefined { // Return only the first element of array because only one url is found + let result = content.match(srcSetRegex) ?? undefined; if (result) { diff --git a/api/src/resolvers/index.ts b/api/src/resolvers/index.ts index 4acdf36a..0334dd99 100644 --- a/api/src/resolvers/index.ts +++ b/api/src/resolvers/index.ts @@ -35,8 +35,11 @@ export * from './topics/replyMutation'; export * from './topics/searchQuery'; export * from './topics/searchTagsQuery'; export * from './topics/timingsMutation'; +export * from './topics/togglePollStatusMutation'; export * from './topics/topicDetailQuery'; export * from './topics/topicsQuery'; +export * from './topics/undoVotePollMutation'; +export * from './topics/votePollMutation'; export * from './upload/lookupUrlsQuery'; export * from './upload/uploadMutation'; @@ -49,5 +52,7 @@ export * from './user/searchUserQuery'; export * from './user/singleBadgeQuery'; export * from './user/userActivityQuery'; export * from './user/userProfileQuery'; +export * from './user/editUserStatusMutation'; +export * from './user/deleteUserStatusMutation'; export * from './health/healthQuery'; diff --git a/api/src/resolvers/site/siteQuery.ts b/api/src/resolvers/site/siteQuery.ts index 9dd8d742..09875269 100644 --- a/api/src/resolvers/site/siteQuery.ts +++ b/api/src/resolvers/site/siteQuery.ts @@ -3,7 +3,10 @@ import { FieldResolver, queryField } from 'nexus'; import { errorHandler } from '../../helpers'; import { Context } from '../../types'; -import { UNCATEGORIZED_CATEGORY_ID } from '../../constants'; +import { + PROSE_DISCOURSE_HOST, + UNCATEGORIZED_CATEGORY_ID, +} from '../../constants'; let siteResolver: FieldResolver<'Query', 'site'> = async ( _, @@ -55,6 +58,11 @@ let siteResolver: FieldResolver<'Query', 'site'> = async ( full_name_required: fullNameRequired = false, default_composer_category: defaultComposerCategory = '', allow_uncategorized_topics: allowUncategorizedTopics = false, + enable_user_status: allowUserStatus = false, + external_emoji_url: externalEmojiUrl = '', + emoji_set: emojiSet = '', + poll_enabled: allowPoll = true, + poll_minimum_trust_level_to_create: pollCreateMinimumTrustLevel = 1, }, } = await context.client.get(siteSettingsUrl); @@ -76,6 +84,12 @@ let siteResolver: FieldResolver<'Query', 'site'> = async ( defaultComposerCategory, allowUncategorizedTopics, uncategorizedCategoryId, + allowUserStatus, + externalEmojiUrl, + emojiSet, + discourseBaseUrl: PROSE_DISCOURSE_HOST || '', + allowPoll, + pollCreateMinimumTrustLevel, ...camelcaseKey(siteData, { deep: true }), }; } catch (error) { diff --git a/api/src/resolvers/topics/editPostMutation.ts b/api/src/resolvers/topics/editPostMutation.ts index f2d7d2ff..82a7cdb5 100644 --- a/api/src/resolvers/topics/editPostMutation.ts +++ b/api/src/resolvers/topics/editPostMutation.ts @@ -2,7 +2,7 @@ import camelcaseKey from 'camelcase-keys'; import snakecaseKey from 'snakecase-keys'; import { FieldResolver, mutationField, arg, intArg } from 'nexus'; -import { errorHandler } from '../../helpers'; +import { errorHandler, formatPolls } from '../../helpers'; import { Context } from '../../types'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; @@ -24,7 +24,18 @@ export let editPostResolver: FieldResolver<'Mutation', 'editPost'> = async ( { post }, config, ); - return camelcaseKey(data.post, { deep: true }); + + let editPostData = camelcaseKey(data.post, { deep: true }); + const { formattedPolls, formattedPollsVotes } = formatPolls( + editPostData.polls, + editPostData.pollsVotes, + ); + + return { + ...editPostData, + polls: formattedPolls, + pollsVotes: formattedPollsVotes, + }; } catch (e) { errorHandler(e); } diff --git a/api/src/resolvers/topics/flagPostMutation.ts b/api/src/resolvers/topics/flagPostMutation.ts index f8b5542a..bcbaf608 100644 --- a/api/src/resolvers/topics/flagPostMutation.ts +++ b/api/src/resolvers/topics/flagPostMutation.ts @@ -10,7 +10,7 @@ import { } from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_FORM_URLENCODED } from '../../constants'; -import { errorHandler } from '../../helpers'; +import { errorHandler, formatPolls } from '../../helpers'; import { Context } from '../../types'; export let flagPostResolver: FieldResolver<'Mutation', 'flagPost'> = async ( @@ -34,7 +34,17 @@ export let flagPostResolver: FieldResolver<'Mutation', 'flagPost'> = async ( stringify(body), config, ); - return camelcaseKeys(data, { deep: true }); + let flagPostData = camelcaseKeys(data, { deep: true }); + const { formattedPolls, formattedPollsVotes } = formatPolls( + flagPostData.polls, + flagPostData.pollsVotes, + ); + + return { + ...flagPostData, + polls: formattedPolls, + pollsVotes: formattedPollsVotes, + }; } catch (e) { errorHandler(e); } diff --git a/api/src/resolvers/topics/leaveMessageMutation.ts b/api/src/resolvers/topics/leaveMessageMutation.ts index a0ecdecd..9448fb6a 100644 --- a/api/src/resolvers/topics/leaveMessageMutation.ts +++ b/api/src/resolvers/topics/leaveMessageMutation.ts @@ -1,11 +1,4 @@ -import { - FieldResolver, - mutationField, - booleanArg, - intArg, - stringArg, - nullable, -} from 'nexus'; +import { FieldResolver, mutationField, intArg, stringArg } from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; import { errorHandler } from '../../helpers'; @@ -14,7 +7,7 @@ import { Context } from '../../types'; export let leaveMessageResolver: FieldResolver< 'Mutation', 'leaveMessage' -> = async (_, { topicId, owner, username }, context: Context) => { +> = async (_, { topicId, username }, context: Context) => { const config = { headers: { 'Accept-Language': ACCEPTED_LANGUAGE, @@ -23,17 +16,12 @@ export let leaveMessageResolver: FieldResolver< }; try { - if (owner) { - await context.client.delete(`/t/${topicId}.json`); - return 'success'; - } else { - await context.client.put( - `/t/${topicId}/remove-allowed-user.json`, - { username }, - config, - ); - return 'success'; - } + await context.client.put( + `/t/${topicId}/remove-allowed-user.json`, + { username }, + config, + ); + return 'success'; } catch (e) { throw errorHandler(e); } @@ -43,7 +31,6 @@ export let leaveMessageMutation = mutationField('leaveMessage', { type: 'String', args: { topicId: intArg(), - owner: nullable(booleanArg()), username: stringArg(), }, resolve: leaveMessageResolver, diff --git a/api/src/resolvers/topics/newPrivateMessageMutation.ts b/api/src/resolvers/topics/newPrivateMessageMutation.ts index a4d9aecd..4043d2be 100644 --- a/api/src/resolvers/topics/newPrivateMessageMutation.ts +++ b/api/src/resolvers/topics/newPrivateMessageMutation.ts @@ -5,7 +5,7 @@ import snakecaseKey from 'snakecase-keys'; import { FieldResolver, mutationField, arg } from 'nexus'; import { CONTENT_FORM_URLENCODED } from '../../constants'; -import { errorHandler } from '../../helpers'; +import { errorHandler, formatPolls } from '../../helpers'; import { Context } from '../../types'; export let newPrivateMessageResolver: FieldResolver< @@ -28,7 +28,18 @@ export let newPrivateMessageResolver: FieldResolver< stringify(pmInputSnake), config, ); - return camelcaseKey(data, { deep: true }); + + let newPrivateMessageData = camelcaseKey(data, { deep: true }); + const { formattedPolls, formattedPollsVotes } = formatPolls( + newPrivateMessageData.polls, + newPrivateMessageData.pollsVotes, + ); + + return { + ...newPrivateMessageData, + polls: formattedPolls, + pollsVotes: formattedPollsVotes, + }; } catch (e) { errorHandler(e); } diff --git a/api/src/resolvers/topics/newTopicMutation.ts b/api/src/resolvers/topics/newTopicMutation.ts index 5d0d9538..bfa10e08 100644 --- a/api/src/resolvers/topics/newTopicMutation.ts +++ b/api/src/resolvers/topics/newTopicMutation.ts @@ -3,7 +3,7 @@ import snakecaseKey from 'snakecase-keys'; import { FieldResolver, mutationField, arg } from 'nexus'; import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; -import { errorHandler } from '../../helpers'; +import { errorHandler, formatPolls } from '../../helpers'; import { Context } from '../../types'; export let newTopicResolver: FieldResolver<'Mutation', 'newTopic'> = async ( @@ -27,7 +27,18 @@ export let newTopicResolver: FieldResolver<'Mutation', 'newTopic'> = async ( topicInputSnake, config, ); - return camelcaseKey(data, { deep: true }); + + let newTopicData = camelcaseKey(data, { deep: true }); + const { formattedPolls, formattedPollsVotes } = formatPolls( + newTopicData.polls, + newTopicData.pollsVotes, + ); + + return { + ...newTopicData, + polls: formattedPolls, + pollsVotes: formattedPollsVotes, + }; } catch (e) { errorHandler(e); } diff --git a/api/src/resolvers/topics/postQuery.ts b/api/src/resolvers/topics/postQuery.ts index 5dad44be..6cdd0c5e 100644 --- a/api/src/resolvers/topics/postQuery.ts +++ b/api/src/resolvers/topics/postQuery.ts @@ -1,6 +1,6 @@ import { FieldResolver, queryField, intArg } from 'nexus'; -import { errorHandler, fetchPost } from '../../helpers'; +import { errorHandler, fetchPost, formatPolls } from '../../helpers'; import { Context } from '../../types'; export let postQueryResolver: FieldResolver<'Query', 'post'> = async ( @@ -9,7 +9,17 @@ export let postQueryResolver: FieldResolver<'Query', 'post'> = async ( { client }: Context, ) => { try { - return await fetchPost({ client, postId }); + const data = await fetchPost({ client, postId }); + const { formattedPolls, formattedPollsVotes } = formatPolls( + data.polls, + data.pollsVotes, + ); + + return { + ...data, + polls: formattedPolls, + pollsVotes: formattedPollsVotes, + }; } catch (error) { throw errorHandler(error); } diff --git a/api/src/resolvers/topics/privateMessageDetailQuery.ts b/api/src/resolvers/topics/privateMessageDetailQuery.ts index 24570506..494ed167 100644 --- a/api/src/resolvers/topics/privateMessageDetailQuery.ts +++ b/api/src/resolvers/topics/privateMessageDetailQuery.ts @@ -5,8 +5,9 @@ import { errorHandler, fetchTopicDetail, getTopicDetailBaseArgs, + formatPolls, } from '../../helpers'; -import { Context } from '../../types'; +import { Context, Post } from '../../types'; // TODO: Move message detail handler from frontend to this endpoint #837 let privateMessageDetailQueryResolver: FieldResolver< @@ -15,12 +16,28 @@ let privateMessageDetailQueryResolver: FieldResolver< > = async (_, { topicId, postIds, postNumber }, { client }: Context) => { try { validateTopicDetailOptionalArgs({ postIds, postNumber }); - return await fetchTopicDetail({ + const data = await fetchTopicDetail({ client, topicId, postIds, postNumber, }); + + let formattedPosts = data.postStream.posts.map((post: Post) => { + const { formattedPolls, formattedPollsVotes } = formatPolls( + post.polls, + post.pollsVotes, + ); + + return { + ...post, + polls: formattedPolls, + pollsVotes: formattedPollsVotes, + }; + }); + data.postStream.posts = formattedPosts; + + return data; } catch (error) { throw errorHandler(error); } diff --git a/api/src/resolvers/topics/replyMutation.ts b/api/src/resolvers/topics/replyMutation.ts index b08cc3de..a4d9f553 100644 --- a/api/src/resolvers/topics/replyMutation.ts +++ b/api/src/resolvers/topics/replyMutation.ts @@ -6,7 +6,7 @@ import snakecaseKey from 'snakecase-keys'; import { FieldResolver, mutationField, arg, intArg, nullable } from 'nexus'; import { CONTENT_FORM_URLENCODED } from '../../constants'; -import { errorHandler } from '../../helpers'; +import { errorHandler, formatPolls } from '../../helpers'; import { Context } from '../../types'; export let replyResolver: FieldResolver<'Mutation', 'reply'> = async ( @@ -55,7 +55,18 @@ export let replyResolver: FieldResolver<'Mutation', 'reply'> = async ( stringify(replyInputSnake), config, ); - return camelcaseKey(data, { deep: true }); + + let replyPostData = camelcaseKey(data, { deep: true }); + const { formattedPolls, formattedPollsVotes } = formatPolls( + replyPostData.polls, + replyPostData.pollsVotes, + ); + + return { + ...replyPostData, + polls: formattedPolls, + pollsVotes: formattedPollsVotes, + }; } catch (e) { throw errorHandler(e); } diff --git a/api/src/resolvers/topics/togglePollStatusMutation.ts b/api/src/resolvers/topics/togglePollStatusMutation.ts new file mode 100644 index 00000000..45955694 --- /dev/null +++ b/api/src/resolvers/topics/togglePollStatusMutation.ts @@ -0,0 +1,39 @@ +import camelcaseKey from 'camelcase-keys'; +import snakecaseKey from 'snakecase-keys'; +import { FieldResolver, mutationField, intArg, stringArg, arg } from 'nexus'; + +import { errorHandler } from '../../helpers'; +import { Context } from '../../types'; +import { CONTENT_JSON } from '../../constants'; + +export let togglePollStatusResolver: FieldResolver< + 'Mutation', + 'togglePollStatus' +> = async (_, { postId, pollName, status }, context: Context) => { + const config = { + headers: { + 'Content-Type': CONTENT_JSON, + }, + }; + let toggleStatusInputSnake = snakecaseKey({ postId, pollName, status }); + try { + let { data } = await context.client.put( + '/polls/toggle_status.json', + toggleStatusInputSnake, + config, + ); + return camelcaseKey(data.poll, { deep: true }); + } catch (e) { + throw errorHandler(e); + } +}; + +export let togglePollStatusMutation = mutationField('togglePollStatus', { + type: 'Poll', + args: { + postId: intArg(), + pollName: stringArg(), + status: arg({ type: 'PollStatus' }), + }, + resolve: togglePollStatusResolver, +}); diff --git a/api/src/resolvers/topics/topicDetailQuery.ts b/api/src/resolvers/topics/topicDetailQuery.ts index 9d1f1354..386588d4 100644 --- a/api/src/resolvers/topics/topicDetailQuery.ts +++ b/api/src/resolvers/topics/topicDetailQuery.ts @@ -7,8 +7,9 @@ import { fetchPost, fetchTopicDetail, getTopicDetailBaseArgs, + formatPolls, } from '../../helpers'; -import { Context } from '../../types'; +import { Context, Post } from '../../types'; let topicDetailQueryResolver: FieldResolver<'Query', 'topicDetail'> = async ( _, @@ -23,6 +24,21 @@ let topicDetailQueryResolver: FieldResolver<'Query', 'topicDetail'> = async ( postIds, postNumber, }); + + let formattedPosts = data.postStream.posts.map((post: Post) => { + const { formattedPolls, formattedPollsVotes } = formatPolls( + post.polls, + post.pollsVotes, + ); + + return { + ...post, + polls: formattedPolls, + pollsVotes: formattedPollsVotes, + }; + }); + data.postStream.posts = formattedPosts; + const firstPostOfData = data.postStream.posts[0]; if (firstPostOfData) { let isLiked = !!firstPostOfData.actionsSummary.find( diff --git a/api/src/resolvers/topics/topicsQuery.ts b/api/src/resolvers/topics/topicsQuery.ts index 4ae4e685..52c7e4ec 100644 --- a/api/src/resolvers/topics/topicsQuery.ts +++ b/api/src/resolvers/topics/topicsQuery.ts @@ -59,10 +59,17 @@ let topicsQueryResolver: FieldResolver<'Query', 'topics'> = async ( 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), - }; + if ('userId' in poster) { + return { + ...poster, + user: poster.user ?? users.find(({ id }) => id === poster.userId), + }; + } else { + return { + ...poster, + user: poster.user, + }; + } }); return { ...topic, posters: postersWithUser }; }); diff --git a/api/src/resolvers/topics/undoVotePollMutation.ts b/api/src/resolvers/topics/undoVotePollMutation.ts new file mode 100644 index 00000000..b696f8ae --- /dev/null +++ b/api/src/resolvers/topics/undoVotePollMutation.ts @@ -0,0 +1,42 @@ +import camelcaseKey from 'camelcase-keys'; +import snakecaseKey from 'snakecase-keys'; +import { FieldResolver, mutationField, intArg, stringArg } from 'nexus'; + +import { errorHandler, formatPreloadedVoters } from '../../helpers'; +import { Context } from '../../types'; +import { CONTENT_JSON } from '../../constants'; + +export let undoVotePollResolver: FieldResolver< + 'Mutation', + 'undoVotePoll' +> = async (_, { postId, pollName }, context: Context) => { + let undoVoteInputSnake = snakecaseKey({ postId, pollName }); + const config = { + headers: { + 'Content-Type': CONTENT_JSON, + }, + data: undoVoteInputSnake, + }; + + try { + let { data } = await context.client.delete(`/polls/vote.json`, { + ...config, + }); + + let undoVotePollData = camelcaseKey(data.poll, { deep: true }); + let formattedPoll = formatPreloadedVoters(undoVotePollData); + + return formattedPoll; + } catch (e) { + throw errorHandler(e); + } +}; + +export let undoVotePollMutation = mutationField('undoVotePoll', { + type: 'Poll', + args: { + postId: intArg(), + pollName: stringArg(), + }, + resolve: undoVotePollResolver, +}); diff --git a/api/src/resolvers/topics/votePollMutation.ts b/api/src/resolvers/topics/votePollMutation.ts new file mode 100644 index 00000000..2d559ed3 --- /dev/null +++ b/api/src/resolvers/topics/votePollMutation.ts @@ -0,0 +1,45 @@ +import camelcaseKey from 'camelcase-keys'; +import snakecaseKey from 'snakecase-keys'; +import { FieldResolver, mutationField, intArg, list, stringArg } from 'nexus'; + +import { errorHandler, formatPreloadedVoters } from '../../helpers'; +import { Context } from '../../types'; +import { CONTENT_JSON } from '../../constants'; + +export let votePollResolver: FieldResolver<'Mutation', 'votePoll'> = async ( + _, + { postId, pollName, options }, + context: Context, +) => { + const config = { + headers: { + 'Content-Type': CONTENT_JSON, + }, + }; + let votePollInputSnake = snakecaseKey({ postId, pollName, options }); + try { + let { data } = await context.client.put( + `/polls/vote.json`, + votePollInputSnake, + config, + ); + + let votePollData = camelcaseKey(data, { deep: true }); + let formattedPoll = formatPreloadedVoters(votePollData.poll); + votePollData.poll = formattedPoll; + + return votePollData; + } catch (e) { + throw errorHandler(e); + } +}; + +export let votePollMutation = mutationField('votePoll', { + type: 'PollVoteOutput', + args: { + postId: intArg(), + pollName: stringArg(), + options: list(stringArg()), + }, + resolve: votePollResolver, +}); diff --git a/api/src/resolvers/user/deleteUserStatusMutation.ts b/api/src/resolvers/user/deleteUserStatusMutation.ts new file mode 100644 index 00000000..b251bcd8 --- /dev/null +++ b/api/src/resolvers/user/deleteUserStatusMutation.ts @@ -0,0 +1,27 @@ +import { FieldResolver, mutationField } from 'nexus'; + +import { ACCEPTED_LANGUAGE } from '../../constants'; +import { errorHandler } from '../../helpers'; +import { Context } from '../../types'; + +export let deleteUserStatusMutation: FieldResolver< + 'Mutation', + 'deleteUserStatus' +> = async (_, _args, context: Context) => { + try { + const config = { + headers: { + 'Accept-Language': ACCEPTED_LANGUAGE, + }, + }; + await context.client.delete(`/user-status.json`, config); + return 'success'; + } catch (e) { + throw errorHandler(e); + } +}; + +export let deleteUserStatus = mutationField('deleteUserStatus', { + type: 'String', + resolve: deleteUserStatusMutation, +}); diff --git a/api/src/resolvers/user/editUserStatusMutation.ts b/api/src/resolvers/user/editUserStatusMutation.ts new file mode 100644 index 00000000..1b305f0c --- /dev/null +++ b/api/src/resolvers/user/editUserStatusMutation.ts @@ -0,0 +1,39 @@ +import { FieldResolver, mutationField, stringArg, nullable } from 'nexus'; + +import { ACCEPTED_LANGUAGE, CONTENT_JSON } from '../../constants'; +import { errorHandler } from '../../helpers'; +import { Context } from '../../types'; + +export let editUserStatusMutation: FieldResolver< + 'Mutation', + 'editUserStatus' +> = async (_, { endsAt, emoji, description }, context: Context) => { + try { + const editStatus = { + description, + emoji, + ends_at: endsAt || '', + }; + + const config = { + headers: { + 'Accept-Language': ACCEPTED_LANGUAGE, + 'Content-Type': CONTENT_JSON, + }, + }; + await context.client.put(`/user-status.json`, editStatus, config); + return 'success'; + } catch (e) { + throw errorHandler(e); + } +}; + +export let editUserStatus = mutationField('editUserStatus', { + type: 'String', + args: { + endsAt: nullable(stringArg()), + emoji: stringArg(), + description: stringArg(), + }, + resolve: editUserStatusMutation, +}); diff --git a/api/src/scalars/PollEnums.ts b/api/src/scalars/PollEnums.ts new file mode 100644 index 00000000..b3248b8d --- /dev/null +++ b/api/src/scalars/PollEnums.ts @@ -0,0 +1,28 @@ +import { enumType } from 'nexus'; + +import { + POLL_CHART_TYPE, + POLL_RESULTS, + POLL_STATUS, + POLL_TYPE, +} from '../types'; + +export let PollResult = enumType({ + name: 'PollResult', + members: POLL_RESULTS, +}); + +export let PollStatus = enumType({ + name: 'PollStatus', + members: POLL_STATUS, +}); + +export let PollType = enumType({ + name: 'PollType', + members: POLL_TYPE, +}); + +export let PollChartType = enumType({ + name: 'PollChartType', + members: POLL_CHART_TYPE, +}); diff --git a/api/src/scalars/PosterOutputUnion.ts b/api/src/scalars/PosterOutputUnion.ts new file mode 100644 index 00000000..ef350c01 --- /dev/null +++ b/api/src/scalars/PosterOutputUnion.ts @@ -0,0 +1,14 @@ +import { unionType } from 'nexus'; + +export let PosterOutputUnion = unionType({ + name: 'PosterOutputUnion', + definition(t) { + t.members('TopicPoster', 'SuggestionTopicPoster'); + }, + resolveType: (item) => { + if (item.hasOwnProperty('userId')) { + return 'TopicPoster'; + } + return 'SuggestionTopicPoster'; + }, +}); diff --git a/api/src/scalars/index.ts b/api/src/scalars/index.ts index 8287d081..0f5ee266 100644 --- a/api/src/scalars/index.ts +++ b/api/src/scalars/index.ts @@ -7,3 +7,5 @@ export * from './TopPeriodEnum'; export * from './File'; export * from './UploadTypeEnum'; export * from './UserUnion'; +export * from './PosterOutputUnion'; +export * from './PollEnums'; diff --git a/api/src/server/graphql/plugins.ts b/api/src/server/graphql/plugins.ts index 361a90ca..c66456db 100644 --- a/api/src/server/graphql/plugins.ts +++ b/api/src/server/graphql/plugins.ts @@ -82,6 +82,8 @@ const guardedMutations = [ 'upload', 'editProfile', 'saveProfilePicture', + 'editUserStatus', + 'deleteUserStatus', ]; const authenticatedSchema: AuthSchema = { diff --git a/api/src/typeSchemas/Poll.ts b/api/src/typeSchemas/Poll.ts new file mode 100644 index 00000000..03fd8473 --- /dev/null +++ b/api/src/typeSchemas/Poll.ts @@ -0,0 +1,50 @@ +import { objectType } from 'nexus'; + +import { BaseUserIcon } from './UserIcon'; + +export let Poll = objectType({ + name: 'Poll', + definition(t) { + t.string('name'); + t.field('type', { type: 'PollType' }); + t.field('status', { type: 'PollStatus' }); + t.field('results', { type: 'PollResult' }); + t.list.field('options', { type: 'PollOption' }); + t.int('voters'); + t.field('chartType', { type: 'PollChartType' }); + t.nullable.string('title'); + t.nullable.string('groups'); + t.nullable.boolean('public'); + t.nullable.int('min'); + t.nullable.int('max'); + t.nullable.int('step'); + t.nullable.string('close'); + t.nullable.list.field('preloadedVoters', { + type: 'PreloadedVoters', + }); + }, +}); + +export let PreloadedVoters = objectType({ + name: 'PreloadedVoters', + definition(t) { + t.string('pollOptionId'); + t.list.field('users', { type: 'UserVoter' }); + }, +}); + +export let UserVoter = objectType({ + name: 'UserVoter', + definition(t) { + t.implements(BaseUserIcon); + t.nullable.string('title'); + }, +}); + +export let PollsVotes = objectType({ + name: 'PollsVotes', + definition(t) { + t.string('pollName'); + t.list.string('pollOptionIds'); + }, +}); diff --git a/api/src/typeSchemas/PollOption.ts b/api/src/typeSchemas/PollOption.ts new file mode 100644 index 00000000..11b9adc5 --- /dev/null +++ b/api/src/typeSchemas/PollOption.ts @@ -0,0 +1,10 @@ +import { objectType } from 'nexus'; + +export let PollOption = objectType({ + name: 'PollOption', + definition(t) { + t.string('id'); + t.string('html'); + t.nullable.int('votes'); + }, +}); diff --git a/api/src/typeSchemas/PollVoteOutput.ts b/api/src/typeSchemas/PollVoteOutput.ts new file mode 100644 index 00000000..bd804b4f --- /dev/null +++ b/api/src/typeSchemas/PollVoteOutput.ts @@ -0,0 +1,9 @@ +import { objectType } from 'nexus'; + +export let PollVoteOutput = objectType({ + name: 'PollVoteOutput', + definition(t) { + t.field('poll', { type: 'Poll' }); + t.nullable.list.string('vote'); + }, +}); diff --git a/api/src/typeSchemas/Post.ts b/api/src/typeSchemas/Post.ts index 7e59c9e2..20dbe5e4 100644 --- a/api/src/typeSchemas/Post.ts +++ b/api/src/typeSchemas/Post.ts @@ -82,5 +82,9 @@ export let Post = objectType({ t.nullable.string('actionCode'); t.nullable.string('actionCodeWho'); + + t.nullable.list.field('polls', { type: 'Poll' }); + t.nullable.list.field('pollsVotes', { type: 'PollsVotes' }); + t.nullable.field('userStatus', { type: 'UserStatus' }); }, }); diff --git a/api/src/typeSchemas/SiteSetting.ts b/api/src/typeSchemas/SiteSetting.ts index 478e3f0e..981d84c7 100644 --- a/api/src/typeSchemas/SiteSetting.ts +++ b/api/src/typeSchemas/SiteSetting.ts @@ -24,5 +24,31 @@ export let SiteSetting = objectType({ t.list.field('postActionTypes', { type: 'TopicFlagTypes', }); + /** + * This field is used for user status + */ + t.boolean('allowUserStatus'); + t.string('externalEmojiUrl'); + t.string('emojiSet'); + t.string('discourseBaseUrl'); + + /** + * This field is used for Poll + */ + + t.boolean('allowPoll'); + t.int('pollCreateMinimumTrustLevel'); + + t.list.field('groups', { + type: 'GroupSiteSetting', + }); + }, +}); + +export let GroupSiteSetting = objectType({ + name: 'GroupSiteSetting', + definition(t) { + t.int('id'); + t.string('name'); }, }); diff --git a/api/src/typeSchemas/Topic.ts b/api/src/typeSchemas/Topic.ts index c6671dc7..3c377dc8 100644 --- a/api/src/typeSchemas/Topic.ts +++ b/api/src/typeSchemas/Topic.ts @@ -50,12 +50,14 @@ export let Topic = objectType({ t.nullable.boolean('pinnedGlobally'); t.nullable.boolean('hasSummary'); - t.list.field('posters', { type: 'TopicPoster' }); + t.list.field('posters', { type: 'PosterOutputUnion' }); t.nullable.list.field('participants', { type: 'MessageParticipant', }); t.nullable.int('authorUserId', { - resolve: ({ posters }) => getTopicAuthorUserId(posters) ?? null, + resolve: ({ posters }) => { + return getTopicAuthorUserId(posters) ?? null; + }, }); // Note: Comment out for maybe next phase // t.nullable.int('recentPosterUserId', { diff --git a/api/src/typeSchemas/TopicPoster.ts b/api/src/typeSchemas/TopicPoster.ts index 872eb4c0..a061081e 100644 --- a/api/src/typeSchemas/TopicPoster.ts +++ b/api/src/typeSchemas/TopicPoster.ts @@ -5,7 +5,16 @@ export let TopicPoster = objectType({ definition(t) { t.nullable.string('extras'); t.string('description'); - t.nullable.int('userId'); - t.nullable.field('user', { type: 'UserIcon' }); + t.int('userId'); + t.field('user', { type: 'UserIcon' }); + }, +}); + +export let SuggestionTopicPoster = objectType({ + name: 'SuggestionTopicPoster', + definition(t) { + t.nullable.string('extras'); + t.string('description'); + t.field('user', { type: 'UserIcon' }); }, }); diff --git a/api/src/typeSchemas/UserDetail.ts b/api/src/typeSchemas/UserDetail.ts index 679fca28..0bcd8625 100644 --- a/api/src/typeSchemas/UserDetail.ts +++ b/api/src/typeSchemas/UserDetail.ts @@ -86,6 +86,7 @@ export let UserDetail = objectType({ }); t.list.field('userAuthTokens', { type: 'UserAuthToken' }); t.field('userOption', { type: 'UserOption' }); + t.nullable.field('status', { type: 'UserStatus' }); }, }); /** diff --git a/api/src/typeSchemas/UserIcon.ts b/api/src/typeSchemas/UserIcon.ts index edca4e70..b79ab2ef 100644 --- a/api/src/typeSchemas/UserIcon.ts +++ b/api/src/typeSchemas/UserIcon.ts @@ -1,9 +1,9 @@ -import { objectType } from 'nexus'; +import { interfaceType, objectType } from 'nexus'; import { getNormalizedUrlTemplate } from '../resolvers/utils'; -export let UserIcon = objectType({ - name: 'UserIcon', +export let BaseUserIcon = interfaceType({ + name: 'BaseUserIcon', definition(t) { t.int('id'); t.string('username'); @@ -13,4 +13,12 @@ export let UserIcon = objectType({ sourceType: 'string', }); }, + resolveType: () => null, +}); + +export let UserIcon = objectType({ + name: 'UserIcon', + definition(t) { + t.implements('BaseUserIcon'); + }, }); diff --git a/api/src/typeSchemas/UserStatus.ts b/api/src/typeSchemas/UserStatus.ts new file mode 100644 index 00000000..75f8dcb3 --- /dev/null +++ b/api/src/typeSchemas/UserStatus.ts @@ -0,0 +1,10 @@ +import { objectType } from 'nexus'; + +export let UserStatus = objectType({ + name: 'UserStatus', + definition(t) { + t.string('description'); + t.string('emoji'); + t.nullable.string('endsAt'); + }, +}); diff --git a/api/src/typeSchemas/index.ts b/api/src/typeSchemas/index.ts index b74a318e..16b653ca 100644 --- a/api/src/typeSchemas/index.ts +++ b/api/src/typeSchemas/index.ts @@ -30,6 +30,9 @@ export * from './MessageParticipant'; export * from './NotificationDetail'; export * from './Notifications'; export * from './Participant'; +export * from './Poll'; +export * from './PollOption'; +export * from './PollVoteOutput'; export * from './Post'; export * from './PostInput'; export * from './PostRaw'; @@ -75,3 +78,4 @@ export * from './UserOptions'; export * from './UserProfileOutput'; export * from './UserTopic'; export * from './HealthCheck'; +export * from './UserStatus'; diff --git a/api/src/types/dataTypes.ts b/api/src/types/dataTypes.ts index ba424541..42054cba 100644 --- a/api/src/types/dataTypes.ts +++ b/api/src/types/dataTypes.ts @@ -34,11 +34,19 @@ export type UserIcon = z.infer; 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)), + userId: z.number(), + user: UserIcon, }); -export type TopicPoster = z.infer; +export const SuggestionTopicPoster = z.object({ + extras: z.optional(z.nullable(z.string())), + description: z.string(), + user: UserIcon, +}); + +export const PosterUnion = z.union([TopicPoster, SuggestionTopicPoster]); + +export type PosterUnion = z.infer; export type Topic = { id: number; @@ -73,7 +81,7 @@ export type Topic = { lastPosterUsername?: string | null; categoryId?: number | null; pinnedGlobally: boolean | null; - posters: Array; + posters: Array; authorUserId?: number | null; }; @@ -152,3 +160,115 @@ type ActionSummary = { count?: number; }; export type ActionsSummary = Array; + +const ActionSummary = z.array( + z.object({ + id: z.number(), + hidden: z.optional(z.nullable(z.boolean())), + acted: z.optional(z.nullable(z.boolean())), + canUndo: z.optional(z.nullable(z.boolean())), + canAct: z.optional(z.nullable(z.boolean())), + count: z.optional(z.nullable(z.number())), + }), +); +const ActionsSummary = z.array(ActionSummary); + +const PollOption = z.object({ + id: z.string(), + html: z.string(), + votes: z.number(), +}); + +const PreloadedVotersUser = z.object({ + id: z.number(), + username: z.string(), + name: z.string(), + avatarTemplate: z.string(), + title: z.optional(z.nullable(z.string())), +}); + +const PreloadedVoters = z.record(z.string(), z.array(PreloadedVotersUser)); + +const PollsVotes = z.record(z.string(), z.array(z.string())); +export type PollsVotes = z.infer; + +export const POLL_TYPE = ['regular', 'multiple', 'number'] as const; +export const POLL_RESULTS = ['always', 'on_vote', 'on_close'] as const; +export const POLL_STATUS = ['open', 'closed'] as const; +export const POLL_CHART_TYPE = ['bar', 'pie'] as const; + +const Poll = z.object({ + name: z.string(), + type: z.enum(POLL_TYPE), + status: z.enum(POLL_STATUS), + public: z.boolean(), + results: z.enum(POLL_RESULTS), + options: z.array(PollOption), + voters: z.number(), + preloadedVoters: PreloadedVoters, + chartType: z.enum(POLL_CHART_TYPE), + groups: z.optional(z.nullable(z.string())), + title: z.optional(z.nullable(z.string())), + close: z.optional(z.nullable(z.string())), + min: z.optional(z.nullable(z.number())), + max: z.optional(z.nullable(z.number())), + step: z.optional(z.nullable(z.number())), +}); +export type Poll = z.infer; + +const Post = z.object({ + id: z.number(), + name: z.optional(z.nullable(z.string())), + username: z.string(), + avatarTemplate: z.string(), + createdAt: z.string(), + cooked: z.string(), + postNumber: z.number(), + postType: z.number(), + updatedAt: z.string(), + replyCount: z.number(), + replyToPostNumber: z.optional(z.nullable(z.number())), + quoteCount: z.number(), + incomingLinkCount: z.number(), + reads: z.number(), + readersCount: z.number(), + score: z.number(), + yours: z.boolean(), + topicId: z.number(), + topicSlug: z.string(), + displayUsername: z.optional(z.nullable(z.string())), + primaryGroupName: z.optional(z.nullable(z.string())), + primaryGroupFlairUrl: z.optional(z.nullable(z.string())), + primaryGroupFlairColor: z.optional(z.nullable(z.string())), + primaryGroupFlairBgColor: z.optional(z.nullable(z.string())), + version: z.number(), + canEdit: z.boolean(), + canDelete: z.boolean(), + canRecover: z.boolean(), + canSeeHiddenPost: z.boolean(), + canWiki: z.boolean(), + read: z.boolean(), + userTitle: z.string(), + bookmarked: z.boolean(), + raw: z.string(), + actionsSummary: ActionsSummary, + moderator: z.boolean(), + admin: z.boolean(), + staff: z.boolean(), + userId: z.number(), + hidden: z.boolean(), + draftSequence: z.number(), + trustLevel: z.number(), + deletedAt: z.string(), + userDeleted: z.boolean(), + editReason: z.string(), + canViewEditHistory: z.boolean(), + wiki: z.boolean(), + reviewableId: z.number(), + reviewableScoreCount: z.number(), + reviewableScorePendingCount: z.number(), + mentionedUsers: z.array(z.string()), + polls: z.optional(z.nullable(z.array(Poll))), + pollsVotes: z.optional(z.nullable(PollsVotes)), +}); +export type Post = z.infer; diff --git a/api/yarn.lock b/api/yarn.lock index ab3a11d5..450661eb 100644 --- a/api/yarn.lock +++ b/api/yarn.lock @@ -24,6 +24,14 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.18.8": version "7.18.13" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz" @@ -59,6 +67,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@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" @@ -74,20 +92,25 @@ 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== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@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== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" "@babel/helper-module-imports@^7.18.6": version "7.18.6" @@ -129,16 +152,33 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@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-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@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-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@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" @@ -162,11 +202,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@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/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" @@ -260,19 +314,28 @@ "@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== +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== 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" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.18.13", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.4": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" @@ -285,6 +348,15 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" @@ -365,6 +437,11 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@fastify/busboy@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" + integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== + "@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" @@ -675,6 +752,11 @@ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@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" @@ -685,6 +767,19 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.15" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz" @@ -1456,7 +1551,7 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2561,10 +2656,10 @@ graceful-fs@^4.2.4: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graphql@^16.5.0: - version "16.6.0" - resolved "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz" - integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== +graphql@^16.8.1: + version "16.8.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" + integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== growly@^1.3.0: version "1.3.0" @@ -5122,11 +5217,11 @@ unbox-primitive@^1.0.2: 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== + version "5.26.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.3.tgz#ab3527b3d5bb25b12f898dfd22165d472dd71b79" + integrity sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw== dependencies: - busboy "^1.6.0" + "@fastify/busboy" "^2.0.0" union-value@^1.0.0: version "1.0.1" @@ -5467,7 +5562,7 @@ yn@3.1.1: resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -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== +zod@^3.22.3: + version "3.22.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.3.tgz#2fbc96118b174290d94e8896371c95629e87a060" + integrity sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug== diff --git a/documentation/docusaurus.config.js b/documentation/docusaurus.config.js index 937e4856..7a07a24e 100644 --- a/documentation/docusaurus.config.js +++ b/documentation/docusaurus.config.js @@ -64,10 +64,11 @@ module.exports = { editUrl: 'https://github.com/lexiconhq/lexicon/blob/master/documentation/', routeBasePath: '/', - onlyIncludeVersions: ['1.0.0', '2.0.0-beta'], + onlyIncludeVersions: ['1.0.0', '2.0.0'], + lastVersion: '2.0.0', versions: { - '2.0.0-beta': { - path: 'version-2.0.0-beta', + '2.0.0': { + path: 'version-2.0.0', banner: 'none', }, '1.0.0': { diff --git a/documentation/package.json b/documentation/package.json index 52fa946a..87eb61bd 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -12,8 +12,8 @@ "serve": "docusaurus serve" }, "dependencies": { - "@docusaurus/core": "^2.0.0-rc.1", - "@docusaurus/preset-classic": "^2.0.0-rc.1", + "@docusaurus/core": "^2.4.3", + "@docusaurus/preset-classic": "^2.4.3", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "docusaurus-plugin-image-zoom": "^0.1.1", diff --git a/documentation/src/pages/index.js b/documentation/src/pages/index.js index 19a6bb8d..079a4187 100644 --- a/documentation/src/pages/index.js +++ b/documentation/src/pages/index.js @@ -2,5 +2,5 @@ import React from 'react'; import { Redirect } from 'react-router-dom'; export default function Home() { - return ; + return ; } diff --git a/documentation/versioned_docs/version-1.0.0/intro.md b/documentation/versioned_docs/version-1.0.0/intro.md index 66a89182..4684df41 100644 --- a/documentation/versioned_docs/version-1.0.0/intro.md +++ b/documentation/versioned_docs/version-1.0.0/intro.md @@ -45,7 +45,7 @@ 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. +See the [v2 documentation](../version-2.0.0/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). diff --git a/documentation/versioned_docs/version-2.0.0-beta/app-store.md b/documentation/versioned_docs/version-2.0.0/app-store.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/app-store.md rename to documentation/versioned_docs/version-2.0.0/app-store.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/assets.md b/documentation/versioned_docs/version-2.0.0/assets.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/assets.md rename to documentation/versioned_docs/version-2.0.0/assets.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/commercial-support.md b/documentation/versioned_docs/version-2.0.0/commercial-support.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/commercial-support.md rename to documentation/versioned_docs/version-2.0.0/commercial-support.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/concepts.md b/documentation/versioned_docs/version-2.0.0/concepts.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/concepts.md rename to documentation/versioned_docs/version-2.0.0/concepts.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/contributing.md b/documentation/versioned_docs/version-2.0.0/contributing.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/contributing.md rename to documentation/versioned_docs/version-2.0.0/contributing.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/customize.md b/documentation/versioned_docs/version-2.0.0/customize.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/customize.md rename to documentation/versioned_docs/version-2.0.0/customize.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/dedicated.md b/documentation/versioned_docs/version-2.0.0/dedicated.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/dedicated.md rename to documentation/versioned_docs/version-2.0.0/dedicated.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/deployment.md b/documentation/versioned_docs/version-2.0.0/deployment.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/deployment.md rename to documentation/versioned_docs/version-2.0.0/deployment.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/discourse-features.md b/documentation/versioned_docs/version-2.0.0/discourse-features.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/discourse-features.md rename to documentation/versioned_docs/version-2.0.0/discourse-features.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-enable.md b/documentation/versioned_docs/version-2.0.0/discourse-plugin-enable.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-enable.md rename to documentation/versioned_docs/version-2.0.0/discourse-plugin-enable.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-installation.md b/documentation/versioned_docs/version-2.0.0/discourse-plugin-installation.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/discourse-plugin-installation.md rename to documentation/versioned_docs/version-2.0.0/discourse-plugin-installation.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/discourse-plugin.md b/documentation/versioned_docs/version-2.0.0/discourse-plugin.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/discourse-plugin.md rename to documentation/versioned_docs/version-2.0.0/discourse-plugin.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/intro.md b/documentation/versioned_docs/version-2.0.0/email-deep-linking/intro.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/intro.md rename to documentation/versioned_docs/version-2.0.0/email-deep-linking/intro.md 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/email-deep-linking/setup/enable-email-deep-linking.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/enable-email-deep-linking.md rename to documentation/versioned_docs/version-2.0.0/email-deep-linking/setup/enable-email-deep-linking.md 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/email-deep-linking/setup/verify-email-deep-linking.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/email-deep-linking/setup/verify-email-deep-linking.md rename to documentation/versioned_docs/version-2.0.0/email-deep-linking/setup/verify-email-deep-linking.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/env-mobile.md b/documentation/versioned_docs/version-2.0.0/env-mobile.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/env-mobile.md rename to documentation/versioned_docs/version-2.0.0/env-mobile.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/env-prose.md b/documentation/versioned_docs/version-2.0.0/env-prose.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/env-prose.md rename to documentation/versioned_docs/version-2.0.0/env-prose.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/intro.md b/documentation/versioned_docs/version-2.0.0/intro.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/intro.md rename to documentation/versioned_docs/version-2.0.0/intro.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/lexicon-updates.md b/documentation/versioned_docs/version-2.0.0/lexicon-updates.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/lexicon-updates.md rename to documentation/versioned_docs/version-2.0.0/lexicon-updates.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/optimal.md b/documentation/versioned_docs/version-2.0.0/optimal.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/optimal.md rename to documentation/versioned_docs/version-2.0.0/optimal.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/play-store.md b/documentation/versioned_docs/version-2.0.0/play-store.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/play-store.md rename to documentation/versioned_docs/version-2.0.0/play-store.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/publish-app.md b/documentation/versioned_docs/version-2.0.0/publish-app.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/publish-app.md rename to documentation/versioned_docs/version-2.0.0/publish-app.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/push-notifications/introduction.md b/documentation/versioned_docs/version-2.0.0/push-notifications/introduction.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/push-notifications/introduction.md rename to documentation/versioned_docs/version-2.0.0/push-notifications/introduction.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/push-notifications/plugin-interaction.md b/documentation/versioned_docs/version-2.0.0/push-notifications/plugin-interaction.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/push-notifications/plugin-interaction.md rename to documentation/versioned_docs/version-2.0.0/push-notifications/plugin-interaction.md 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/push-notifications/setup/enable-push-notifications.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/enable-push-notifications.md rename to documentation/versioned_docs/version-2.0.0/push-notifications/setup/enable-push-notifications.md 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/push-notifications/setup/verify-push-notifications.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/push-notifications/setup/verify-push-notifications.md rename to documentation/versioned_docs/version-2.0.0/push-notifications/setup/verify-push-notifications.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/quick-start.md b/documentation/versioned_docs/version-2.0.0/quick-start.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/quick-start.md rename to documentation/versioned_docs/version-2.0.0/quick-start.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/rationale.md b/documentation/versioned_docs/version-2.0.0/rationale.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/rationale.md rename to documentation/versioned_docs/version-2.0.0/rationale.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/setup.md b/documentation/versioned_docs/version-2.0.0/setup.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/setup.md rename to documentation/versioned_docs/version-2.0.0/setup.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/supported-devices.md b/documentation/versioned_docs/version-2.0.0/supported-devices.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/supported-devices.md rename to documentation/versioned_docs/version-2.0.0/supported-devices.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/technologies.md b/documentation/versioned_docs/version-2.0.0/technologies.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/technologies.md rename to documentation/versioned_docs/version-2.0.0/technologies.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/theming.md b/documentation/versioned_docs/version-2.0.0/theming.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/theming.md rename to documentation/versioned_docs/version-2.0.0/theming.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/troubleshooting-build.md b/documentation/versioned_docs/version-2.0.0/troubleshooting-build.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/troubleshooting-build.md rename to documentation/versioned_docs/version-2.0.0/troubleshooting-build.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/building.md b/documentation/versioned_docs/version-2.0.0/tutorial/building.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/building.md rename to documentation/versioned_docs/version-2.0.0/tutorial/building.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/install-prose.md b/documentation/versioned_docs/version-2.0.0/tutorial/install-prose.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/install-prose.md rename to documentation/versioned_docs/version-2.0.0/tutorial/install-prose.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/intro.md b/documentation/versioned_docs/version-2.0.0/tutorial/intro.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/intro.md rename to documentation/versioned_docs/version-2.0.0/tutorial/intro.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/publishing.md b/documentation/versioned_docs/version-2.0.0/tutorial/publishing.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/publishing.md rename to documentation/versioned_docs/version-2.0.0/tutorial/publishing.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-cloud-server.md b/documentation/versioned_docs/version-2.0.0/tutorial/setup-cloud-server.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-cloud-server.md rename to documentation/versioned_docs/version-2.0.0/tutorial/setup-cloud-server.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-discourse.md b/documentation/versioned_docs/version-2.0.0/tutorial/setup-discourse.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-discourse.md rename to documentation/versioned_docs/version-2.0.0/tutorial/setup-discourse.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-mobile.md b/documentation/versioned_docs/version-2.0.0/tutorial/setup-mobile.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/setup-mobile.md rename to documentation/versioned_docs/version-2.0.0/tutorial/setup-mobile.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/setup.md b/documentation/versioned_docs/version-2.0.0/tutorial/setup.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/setup.md rename to documentation/versioned_docs/version-2.0.0/tutorial/setup.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/updating.md b/documentation/versioned_docs/version-2.0.0/tutorial/updating.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/updating.md rename to documentation/versioned_docs/version-2.0.0/tutorial/updating.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/tutorial/white-label.md b/documentation/versioned_docs/version-2.0.0/tutorial/white-label.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/tutorial/white-label.md rename to documentation/versioned_docs/version-2.0.0/tutorial/white-label.md diff --git a/documentation/versioned_docs/version-2.0.0-beta/white-labeling.md b/documentation/versioned_docs/version-2.0.0/white-labeling.md similarity index 100% rename from documentation/versioned_docs/version-2.0.0-beta/white-labeling.md rename to documentation/versioned_docs/version-2.0.0/white-labeling.md diff --git a/documentation/versioned_sidebars/version-2.0.0-beta-sidebars.json b/documentation/versioned_sidebars/version-2.0.0-sidebars.json similarity index 100% rename from documentation/versioned_sidebars/version-2.0.0-beta-sidebars.json rename to documentation/versioned_sidebars/version-2.0.0-sidebars.json diff --git a/documentation/versions.json b/documentation/versions.json index f103ef9d..04c9f68a 100644 --- a/documentation/versions.json +++ b/documentation/versions.json @@ -1 +1 @@ -["2.0.0-beta", "1.0.0"] +["2.0.0", "1.0.0"] diff --git a/documentation/yarn.lock b/documentation/yarn.lock index 81b30277..b20f2b1d 100644 --- a/documentation/yarn.lock +++ b/documentation/yarn.lock @@ -256,6 +256,14 @@ dependencies: "@babel/highlight" "^7.10.4" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" @@ -304,7 +312,16 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.13", "@babel/generator@^7.18.7", "@babel/generator@^7.18.9": +"@babel/generator@^7.12.5": + version "7.12.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f" + integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ== + dependencies: + "@babel/types" "^7.12.13" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.18.7", "@babel/generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== @@ -313,14 +330,15 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.12.5": - version "7.12.15" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f" - integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ== +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" - source-map "^0.5.0" "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" @@ -385,6 +403,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -392,7 +415,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.18.9": +"@babel/helper-function-name@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== @@ -400,6 +423,14 @@ "@babel/template" "^7.18.6" "@babel/types" "^7.18.9" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -407,6 +438,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" @@ -509,11 +547,28 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" @@ -556,6 +611,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.12.13", "@babel/parser@^7.18.6", "@babel/parser@^7.18.8", "@babel/parser@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" @@ -566,6 +630,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.15.tgz#2b20de7f0b4b332d9b119dd9c33409c538b8aacf" integrity sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -1326,36 +1395,30 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.12.13", "@babel/traverse@^7.18.8", "@babel/traverse@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" - integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@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.9" - "@babel/types" "^7.18.9" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.12.9": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" - integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.12.13", "@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.18.9": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" "@babel/types@^7.12.13", "@babel/types@^7.18.4", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.4.4": version "7.18.9" @@ -1374,6 +1437,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1394,10 +1466,10 @@ "@docsearch/css" "3.1.1" algoliasearch "^4.0.0" -"@docusaurus/core@2.0.0-rc.1", "@docusaurus/core@^2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-rc.1.tgz#828d93d241171565d8947a9ab404091e04759141" - integrity sha512-b9FX0Z+EddfQ6wAiNh+Wx4fysKfcvEcWJrZ5USROn3C+EVU5P4luaa8mwWK//O+hTwD9ur7/A44IZ/tWCTAoLQ== +"@docusaurus/core@2.4.3", "@docusaurus/core@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.4.3.tgz#d86624901386fd8164ce4bff9cc7f16fde57f523" + integrity sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA== dependencies: "@babel/core" "^7.18.6" "@babel/generator" "^7.18.7" @@ -1409,13 +1481,13 @@ "@babel/runtime" "^7.18.6" "@babel/runtime-corejs3" "^7.18.6" "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" + "@docusaurus/cssnano-preset" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" "@slorber/static-site-generator-webpack-plugin" "^4.0.7" "@svgr/webpack" "^6.2.1" autoprefixer "^10.4.7" @@ -1436,7 +1508,7 @@ del "^6.1.1" detect-port "^1.3.0" escape-html "^1.0.3" - eta "^1.12.3" + eta "^2.0.0" file-loader "^6.2.0" fs-extra "^10.1.0" html-minifier-terser "^6.1.0" @@ -1471,33 +1543,33 @@ webpack-merge "^5.8.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-rc.1.tgz#76bbd7f6912779a0667f8f2fd8fc1a05618a6148" - integrity sha512-9/KmQvF+eTlMqUqG6UcXbRgxbGed/8bQInXuKEs+95/jI6jO/3xSzuRwuHHHP0naUvSVWjnNI9jngPrQerXE5w== +"@docusaurus/cssnano-preset@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.3.tgz#1d7e833c41ce240fcc2812a2ac27f7b862f32de0" + integrity sha512-ZvGSRCi7z9wLnZrXNPG6DmVPHdKGd8dIn9pYbEOFiYihfv4uDR3UtxogmKf+rT8ZlKFf5Lqne8E8nt08zNM8CA== dependencies: cssnano-preset-advanced "^5.3.8" postcss "^8.4.14" postcss-sort-media-queries "^4.2.1" tslib "^2.4.0" -"@docusaurus/logger@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.0.0-rc.1.tgz#db95e9b15bc243695830a5b791c0eff705ef1b54" - integrity sha512-daa3g+SXuO9K60PVMiSUmDEK9Vro+Ed7i7uF8CH6QQJLcNZy/zJc0Xz62eH7ip1x77fmeb6Rg4Us1TqTFc9AbQ== +"@docusaurus/logger@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.4.3.tgz#518bbc965fb4ebe8f1d0b14e5f4161607552d34c" + integrity sha512-Zxws7r3yLufk9xM1zq9ged0YHs65mlRmtsobnFkdZTxWXdTYlWWLWdKyNKAsVC+D7zg+pv2fGbyabdOnyZOM3w== dependencies: chalk "^4.1.2" tslib "^2.4.0" -"@docusaurus/mdx-loader@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-rc.1.tgz#e78d7d416aacc289f2427c5ccdb9145820acb0cb" - integrity sha512-8Fg0c/ceu39knmr7w0dutm7gq3YxKYCqWVS2cB/cPATzChCCNH/AGLfBT6sz/Z4tjVXE+NyREq2pfOFvkhjVXg== +"@docusaurus/mdx-loader@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.4.3.tgz#e8ff37f30a060eaa97b8121c135f74cb531a4a3e" + integrity sha512-b1+fDnWtl3GiqkL0BRjYtc94FZrcDDBV1j8446+4tptB9BAOlePwG2p/pK6vGvfL53lkOsszXMghr2g67M0vCw== dependencies: "@babel/parser" "^7.18.8" "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/logger" "2.4.3" + "@docusaurus/utils" "2.4.3" "@mdx-js/mdx" "^1.6.22" escape-html "^1.0.3" file-loader "^6.2.0" @@ -1512,13 +1584,13 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@docusaurus/module-type-aliases@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-rc.1.tgz#c7839ac15b7712a8d86353a3253918f63ffbea09" - integrity sha512-la7D8ggFP8I5nOp/Epl6NqTeDWcbofPVMOaVisRxQbx5iuF9Al+AITbaDgm4CXpFLJACsqhsXD5W4BnKX8ZxfA== +"@docusaurus/module-type-aliases@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz#d08ef67e4151e02f352a2836bcf9ecde3b9c56ac" + integrity sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA== dependencies: "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/types" "2.4.3" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1526,18 +1598,18 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-content-blog@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-rc.1.tgz#8ae5d5ec2da08c583a057bf2754a5b9278b3eb08" - integrity sha512-BVVrAGZujpjS/0rarY2o24rlylRRh2NZuM65kg0JNkkViF79SeEHsepog7IuHyoqGWPm1N/I7LpEp7k+gowZzQ== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" +"@docusaurus/plugin-content-blog@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.3.tgz#6473b974acab98e967414d8bbb0d37e0cedcea14" + integrity sha512-PVhypqaA0t98zVDpOeTqWUTvRqCEjJubtfFUQ7zJNYdbYTbS/E/ytq6zbLVsN/dImvemtO/5JQgjLxsh8XLo8Q== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" cheerio "^1.0.0-rc.12" feed "^4.2.2" fs-extra "^10.1.0" @@ -1548,18 +1620,18 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-docs@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-rc.1.tgz#2dda88166bf21b0eeb3821ef748059b20c8c49f7" - integrity sha512-Yk5Hu6uaw3tRplzJnbDygwRhmZ3PCzEXD4SJpBA6cPC73ylfqOEh6qhiU+BWhMTtDXNhY+athk5Kycfk3DW1aQ== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/module-type-aliases" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" +"@docusaurus/plugin-content-docs@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.3.tgz#aa224c0512351e81807adf778ca59fd9cd136973" + integrity sha512-N7Po2LSH6UejQhzTCsvuX5NOzlC+HiXOVvofnEPj0WhMu1etpLEXE6a4aTxrtg95lQ5kf0xUIdjX9sh3d3G76A== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" "@types/react-router-config" "^5.0.6" combine-promises "^1.1.0" fs-extra "^10.1.0" @@ -1570,84 +1642,95 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-pages@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-rc.1.tgz#2be82f53d6c77e6aa66787726c30dc60b210e6f8" - integrity sha512-FdO79WC5hfWDQu3/CTFLRQzTNc0e5n+HNzavm2MNkSzGV08BFJ6RAkbPbtra5CWef+6iXZav6D/tzv2jDPvLzA== +"@docusaurus/plugin-content-pages@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.3.tgz#7f285e718b53da8c8d0101e70840c75b9c0a1ac0" + integrity sha512-txtDVz7y3zGk67q0HjG0gRttVPodkHqE0bpJ+7dOaTH40CQFLSh7+aBeGnPOTl+oCPG+hxkim4SndqPqXjQ8Bg== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" fs-extra "^10.1.0" tslib "^2.4.0" webpack "^5.73.0" -"@docusaurus/plugin-debug@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-rc.1.tgz#73c06ad08d66810941e456d50b07be008f5235cb" - integrity sha512-aOsyYrPMbnsyqHwsVZ+0frrMRtnYqm4eaJpG4sC/6LYAJ07IDRQ9j3GOku2dKr5GsFK1Vx7VlE6ZLwe0MaGstg== +"@docusaurus/plugin-debug@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.4.3.tgz#2f90eb0c9286a9f225444e3a88315676fe02c245" + integrity sha512-LkUbuq3zCmINlFb+gAd4ZvYr+bPAzMC0hwND4F7V9bZ852dCX8YoWyovVUBKq4er1XsOwSQaHmNGtObtn8Av8Q== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" fs-extra "^10.1.0" react-json-view "^1.21.3" tslib "^2.4.0" -"@docusaurus/plugin-google-analytics@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-rc.1.tgz#0136cc7534573ca56e023178ec2bda5c1e89ce71" - integrity sha512-f+G8z5OJWfg5QqWDLIdcN2SDoK5J5Gg8HMrqCI6Pfl+rxPb5I1niA+/UkAM+kMCpnekvhSt5AWz2fgkRenkPLA== +"@docusaurus/plugin-google-analytics@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.3.tgz#0d19993136ade6f7a7741251b4f617400d92ab45" + integrity sha512-KzBV3k8lDkWOhg/oYGxlK5o9bOwX7KpPc/FTWoB+SfKhlHfhq7qcQdMi1elAaVEIop8tgK6gD1E58Q+XC6otSQ== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-rc.1.tgz#61698fdc41a4ace912fb8f6c834efd288edad3c0" - integrity sha512-yE1Et9hhhX9qMRnMJzpNq0854qIYiSEc2dZaXNk537HN7Q0rKkr/YONUHz2iqNYwPX2hGOY4LdpTxlMP88uVhA== +"@docusaurus/plugin-google-gtag@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz#e1a80b0696771b488562e5b60eff21c9932d9e1c" + integrity sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-sitemap@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.1.tgz#0b638e774b253d90e9f2d11663e961250f557bc4" - integrity sha512-5JmbNpssUF03odFM4ArvIsrO9bv7HnAJ0VtefXhh0WBpaFs8NgI3rTkCTFimvtRQjDR9U2bh23fXz2vjQQz6oA== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" +"@docusaurus/plugin-google-tag-manager@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.3.tgz#e41fbf79b0ffc2de1cc4013eb77798cff0ad98e3" + integrity sha512-1jTzp71yDGuQiX9Bi0pVp3alArV0LSnHXempvQTxwCGAEzUWWaBg4d8pocAlTpbP9aULQQqhgzrs8hgTRPOM0A== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + tslib "^2.4.0" + +"@docusaurus/plugin-sitemap@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.3.tgz#1b3930900a8f89670ce7e8f83fb4730cd3298c32" + integrity sha512-LRQYrK1oH1rNfr4YvWBmRzTL0LN9UAPxBbghgeFRBm5yloF6P+zv1tm2pe2hQTX/QP5bSKdnajCvfnScgKXMZQ== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" fs-extra "^10.1.0" sitemap "^7.1.1" tslib "^2.4.0" -"@docusaurus/preset-classic@^2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-rc.1.tgz#5e5b1cf80b3dd4e2c3f824c78a111f105858d853" - integrity sha512-5jjTVZkhArjyoNHwCI9x4PSG0zPmBJILjZLVrxPcHpm/K0ltkYcp6J3GxYpf5EbMuOh5+yCWM63cSshGcNOo3Q== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/plugin-content-blog" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/plugin-content-pages" "2.0.0-rc.1" - "@docusaurus/plugin-debug" "2.0.0-rc.1" - "@docusaurus/plugin-google-analytics" "2.0.0-rc.1" - "@docusaurus/plugin-google-gtag" "2.0.0-rc.1" - "@docusaurus/plugin-sitemap" "2.0.0-rc.1" - "@docusaurus/theme-classic" "2.0.0-rc.1" - "@docusaurus/theme-common" "2.0.0-rc.1" - "@docusaurus/theme-search-algolia" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" +"@docusaurus/preset-classic@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.4.3.tgz#074c57ebf29fa43d23bd1c8ce691226f542bc262" + integrity sha512-tRyMliepY11Ym6hB1rAFSNGwQDpmszvWYJvlK1E+md4SW8i6ylNHtpZjaYFff9Mdk3i/Pg8ItQq9P0daOJAvQw== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/plugin-content-blog" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/plugin-content-pages" "2.4.3" + "@docusaurus/plugin-debug" "2.4.3" + "@docusaurus/plugin-google-analytics" "2.4.3" + "@docusaurus/plugin-google-gtag" "2.4.3" + "@docusaurus/plugin-google-tag-manager" "2.4.3" + "@docusaurus/plugin-sitemap" "2.4.3" + "@docusaurus/theme-classic" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/theme-search-algolia" "2.4.3" + "@docusaurus/types" "2.4.3" "@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" @@ -1657,27 +1740,27 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/theme-classic@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-rc.1.tgz#4ab30745e6b03b0f277837debae786a0a83aee6a" - integrity sha512-qNiz7ieeq3AC+V8TbW6S63pWLJph1CbzWDDPTqxDLHgA8VQaNaSmJM8S92pH+yKALRb9u14ogjjYYc75Nj2JmQ== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/module-type-aliases" "2.0.0-rc.1" - "@docusaurus/plugin-content-blog" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/plugin-content-pages" "2.0.0-rc.1" - "@docusaurus/theme-common" "2.0.0-rc.1" - "@docusaurus/theme-translations" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" +"@docusaurus/theme-classic@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.4.3.tgz#29360f2eb03a0e1686eb19668633ef313970ee8f" + integrity sha512-QKRAJPSGPfDY2yCiPMIVyr+MqwZCIV2lxNzqbyUW0YkrlmdzzP3WuQJPMGLCjWgQp/5c9kpWMvMxjhpZx1R32Q== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/plugin-content-blog" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/plugin-content-pages" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/theme-translations" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" "@mdx-js/react" "^1.6.22" clsx "^1.2.1" copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.42" + infima "0.2.0-alpha.43" lodash "^4.17.21" nprogress "^0.2.0" postcss "^8.4.14" @@ -1688,17 +1771,18 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-common@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-rc.1.tgz#ea5d9732a16b03b488555e50107161bfa2abad98" - integrity sha512-1r9ZLKD9SeoCYVzWzcdR79Dia4ANlrlRjNl6uzETOEybjK6FF7yEa9Yra8EJcOCbi3coyYz5xFh/r1YHFTFHug== - dependencies: - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/module-type-aliases" "2.0.0-rc.1" - "@docusaurus/plugin-content-blog" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/plugin-content-pages" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" +"@docusaurus/theme-common@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.4.3.tgz#bb31d70b6b67d0bdef9baa343192dcec49946a2e" + integrity sha512-7KaDJBXKBVGXw5WOVt84FtN8czGWhM0lbyWEZXGp8AFfL6sZQfRTluFp4QriR97qwzSyOfQb+nzcDZZU4tezUw== + dependencies: + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/plugin-content-blog" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/plugin-content-pages" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1706,42 +1790,43 @@ parse-numeric-range "^1.3.0" prism-react-renderer "^1.3.5" tslib "^2.4.0" + use-sync-external-store "^1.2.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-rc.1.tgz#e78c0aeaea6a3717ae3a6ecd75a8652bd7c8e974" - integrity sha512-H5yq6V/B4qo6GZrDKMbeSpk3T9e9K2MliDzLonRu0w3QHW9orVGe0c/lZvRbGlDZjnsOo7XGddhXXIDWGwnpaA== +"@docusaurus/theme-search-algolia@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz#32d4cbefc3deba4112068fbdb0bde11ac51ece53" + integrity sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q== dependencies: "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/theme-common" "2.0.0-rc.1" - "@docusaurus/theme-translations" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/theme-translations" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" algoliasearch "^4.13.1" algoliasearch-helper "^3.10.0" clsx "^1.2.1" - eta "^1.12.3" + eta "^2.0.0" fs-extra "^10.1.0" lodash "^4.17.21" tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.0.0-rc.1.tgz#bd647f78c741ee7f6c6d2cbbd3e3f282ef2f89ad" - integrity sha512-JLhNdlnbQhxVQzOnLyiCaTzKFa1lpVrM3nCrkGQKscoG2rY6ARGYMgMN2DkoH6hm7TflQ8+PE1S5MzzASeLs4Q== +"@docusaurus/theme-translations@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.4.3.tgz#91ac73fc49b8c652b7a54e88b679af57d6ac6102" + integrity sha512-H4D+lbZbjbKNS/Zw1Lel64PioUAIT3cLYYJLUf3KkuO/oc9e0QCVhIYVtUI2SfBCF2NNdlyhBDQEEMygsCedIg== dependencies: fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-rc.1.tgz#032f8afde6b4878e37f984b9949a96b150103c21" - integrity sha512-wX25FOZa/aKnCGA5ljWPaDpMW3TuTbs0BtjQ8WTC557p8zDvuz4r+g2/FPHsgWE0TKwUMf4usQU1m3XpJLPN+g== +"@docusaurus/types@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.4.3.tgz#4aead281ca09f721b3c0a9b926818450cfa3db31" + integrity sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw== dependencies: "@types/history" "^4.7.11" "@types/react" "*" @@ -1752,31 +1837,32 @@ webpack "^5.73.0" webpack-merge "^5.8.0" -"@docusaurus/utils-common@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.0.0-rc.1.tgz#3e233a28794325d5d9d3af3f7b1c22b59aa8b847" - integrity sha512-+iZICpeFPZJ9oGJXuG92WTWee6WRnVx5BdzlcfuKf/f5KQX8PvwXR2tDME78FGGhShB8zr+vjuNEXuLvXT7j2A== +"@docusaurus/utils-common@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.4.3.tgz#30656c39ef1ce7e002af7ba39ea08330f58efcfb" + integrity sha512-/jascp4GbLQCPVmcGkPzEQjNaAk3ADVfMtudk49Ggb+131B1WDD6HqlSmDf8MxGdy7Dja2gc+StHf01kiWoTDQ== dependencies: tslib "^2.4.0" -"@docusaurus/utils-validation@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-rc.1.tgz#dded12f036cda8a54a19e01694b35859fe0cf1d5" - integrity sha512-lj36gm9Ksu4tt/EUeLDWoMbXe3sfBxeIPIUUdqYcBYkF/rpQkh+uL/dncjNGiw6uvBOqXhOfsFVP045HtgShVw== +"@docusaurus/utils-validation@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.4.3.tgz#8122c394feef3e96c73f6433987837ec206a63fb" + integrity sha512-G2+Vt3WR5E/9drAobP+hhZQMaswRwDlp6qOMi7o7ZypB+VO7N//DZWhZEwhcRGepMDJGQEwtPv7UxtYwPL9PBw== dependencies: - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/logger" "2.4.3" + "@docusaurus/utils" "2.4.3" joi "^17.6.0" js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-rc.1.tgz#53584b800df9e13864d5ef1a76aa7655a90ec86e" - integrity sha512-ym9I1OwIYbKs1LGaUajaA/vDG8VweJj/6YoZjHp+eDQHhTRIrHXiYoGDqorafRhftKwnA1EnyomuXpNd9bq8Gg== +"@docusaurus/utils@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.4.3.tgz#52b000d989380a2125831b84e3a7327bef471e89" + integrity sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A== dependencies: - "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/logger" "2.4.3" "@svgr/webpack" "^6.2.1" + escape-string-regexp "^4.0.0" file-loader "^6.2.0" fs-extra "^10.1.0" github-slugger "^1.4.0" @@ -1825,6 +1911,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -1843,6 +1934,19 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": version "0.3.14" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" @@ -2969,7 +3073,7 @@ ccount@^1.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3866,10 +3970,10 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eta@^1.12.3: - version "1.12.3" - resolved "https://registry.yarnpkg.com/eta/-/eta-1.12.3.tgz#2982d08adfbef39f9fa50e2fbd42d7337e7338b1" - integrity sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg== +eta@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== etag@~1.8.1: version "1.8.1" @@ -4659,10 +4763,10 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infima@0.2.0-alpha.42: - version "0.2.0-alpha.42" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.42.tgz#f6e86a655ad40877c6b4d11b2ede681eb5470aa5" - integrity sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww== +infima@0.2.0-alpha.43: + version "0.2.0-alpha.43" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" + integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== inflight@^1.0.4: version "1.0.6" @@ -5358,10 +5462,10 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== negotiator@0.6.3: version "0.6.3" @@ -6017,11 +6121,11 @@ postcss-zindex@^5.1.0: integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== postcss@^8.3.11, postcss@^8.4.13, postcss@^8.4.14, postcss@^8.4.7: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -7513,6 +7617,11 @@ use-latest@^1.0.0: dependencies: use-isomorphic-layout-effect "^1.0.0" +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json deleted file mode 100644 index aadaeaa8..00000000 --- a/frontend/.eslintrc.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "env": { - "es6": true, - "react-native/react-native": true - }, - "extends": ["plugin:@typescript-eslint/recommended", "prettier"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { "jsx": true }, - "ecmaVersion": 2022, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint", - "eslint-comments", - "prettier", - "react", - "react-hooks", - "react-native", - "t", - "styles" - ], - "settings": { - "import/extensions": [".js", ".jsx", ".ts", ".tsx"], - "react": { "version": "detect" } - }, - "rules": { - "t/string-literal": 1, - "styles/style-maker-no-unused": 1, - // TypeScript (@typescript-eslint/eslint-plugin) - "@typescript-eslint/array-type": ["error", { "default": "generic" }], - "@typescript-eslint/ban-types": [ - "error", - { - "extendDefaults":true, - "types": { - "Boolean": { "message": "Use boolean instead", "fixWith": "boolean" }, - "Number": { "message": "Use number instead", "fixWith": "number" }, - "String": { "message": "Use string instead", "fixWith": "string" }, - "Symbol": { "message": "Use symbol instead", "fixWith": "symbol" }, - "object": { "message":"Use Record instead", "fixWith" :"Record"} - } - } - ], - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/explicit-member-accessibility": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": [ - "warn", - { - "ignoreRestSiblings": true, - "argsIgnorePattern": "^_" - } - ], - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/prefer-interface": "off", - - // ESLint (eslint-plugin-eslint-comments) - "eslint-comments/no-unused-disable": "warn", - - // Custom - "array-callback-return": "warn", - "curly": "warn", - "dot-notation": "warn", - "eol-last": "warn", - "eqeqeq": ["error", "always", { "null": "never" }], - "guard-for-in": "warn", - "no-alert": "warn", - "no-console": "warn", - "no-debugger": "warn", - "no-duplicate-imports": ["warn", { "includeExports": true }], - "no-floating-decimal": "warn", - "no-new": "warn", - "no-proto": "warn", - "no-return-assign": "warn", - "no-underscore-dangle": ["warn", { "allowAfterThis": true }], - "no-unneeded-ternary": "warn", - "one-var": ["warn", "never"], - "prefer-arrow-callback": "warn", - "prefer-const": "off", - "radix": "warn", - "yoda": "warn", - - // React (eslint-plugin-react) - "react/jsx-key": "warn", - "react/jsx-no-comment-textnodes": "warn", - "react/jsx-no-duplicate-props": "warn", - "react/jsx-no-target-blank": "warn", - "react/jsx-no-undef": "warn", - "react/jsx-uses-react": "warn", - "react/jsx-uses-vars": "warn", - "react/no-unescaped-entities": "warn", - "react/no-unknown-property": "warn", - "react/react-in-jsx-scope": "error", - "react/require-render-return": "warn", - "react/self-closing-comp": "warn", - - // React (eslint-plugin-react-hooks) - "react-hooks/exhaustive-deps": "warn", - "react-hooks/rules-of-hooks": "error", - - // React Native (eslint-plugin-react-native) - "react-native/no-single-element-style-arrays": "warn", - "react-native/no-unused-styles": "warn" - } -} diff --git a/frontend/assets/icons/Ballot.svg b/frontend/assets/icons/Ballot.svg new file mode 100644 index 00000000..d5b7b036 --- /dev/null +++ b/frontend/assets/icons/Ballot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/assets/icons/Clock.svg b/frontend/assets/icons/Clock.svg new file mode 100644 index 00000000..cf6d1719 --- /dev/null +++ b/frontend/assets/icons/Clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/assets/icons/Delete.svg b/frontend/assets/icons/Delete.svg new file mode 100644 index 00000000..1520eaf6 --- /dev/null +++ b/frontend/assets/icons/Delete.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/assets/icons/DropdownArrow.svg b/frontend/assets/icons/DropdownArrow.svg new file mode 100644 index 00000000..9846d8bc --- /dev/null +++ b/frontend/assets/icons/DropdownArrow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/assets/icons/Edit.svg b/frontend/assets/icons/Edit.svg new file mode 100644 index 00000000..1d4d77f3 --- /dev/null +++ b/frontend/assets/icons/Edit.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/assets/icons/ExpandLess.svg b/frontend/assets/icons/ExpandLess.svg new file mode 100644 index 00000000..5ce5766c --- /dev/null +++ b/frontend/assets/icons/ExpandLess.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/assets/icons/ExpandMore.svg b/frontend/assets/icons/ExpandMore.svg new file mode 100644 index 00000000..0011f054 --- /dev/null +++ b/frontend/assets/icons/ExpandMore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/assets/icons/RemoveCircle.svg b/frontend/assets/icons/RemoveCircle.svg new file mode 100644 index 00000000..2b5898c2 --- /dev/null +++ b/frontend/assets/icons/RemoveCircle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/assets/icons/WarningCircle.svg b/frontend/assets/icons/WarningCircle.svg new file mode 100644 index 00000000..80c8e834 --- /dev/null +++ b/frontend/assets/icons/WarningCircle.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/package.json b/frontend/package.json index 8b35a2cf..c8450f7b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,12 +25,14 @@ "@react-navigation/elements": "^1.3.4", "@react-navigation/native": "^6.0.11", "@react-navigation/stack": "^6.2.2", + "@shopify/flash-list": "^1.6.1", "apollo-upload-client": "^17.0.0", + "date-fns": "^2.30.0", "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-file-system": "~15.4.4", "expo-image-picker": "~14.3.2", "expo-linear-gradient": "~12.3.0", "expo-linking": "~5.0.2", @@ -41,14 +43,15 @@ "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", + "expo-updates": "~0.18.15", + "graphql": "^16.8.1", "intl": "^1.2.5", "markdown-it-flowdock": "^0.3.8", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.43.9", - "react-native": "0.72.4", + "react-native": "0.72.5", + "react-native-animated-progress": "^1.0.2", "react-native-auto-grow-textinput": "^1.2.1", "react-native-dotenv": "^3.3.1", "react-native-gesture-handler": "~2.12.0", @@ -57,7 +60,9 @@ "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-modal-datetime-picker": "^17.1.0", "react-native-parsed-text": "^0.0.22", + "react-native-pie-chart": "^3.0.1", "react-native-reanimated": "~3.3.0", "react-native-safe-area-context": "4.6.3", "react-native-screens": "~3.22.0", @@ -80,6 +85,7 @@ "@types/jest": "^26.0.9", "@types/react": "~18.2.14", "@types/react-native": "~0.70.6", + "@types/react-native-animated-progress": "^1.0.2", "@types/react-native-dotenv": "^0.2.0", "@types/react-test-renderer": "^18.0.0", "cross-env": "^7.0.3", diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 4b28a6f1..859968b5 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -17,7 +17,8 @@ import { } from './utils'; import { AuthProvider } from './utils/AuthProvider'; import { NewPostForm } from './types'; -import { NO_CHANNEL_FILTER_ID } from './constants'; +import { FORM_DEFAULT_VALUES } from './constants'; +import ErrorBoundary from './components/ErrorBoundary'; if (Platform.OS === 'android') { require('intl'); @@ -41,16 +42,13 @@ export default function App() { const newPostMethods = useForm({ mode: 'onChange', reValidateMode: 'onChange', - defaultValues: { - title: '', - raw: '', - tags: [], - channelId: NO_CHANNEL_FILTER_ID, - editPostId: undefined, - editTopicId: undefined, - }, + defaultValues: FORM_DEFAULT_VALUES, }); + /** + * Error Boundary is inside the ThemeProvider because we need to use the core UI, which relies on the theme provided by the ThemeProvider. + */ + return ( @@ -58,22 +56,24 @@ export default function App() { - <> - - - - - - - - - - - - - - - + + <> + + + + + + + + + + + + + + + + diff --git a/frontend/src/components/AlertBanner.tsx b/frontend/src/components/AlertBanner.tsx new file mode 100644 index 00000000..49ff2cb2 --- /dev/null +++ b/frontend/src/components/AlertBanner.tsx @@ -0,0 +1,70 @@ +import React from 'react'; +import { StyleProp, View, ViewStyle } from 'react-native'; + +import { Text } from '../core-ui'; +import { makeStyles } from '../theme'; + +type Props = { + type: 'warning' | 'success' | 'error' | 'info'; + title?: string; + message: string; + style?: StyleProp; +}; + +export function AlertBanner(props: Props) { + const styles = useStyles(); + const { message, type, title, style } = props; + const alertColor = () => { + switch (type) { + case 'warning': + return { + background: styles.warningBackground, + text: styles.warningText, + }; + case 'success': + return { + background: styles.successBackground, + text: styles.successText, + }; + case 'error': + return { + background: styles.errorBackground, + text: styles.errorText, + }; + case 'info': + return { + background: styles.infoBackground, + text: styles.infoText, + }; + } + }; + + return ( + + {title && ( + + {title} + + )} + + {message} + + + ); +} + +const useStyles = makeStyles(({ colors, spacing }) => ({ + bannerContainer: { + borderRadius: spacing.m, + paddingHorizontal: spacing.l, + paddingVertical: spacing.m, + }, + warningBackground: { backgroundColor: colors.alertWarningBackground }, + warningText: { color: colors.alertWarningText }, + successBackground: { backgroundColor: colors.alertSuccessBackground }, + successText: { color: colors.alertSuccessText }, + errorBackground: { backgroundColor: colors.alertErrorBackground }, + errorText: { color: colors.alertErrorText }, + infoBackground: { backgroundColor: colors.alertInfoBackground }, + infoText: { color: colors.alertInfoText }, +})); diff --git a/frontend/src/components/Author.tsx b/frontend/src/components/Author.tsx index df6aa219..8a1e9667 100644 --- a/frontend/src/components/Author.tsx +++ b/frontend/src/components/Author.tsx @@ -8,7 +8,7 @@ import { View, } from 'react-native'; -import { Avatar, AvatarProps, Text } from '../core-ui'; +import { Avatar, AvatarProps, Emoji, Text } from '../core-ui'; import { FontVariant, makeStyles } from '../theme'; type Props = TouchableOpacityProps & @@ -24,6 +24,8 @@ type Props = TouchableOpacityProps & imageStyle?: StyleProp; onPressAuthor?: (username: string) => void; onPressEmptySpaceInPost?: () => void; + showStatus?: boolean; + emojiCode?: string; }; export function Author(props: Props) { @@ -43,6 +45,8 @@ export function Author(props: Props) { children, onPressAuthor, onPressEmptySpaceInPost, + showStatus, + emojiCode, ...otherProps } = props; @@ -57,9 +61,14 @@ export function Author(props: Props) { onPress={() => onPressAuthor && onPressAuthor(title)} /> - - {title} - + + + {title} + + {showStatus && emojiCode && ( + + )} + {subtitle && ( {subtitle} @@ -108,6 +117,7 @@ const useStyles = makeStyles(({ spacing }) => ({ textTitle: { textTransform: 'capitalize', paddingBottom: spacing.xs, + marginRight: spacing.s, }, image: { marginRight: spacing.m, @@ -115,4 +125,9 @@ const useStyles = makeStyles(({ spacing }) => ({ children: { alignSelf: 'center', }, + nameContainer: { + flexDirection: 'row', + flex: 1, + alignItems: 'center', + }, })); diff --git a/frontend/src/components/BottomMenu.tsx b/frontend/src/components/BottomMenu.tsx index a63a8fbd..936b1a31 100644 --- a/frontend/src/components/BottomMenu.tsx +++ b/frontend/src/components/BottomMenu.tsx @@ -3,10 +3,12 @@ import { Keyboard, Platform, View } from 'react-native'; import { Divider, Icon } from '../core-ui'; import { makeStyles, useTheme } from '../theme'; +import { useStorage } from '../helpers'; type Props = { onInsertImage: () => void; onInsertLink: () => void; + onInsertPoll?: () => void; showLeftMenu?: boolean; }; @@ -14,7 +16,16 @@ export function BottomMenu(props: Props) { const styles = useStyles(); const { colors } = useTheme(); - const { onInsertImage, onInsertLink, showLeftMenu = true } = props; + const storage = useStorage(); + const pollSetting = storage.getItem('poll'); + const userTrustLevel = storage.getItem('user')?.trustLevel; + + const { + onInsertImage, + onInsertLink, + onInsertPoll, + showLeftMenu = true, + } = props; const ios = Platform.OS === 'ios'; @@ -43,6 +54,19 @@ export function BottomMenu(props: Props) { style={styles.iconButton} /> + {onInsertPoll && + pollSetting?.allowPoll && + userTrustLevel && + pollSetting.pollCreateMinimumTrustLevel <= userTrustLevel && ( + + )} + )} diff --git a/frontend/src/components/DateTimePicker.tsx b/frontend/src/components/DateTimePicker.tsx new file mode 100644 index 00000000..3e52803f --- /dev/null +++ b/frontend/src/components/DateTimePicker.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import RNDateTimePicker, { + DateTimePickerProps as RNDateTimePickerProps, +} from 'react-native-modal-datetime-picker'; + +type DateTimePickerMode = 'date' | 'time'; + +export type DateTimePickerProps = Readonly< + Omit & { + title?: string; + dateTitleWeb?: string; + timeTitleWeb?: string; + cancelTextWeb?: string; + confirmTextWeb?: string; + mode?: DateTimePickerMode; + date?: string; + use24Hour?: boolean; + } +>; + +export function DateTimePicker(props: DateTimePickerProps) { + const { + onCancel, + onConfirm, + date = new Date().toISOString(), + use24Hour = false, + mode = 'date', + ...otherProps + } = props; + return ( + + ); +} diff --git a/frontend/src/components/Dropdown.tsx b/frontend/src/components/Dropdown.tsx new file mode 100644 index 00000000..a25cf0c3 --- /dev/null +++ b/frontend/src/components/Dropdown.tsx @@ -0,0 +1,123 @@ +import React, { useState } from 'react'; +import { + TouchableOpacity, + View, + ScrollView, + StyleProp, + ViewStyle, +} from 'react-native'; + +import { Text, TextInput } from '../core-ui'; +import { makeStyles, useTheme } from '../theme'; + +type DropdownOption = { + value: string; + label: string; +}; + +type DropdownTextInputProps = { + label?: string; + value: string; + placeholder?: string; + onPress: () => void; + style?: StyleProp; + disabled?: boolean; +}; + +type Props = { + selectedIndex: number | Array; + onSelect: (option: DropdownOption, index: number) => void; + options: Array; + style?: StyleProp; +} & Pick; + +export function DropdownTextInput(props: DropdownTextInputProps) { + const { label, value, placeholder, onPress, style, disabled = false } = props; + const { colors } = useTheme(); + + return ( + + + + ); +} + +export function Dropdown(props: Props) { + const { + label, + selectedIndex, + placeholder = '', + onSelect, + options, + style, + disabled, + } = props; + const styles = useStyles(); + const [showOptions, setShowOptions] = useState(false); + const isMultiple = Array.isArray(selectedIndex); + + return ( + + options[index].label).join(', ') + : options[selectedIndex].label + } + onPress={() => setShowOptions(!showOptions)} + placeholder={placeholder} + disabled={disabled} + /> + {showOptions && ( + + + {options.map((option, index) => ( + { + onSelect(option, index); + !isMultiple && setShowOptions(false); + }} + > + {option.label} + + ))} + + + )} + + ); +} + +const useStyles = makeStyles(({ spacing, colors }) => ({ + scrollContainer: { maxHeight: 160 }, + scrollContentContainer: { + paddingVertical: spacing.m, + paddingHorizontal: spacing.xl, + }, + shadow: { + backgroundColor: colors.background, + shadowColor: colors.pureBlack, + shadowOffset: { + width: 1, + height: 1, + }, + shadowOpacity: 0.2, + elevation: 2, + }, + optionItem: { paddingVertical: spacing.m }, +})); diff --git a/frontend/src/components/ErrorBoundary.tsx b/frontend/src/components/ErrorBoundary.tsx new file mode 100644 index 00000000..d4f56eb6 --- /dev/null +++ b/frontend/src/components/ErrorBoundary.tsx @@ -0,0 +1,71 @@ +import React, { ReactNode } from 'react'; +import { View, StyleSheet, NativeModules } from 'react-native'; +import { reloadAsync } from 'expo-updates'; + +import { SPACING } from '../constants'; +import { Button, Icon, Text } from '../core-ui'; + +type Props = { + children: ReactNode; +}; +type State = { + hasError: boolean; +}; + +class ErrorBoundary extends React.Component { + constructor(props: Props) { + super(props); + this.state = { hasError: false }; + } + + static getDerivedStateFromError(): State { + return { hasError: true }; + } + + restartApp = () => { + if (__DEV__) { + NativeModules.DevSettings.reload(); + } else { + reloadAsync(); + } + }; + + render() { + if (this.state.hasError) { + return ( + + + + {t('Something Went Wrong')} + + + {t( + 'Sorry, an unexpected issue occurred. Please relaunch the app to continue.', + )} + +