[^/]+)/i.test(
+ urlp.pathname,
+ )
+ } catch {}
+ }
+ return false
+}
+
export function convertBskyAppUrlIfNeeded(url: string): string {
if (isBskyAppUrl(url)) {
try {
diff --git a/src/lib/styles.ts b/src/lib/styles.ts
index 00a8638f..fb631c0b 100644
--- a/src/lib/styles.ts
+++ b/src/lib/styles.ts
@@ -1,4 +1,4 @@
-import {StyleProp, StyleSheet, TextStyle} from 'react-native'
+import {Dimensions, StyleProp, StyleSheet, TextStyle} from 'react-native'
import {Theme, TypographyVariant} from './ThemeContext'
import {isMobileWeb} from 'platform/detection'
@@ -52,6 +52,7 @@ export const colors = {
green5: '#082b03',
unreadNotifBg: '#ebf6ff',
+ brandBlue: '#0066FF',
}
export const gradients = {
@@ -169,6 +170,10 @@ export const s = StyleSheet.create({
w100pct: {width: '100%'},
h100pct: {height: '100%'},
hContentRegion: isMobileWeb ? {flex: 1} : {height: '100%'},
+ window: {
+ width: Dimensions.get('window').width,
+ height: Dimensions.get('window').height,
+ },
// text align
textLeft: {textAlign: 'left'},
@@ -214,6 +219,8 @@ export const s = StyleSheet.create({
green3: {color: colors.green3},
green4: {color: colors.green4},
green5: {color: colors.green5},
+
+ brandBlue: {color: colors.brandBlue},
})
export function lh(
diff --git a/src/locale/en/community-guidelines.tsx b/src/locale/en/community-guidelines.tsx
index 5a806999..df19f5b7 100644
--- a/src/locale/en/community-guidelines.tsx
+++ b/src/locale/en/community-guidelines.tsx
@@ -4,7 +4,7 @@ import {H3, H4, P, UL, LI, A, EM, OL} from 'view/com/util/Html'
export default function () {
return (
<>
- Last Updated: 2023/04/06
+ Last Updated: April 6, 2023
The Bluesky app is built on a decentralized social networking protocol,
the AT Protocol (atproto). Atproto is an open protocol that supports
diff --git a/src/locale/en/copyright-policy.tsx b/src/locale/en/copyright-policy.tsx
index 3e995b5d..9412d005 100644
--- a/src/locale/en/copyright-policy.tsx
+++ b/src/locale/en/copyright-policy.tsx
@@ -4,7 +4,7 @@ import {H3, H4, P, UL, LI, A} from 'view/com/util/Html'
export default function () {
return (
<>
-
Last Updated: 2023/04/06
+ Last Updated: April 6, 2023
Notification of Copyright Infringement
Bluesky, PBLLC d.b.a. Bluesky (“Bluesky”) respects the
diff --git a/src/locale/en/privacy-policy.tsx b/src/locale/en/privacy-policy.tsx
index c0bae56f..ea0072ce 100644
--- a/src/locale/en/privacy-policy.tsx
+++ b/src/locale/en/privacy-policy.tsx
@@ -4,7 +4,7 @@ import {H2, H4, P, UL, LI, A} from 'view/com/util/Html'
export default function () {
return (
<>
-
Last Updated: 2023/02/02
+ Last Updated: February 2, 2023
This Privacy Policy is designed to help you understand how Bluesky,
PBLLC d.b.a. Bluesky (“Bluesky,” “we,” “us,” or “our”)
diff --git a/src/locale/en/terms-of-service.tsx b/src/locale/en/terms-of-service.tsx
index 8219cae2..30953a21 100644
--- a/src/locale/en/terms-of-service.tsx
+++ b/src/locale/en/terms-of-service.tsx
@@ -4,7 +4,7 @@ import {H4, P, OL, LI, A, STRONG, EM, UL} from 'view/com/util/Html'
export default function () {
return (
<>
-
Last Updated: 2023/04/06
+ Last Updated: April 6, 2023
Welcome to the Bluesky, PBLLC d.b.a. Bluesky (“Bluesky”,
“we”, or “us”) website located at{' '}
diff --git a/src/platform/polyfills.ts b/src/platform/polyfills.ts
index a64c2c33..d5028c29 100644
--- a/src/platform/polyfills.ts
+++ b/src/platform/polyfills.ts
@@ -23,7 +23,7 @@ globalThis.atob = (str: string): string => {
)
}
- // Adding the padding if missing, for semplicity
+ // Adding the padding if missing, for simplicity
str += '=='.slice(2 - (str.length & 3))
var bitmap,
result = '',
diff --git a/src/routes.ts b/src/routes.ts
index 571aca7f..54faba22 100644
--- a/src/routes.ts
+++ b/src/routes.ts
@@ -3,6 +3,8 @@ import {Router} from 'lib/routes/router'
export const router = new Router({
Home: '/',
Search: '/search',
+ Feeds: '/feeds',
+ DiscoverFeeds: '/search/feeds',
Notifications: '/notifications',
Settings: '/settings',
Moderation: '/moderation',
@@ -16,9 +18,12 @@ export const router = new Router({
PostThread: '/profile/:name/post/:rkey',
PostLikedBy: '/profile/:name/post/:rkey/liked-by',
PostRepostedBy: '/profile/:name/post/:rkey/reposted-by',
+ CustomFeed: '/profile/:name/feed/:rkey',
+ CustomFeedLikedBy: '/profile/:name/feed/:rkey/liked-by',
Debug: '/sys/debug',
Log: '/sys/log',
AppPasswords: '/settings/app-passwords',
+ SavedFeeds: '/settings/saved-feeds',
Support: '/support',
PrivacyPolicy: '/support/privacy',
TermsOfService: '/support/tos',
diff --git a/src/state/models/cache/image-sizes.ts b/src/state/models/cache/image-sizes.ts
index bbfb9612..c30a68f4 100644
--- a/src/state/models/cache/image-sizes.ts
+++ b/src/state/models/cache/image-sizes.ts
@@ -16,6 +16,7 @@ export class ImageSizesCache {
if (Dimensions) {
return Dimensions
}
+
const prom =
this.activeRequests.get(uri) ||
new Promise(resolve => {
diff --git a/src/state/models/content/post-thread.ts b/src/state/models/content/post-thread.ts
index 74a75d80..577b76e0 100644
--- a/src/state/models/content/post-thread.ts
+++ b/src/state/models/content/post-thread.ts
@@ -118,7 +118,7 @@ export class PostThreadItemModel {
assignTreeModels(
v: AppBskyFeedDefs.ThreadViewPost,
- higlightedPostUri: string,
+ highlightedPostUri: string,
includeParent = true,
includeChildren = true,
) {
@@ -130,7 +130,12 @@ export class PostThreadItemModel {
parentModel._showChildReplyLine = true
if (v.parent.parent) {
parentModel._showParentReplyLine = true
- parentModel.assignTreeModels(v.parent, higlightedPostUri, true, false)
+ parentModel.assignTreeModels(
+ v.parent,
+ highlightedPostUri,
+ true,
+ false,
+ )
}
this.parent = parentModel
} else if (AppBskyFeedDefs.isNotFoundPost(v.parent)) {
@@ -147,10 +152,10 @@ export class PostThreadItemModel {
const itemModel = new PostThreadItemModel(this.rootStore, item)
itemModel._depth = this._depth + 1
itemModel._showParentReplyLine =
- itemModel.parentUri !== higlightedPostUri && replies.length === 0
+ itemModel.parentUri !== highlightedPostUri && replies.length === 0
if (item.replies?.length) {
itemModel._showChildReplyLine = true
- itemModel.assignTreeModels(item, higlightedPostUri, false, true)
+ itemModel.assignTreeModels(item, highlightedPostUri, false, true)
}
replies.push(itemModel)
} else if (AppBskyFeedDefs.isNotFoundPost(item)) {
diff --git a/src/state/models/discovery/feeds.ts b/src/state/models/discovery/feeds.ts
new file mode 100644
index 00000000..26a8d650
--- /dev/null
+++ b/src/state/models/discovery/feeds.ts
@@ -0,0 +1,97 @@
+import {makeAutoObservable} from 'mobx'
+import {AppBskyUnspeccedGetPopularFeedGenerators} from '@atproto/api'
+import {RootStoreModel} from '../root-store'
+import {bundleAsync} from 'lib/async/bundle'
+import {cleanError} from 'lib/strings/errors'
+import {CustomFeedModel} from '../feeds/custom-feed'
+
+export class FeedsDiscoveryModel {
+ // state
+ isLoading = false
+ isRefreshing = false
+ hasLoaded = false
+ error = ''
+
+ // data
+ feeds: CustomFeedModel[] = []
+
+ constructor(public rootStore: RootStoreModel) {
+ makeAutoObservable(
+ this,
+ {
+ rootStore: false,
+ },
+ {autoBind: true},
+ )
+ }
+
+ get hasMore() {
+ return false
+ }
+
+ get hasContent() {
+ return this.feeds.length > 0
+ }
+
+ get hasError() {
+ return this.error !== ''
+ }
+
+ get isEmpty() {
+ return this.hasLoaded && !this.hasContent
+ }
+
+ // public api
+ // =
+
+ refresh = bundleAsync(async () => {
+ this._xLoading()
+ try {
+ const res =
+ await this.rootStore.agent.app.bsky.unspecced.getPopularFeedGenerators(
+ {},
+ )
+ this._replaceAll(res)
+ this._xIdle()
+ } catch (e: any) {
+ this._xIdle(e)
+ }
+ })
+
+ clear() {
+ this.isLoading = false
+ this.isRefreshing = false
+ this.hasLoaded = false
+ this.error = ''
+ this.feeds = []
+ }
+
+ // state transitions
+ // =
+
+ _xLoading() {
+ this.isLoading = true
+ this.isRefreshing = true
+ this.error = ''
+ }
+
+ _xIdle(err?: any) {
+ this.isLoading = false
+ this.isRefreshing = false
+ this.hasLoaded = true
+ this.error = cleanError(err)
+ if (err) {
+ this.rootStore.log.error('Failed to fetch popular feeds', err)
+ }
+ }
+
+ // helper functions
+ // =
+
+ _replaceAll(res: AppBskyUnspeccedGetPopularFeedGenerators.Response) {
+ this.feeds = []
+ for (const f of res.data.feeds) {
+ this.feeds.push(new CustomFeedModel(this.rootStore, f))
+ }
+ }
+}
diff --git a/src/state/models/feeds/custom-feed.ts b/src/state/models/feeds/custom-feed.ts
new file mode 100644
index 00000000..8fc1eb1e
--- /dev/null
+++ b/src/state/models/feeds/custom-feed.ts
@@ -0,0 +1,120 @@
+import {AppBskyFeedDefs} from '@atproto/api'
+import {makeAutoObservable, runInAction} from 'mobx'
+import {RootStoreModel} from 'state/models/root-store'
+import {sanitizeDisplayName} from 'lib/strings/display-names'
+import {updateDataOptimistically} from 'lib/async/revertible'
+
+export class CustomFeedModel {
+ // data
+ _reactKey: string
+ data: AppBskyFeedDefs.GeneratorView
+ isOnline: boolean
+ isValid: boolean
+
+ constructor(
+ public rootStore: RootStoreModel,
+ view: AppBskyFeedDefs.GeneratorView,
+ isOnline?: boolean,
+ isValid?: boolean,
+ ) {
+ this._reactKey = view.uri
+ this.data = view
+ this.isOnline = isOnline ?? true
+ this.isValid = isValid ?? true
+ makeAutoObservable(
+ this,
+ {
+ rootStore: false,
+ },
+ {autoBind: true},
+ )
+ }
+
+ // local actions
+ // =
+
+ get uri() {
+ return this.data.uri
+ }
+
+ get displayName() {
+ if (this.data.displayName) {
+ return sanitizeDisplayName(this.data.displayName)
+ }
+ return `Feed by @${this.data.creator.handle}`
+ }
+
+ get isSaved() {
+ return this.rootStore.preferences.savedFeeds.includes(this.uri)
+ }
+
+ get isLiked() {
+ return this.data.viewer?.like
+ }
+
+ // public apis
+ // =
+
+ async save() {
+ await this.rootStore.preferences.addSavedFeed(this.uri)
+ }
+
+ async unsave() {
+ await this.rootStore.preferences.removeSavedFeed(this.uri)
+ }
+
+ async like() {
+ try {
+ await updateDataOptimistically(
+ this.data,
+ () => {
+ this.data.viewer = this.data.viewer || {}
+ this.data.viewer.like = 'pending'
+ this.data.likeCount = (this.data.likeCount || 0) + 1
+ },
+ () => this.rootStore.agent.like(this.data.uri, this.data.cid),
+ res => {
+ this.data.viewer = this.data.viewer || {}
+ this.data.viewer.like = res.uri
+ },
+ )
+ } catch (e: any) {
+ this.rootStore.log.error('Failed to like feed', e)
+ }
+ }
+
+ async unlike() {
+ if (!this.data.viewer?.like) {
+ return
+ }
+ try {
+ const likeUri = this.data.viewer.like
+ await updateDataOptimistically(
+ this.data,
+ () => {
+ this.data.viewer = this.data.viewer || {}
+ this.data.viewer.like = undefined
+ this.data.likeCount = (this.data.likeCount || 1) - 1
+ },
+ () => this.rootStore.agent.deleteLike(likeUri),
+ )
+ } catch (e: any) {
+ this.rootStore.log.error('Failed to unlike feed', e)
+ }
+ }
+
+ async reload() {
+ const res = await this.rootStore.agent.app.bsky.feed.getFeedGenerator({
+ feed: this.data.uri,
+ })
+ runInAction(() => {
+ this.data = res.data.view
+ this.isOnline = res.data.isOnline
+ this.isValid = res.data.isValid
+ })
+ }
+
+ serialize() {
+ return JSON.stringify(this.data)
+ }
+}
diff --git a/src/state/models/feeds/multi-feed.ts b/src/state/models/feeds/multi-feed.ts
new file mode 100644
index 00000000..3c13041c
--- /dev/null
+++ b/src/state/models/feeds/multi-feed.ts
@@ -0,0 +1,216 @@
+import {makeAutoObservable, runInAction} from 'mobx'
+import {AtUri} from '@atproto/api'
+import {bundleAsync} from 'lib/async/bundle'
+import {RootStoreModel} from '../root-store'
+import {CustomFeedModel} from './custom-feed'
+import {PostsFeedModel} from './posts'
+import {PostsFeedSliceModel} from './post'
+
+const FEED_PAGE_SIZE = 5
+const FEEDS_PAGE_SIZE = 3
+
+export type MultiFeedItem =
+ | {
+ _reactKey: string
+ type: 'header'
+ }
+ | {
+ _reactKey: string
+ type: 'feed-header'
+ avatar: string | undefined
+ title: string
+ }
+ | {
+ _reactKey: string
+ type: 'feed-slice'
+ slice: PostsFeedSliceModel
+ }
+ | {
+ _reactKey: string
+ type: 'feed-loading'
+ }
+ | {
+ _reactKey: string
+ type: 'feed-error'
+ error: string
+ }
+ | {
+ _reactKey: string
+ type: 'feed-footer'
+ title: string
+ uri: string
+ }
+ | {
+ _reactKey: string
+ type: 'footer'
+ }
+
+export class PostsMultiFeedModel {
+ // state
+ isLoading = false
+ isRefreshing = false
+ hasLoaded = false
+ hasMore = true
+
+ // data
+ feedInfos: CustomFeedModel[] = []
+ feeds: PostsFeedModel[] = []
+
+ constructor(public rootStore: RootStoreModel) {
+ makeAutoObservable(this, {rootStore: false}, {autoBind: true})
+ }
+
+ get hasContent() {
+ return this.feeds.length !== 0
+ }
+
+ get isEmpty() {
+ return this.hasLoaded && !this.hasContent
+ }
+
+ get items() {
+ const items: MultiFeedItem[] = [{_reactKey: '__header__', type: 'header'}]
+ for (let i = 0; i < this.feedInfos.length; i++) {
+ if (!this.feeds[i]) {
+ break
+ }
+ const feed = this.feeds[i]
+ const feedInfo = this.feedInfos[i]
+ const urip = new AtUri(feedInfo.uri)
+ items.push({
+ _reactKey: `__feed_header_${i}__`,
+ type: 'feed-header',
+ avatar: feedInfo.data.avatar,
+ title: feedInfo.displayName,
+ })
+ if (feed.isLoading) {
+ items.push({
+ _reactKey: `__feed_loading_${i}__`,
+ type: 'feed-loading',
+ })
+ } else if (feed.hasError) {
+ items.push({
+ _reactKey: `__feed_error_${i}__`,
+ type: 'feed-error',
+ error: feed.error,
+ })
+ } else {
+ for (let j = 0; j < feed.slices.length; j++) {
+ items.push({
+ _reactKey: `__feed_slice_${i}_${j}__`,
+ type: 'feed-slice',
+ slice: feed.slices[j],
+ })
+ }
+ }
+ items.push({
+ _reactKey: `__feed_footer_${i}__`,
+ type: 'feed-footer',
+ title: feedInfo.displayName,
+ uri: `/profile/${feedInfo.data.creator.did}/feed/${urip.rkey}`,
+ })
+ }
+ if (!this.hasMore) {
+ items.push({_reactKey: '__footer__', type: 'footer'})
+ }
+ return items
+ }
+
+ // public api
+ // =
+
+ /**
+ * Nuke all data
+ */
+ clear() {
+ this.rootStore.log.debug('MultiFeedModel:clear')
+ this.isLoading = false
+ this.isRefreshing = false
+ this.hasLoaded = false
+ this.hasMore = true
+ this.feeds = []
+ }
+
+ /**
+ * Register any event listeners. Returns a cleanup function.
+ */
+ registerListeners() {
+ const sub = this.rootStore.onPostDeleted(this.onPostDeleted.bind(this))
+ return () => sub.remove()
+ }
+
+ /**
+ * Reset and load
+ */
+ async refresh() {
+ this.feedInfos = this.rootStore.me.savedFeeds.all.slice() // capture current feeds
+ await this.loadMore(true)
+ }
+
+ /**
+ * Load more posts to the end of the feed
+ */
+ loadMore = bundleAsync(async (isRefreshing: boolean = false) => {
+ if (!isRefreshing && !this.hasMore) {
+ return
+ }
+ if (isRefreshing) {
+ this.isRefreshing = true // set optimistically for UI
+ this.feeds = []
+ }
+ this._xLoading(isRefreshing)
+ const start = this.feeds.length
+ const newFeeds: PostsFeedModel[] = []
+ for (
+ let i = start;
+ i < start + FEEDS_PAGE_SIZE && i < this.feedInfos.length;
+ i++
+ ) {
+ const feed = new PostsFeedModel(this.rootStore, 'custom', {
+ feed: this.feedInfos[i].uri,
+ })
+ feed.pageSize = FEED_PAGE_SIZE
+ await feed.setup()
+ newFeeds.push(feed)
+ }
+ runInAction(() => {
+ this.feeds = this.feeds.concat(newFeeds)
+ this.hasMore = this.feeds.length < this.feedInfos.length
+ })
+ this._xIdle()
+ })
+
+ /**
+ * Attempt to load more again after a failure
+ */
+ async retryLoadMore() {
+ this.hasMore = true
+ return this.loadMore()
+ }
+
+ /**
+ * Removes posts from the feed upon deletion.
+ */
+ onPostDeleted(uri: string) {
+ for (const f of this.feeds) {
+ f.onPostDeleted(uri)
+ }
+ }
+
+ // state transitions
+ // =
+
+ _xLoading(isRefreshing = false) {
+ this.isLoading = true
+ this.isRefreshing = isRefreshing
+ }
+
+ _xIdle() {
+ this.isLoading = false
+ this.isRefreshing = false
+ this.hasLoaded = true
+ }
+
+ // helper functions
+ // =
+}
diff --git a/src/state/models/feeds/notifications.ts b/src/state/models/feeds/notifications.ts
index 73424f03..5005f1d9 100644
--- a/src/state/models/feeds/notifications.ts
+++ b/src/state/models/feeds/notifications.ts
@@ -181,7 +181,7 @@ export class NotificationsFeedItemModel {
return false
}
- get additionaDataUri(): string | undefined {
+ get additionalDataUri(): string | undefined {
if (this.isReply || this.isQuote || this.isMention) {
return this.uri
} else if (this.isLike || this.isRepost) {
@@ -290,7 +290,9 @@ export class NotificationsFeedModel {
}
get hasNewLatest() {
- return this.queuedNotifications && this.queuedNotifications?.length > 0
+ return Boolean(
+ this.queuedNotifications && this.queuedNotifications?.length > 0,
+ )
}
get unreadCountLabel(): string {
@@ -490,7 +492,7 @@ export class NotificationsFeedModel {
'mostRecent',
res.data.notifications[0],
)
- const addedUri = notif.additionaDataUri
+ const addedUri = notif.additionalDataUri
if (addedUri) {
const postsRes = await this.rootStore.agent.app.bsky.feed.getPosts({
uris: [addedUri],
@@ -583,7 +585,7 @@ export class NotificationsFeedModel {
`item-${_idCounter++}`,
item,
)
- const uri = itemModel.additionaDataUri
+ const uri = itemModel.additionalDataUri
if (uri) {
const models = addedPostMap.get(uri) || []
models.push(itemModel)
diff --git a/src/state/models/feeds/post.ts b/src/state/models/feeds/post.ts
new file mode 100644
index 00000000..0c411d44
--- /dev/null
+++ b/src/state/models/feeds/post.ts
@@ -0,0 +1,265 @@
+import {makeAutoObservable} from 'mobx'
+import {AppBskyFeedDefs, AppBskyFeedPost, RichText} from '@atproto/api'
+import {RootStoreModel} from '../root-store'
+import {updateDataOptimistically} from 'lib/async/revertible'
+import {PostLabelInfo, PostModeration} from 'lib/labeling/types'
+import {FeedViewPostsSlice} from 'lib/api/feed-manip'
+import {
+ getEmbedLabels,
+ getEmbedMuted,
+ getEmbedMutedByList,
+ getEmbedBlocking,
+ getEmbedBlockedBy,
+ getPostModeration,
+ filterAccountLabels,
+ filterProfileLabels,
+ mergePostModerations,
+} from 'lib/labeling/helpers'
+
+type FeedViewPost = AppBskyFeedDefs.FeedViewPost
+type ReasonRepost = AppBskyFeedDefs.ReasonRepost
+type PostView = AppBskyFeedDefs.PostView
+
+let _idCounter = 0
+
+export class PostsFeedItemModel {
+ // ui state
+ _reactKey: string = ''
+
+ // data
+ post: PostView
+ postRecord?: AppBskyFeedPost.Record
+ reply?: FeedViewPost['reply']
+ reason?: FeedViewPost['reason']
+ richText?: RichText
+
+ constructor(
+ public rootStore: RootStoreModel,
+ reactKey: string,
+ v: FeedViewPost,
+ ) {
+ this._reactKey = reactKey
+ this.post = v.post
+ if (AppBskyFeedPost.isRecord(this.post.record)) {
+ const valid = AppBskyFeedPost.validateRecord(this.post.record)
+ if (valid.success) {
+ this.postRecord = this.post.record
+ this.richText = new RichText(this.postRecord, {cleanNewlines: true})
+ } else {
+ this.postRecord = undefined
+ this.richText = undefined
+ rootStore.log.warn(
+ 'Received an invalid app.bsky.feed.post record',
+ valid.error,
+ )
+ }
+ } else {
+ this.postRecord = undefined
+ this.richText = undefined
+ rootStore.log.warn(
+ 'app.bsky.feed.getTimeline or app.bsky.feed.getAuthorFeed served an unexpected record type',
+ this.post.record,
+ )
+ }
+ this.reply = v.reply
+ this.reason = v.reason
+ makeAutoObservable(this, {rootStore: false})
+ }
+
+ get rootUri(): string {
+ if (this.reply?.root.uri) {
+ return this.reply.root.uri
+ }
+ return this.post.uri
+ }
+
+ get isThreadMuted() {
+ return this.rootStore.mutedThreads.uris.has(this.rootUri)
+ }
+
+ get labelInfo(): PostLabelInfo {
+ return {
+ postLabels: (this.post.labels || []).concat(
+ getEmbedLabels(this.post.embed),
+ ),
+ accountLabels: filterAccountLabels(this.post.author.labels),
+ profileLabels: filterProfileLabels(this.post.author.labels),
+ isMuted:
+ this.post.author.viewer?.muted ||
+ getEmbedMuted(this.post.embed) ||
+ false,
+ mutedByList:
+ this.post.author.viewer?.mutedByList ||
+ getEmbedMutedByList(this.post.embed),
+ isBlocking:
+ !!this.post.author.viewer?.blocking ||
+ getEmbedBlocking(this.post.embed) ||
+ false,
+ isBlockedBy:
+ !!this.post.author.viewer?.blockedBy ||
+ getEmbedBlockedBy(this.post.embed) ||
+ false,
+ }
+ }
+
+ get moderation(): PostModeration {
+ return getPostModeration(this.rootStore, this.labelInfo)
+ }
+
+ copy(v: FeedViewPost) {
+ this.post = v.post
+ this.reply = v.reply
+ this.reason = v.reason
+ }
+
+ copyMetrics(v: FeedViewPost) {
+ this.post.replyCount = v.post.replyCount
+ this.post.repostCount = v.post.repostCount
+ this.post.likeCount = v.post.likeCount
+ this.post.viewer = v.post.viewer
+ }
+
+ get reasonRepost(): ReasonRepost | undefined {
+ if (this.reason?.$type === 'app.bsky.feed.defs#reasonRepost') {
+ return this.reason as ReasonRepost
+ }
+ }
+
+ async toggleLike() {
+ this.post.viewer = this.post.viewer || {}
+ if (this.post.viewer.like) {
+ const url = this.post.viewer.like
+ await updateDataOptimistically(
+ this.post,
+ () => {
+ this.post.likeCount = (this.post.likeCount || 0) - 1
+ this.post.viewer!.like = undefined
+ },
+ () => this.rootStore.agent.deleteLike(url),
+ )
+ } else {
+ await updateDataOptimistically(
+ this.post,
+ () => {
+ this.post.likeCount = (this.post.likeCount || 0) + 1
+ this.post.viewer!.like = 'pending'
+ },
+ () => this.rootStore.agent.like(this.post.uri, this.post.cid),
+ res => {
+ this.post.viewer!.like = res.uri
+ },
+ )
+ }
+ }
+
+ async toggleRepost() {
+ this.post.viewer = this.post.viewer || {}
+ if (this.post.viewer?.repost) {
+ const url = this.post.viewer.repost
+ await updateDataOptimistically(
+ this.post,
+ () => {
+ this.post.repostCount = (this.post.repostCount || 0) - 1
+ this.post.viewer!.repost = undefined
+ },
+ () => this.rootStore.agent.deleteRepost(url),
+ )
+ } else {
+ await updateDataOptimistically(
+ this.post,
+ () => {
+ this.post.repostCount = (this.post.repostCount || 0) + 1
+ this.post.viewer!.repost = 'pending'
+ },
+ () => this.rootStore.agent.repost(this.post.uri, this.post.cid),
+ res => {
+ this.post.viewer!.repost = res.uri
+ },
+ )
+ }
+ }
+
+ async toggleThreadMute() {
+ if (this.isThreadMuted) {
+ this.rootStore.mutedThreads.uris.delete(this.rootUri)
+ } else {
+ this.rootStore.mutedThreads.uris.add(this.rootUri)
+ }
+ }
+
+ async delete() {
+ await this.rootStore.agent.deletePost(this.post.uri)
+ this.rootStore.emitPostDeleted(this.post.uri)
+ }
+}
+
+export class PostsFeedSliceModel {
+ // ui state
+ _reactKey: string = ''
+
+ // data
+ items: PostsFeedItemModel[] = []
+
+ constructor(
+ public rootStore: RootStoreModel,
+ reactKey: string,
+ slice: FeedViewPostsSlice,
+ ) {
+ this._reactKey = reactKey
+ for (const item of slice.items) {
+ this.items.push(
+ new PostsFeedItemModel(rootStore, `slice-${_idCounter++}`, item),
+ )
+ }
+ makeAutoObservable(this, {rootStore: false})
+ }
+
+ get uri() {
+ if (this.isReply) {
+ return this.items[1].post.uri
+ }
+ return this.items[0].post.uri
+ }
+
+ get isThread() {
+ return (
+ this.items.length > 1 &&
+ this.items.every(
+ item => item.post.author.did === this.items[0].post.author.did,
+ )
+ )
+ }
+
+ get isReply() {
+ return this.items.length > 1 && !this.isThread
+ }
+
+ get rootItem() {
+ if (this.isReply) {
+ return this.items[1]
+ }
+ return this.items[0]
+ }
+
+ get moderation() {
+ return mergePostModerations(this.items.map(item => item.moderation))
+ }
+
+ containsUri(uri: string) {
+ return !!this.items.find(item => item.post.uri === uri)
+ }
+
+ isThreadParentAt(i: number) {
+ if (this.items.length === 1) {
+ return false
+ }
+ return i < this.items.length - 1
+ }
+
+ isThreadChildAt(i: number) {
+ if (this.items.length === 1) {
+ return false
+ }
+ return i > 0
+ }
+}
diff --git a/src/state/models/feeds/posts.ts b/src/state/models/feeds/posts.ts
index b2dffdc6..911cc630 100644
--- a/src/state/models/feeds/posts.ts
+++ b/src/state/models/feeds/posts.ts
@@ -1,11 +1,8 @@
import {makeAutoObservable, runInAction} from 'mobx'
import {
AppBskyFeedGetTimeline as GetTimeline,
- AppBskyFeedDefs,
- AppBskyFeedPost,
AppBskyFeedGetAuthorFeed as GetAuthorFeed,
- RichText,
- jsonToLex,
+ AppBskyFeedGetFeed as GetCustomFeed,
} from '@atproto/api'
import AwaitLock from 'await-lock'
import {bundleAsync} from 'lib/async/bundle'
@@ -19,269 +16,11 @@ import {
mergePosts,
} from 'lib/api/build-suggested-posts'
import {FeedTuner, FeedViewPostsSlice} from 'lib/api/feed-manip'
-import {updateDataOptimistically} from 'lib/async/revertible'
-import {PostLabelInfo, PostModeration} from 'lib/labeling/types'
-import {
- getEmbedLabels,
- getEmbedMuted,
- getEmbedMutedByList,
- getEmbedBlocking,
- getEmbedBlockedBy,
- getPostModeration,
- mergePostModerations,
- filterAccountLabels,
- filterProfileLabels,
-} from 'lib/labeling/helpers'
-
-type FeedViewPost = AppBskyFeedDefs.FeedViewPost
-type ReasonRepost = AppBskyFeedDefs.ReasonRepost
-type PostView = AppBskyFeedDefs.PostView
+import {PostsFeedSliceModel} from './post'
const PAGE_SIZE = 30
let _idCounter = 0
-export class PostsFeedItemModel {
- // ui state
- _reactKey: string = ''
-
- // data
- post: PostView
- postRecord?: AppBskyFeedPost.Record
- reply?: FeedViewPost['reply']
- reason?: FeedViewPost['reason']
- richText?: RichText
-
- constructor(
- public rootStore: RootStoreModel,
- reactKey: string,
- v: FeedViewPost,
- ) {
- this._reactKey = reactKey
- this.post = v.post
- if (AppBskyFeedPost.isRecord(this.post.record)) {
- const valid = AppBskyFeedPost.validateRecord(this.post.record)
- if (valid.success) {
- this.postRecord = this.post.record
- this.richText = new RichText(this.postRecord, {cleanNewlines: true})
- } else {
- this.postRecord = undefined
- this.richText = undefined
- rootStore.log.warn(
- 'Received an invalid app.bsky.feed.post record',
- valid.error,
- )
- }
- } else {
- this.postRecord = undefined
- this.richText = undefined
- rootStore.log.warn(
- 'app.bsky.feed.getTimeline or app.bsky.feed.getAuthorFeed served an unexpected record type',
- this.post.record,
- )
- }
- this.reply = v.reply
- this.reason = v.reason
- makeAutoObservable(this, {rootStore: false})
- }
-
- get rootUri(): string {
- if (this.reply?.root.uri) {
- return this.reply.root.uri
- }
- return this.post.uri
- }
-
- get isThreadMuted() {
- return this.rootStore.mutedThreads.uris.has(this.rootUri)
- }
-
- get labelInfo(): PostLabelInfo {
- return {
- postLabels: (this.post.labels || []).concat(
- getEmbedLabels(this.post.embed),
- ),
- accountLabels: filterAccountLabels(this.post.author.labels),
- profileLabels: filterProfileLabels(this.post.author.labels),
- isMuted:
- this.post.author.viewer?.muted ||
- getEmbedMuted(this.post.embed) ||
- false,
- mutedByList:
- this.post.author.viewer?.mutedByList ||
- getEmbedMutedByList(this.post.embed),
- isBlocking:
- !!this.post.author.viewer?.blocking ||
- getEmbedBlocking(this.post.embed) ||
- false,
- isBlockedBy:
- !!this.post.author.viewer?.blockedBy ||
- getEmbedBlockedBy(this.post.embed) ||
- false,
- }
- }
-
- get moderation(): PostModeration {
- return getPostModeration(this.rootStore, this.labelInfo)
- }
-
- copy(v: FeedViewPost) {
- this.post = v.post
- this.reply = v.reply
- this.reason = v.reason
- }
-
- copyMetrics(v: FeedViewPost) {
- this.post.replyCount = v.post.replyCount
- this.post.repostCount = v.post.repostCount
- this.post.likeCount = v.post.likeCount
- this.post.viewer = v.post.viewer
- }
-
- get reasonRepost(): ReasonRepost | undefined {
- if (this.reason?.$type === 'app.bsky.feed.defs#reasonRepost') {
- return this.reason as ReasonRepost
- }
- }
-
- async toggleLike() {
- this.post.viewer = this.post.viewer || {}
- if (this.post.viewer.like) {
- const url = this.post.viewer.like
- await updateDataOptimistically(
- this.post,
- () => {
- this.post.likeCount = (this.post.likeCount || 0) - 1
- this.post.viewer!.like = undefined
- },
- () => this.rootStore.agent.deleteLike(url),
- )
- } else {
- await updateDataOptimistically(
- this.post,
- () => {
- this.post.likeCount = (this.post.likeCount || 0) + 1
- this.post.viewer!.like = 'pending'
- },
- () => this.rootStore.agent.like(this.post.uri, this.post.cid),
- res => {
- this.post.viewer!.like = res.uri
- },
- )
- }
- }
-
- async toggleRepost() {
- this.post.viewer = this.post.viewer || {}
- if (this.post.viewer?.repost) {
- const url = this.post.viewer.repost
- await updateDataOptimistically(
- this.post,
- () => {
- this.post.repostCount = (this.post.repostCount || 0) - 1
- this.post.viewer!.repost = undefined
- },
- () => this.rootStore.agent.deleteRepost(url),
- )
- } else {
- await updateDataOptimistically(
- this.post,
- () => {
- this.post.repostCount = (this.post.repostCount || 0) + 1
- this.post.viewer!.repost = 'pending'
- },
- () => this.rootStore.agent.repost(this.post.uri, this.post.cid),
- res => {
- this.post.viewer!.repost = res.uri
- },
- )
- }
- }
-
- async toggleThreadMute() {
- if (this.isThreadMuted) {
- this.rootStore.mutedThreads.uris.delete(this.rootUri)
- } else {
- this.rootStore.mutedThreads.uris.add(this.rootUri)
- }
- }
-
- async delete() {
- await this.rootStore.agent.deletePost(this.post.uri)
- this.rootStore.emitPostDeleted(this.post.uri)
- }
-}
-
-export class PostsFeedSliceModel {
- // ui state
- _reactKey: string = ''
-
- // data
- items: PostsFeedItemModel[] = []
-
- constructor(
- public rootStore: RootStoreModel,
- reactKey: string,
- slice: FeedViewPostsSlice,
- ) {
- this._reactKey = reactKey
- for (const item of slice.items) {
- this.items.push(
- new PostsFeedItemModel(rootStore, `item-${_idCounter++}`, item),
- )
- }
- makeAutoObservable(this, {rootStore: false})
- }
-
- get uri() {
- if (this.isReply) {
- return this.items[1].post.uri
- }
- return this.items[0].post.uri
- }
-
- get isThread() {
- return (
- this.items.length > 1 &&
- this.items.every(
- item => item.post.author.did === this.items[0].post.author.did,
- )
- )
- }
-
- get isReply() {
- return this.items.length > 1 && !this.isThread
- }
-
- get rootItem() {
- if (this.isReply) {
- return this.items[1]
- }
- return this.items[0]
- }
-
- get moderation() {
- return mergePostModerations(this.items.map(item => item.moderation))
- }
-
- containsUri(uri: string) {
- return !!this.items.find(item => item.post.uri === uri)
- }
-
- isThreadParentAt(i: number) {
- if (this.items.length === 1) {
- return false
- }
- return i < this.items.length - 1
- }
-
- isThreadChildAt(i: number) {
- if (this.items.length === 1) {
- return false
- }
- return i > 0
- }
-}
-
export class PostsFeedModel {
// state
isLoading = false
@@ -297,6 +36,7 @@ export class PostsFeedModel {
loadMoreCursor: string | undefined
pollCursor: string | undefined
tuner = new FeedTuner()
+ pageSize = PAGE_SIZE
// used to linearize async modifications to state
lock = new AwaitLock()
@@ -309,8 +49,11 @@ export class PostsFeedModel {
constructor(
public rootStore: RootStoreModel,
- public feedType: 'home' | 'author' | 'suggested' | 'goodstuff',
- params: GetTimeline.QueryParams | GetAuthorFeed.QueryParams,
+ public feedType: 'home' | 'author' | 'suggested' | 'custom',
+ params:
+ | GetTimeline.QueryParams
+ | GetAuthorFeed.QueryParams
+ | GetCustomFeed.QueryParams,
) {
makeAutoObservable(
this,
@@ -387,10 +130,9 @@ export class PostsFeedModel {
}
get feedTuners() {
- if (this.feedType === 'goodstuff') {
+ if (this.feedType === 'custom') {
return [
FeedTuner.dedupReposts,
- FeedTuner.likedRepliesOnly,
FeedTuner.preferredLangOnly(
this.rootStore.preferences.contentLanguages,
),
@@ -416,7 +158,7 @@ export class PostsFeedModel {
this.tuner.reset()
this._xLoading(isRefreshing)
try {
- const res = await this._getFeed({limit: PAGE_SIZE})
+ const res = await this._getFeed({limit: this.pageSize})
await this._replaceAll(res)
this._xIdle()
} catch (e: any) {
@@ -455,7 +197,7 @@ export class PostsFeedModel {
try {
const res = await this._getFeed({
cursor: this.loadMoreCursor,
- limit: PAGE_SIZE,
+ limit: this.pageSize,
})
await this._appendAll(res)
this._xIdle()
@@ -524,7 +266,7 @@ export class PostsFeedModel {
if (this.hasNewLatest || this.feedType === 'suggested') {
return
}
- const res = await this._getFeed({limit: PAGE_SIZE})
+ const res = await this._getFeed({limit: this.pageSize})
const tuner = new FeedTuner()
const slices = tuner.tune(res.data.feed, this.feedTuners)
this.setHasNewLatest(slices[0]?.uri !== this.slices[0]?.uri)
@@ -599,13 +341,15 @@ export class PostsFeedModel {
// helper functions
// =
- async _replaceAll(res: GetTimeline.Response | GetAuthorFeed.Response) {
+ async _replaceAll(
+ res: GetTimeline.Response | GetAuthorFeed.Response | GetCustomFeed.Response,
+ ) {
this.pollCursor = res.data.feed[0]?.post.uri
return this._appendAll(res, true)
}
async _appendAll(
- res: GetTimeline.Response | GetAuthorFeed.Response,
+ res: GetTimeline.Response | GetAuthorFeed.Response | GetCustomFeed.Response,
replace = false,
) {
this.loadMoreCursor = res.data.cursor
@@ -644,7 +388,9 @@ export class PostsFeedModel {
})
}
- _updateAll(res: GetTimeline.Response | GetAuthorFeed.Response) {
+ _updateAll(
+ res: GetTimeline.Response | GetAuthorFeed.Response | GetCustomFeed.Response,
+ ) {
for (const item of res.data.feed) {
const existingSlice = this.slices.find(slice =>
slice.containsUri(item.post.uri),
@@ -661,8 +407,13 @@ export class PostsFeedModel {
}
protected async _getFeed(
- params: GetTimeline.QueryParams | GetAuthorFeed.QueryParams = {},
- ): Promise {
+ params:
+ | GetTimeline.QueryParams
+ | GetAuthorFeed.QueryParams
+ | GetCustomFeed.QueryParams,
+ ): Promise<
+ GetTimeline.Response | GetAuthorFeed.Response | GetCustomFeed.Response
+ > {
params = Object.assign({}, this.params, params)
if (this.feedType === 'suggested') {
const responses = await getMultipleAuthorsPosts(
@@ -684,61 +435,31 @@ export class PostsFeedModel {
}
} else if (this.feedType === 'home') {
return this.rootStore.agent.getTimeline(params as GetTimeline.QueryParams)
- } else if (this.feedType === 'goodstuff') {
- const res = await getGoodStuff(
- this.rootStore.session.currentSession?.accessJwt || '',
- params as GetTimeline.QueryParams,
+ } else if (this.feedType === 'custom') {
+ this.checkIfCustomFeedIsOnlineAndValid(
+ params as GetCustomFeed.QueryParams,
)
- res.data.feed = (res.data.feed || []).filter(
- item => !item.post.author.viewer?.muted,
+ return this.rootStore.agent.app.bsky.feed.getFeed(
+ params as GetCustomFeed.QueryParams,
)
- return res
} else {
return this.rootStore.agent.getAuthorFeed(
params as GetAuthorFeed.QueryParams,
)
}
}
-}
-// HACK
-// temporary off-spec route to get the good stuff
-// -prf
-async function getGoodStuff(
- accessJwt: string,
- params: GetTimeline.QueryParams,
-): Promise {
- const controller = new AbortController()
- const to = setTimeout(() => controller.abort(), 15e3)
-
- const uri = new URL('https://bsky.social/xrpc/app.bsky.unspecced.getPopular')
- let k: keyof GetTimeline.QueryParams
- for (k in params) {
- if (typeof params[k] !== 'undefined') {
- uri.searchParams.set(k, String(params[k]))
+ private async checkIfCustomFeedIsOnlineAndValid(
+ params: GetCustomFeed.QueryParams,
+ ) {
+ const res = await this.rootStore.agent.app.bsky.feed.getFeedGenerator({
+ feed: params.feed,
+ })
+ if (!res.data.isOnline || !res.data.isValid) {
+ runInAction(() => {
+ this.error =
+ 'This custom feed is not online or may be experiencing issues.'
+ })
}
}
-
- const res = await fetch(String(uri), {
- method: 'get',
- headers: {
- accept: 'application/json',
- authorization: `Bearer ${accessJwt}`,
- },
- signal: controller.signal,
- })
-
- const resHeaders: Record = {}
- res.headers.forEach((value: string, key: string) => {
- resHeaders[key] = value
- })
- let resBody = await res.json()
-
- clearTimeout(to)
-
- return {
- success: res.status === 200,
- headers: resHeaders,
- data: jsonToLex(resBody),
- }
}
diff --git a/src/state/models/lists/actor-feeds.ts b/src/state/models/lists/actor-feeds.ts
new file mode 100644
index 00000000..0f206058
--- /dev/null
+++ b/src/state/models/lists/actor-feeds.ts
@@ -0,0 +1,120 @@
+import {makeAutoObservable} from 'mobx'
+import {AppBskyFeedGetActorFeeds as GetActorFeeds} from '@atproto/api'
+import {RootStoreModel} from '../root-store'
+import {bundleAsync} from 'lib/async/bundle'
+import {cleanError} from 'lib/strings/errors'
+import {CustomFeedModel} from '../feeds/custom-feed'
+
+const PAGE_SIZE = 30
+
+export class ActorFeedsModel {
+ // state
+ isLoading = false
+ isRefreshing = false
+ hasLoaded = false
+ error = ''
+ hasMore = true
+ loadMoreCursor?: string
+
+ // data
+ feeds: CustomFeedModel[] = []
+
+ constructor(
+ public rootStore: RootStoreModel,
+ public params: GetActorFeeds.QueryParams,
+ ) {
+ makeAutoObservable(
+ this,
+ {
+ rootStore: false,
+ },
+ {autoBind: true},
+ )
+ }
+
+ get hasContent() {
+ return this.feeds.length > 0
+ }
+
+ get hasError() {
+ return this.error !== ''
+ }
+
+ get isEmpty() {
+ return this.hasLoaded && !this.hasContent
+ }
+
+ // public api
+ // =
+
+ async refresh() {
+ return this.loadMore(true)
+ }
+
+ clear() {
+ this.isLoading = false
+ this.isRefreshing = false
+ this.hasLoaded = false
+ this.error = ''
+ this.hasMore = true
+ this.loadMoreCursor = undefined
+ this.feeds = []
+ }
+
+ loadMore = bundleAsync(async (replace: boolean = false) => {
+ if (!replace && !this.hasMore) {
+ return
+ }
+ this._xLoading(replace)
+ try {
+ const res = await this.rootStore.agent.app.bsky.feed.getActorFeeds({
+ actor: this.params.actor,
+ limit: PAGE_SIZE,
+ cursor: replace ? undefined : this.loadMoreCursor,
+ })
+ if (replace) {
+ this._replaceAll(res)
+ } else {
+ this._appendAll(res)
+ }
+ this._xIdle()
+ } catch (e: any) {
+ this._xIdle(e)
+ }
+ })
+
+ // state transitions
+ // =
+
+ _xLoading(isRefreshing = false) {
+ this.isLoading = true
+ this.isRefreshing = isRefreshing
+ this.error = ''
+ }
+
+ _xIdle(err?: any) {
+ this.isLoading = false
+ this.isRefreshing = false
+ this.hasLoaded = true
+ this.error = cleanError(err)
+ if (err) {
+ this.rootStore.log.error('Failed to fetch user followers', err)
+ }
+ }
+
+ // helper functions
+ // =
+
+ _replaceAll(res: GetActorFeeds.Response) {
+ this.feeds = []
+ this._appendAll(res)
+ }
+
+ _appendAll(res: GetActorFeeds.Response) {
+ this.loadMoreCursor = res.data.cursor
+ this.hasMore = !!this.loadMoreCursor
+ for (const f of res.data.feeds) {
+ this.feeds.push(new CustomFeedModel(this.rootStore, f))
+ }
+ }
+}
diff --git a/src/state/models/log.ts b/src/state/models/log.ts
index d8061713..7c9c37c0 100644
--- a/src/state/models/log.ts
+++ b/src/state/models/log.ts
@@ -27,6 +27,7 @@ function genId(): string {
export class LogModel {
entries: LogEntry[] = []
+ timers = new Map()
constructor() {
makeAutoObservable(this)
@@ -74,6 +75,21 @@ export class LogModel {
ts: Date.now(),
})
}
+
+ time = (label = 'default') => {
+ this.timers.set(label, performance.now())
+ }
+
+ timeEnd = (label = 'default', warn = false) => {
+ const endTime = performance.now()
+ if (this.timers.has(label)) {
+ const elapsedTime = endTime - this.timers.get(label)!
+ console.log(`${label}: ${elapsedTime.toFixed(3)}ms`)
+ this.timers.delete(label)
+ } else {
+ warn && console.warn(`Timer with label '${label}' does not exist.`)
+ }
+ }
}
function detailsToStr(details?: any) {
diff --git a/src/state/models/me.ts b/src/state/models/me.ts
index ba2dc6f3..81504485 100644
--- a/src/state/models/me.ts
+++ b/src/state/models/me.ts
@@ -8,6 +8,7 @@ import {PostsFeedModel} from './feeds/posts'
import {NotificationsFeedModel} from './feeds/notifications'
import {MyFollowsCache} from './cache/my-follows'
import {isObj, hasProp} from 'lib/type-guards'
+import {SavedFeedsModel} from './ui/saved-feeds'
const PROFILE_UPDATE_INTERVAL = 10 * 60 * 1e3 // 10min
const NOTIFS_UPDATE_INTERVAL = 30 * 1e3 // 30sec
@@ -21,6 +22,7 @@ export class MeModel {
followsCount: number | undefined
followersCount: number | undefined
mainFeed: PostsFeedModel
+ savedFeeds: SavedFeedsModel
notifications: NotificationsFeedModel
follows: MyFollowsCache
invites: ComAtprotoServerDefs.InviteCode[] = []
@@ -43,12 +45,14 @@ export class MeModel {
})
this.notifications = new NotificationsFeedModel(this.rootStore)
this.follows = new MyFollowsCache(this.rootStore)
+ this.savedFeeds = new SavedFeedsModel(this.rootStore)
}
clear() {
this.mainFeed.clear()
this.notifications.clear()
this.follows.clear()
+ this.savedFeeds.clear()
this.did = ''
this.handle = ''
this.displayName = ''
@@ -110,6 +114,7 @@ export class MeModel {
/* dont await */ this.notifications.setup().catch(e => {
this.rootStore.log.error('Failed to setup notifications model', e)
})
+ /* dont await */ this.savedFeeds.refresh(true)
this.rootStore.emitSessionLoaded()
await this.fetchInviteCodes()
await this.fetchAppPasswords()
@@ -119,6 +124,7 @@ export class MeModel {
}
async updateIfNeeded() {
+ /* dont await */ this.savedFeeds.refresh(true)
if (Date.now() - this.lastProfileStateUpdate > PROFILE_UPDATE_INTERVAL) {
this.rootStore.log.debug('Updating me profile information')
this.lastProfileStateUpdate = Date.now()
diff --git a/src/state/models/media/gallery.ts b/src/state/models/media/gallery.ts
index 67f8d2ea..52ef8f37 100644
--- a/src/state/models/media/gallery.ts
+++ b/src/state/models/media/gallery.ts
@@ -4,7 +4,6 @@ import {ImageModel} from './image'
import {Image as RNImage} from 'react-native-image-crop-picker'
import {openPicker} from 'lib/media/picker'
import {getImageDim} from 'lib/media/manip'
-import {getDataUriSize} from 'lib/media/util'
import {isNative} from 'platform/detection'
export class GalleryModel {
@@ -24,13 +23,7 @@ export class GalleryModel {
return this.images.length
}
- get paths() {
- return this.images.map(image =>
- image.compressed === undefined ? image.path : image.compressed.path,
- )
- }
-
- async add(image_: RNImage) {
+ async add(image_: Omit) {
if (this.size >= 4) {
return
}
@@ -39,15 +32,9 @@ export class GalleryModel {
if (!this.images.some(i => i.path === image_.path)) {
const image = new ImageModel(this.rootStore, image_)
- if (!isNative) {
- await image.manipulate({})
- } else {
- await image.compress()
- }
-
- runInAction(() => {
- this.images.push(image)
- })
+ // Initial resize
+ image.manipulate({})
+ this.images.push(image)
}
}
@@ -70,11 +57,10 @@ export class GalleryModel {
const {width, height} = await getImageDim(uri)
- const image: RNImage = {
+ const image = {
path: uri,
height,
width,
- size: getDataUriSize(uri),
mime: 'image/jpeg',
}
diff --git a/src/state/models/media/image.ts b/src/state/models/media/image.ts
index ec93bf5b..e524c49d 100644
--- a/src/state/models/media/image.ts
+++ b/src/state/models/media/image.ts
@@ -3,14 +3,11 @@ import {RootStoreModel} from 'state/index'
import {makeAutoObservable, runInAction} from 'mobx'
import {POST_IMG_MAX} from 'lib/constants'
import * as ImageManipulator from 'expo-image-manipulator'
-import {getDataUriSize, scaleDownDimensions} from 'lib/media/util'
+import {getDataUriSize} from 'lib/media/util'
import {openCropper} from 'lib/media/picker'
import {ActionCrop, FlipType, SaveFormat} from 'expo-image-manipulator'
import {Position} from 'react-avatar-editor'
-import {compressAndResizeImageForPost} from 'lib/media/manip'
-
-// TODO: EXIF embed
-// Cases to consider: ExternalEmbed
+import {Dimensions} from 'lib/media/types'
export interface ImageManipulationAttributes {
aspectRatio?: '4:3' | '1:1' | '3:4' | 'None'
@@ -21,17 +18,16 @@ export interface ImageManipulationAttributes {
flipVertical?: boolean
}
-export class ImageModel implements RNImage {
+const MAX_IMAGE_SIZE_IN_BYTES = 976560
+
+export class ImageModel implements Omit {
path: string
mime = 'image/jpeg'
width: number
height: number
- size: number
altText = ''
cropped?: RNImage = undefined
compressed?: RNImage = undefined
- scaledWidth: number = POST_IMG_MAX.width
- scaledHeight: number = POST_IMG_MAX.height
// Web manipulation
prev?: RNImage
@@ -44,7 +40,7 @@ export class ImageModel implements RNImage {
}
prevAttributes: ImageManipulationAttributes = {}
- constructor(public rootStore: RootStoreModel, image: RNImage) {
+ constructor(public rootStore: RootStoreModel, image: Omit) {
makeAutoObservable(this, {
rootStore: false,
})
@@ -52,19 +48,8 @@ export class ImageModel implements RNImage {
this.path = image.path
this.width = image.width
this.height = image.height
- this.size = image.size
- this.calcScaledDimensions()
}
- // TODO: Revisit compression factor due to updated sizing with zoom
- // get compressionFactor() {
- // const MAX_IMAGE_SIZE_IN_BYTES = 976560
-
- // return this.size < MAX_IMAGE_SIZE_IN_BYTES
- // ? 1
- // : MAX_IMAGE_SIZE_IN_BYTES / this.size
- // }
-
setRatio(aspectRatio: ImageManipulationAttributes['aspectRatio']) {
this.attributes.aspectRatio = aspectRatio
}
@@ -93,8 +78,24 @@ export class ImageModel implements RNImage {
}
}
- getDisplayDimensions(
- as: ImageManipulationAttributes['aspectRatio'] = '1:1',
+ getUploadDimensions(
+ dimensions: Dimensions,
+ maxDimensions: Dimensions = POST_IMG_MAX,
+ as: ImageManipulationAttributes['aspectRatio'] = 'None',
+ ) {
+ const {width, height} = dimensions
+ const {width: maxWidth, height: maxHeight} = maxDimensions
+
+ return width < maxWidth && height < maxHeight
+ ? {
+ width,
+ height,
+ }
+ : this.getResizedDimensions(as, POST_IMG_MAX.width)
+ }
+
+ getResizedDimensions(
+ as: ImageManipulationAttributes['aspectRatio'] = 'None',
maxSide: number,
) {
const ratioMultiplier = this.ratioMultipliers[as]
@@ -119,59 +120,70 @@ export class ImageModel implements RNImage {
}
}
- calcScaledDimensions() {
- const {width, height} = scaleDownDimensions(
- {width: this.width, height: this.height},
- POST_IMG_MAX,
- )
- this.scaledWidth = width
- this.scaledHeight = height
- }
-
async setAltText(altText: string) {
this.altText = altText
}
- // Only for mobile
+ // Only compress prior to upload
+ async compress() {
+ for (let i = 10; i > 0; i--) {
+ // Float precision
+ const factor = Math.round(i) / 10
+ const compressed = await ImageManipulator.manipulateAsync(
+ this.cropped?.path ?? this.path,
+ undefined,
+ {
+ compress: factor,
+ base64: true,
+ format: SaveFormat.JPEG,
+ },
+ )
+
+ if (compressed.base64 !== undefined) {
+ const size = getDataUriSize(compressed.base64)
+
+ if (size < MAX_IMAGE_SIZE_IN_BYTES) {
+ runInAction(() => {
+ this.compressed = {
+ mime: 'image/jpeg',
+ path: compressed.uri,
+ size,
+ ...compressed,
+ }
+ })
+ return
+ }
+ }
+ }
+
+ // Compression fails when removing redundant information is not possible.
+ // This can be tested with images that have high variance in noise.
+ throw new Error('Failed to compress image')
+ }
+
+ // Mobile
async crop() {
try {
- const cropped = await openCropper({
+ // openCropper requires an output width and height hence
+ // getting upload dimensions before cropping is necessary.
+ const {width, height} = this.getUploadDimensions({
+ width: this.width,
+ height: this.height,
+ })
+
+ const cropped = await openCropper(this.rootStore, {
mediaType: 'photo',
path: this.path,
freeStyleCropEnabled: true,
- width: this.scaledWidth,
- height: this.scaledHeight,
- })
- runInAction(() => {
- this.cropped = cropped
- this.compress()
- })
- } catch (err) {
- this.rootStore.log.error('Failed to crop photo', err)
- }
- }
-
- async compress() {
- try {
- const {width, height} = scaleDownDimensions(
- this.cropped
- ? {width: this.cropped.width, height: this.cropped.height}
- : {width: this.width, height: this.height},
- POST_IMG_MAX,
- )
-
- // TODO: Revisit this - currently iOS uses this as well
- const compressed = await compressAndResizeImageForPost({
- ...(this.cropped === undefined ? this : this.cropped),
width,
height,
})
runInAction(() => {
- this.compressed = compressed
+ this.cropped = cropped
})
} catch (err) {
- this.rootStore.log.error('Failed to compress photo', err)
+ this.rootStore.log.error('Failed to crop photo', err)
}
}
@@ -181,6 +193,9 @@ export class ImageModel implements RNImage {
crop?: ActionCrop['crop']
} & ImageManipulationAttributes,
) {
+ let uploadWidth: number | undefined
+ let uploadHeight: number | undefined
+
const {aspectRatio, crop, position, scale} = attributes
const modifiers = []
@@ -197,14 +212,34 @@ export class ImageModel implements RNImage {
}
if (crop !== undefined) {
+ const croppedHeight = crop.height * this.height
+ const croppedWidth = crop.width * this.width
modifiers.push({
crop: {
originX: crop.originX * this.width,
originY: crop.originY * this.height,
- height: crop.height * this.height,
- width: crop.width * this.width,
+ height: croppedHeight,
+ width: croppedWidth,
},
})
+
+ const uploadDimensions = this.getUploadDimensions(
+ {width: croppedWidth, height: croppedHeight},
+ POST_IMG_MAX,
+ aspectRatio,
+ )
+
+ uploadWidth = uploadDimensions.width
+ uploadHeight = uploadDimensions.height
+ } else {
+ const uploadDimensions = this.getUploadDimensions(
+ {width: this.width, height: this.height},
+ POST_IMG_MAX,
+ aspectRatio,
+ )
+
+ uploadWidth = uploadDimensions.width
+ uploadHeight = uploadDimensions.height
}
if (scale !== undefined) {
@@ -222,36 +257,40 @@ export class ImageModel implements RNImage {
const ratioMultiplier =
this.ratioMultipliers[this.attributes.aspectRatio ?? '1:1']
- const MAX_SIDE = 2000
-
const result = await ImageManipulator.manipulateAsync(
this.path,
[
...modifiers,
- {resize: ratioMultiplier > 1 ? {width: MAX_SIDE} : {height: MAX_SIDE}},
+ {
+ resize:
+ ratioMultiplier > 1 ? {width: uploadWidth} : {height: uploadHeight},
+ },
],
{
- compress: 0.9,
+ base64: true,
format: SaveFormat.JPEG,
},
)
runInAction(() => {
- this.compressed = {
+ this.cropped = {
mime: 'image/jpeg',
path: result.uri,
- size: getDataUriSize(result.uri),
+ size:
+ result.base64 !== undefined
+ ? getDataUriSize(result.base64)
+ : MAX_IMAGE_SIZE_IN_BYTES + 999, // shouldn't hit this unless manipulation fails
...result,
}
})
}
- resetCompressed() {
+ resetCropped() {
this.manipulate({})
}
previous() {
- this.compressed = this.prev
+ this.cropped = this.prev
this.attributes = this.prevAttributes
}
}
diff --git a/src/state/models/session.ts b/src/state/models/session.ts
index c3653760..aa9c9775 100644
--- a/src/state/models/session.ts
+++ b/src/state/models/session.ts
@@ -187,7 +187,7 @@ export class SessionModel {
account => account.service === service && account.did === did,
)
- // fall back to any pre-existing access tokens
+ // fall back to any preexisting access tokens
let refreshJwt = session?.refreshJwt || existingAccount?.refreshJwt
let accessJwt = session?.accessJwt || existingAccount?.accessJwt
if (event === 'expired') {
@@ -247,7 +247,7 @@ export class SessionModel {
const res = await agent.getProfile({actor: did}).catch(_e => undefined)
if (res) {
return {
- dispayName: res.data.displayName,
+ displayName: res.data.displayName,
aviUrl: res.data.avatar,
}
}
diff --git a/src/state/models/ui/preferences.ts b/src/state/models/ui/preferences.ts
index 1471420f..dcf6b9a7 100644
--- a/src/state/models/ui/preferences.ts
+++ b/src/state/models/ui/preferences.ts
@@ -11,6 +11,7 @@ import {
ALWAYS_FILTER_LABEL_GROUP,
ALWAYS_WARN_LABEL_GROUP,
} from 'lib/labeling/const'
+import {DEFAULT_FEEDS} from 'lib/constants'
import {isIOS} from 'platform/detection'
const deviceLocales = getLocales()
@@ -25,6 +26,7 @@ const LABEL_GROUPS = [
'spam',
'impersonation',
]
+const VISIBILITY_VALUES = ['show', 'warn', 'hide']
export class LabelPreferencesModel {
nsfw: LabelPreference = 'hide'
@@ -45,6 +47,8 @@ export class PreferencesModel {
contentLanguages: string[] =
deviceLocales?.map?.(locale => locale.languageCode) || []
contentLabels = new LabelPreferencesModel()
+ savedFeeds: string[] = []
+ pinnedFeeds: string[] = []
constructor(public rootStore: RootStoreModel) {
makeAutoObservable(this, {}, {autoBind: true})
@@ -54,9 +58,16 @@ export class PreferencesModel {
return {
contentLanguages: this.contentLanguages,
contentLabels: this.contentLabels,
+ savedFeeds: this.savedFeeds,
+ pinnedFeeds: this.pinnedFeeds,
}
}
+ /**
+ * The function hydrates an object with properties related to content languages, labels, saved feeds,
+ * and pinned feeds that it gets from the parameter `v` (probably local storage)
+ * @param {unknown} v - the data object to hydrate from
+ */
hydrate(v: unknown) {
if (isObj(v)) {
if (
@@ -72,10 +83,29 @@ export class PreferencesModel {
// default to the device languages
this.contentLanguages = deviceLocales.map(locale => locale.languageCode)
}
+ if (
+ hasProp(v, 'savedFeeds') &&
+ Array.isArray(v.savedFeeds) &&
+ typeof v.savedFeeds.every(item => typeof item === 'string')
+ ) {
+ this.savedFeeds = v.savedFeeds
+ }
+ if (
+ hasProp(v, 'pinnedFeeds') &&
+ Array.isArray(v.pinnedFeeds) &&
+ typeof v.pinnedFeeds.every(item => typeof item === 'string')
+ ) {
+ this.pinnedFeeds = v.pinnedFeeds
+ }
}
}
+ /**
+ * This function fetches preferences and sets defaults for missing items.
+ */
async sync() {
+ // fetch preferences
+ let hasSavedFeedsPref = false
const res = await this.rootStore.agent.app.bsky.actor.getPreferences({})
runInAction(() => {
for (const pref of res.data.preferences) {
@@ -88,22 +118,83 @@ export class PreferencesModel {
AppBskyActorDefs.isContentLabelPref(pref) &&
AppBskyActorDefs.validateAdultContentPref(pref).success
) {
- if (LABEL_GROUPS.includes(pref.label)) {
- this.contentLabels[pref.label] = pref.visibility
+ if (
+ LABEL_GROUPS.includes(pref.label) &&
+ VISIBILITY_VALUES.includes(pref.visibility)
+ ) {
+ this.contentLabels[pref.label as keyof LabelPreferencesModel] =
+ pref.visibility as LabelPreference
}
+ } else if (
+ AppBskyActorDefs.isSavedFeedsPref(pref) &&
+ AppBskyActorDefs.validateSavedFeedsPref(pref).success
+ ) {
+ this.savedFeeds = pref.saved
+ this.pinnedFeeds = pref.pinned
+ hasSavedFeedsPref = true
}
}
})
+
+ // set defaults on missing items
+ if (!hasSavedFeedsPref) {
+ const {saved, pinned} = await DEFAULT_FEEDS(
+ this.rootStore.agent.service.toString(),
+ (handle: string) =>
+ this.rootStore.agent
+ .resolveHandle({handle})
+ .then(({data}) => data.did),
+ )
+ runInAction(() => {
+ this.savedFeeds = saved
+ this.pinnedFeeds = pinned
+ })
+ res.data.preferences.push({
+ $type: 'app.bsky.actor.defs#savedFeedsPref',
+ saved,
+ pinned,
+ })
+ await this.rootStore.agent.app.bsky.actor.putPreferences({
+ preferences: res.data.preferences,
+ })
+ /* dont await */ this.rootStore.me.savedFeeds.refresh()
+ }
}
- async update(cb: (prefs: AppBskyActorDefs.Preferences) => void) {
+ /**
+ * This function updates the preferences of a user and allows for a callback function to be executed
+ * before the update.
+ * @param cb - cb is a callback function that takes in a single parameter of type
+ * AppBskyActorDefs.Preferences and returns either a boolean or void. This callback function is used to
+ * update the preferences of the user. The function is called with the current preferences as an
+ * argument and if the callback returns false, the preferences are not updated.
+ * @returns void
+ */
+ async update(cb: (prefs: AppBskyActorDefs.Preferences) => boolean | void) {
const res = await this.rootStore.agent.app.bsky.actor.getPreferences({})
- cb(res.data.preferences)
+ if (cb(res.data.preferences) === false) {
+ return
+ }
await this.rootStore.agent.app.bsky.actor.putPreferences({
preferences: res.data.preferences,
})
}
+ /**
+ * This function resets the preferences to an empty array of no preferences.
+ */
+ async reset() {
+ runInAction(() => {
+ this.contentLabels = new LabelPreferencesModel()
+ this.contentLanguages = deviceLocales.map(locale => locale.languageCode)
+ this.savedFeeds = []
+ this.pinnedFeeds = []
+ })
+ await this.rootStore.agent.app.bsky.actor.putPreferences({
+ preferences: [],
+ })
+ }
+
hasContentLanguage(code2: string) {
return this.contentLanguages.includes(code2)
}
@@ -200,4 +291,62 @@ export class PreferencesModel {
}
return res
}
+
+ setFeeds(saved: string[], pinned: string[]) {
+ this.savedFeeds = saved
+ this.pinnedFeeds = pinned
+ }
+
+ async setSavedFeeds(saved: string[], pinned: string[]) {
+ const oldSaved = this.savedFeeds
+ const oldPinned = this.pinnedFeeds
+ this.setFeeds(saved, pinned)
+ try {
+ await this.update((prefs: AppBskyActorDefs.Preferences) => {
+ const existing = prefs.find(
+ pref =>
+ AppBskyActorDefs.isSavedFeedsPref(pref) &&
+ AppBskyActorDefs.validateSavedFeedsPref(pref).success,
+ )
+ if (existing) {
+ existing.saved = saved
+ existing.pinned = pinned
+ } else {
+ prefs.push({
+ $type: 'app.bsky.actor.defs#savedFeedsPref',
+ saved,
+ pinned,
+ })
+ }
+ })
+ } catch (e) {
+ runInAction(() => {
+ this.savedFeeds = oldSaved
+ this.pinnedFeeds = oldPinned
+ })
+ throw e
+ }
+ }
+
+ async addSavedFeed(v: string) {
+ return this.setSavedFeeds([...this.savedFeeds, v], this.pinnedFeeds)
+ }
+
+ async removeSavedFeed(v: string) {
+ return this.setSavedFeeds(
+ this.savedFeeds.filter(uri => uri !== v),
+ this.pinnedFeeds.filter(uri => uri !== v),
+ )
+ }
+
+ async addPinnedFeed(v: string) {
+ return this.setSavedFeeds(this.savedFeeds, [...this.pinnedFeeds, v])
+ }
+
+ async removePinnedFeed(v: string) {
+ return this.setSavedFeeds(
+ this.savedFeeds,
+ this.pinnedFeeds.filter(uri => uri !== v),
+ )
+ }
}
diff --git a/src/state/models/ui/profile.ts b/src/state/models/ui/profile.ts
index 861b3df0..81daf797 100644
--- a/src/state/models/ui/profile.ts
+++ b/src/state/models/ui/profile.ts
@@ -2,20 +2,16 @@ import {makeAutoObservable} from 'mobx'
import {RootStoreModel} from '../root-store'
import {ProfileModel} from '../content/profile'
import {PostsFeedModel} from '../feeds/posts'
+import {ActorFeedsModel} from '../lists/actor-feeds'
import {ListsListModel} from '../lists/lists-list'
export enum Sections {
Posts = 'Posts',
PostsWithReplies = 'Posts & replies',
+ CustomAlgorithms = 'Feeds',
Lists = 'Lists',
}
-const USER_SELECTOR_ITEMS = [
- Sections.Posts,
- Sections.PostsWithReplies,
- Sections.Lists,
-]
-
export interface ProfileUiParams {
user: string
}
@@ -28,6 +24,7 @@ export class ProfileUiModel {
// data
profile: ProfileModel
feed: PostsFeedModel
+ algos: ActorFeedsModel
lists: ListsListModel
// ui state
@@ -50,10 +47,11 @@ export class ProfileUiModel {
actor: params.user,
limit: 10,
})
+ this.algos = new ActorFeedsModel(rootStore, {actor: params.user})
this.lists = new ListsListModel(rootStore, params.user)
}
- get currentView(): PostsFeedModel | ListsListModel {
+ get currentView(): PostsFeedModel | ActorFeedsModel | ListsListModel {
if (
this.selectedView === Sections.Posts ||
this.selectedView === Sections.PostsWithReplies
@@ -62,6 +60,9 @@ export class ProfileUiModel {
} else if (this.selectedView === Sections.Lists) {
return this.lists
}
+ if (this.selectedView === Sections.CustomAlgorithms) {
+ return this.algos
+ }
throw new Error(`Invalid selector value: ${this.selectedViewIndex}`)
}
@@ -75,7 +76,14 @@ export class ProfileUiModel {
}
get selectorItems() {
- return USER_SELECTOR_ITEMS
+ const items = [Sections.Posts, Sections.PostsWithReplies]
+ if (this.algos.hasLoaded && !this.algos.isEmpty) {
+ items.push(Sections.CustomAlgorithms)
+ }
+ if (this.lists.hasLoaded && !this.lists.isEmpty) {
+ items.push(Sections.Lists)
+ }
+ return items
}
get selectedView() {
@@ -84,9 +92,11 @@ export class ProfileUiModel {
get uiItems() {
let arr: any[] = []
+ // if loading, return loading item to show loading spinner
if (this.isInitialLoading) {
arr = arr.concat([ProfileUiModel.LOADING_ITEM])
} else if (this.currentView.hasError) {
+ // if error, return error item to show error message
arr = arr.concat([
{
_reactKey: '__error__',
@@ -94,12 +104,16 @@ export class ProfileUiModel {
},
])
} else {
+ // not loading, no error, show content
if (
this.selectedView === Sections.Posts ||
- this.selectedView === Sections.PostsWithReplies
+ this.selectedView === Sections.PostsWithReplies ||
+ this.selectedView === Sections.CustomAlgorithms
) {
if (this.feed.hasContent) {
- if (this.selectedView === Sections.Posts) {
+ if (this.selectedView === Sections.CustomAlgorithms) {
+ arr = this.algos.feeds
+ } else if (this.selectedView === Sections.Posts) {
arr = this.feed.nonReplyFeed
} else {
arr = this.feed.slices.slice()
@@ -117,6 +131,7 @@ export class ProfileUiModel {
arr = arr.concat([ProfileUiModel.EMPTY_ITEM])
}
} else {
+ // fallback, add empty item, to show empty message
arr = arr.concat([ProfileUiModel.EMPTY_ITEM])
}
}
@@ -151,6 +166,7 @@ export class ProfileUiModel {
.setup()
.catch(err => this.rootStore.log.error('Failed to fetch feed', err)),
])
+ this.algos.refresh()
// HACK: need to use the DID as a param, not the username -prf
this.lists.source = this.profile.did
this.lists
diff --git a/src/state/models/ui/saved-feeds.ts b/src/state/models/ui/saved-feeds.ts
new file mode 100644
index 00000000..979fddf4
--- /dev/null
+++ b/src/state/models/ui/saved-feeds.ts
@@ -0,0 +1,185 @@
+import {makeAutoObservable, runInAction} from 'mobx'
+import {AppBskyFeedDefs} from '@atproto/api'
+import {RootStoreModel} from '../root-store'
+import {bundleAsync} from 'lib/async/bundle'
+import {cleanError} from 'lib/strings/errors'
+import {CustomFeedModel} from '../feeds/custom-feed'
+
+export class SavedFeedsModel {
+ // state
+ isLoading = false
+ isRefreshing = false
+ hasLoaded = false
+ error = ''
+
+ // data
+ feeds: CustomFeedModel[] = []
+
+ constructor(public rootStore: RootStoreModel) {
+ makeAutoObservable(
+ this,
+ {
+ rootStore: false,
+ },
+ {autoBind: true},
+ )
+ }
+
+ get hasContent() {
+ return this.feeds.length > 0
+ }
+
+ get hasError() {
+ return this.error !== ''
+ }
+
+ get isEmpty() {
+ return this.hasLoaded && !this.hasContent
+ }
+
+ get pinned() {
+ return this.rootStore.preferences.pinnedFeeds
+ .map(uri => this.feeds.find(f => f.uri === uri) as CustomFeedModel)
+ .filter(Boolean)
+ }
+
+ get unpinned() {
+ return this.feeds.filter(f => !this.isPinned(f))
+ }
+
+ get all() {
+ return this.pinned.concat(this.unpinned)
+ }
+
+ get pinnedFeedNames() {
+ return this.pinned.map(f => f.displayName)
+ }
+
+ // public api
+ // =
+
+ clear() {
+ this.isLoading = false
+ this.isRefreshing = false
+ this.hasLoaded = false
+ this.error = ''
+ this.feeds = []
+ }
+
+ refresh = bundleAsync(async (quietRefresh = false) => {
+ this._xLoading(!quietRefresh)
+ try {
+ let feeds: AppBskyFeedDefs.GeneratorView[] = []
+ for (
+ let i = 0;
+ i < this.rootStore.preferences.savedFeeds.length;
+ i += 25
+ ) {
+ const res = await this.rootStore.agent.app.bsky.feed.getFeedGenerators({
+ feeds: this.rootStore.preferences.savedFeeds.slice(i, 25),
+ })
+ feeds = feeds.concat(res.data.feeds)
+ }
+ runInAction(() => {
+ this.feeds = feeds.map(f => new CustomFeedModel(this.rootStore, f))
+ })
+ this._xIdle()
+ } catch (e: any) {
+ this._xIdle(e)
+ }
+ })
+
+ async save(feed: CustomFeedModel) {
+ try {
+ await feed.save()
+ runInAction(() => {
+ this.feeds = [
+ ...this.feeds,
+ new CustomFeedModel(this.rootStore, feed.data),
+ ]
+ })
+ } catch (e: any) {
+ this.rootStore.log.error('Failed to save feed', e)
+ }
+ }
+
+ async unsave(feed: CustomFeedModel) {
+ const uri = feed.uri
+ try {
+ if (this.isPinned(feed)) {
+ await this.rootStore.preferences.removePinnedFeed(uri)
+ }
+ await feed.unsave()
+ runInAction(() => {
+ this.feeds = this.feeds.filter(f => f.data.uri !== uri)
+ })
+ } catch (e: any) {
+ this.rootStore.log.error('Failed to unsave feed', e)
+ }
+ }
+
+ async togglePinnedFeed(feed: CustomFeedModel) {
+ if (!this.isPinned(feed)) {
+ return this.rootStore.preferences.addPinnedFeed(feed.uri)
+ } else {
+ return this.rootStore.preferences.removePinnedFeed(feed.uri)
+ }
+ }
+
+ async reorderPinnedFeeds(feeds: CustomFeedModel[]) {
+ return this.rootStore.preferences.setSavedFeeds(
+ this.rootStore.preferences.savedFeeds,
+ feeds.filter(feed => this.isPinned(feed)).map(feed => feed.uri),
+ )
+ }
+
+ isPinned(feedOrUri: CustomFeedModel | string) {
+ let uri: string
+ if (typeof feedOrUri === 'string') {
+ uri = feedOrUri
+ } else {
+ uri = feedOrUri.uri
+ }
+ return this.rootStore.preferences.pinnedFeeds.includes(uri)
+ }
+
+ async movePinnedFeed(item: CustomFeedModel, direction: 'up' | 'down') {
+ const pinned = this.rootStore.preferences.pinnedFeeds.slice()
+ const index = pinned.indexOf(item.uri)
+ if (index === -1) {
+ return
+ }
+ if (direction === 'up' && index !== 0) {
+ const temp = pinned[index]
+ pinned[index] = pinned[index - 1]
+ pinned[index - 1] = temp
+ } else if (direction === 'down' && index < pinned.length - 1) {
+ const temp = pinned[index]
+ pinned[index] = pinned[index + 1]
+ pinned[index + 1] = temp
+ }
+ await this.rootStore.preferences.setSavedFeeds(
+ this.rootStore.preferences.savedFeeds,
+ pinned,
+ )
+ }
+
+ // state transitions
+ // =
+
+ _xLoading(isRefreshing = false) {
+ this.isLoading = true
+ this.isRefreshing = isRefreshing
+ this.error = ''
+ }
+
+ _xIdle(err?: any) {
+ this.isLoading = false
+ this.isRefreshing = false
+ this.hasLoaded = true
+ this.error = cleanError(err)
+ if (err) {
+ this.rootStore.log.error('Failed to fetch user feeds', err)
+ }
+ }
+}
diff --git a/src/state/models/ui/shell.ts b/src/state/models/ui/shell.ts
index 187342ec..a77ffbdf 100644
--- a/src/state/models/ui/shell.ts
+++ b/src/state/models/ui/shell.ts
@@ -119,7 +119,7 @@ export type Modal =
// Moderation
| ReportAccountModal
| ReportPostModal
- | CreateMuteListModal
+ | CreateOrEditMuteListModal
| ListAddRemoveUserModal
// Posts
diff --git a/src/view/com/auth/create/Step1.tsx b/src/view/com/auth/create/Step1.tsx
index ac0d706d..57747f07 100644
--- a/src/view/com/auth/create/Step1.tsx
+++ b/src/view/com/auth/create/Step1.tsx
@@ -32,7 +32,7 @@ export const Step1 = observer(({model}: {model: CreateAccountModel}) => {
model.setServiceDescription(undefined)
}, [setIsDefaultSelected, model])
- const fetchServiceDesription = React.useMemo(
+ const fetchServiceDescription = React.useMemo(
() => debounce(() => model.fetchServiceDescription(), 1e3),
[model],
)
@@ -40,9 +40,9 @@ export const Step1 = observer(({model}: {model: CreateAccountModel}) => {
const onChangeServiceUrl = React.useCallback(
(v: string) => {
model.setServiceUrl(v)
- fetchServiceDesription()
+ fetchServiceDescription()
},
- [model, fetchServiceDesription],
+ [model, fetchServiceDescription],
)
const onDebugChangeServiceUrl = React.useCallback(
diff --git a/src/view/com/auth/login/Login.tsx b/src/view/com/auth/login/Login.tsx
index 87512287..9f5d581b 100644
--- a/src/view/com/auth/login/Login.tsx
+++ b/src/view/com/auth/login/Login.tsx
@@ -420,6 +420,7 @@ const LoginForm = ({
textContentType="oneTimeCode"
value={password}
onChangeText={setPassword}
+ onSubmitEditing={onPressNext}
editable={!isProcessing}
accessibilityLabel="Password"
accessibilityHint={
diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx
index 3891fa26..d7a4a42d 100644
--- a/src/view/com/composer/Composer.tsx
+++ b/src/view/com/composer/Composer.tsx
@@ -37,8 +37,7 @@ import {useExternalLinkFetch} from './useExternalLinkFetch'
import {isDesktopWeb, isAndroid} from 'platform/detection'
import {GalleryModel} from 'state/models/media/gallery'
import {Gallery} from './photos/Gallery'
-
-const MAX_GRAPHEME_LENGTH = 300
+import {MAX_GRAPHEME_LENGTH} from 'lib/constants'
type Props = ComposerOpts & {
onClose: () => void
@@ -310,7 +309,7 @@ export const ComposePost = observer(function ComposePost({
onError={setError}
accessible={true}
accessibilityLabel="Write post"
- accessibilityHint="Compose posts up to 300 characters in length"
+ accessibilityHint={`Compose posts up to ${MAX_GRAPHEME_LENGTH} characters in length`}
/>
diff --git a/src/view/com/composer/char-progress/CharProgress.tsx b/src/view/com/composer/char-progress/CharProgress.tsx
index eaaaea5e..6b3b98e4 100644
--- a/src/view/com/composer/char-progress/CharProgress.tsx
+++ b/src/view/com/composer/char-progress/CharProgress.tsx
@@ -7,9 +7,9 @@ import ProgressCircle from 'react-native-progress/Circle'
import ProgressPie from 'react-native-progress/Pie'
import {s} from 'lib/styles'
import {usePalette} from 'lib/hooks/usePalette'
+import {MAX_GRAPHEME_LENGTH} from 'lib/constants'
-const MAX_LENGTH = 300
-const DANGER_LENGTH = MAX_LENGTH
+const DANGER_LENGTH = MAX_GRAPHEME_LENGTH
export function CharProgress({count}: {count: number}) {
const pal = usePalette('default')
@@ -17,7 +17,9 @@ export function CharProgress({count}: {count: number}) {
const circleColor = count > DANGER_LENGTH ? '#e60000' : pal.colors.link
return (
<>
- {MAX_LENGTH - count}
+
+ {MAX_GRAPHEME_LENGTH - count}
+
{count > DANGER_LENGTH ? (
) : (
)}
diff --git a/src/view/com/composer/photos/Gallery.tsx b/src/view/com/composer/photos/Gallery.tsx
index 43682495..f46c0533 100644
--- a/src/view/com/composer/photos/Gallery.tsx
+++ b/src/view/com/composer/photos/Gallery.tsx
@@ -104,63 +104,61 @@ export const Gallery = observer(function ({gallery}: Props) {
return !gallery.isEmpty ? (
- {gallery.images.map(image =>
- image.compressed !== undefined ? (
-
+ {gallery.images.map(image => (
+
+ {
+ handleAddImageAltText(image)
+ }}
+ style={imageControlLabelStyle}>
+ ALT
+
+
{
- handleAddImageAltText(image)
+ handleEditPhoto(image)
}}
- style={imageControlLabelStyle}>
- ALT
+ style={styles.imageControl}>
+
+
+ handleRemovePhoto(image)}
+ style={styles.imageControl}>
+
-
- {
- handleEditPhoto(image)
- }}
- style={styles.imageControl}>
-
-
- handleRemovePhoto(image)}
- style={styles.imageControl}>
-
-
-
-
-
- ) : null,
- )}
+
+
+
+ ))}
) : null
})
diff --git a/src/view/com/composer/useExternalLinkFetch.ts b/src/view/com/composer/useExternalLinkFetch.ts
index 45c2dfd0..8d3b8cac 100644
--- a/src/view/com/composer/useExternalLinkFetch.ts
+++ b/src/view/com/composer/useExternalLinkFetch.ts
@@ -2,9 +2,9 @@ import {useState, useEffect} from 'react'
import {useStores} from 'state/index'
import * as apilib from 'lib/api/index'
import {getLinkMeta} from 'lib/link-meta/link-meta'
-import {getPostAsQuote} from 'lib/link-meta/bsky'
+import {getPostAsQuote, getFeedAsEmbed} from 'lib/link-meta/bsky'
import {downloadAndResize} from 'lib/media/manip'
-import {isBskyPostUrl} from 'lib/strings/url-helpers'
+import {isBskyPostUrl, isBskyCustomFeedUrl} from 'lib/strings/url-helpers'
import {ComposerOpts} from 'state/models/ui/shell'
import {POST_IMG_MAX} from 'lib/constants'
@@ -41,6 +41,24 @@ export function useExternalLinkFetch({
setExtLink(undefined)
},
)
+ } else if (isBskyCustomFeedUrl(extLink.uri)) {
+ getFeedAsEmbed(store, extLink.uri).then(
+ ({embed, meta}) => {
+ if (aborted) {
+ return
+ }
+ setExtLink({
+ uri: extLink.uri,
+ isLoading: false,
+ meta,
+ embed,
+ })
+ },
+ err => {
+ store.log.error('Failed to fetch feed for embedding', {err})
+ setExtLink(undefined)
+ },
+ )
} else {
getLinkMeta(store, extLink.uri).then(meta => {
if (aborted) {
diff --git a/src/view/com/feeds/CustomFeed.tsx b/src/view/com/feeds/CustomFeed.tsx
new file mode 100644
index 00000000..748b89c0
--- /dev/null
+++ b/src/view/com/feeds/CustomFeed.tsx
@@ -0,0 +1,162 @@
+import React from 'react'
+import {
+ Pressable,
+ StyleProp,
+ StyleSheet,
+ View,
+ ViewStyle,
+ TouchableOpacity,
+} from 'react-native'
+import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
+import {Text} from '../util/text/Text'
+import {usePalette} from 'lib/hooks/usePalette'
+import {s} from 'lib/styles'
+import {UserAvatar} from '../util/UserAvatar'
+import {observer} from 'mobx-react-lite'
+import {CustomFeedModel} from 'state/models/feeds/custom-feed'
+import {useNavigation} from '@react-navigation/native'
+import {NavigationProp} from 'lib/routes/types'
+import {useStores} from 'state/index'
+import {pluralize} from 'lib/strings/helpers'
+import {AtUri} from '@atproto/api'
+import * as Toast from 'view/com/util/Toast'
+
+export const CustomFeed = observer(
+ ({
+ item,
+ style,
+ showSaveBtn = false,
+ showDescription = false,
+ showLikes = false,
+ }: {
+ item: CustomFeedModel
+ style?: StyleProp
+ showSaveBtn?: boolean
+ showDescription?: boolean
+ showLikes?: boolean
+ }) => {
+ const store = useStores()
+ const pal = usePalette('default')
+ const navigation = useNavigation()
+
+ const onToggleSaved = React.useCallback(async () => {
+ if (item.isSaved) {
+ store.shell.openModal({
+ name: 'confirm',
+ title: 'Remove from my feeds',
+ message: `Remove ${item.displayName} from my feeds?`,
+ onPressConfirm: async () => {
+ try {
+ await store.me.savedFeeds.unsave(item)
+ Toast.show('Removed from my feeds')
+ } catch (e) {
+ Toast.show('There was an issue contacting your server')
+ store.log.error('Failed to unsave feed', {e})
+ }
+ },
+ })
+ } else {
+ try {
+ await store.me.savedFeeds.save(item)
+ Toast.show('Added to my feeds')
+ } catch (e) {
+ Toast.show('There was an issue contacting your server')
+ store.log.error('Failed to save feed', {e})
+ }
+ }
+ }, [store, item])
+
+ return (
+ {
+ navigation.navigate('CustomFeed', {
+ name: item.data.creator.did,
+ rkey: new AtUri(item.data.uri).rkey,
+ })
+ }}
+ key={item.data.uri}>
+
+
+
+
+
+
+ {item.displayName}
+
+
+ by @{item.data.creator.handle}
+
+
+ {showSaveBtn && (
+
+
+ {item.isSaved ? (
+
+ ) : (
+
+ )}
+
+
+ )}
+
+
+ {showDescription && item.data.description ? (
+
+ {item.data.description}
+
+ ) : null}
+
+ {showLikes ? (
+
+ Liked by {item.data.likeCount || 0}{' '}
+ {pluralize(item.data.likeCount || 0, 'user')}
+
+ ) : null}
+
+ )
+ },
+)
+
+const styles = StyleSheet.create({
+ container: {
+ paddingHorizontal: 18,
+ paddingVertical: 20,
+ flexDirection: 'column',
+ flex: 1,
+ borderTopWidth: 1,
+ gap: 14,
+ },
+ headerContainer: {
+ flexDirection: 'row',
+ },
+ headerTextContainer: {
+ flexDirection: 'column',
+ columnGap: 4,
+ flex: 1,
+ },
+ description: {
+ flex: 1,
+ flexWrap: 'wrap',
+ },
+ btn: {
+ paddingVertical: 6,
+ },
+})
diff --git a/src/view/com/lightbox/Lightbox.web.tsx b/src/view/com/lightbox/Lightbox.web.tsx
index d389279b..61446519 100644
--- a/src/view/com/lightbox/Lightbox.web.tsx
+++ b/src/view/com/lightbox/Lightbox.web.tsx
@@ -65,30 +65,34 @@ function LightboxInner({
const canGoLeft = index >= 1
const canGoRight = index < imgs.length - 1
- const onPressLeft = () => {
+ const onPressLeft = useCallback(() => {
if (canGoLeft) {
setIndex(index - 1)
}
- }
- const onPressRight = () => {
+ }, [index, canGoLeft])
+ const onPressRight = useCallback(() => {
if (canGoRight) {
setIndex(index + 1)
}
- }
+ }, [index, canGoRight])
- const onEscape = useCallback(
+ const onKeyDown = useCallback(
(e: KeyboardEvent) => {
if (e.key === 'Escape') {
onClose()
+ } else if (e.key === 'ArrowLeft') {
+ onPressLeft()
+ } else if (e.key === 'ArrowRight') {
+ onPressRight()
}
},
- [onClose],
+ [onClose, onPressLeft, onPressRight],
)
useEffect(() => {
- window.addEventListener('keydown', onEscape)
- return () => window.removeEventListener('keydown', onEscape)
- }, [onEscape])
+ window.addEventListener('keydown', onKeyDown)
+ return () => window.removeEventListener('keydown', onKeyDown)
+ }, [onKeyDown])
return (
diff --git a/src/view/com/lists/ListCard.tsx b/src/view/com/lists/ListCard.tsx
index 7cbdaaf6..0e13ca33 100644
--- a/src/view/com/lists/ListCard.tsx
+++ b/src/view/com/lists/ListCard.tsx
@@ -60,7 +60,7 @@ export const ListCard = ({
anchorNoUnderline>
-
+
-
+
diff --git a/src/view/com/modals/ContentFilteringSettings.tsx b/src/view/com/modals/ContentFilteringSettings.tsx
index 1256bd42..5215c9cb 100644
--- a/src/view/com/modals/ContentFilteringSettings.tsx
+++ b/src/view/com/modals/ContentFilteringSettings.tsx
@@ -52,8 +52,8 @@ export const Component = observer(({}: {}) => {
Adult content can only be enabled via the Web at{' '}
.
diff --git a/src/view/com/modals/ContentLanguagesSettings.tsx b/src/view/com/modals/ContentLanguagesSettings.tsx
index 0c750fe0..700f1cbc 100644
--- a/src/view/com/modals/ContentLanguagesSettings.tsx
+++ b/src/view/com/modals/ContentLanguagesSettings.tsx
@@ -41,8 +41,8 @@ export function Component({}: {}) {
Content Languages
- Which languages would you like to see in the What's Hot feed? (Leave
- them all unchecked to see any language.)
+ Which languages would you like to see in the your feed? (Leave them all
+ unchecked to see any language.)
{languages.map(lang => (
diff --git a/src/view/com/modals/CreateOrEditMuteList.tsx b/src/view/com/modals/CreateOrEditMuteList.tsx
index 0c13f243..736deae7 100644
--- a/src/view/com/modals/CreateOrEditMuteList.tsx
+++ b/src/view/com/modals/CreateOrEditMuteList.tsx
@@ -143,6 +143,7 @@ export function Component({
List Avatar
{
- image.prev = image.compressed
+ image.prev = image.cropped
image.prevAttributes = image.attributes
- image.resetCompressed()
+ image.resetCropped()
}, [image])
const onCloseModal = useCallback(() => {
@@ -152,7 +152,7 @@ export const Component = observer(function ({image, gallery}: Props) {
: {}),
})
- image.prev = image.compressed
+ image.prev = image.cropped
image.prevAttributes = image.attributes
onCloseModal()
}, [altText, image, position, scale, onCloseModal])
@@ -168,8 +168,7 @@ export const Component = observer(function ({image, gallery}: Props) {
}
}, [])
- // Prevents preliminary flash when transformations are being applied
- if (image.compressed === undefined) {
+ if (image.cropped === undefined) {
return null
}
@@ -177,7 +176,7 @@ export const Component = observer(function ({image, gallery}: Props) {
windowDimensions.width > 500 ? 410 : windowDimensions.width - 80
const sideLength = isDesktopWeb ? 300 : computedWidth
- const dimensions = image.getDisplayDimensions(aspectRatio, sideLength)
+ const dimensions = image.getResizedDimensions(aspectRatio, sideLength)
const imgContainerStyles = {width: sideLength, height: sideLength}
const imgControlStyles = {
@@ -196,7 +195,7 @@ export const Component = observer(function ({image, gallery}: Props) {
+ } else if (activeModal?.name === 'edit-image') {
+ snapPoints = AltImageModal.snapPoints
+ element =
} else if (activeModal?.name === 'change-handle') {
snapPoints = ChangeHandleModal.snapPoints
element =
@@ -119,7 +123,7 @@ export const ModalsContainer = observer(function ModalsContainer() {
snapPoints={snapPoints}
index={store.shell.isModalActive ? 0 : -1}
enablePanDownToClose
- keyboardBehavior="extend"
+ android_keyboardInputMode="adjustResize"
keyboardBlurBehavior="restore"
backdropComponent={
store.shell.isModalActive ? createCustomBackdrop(onClose) : undefined
diff --git a/src/view/com/modals/crop-image/CropImage.tsx b/src/view/com/modals/crop-image/CropImage.tsx
deleted file mode 100644
index 9ac3f277..00000000
--- a/src/view/com/modals/crop-image/CropImage.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * NOTE
- * This modal is used only in the web build
- * Native uses a third-party library
- */
-
-export const snapPoints = ['0%']
-
-export function Component() {
- return null
-}
diff --git a/src/view/com/notifications/Feed.tsx b/src/view/com/notifications/Feed.tsx
index 50bdc5dc..d457d713 100644
--- a/src/view/com/notifications/Feed.tsx
+++ b/src/view/com/notifications/Feed.tsx
@@ -154,6 +154,7 @@ export const Feed = observer(function Feed({
onEndReached={onEndReached}
onEndReachedThreshold={0.6}
onScroll={onScroll}
+ scrollEventThrottle={100}
contentContainerStyle={s.contentContainer}
/>
) : null}
diff --git a/src/view/com/pager/DraggableScrollView.tsx b/src/view/com/pager/DraggableScrollView.tsx
new file mode 100644
index 00000000..4b7396ea
--- /dev/null
+++ b/src/view/com/pager/DraggableScrollView.tsx
@@ -0,0 +1,15 @@
+import {useDraggableScroll} from 'lib/hooks/useDraggableScrollView'
+import React, {ComponentProps} from 'react'
+import {ScrollView} from 'react-native'
+
+export const DraggableScrollView = React.forwardRef<
+ ScrollView,
+ ComponentProps
+>(function DraggableScrollView(props, ref) {
+ const {refs} = useDraggableScroll({
+ outerRef: ref,
+ cursor: 'grab', // optional, default
+ })
+
+ return
+})
diff --git a/src/view/com/pager/FeedsTabBar.web.tsx b/src/view/com/pager/FeedsTabBar.web.tsx
index 0fc1b731..0df91595 100644
--- a/src/view/com/pager/FeedsTabBar.web.tsx
+++ b/src/view/com/pager/FeedsTabBar.web.tsx
@@ -1,4 +1,4 @@
-import React from 'react'
+import React, {useMemo} from 'react'
import {Animated, StyleSheet} from 'react-native'
import {observer} from 'mobx-react-lite'
import {TabBar} from 'view/com/pager/TabBar'
@@ -27,6 +27,10 @@ const FeedsTabBarDesktop = observer(
props: RenderTabBarFnProps & {testID?: string; onPressSelected: () => void},
) => {
const store = useStores()
+ const items = useMemo(
+ () => ['Following', ...store.me.savedFeeds.pinnedFeedNames],
+ [store.me.savedFeeds.pinnedFeedNames],
+ )
const pal = usePalette('default')
const interp = useAnimatedValue(0)
@@ -44,13 +48,14 @@ const FeedsTabBarDesktop = observer(
{translateY: Animated.multiply(interp, -100)},
],
}
+
return (
// @ts-ignore the type signature for transform wrong here, translateX and translateY need to be in separate objects -prf
diff --git a/src/view/com/pager/FeedsTabBarMobile.tsx b/src/view/com/pager/FeedsTabBarMobile.tsx
index 725c4460..9c713881 100644
--- a/src/view/com/pager/FeedsTabBarMobile.tsx
+++ b/src/view/com/pager/FeedsTabBarMobile.tsx
@@ -1,12 +1,17 @@
-import React from 'react'
-import {Animated, StyleSheet, TouchableOpacity} from 'react-native'
+import React, {useMemo} from 'react'
+import {Animated, StyleSheet, TouchableOpacity, View} from 'react-native'
import {observer} from 'mobx-react-lite'
import {TabBar} from 'view/com/pager/TabBar'
import {RenderTabBarFnProps} from 'view/com/pager/Pager'
-import {UserAvatar} from '../util/UserAvatar'
import {useStores} from 'state/index'
import {usePalette} from 'lib/hooks/usePalette'
import {useAnimatedValue} from 'lib/hooks/useAnimatedValue'
+import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle'
+import {Link} from '../util/Link'
+import {Text} from '../util/text/Text'
+import {CogIcon} from 'lib/icons'
+import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
+import {s} from 'lib/styles'
export const FeedsTabBar = observer(
(
@@ -28,25 +33,51 @@ export const FeedsTabBar = observer(
transform: [{translateY: Animated.multiply(interp, -100)}],
}
+ const brandBlue = useColorSchemeStyle(s.brandBlue, s.blue3)
+
const onPressAvi = React.useCallback(() => {
store.shell.openDrawer()
}, [store])
+ const items = useMemo(
+ () => ['Following', ...store.me.savedFeeds.pinnedFeedNames],
+ [store.me.savedFeeds.pinnedFeedNames],
+ )
+
return (
-
-
-
+
+
+
+
+
+
+ Bluesky
+
+
+
+
+
+
@@ -61,13 +92,20 @@ const styles = StyleSheet.create({
left: 0,
right: 0,
top: 0,
- flexDirection: 'row',
+ flexDirection: 'column',
alignItems: 'center',
- paddingHorizontal: 18,
borderBottomWidth: 1,
},
- tabBarAvi: {
- marginTop: 1,
- marginRight: 18,
+ topBar: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingHorizontal: 18,
+ paddingTop: 8,
+ paddingBottom: 2,
+ width: '100%',
+ },
+ title: {
+ fontSize: 21,
},
})
diff --git a/src/view/com/pager/Pager.tsx b/src/view/com/pager/Pager.tsx
index 34747db6..e2c8bf6d 100644
--- a/src/view/com/pager/Pager.tsx
+++ b/src/view/com/pager/Pager.tsx
@@ -1,16 +1,17 @@
-import React from 'react'
+import React, {forwardRef} from 'react'
import {Animated, View} from 'react-native'
import PagerView, {PagerViewOnPageSelectedEvent} from 'react-native-pager-view'
-import {useAnimatedValue} from 'lib/hooks/useAnimatedValue'
import {s} from 'lib/styles'
export type PageSelectedEvent = PagerViewOnPageSelectedEvent
const AnimatedPagerView = Animated.createAnimatedComponent(PagerView)
+export interface PagerRef {
+ setPage: (index: number) => void
+}
+
export interface RenderTabBarFnProps {
selectedPage: number
- position: Animated.Value
- offset: Animated.Value
onSelect?: (index: number) => void
}
export type RenderTabBarFn = (props: RenderTabBarFnProps) => JSX.Element
@@ -22,68 +23,60 @@ interface Props {
onPageSelected?: (index: number) => void
testID?: string
}
-export const Pager = ({
- children,
- tabBarPosition = 'top',
- initialPage = 0,
- renderTabBar,
- onPageSelected,
- testID,
-}: React.PropsWithChildren) => {
- const [selectedPage, setSelectedPage] = React.useState(0)
- const position = useAnimatedValue(0)
- const offset = useAnimatedValue(0)
- const pagerView = React.useRef()
+export const Pager = forwardRef>(
+ (
+ {
+ children,
+ tabBarPosition = 'top',
+ initialPage = 0,
+ renderTabBar,
+ onPageSelected,
+ testID,
+ }: React.PropsWithChildren,
+ ref,
+ ) => {
+ const [selectedPage, setSelectedPage] = React.useState(0)
+ const pagerView = React.useRef()
- const onPageSelectedInner = React.useCallback(
- (e: PageSelectedEvent) => {
- setSelectedPage(e.nativeEvent.position)
- onPageSelected?.(e.nativeEvent.position)
- },
- [setSelectedPage, onPageSelected],
- )
+ React.useImperativeHandle(ref, () => ({
+ setPage: (index: number) => pagerView.current?.setPage(index),
+ }))
- const onTabBarSelect = React.useCallback(
- (index: number) => {
- pagerView.current?.setPage(index)
- },
- [pagerView],
- )
+ const onPageSelectedInner = React.useCallback(
+ (e: PageSelectedEvent) => {
+ setSelectedPage(e.nativeEvent.position)
+ onPageSelected?.(e.nativeEvent.position)
+ },
+ [setSelectedPage, onPageSelected],
+ )
- return (
-
- {tabBarPosition === 'top' &&
- renderTabBar({
- selectedPage,
- position,
- offset,
- onSelect: onTabBarSelect,
- })}
-
- {children}
-
- {tabBarPosition === 'bottom' &&
- renderTabBar({
- selectedPage,
- position,
- offset,
- onSelect: onTabBarSelect,
- })}
-
- )
-}
+ const onTabBarSelect = React.useCallback(
+ (index: number) => {
+ pagerView.current?.setPage(index)
+ },
+ [pagerView],
+ )
+
+ return (
+
+ {tabBarPosition === 'top' &&
+ renderTabBar({
+ selectedPage,
+ onSelect: onTabBarSelect,
+ })}
+
+ {children}
+
+ {tabBarPosition === 'bottom' &&
+ renderTabBar({
+ selectedPage,
+ onSelect: onTabBarSelect,
+ })}
+
+ )
+ },
+)
diff --git a/src/view/com/pager/Pager.web.tsx b/src/view/com/pager/Pager.web.tsx
index 107497f6..7be2b11e 100644
--- a/src/view/com/pager/Pager.web.tsx
+++ b/src/view/com/pager/Pager.web.tsx
@@ -1,12 +1,9 @@
import React from 'react'
-import {Animated, View} from 'react-native'
-import {useAnimatedValue} from 'lib/hooks/useAnimatedValue'
+import {View} from 'react-native'
import {s} from 'lib/styles'
export interface RenderTabBarFnProps {
selectedPage: number
- position: Animated.Value
- offset: Animated.Value
onSelect?: (index: number) => void
}
export type RenderTabBarFn = (props: RenderTabBarFnProps) => JSX.Element
@@ -17,53 +14,51 @@ interface Props {
renderTabBar: RenderTabBarFn
onPageSelected?: (index: number) => void
}
-export const Pager = ({
- children,
- tabBarPosition = 'top',
- initialPage = 0,
- renderTabBar,
- onPageSelected,
-}: React.PropsWithChildren) => {
- const [selectedPage, setSelectedPage] = React.useState(initialPage)
- const position = useAnimatedValue(0)
- const offset = useAnimatedValue(0)
+export const Pager = React.forwardRef(
+ (
+ {
+ children,
+ tabBarPosition = 'top',
+ initialPage = 0,
+ renderTabBar,
+ onPageSelected,
+ }: React.PropsWithChildren,
+ ref,
+ ) => {
+ const [selectedPage, setSelectedPage] = React.useState(initialPage)
- const onTabBarSelect = React.useCallback(
- (index: number) => {
- setSelectedPage(index)
- onPageSelected?.(index)
- Animated.timing(position, {
- toValue: index,
- duration: 200,
- useNativeDriver: true,
- }).start()
- },
- [setSelectedPage, onPageSelected, position],
- )
+ React.useImperativeHandle(ref, () => ({
+ setPage: (index: number) => setSelectedPage(index),
+ }))
- return (
-
- {tabBarPosition === 'top' &&
- renderTabBar({
- selectedPage,
- position,
- offset,
- onSelect: onTabBarSelect,
- })}
- {React.Children.map(children, (child, i) => (
-
- {child}
-
- ))}
- {tabBarPosition === 'bottom' &&
- renderTabBar({
- selectedPage,
- position,
- offset,
- onSelect: onTabBarSelect,
- })}
-
- )
-}
+ const onTabBarSelect = React.useCallback(
+ (index: number) => {
+ setSelectedPage(index)
+ onPageSelected?.(index)
+ },
+ [setSelectedPage, onPageSelected],
+ )
+
+ return (
+
+ {tabBarPosition === 'top' &&
+ renderTabBar({
+ selectedPage,
+ onSelect: onTabBarSelect,
+ })}
+ {React.Children.map(children, (child, i) => (
+
+ {child}
+
+ ))}
+ {tabBarPosition === 'bottom' &&
+ renderTabBar({
+ selectedPage,
+ onSelect: onTabBarSelect,
+ })}
+
+ )
+ },
+)
diff --git a/src/view/com/pager/TabBar.tsx b/src/view/com/pager/TabBar.tsx
index a0b72a93..d7121fde 100644
--- a/src/view/com/pager/TabBar.tsx
+++ b/src/view/com/pager/TabBar.tsx
@@ -1,22 +1,22 @@
-import React, {createRef, useState, useMemo, useRef} from 'react'
-import {Animated, StyleSheet, View} from 'react-native'
+import React, {
+ useRef,
+ createRef,
+ useMemo,
+ useEffect,
+ useState,
+ useCallback,
+} from 'react'
+import {StyleSheet, View, ScrollView} from 'react-native'
import {Text} from '../util/text/Text'
import {PressableWithHover} from '../util/PressableWithHover'
import {usePalette} from 'lib/hooks/usePalette'
-import {isDesktopWeb} from 'platform/detection'
-
-interface Layout {
- x: number
- width: number
-}
+import {isDesktopWeb, isMobileWeb} from 'platform/detection'
+import {DraggableScrollView} from './DraggableScrollView'
export interface TabBarProps {
testID?: string
selectedPage: number
items: string[]
- position: Animated.Value
- offset: Animated.Value
- indicatorPosition?: 'top' | 'bottom'
indicatorColor?: string
onSelect?: (index: number) => void
onPressSelected?: () => void
@@ -26,69 +26,27 @@ export function TabBar({
testID,
selectedPage,
items,
- position,
- offset,
- indicatorPosition = 'bottom',
indicatorColor,
onSelect,
onPressSelected,
}: TabBarProps) {
const pal = usePalette('default')
- const [itemLayouts, setItemLayouts] = useState(
- items.map(() => ({x: 0, width: 0})),
- )
+ const scrollElRef = useRef(null)
+ const [itemXs, setItemXs] = useState([])
const itemRefs = useMemo(
() => Array.from({length: items.length}).map(() => createRef()),
[items.length],
)
- const panX = Animated.add(position, offset)
- const containerRef = useRef(null)
+ const indicatorStyle = useMemo(
+ () => ({borderBottomColor: indicatorColor || pal.colors.link}),
+ [indicatorColor, pal],
+ )
- const indicatorStyle = {
- backgroundColor: indicatorColor || pal.colors.link,
- bottom:
- indicatorPosition === 'bottom' ? (isDesktopWeb ? 0 : -1) : undefined,
- top: indicatorPosition === 'top' ? (isDesktopWeb ? 0 : -1) : undefined,
- transform: [
- {
- translateX: panX.interpolate({
- inputRange: items.map((_item, i) => i),
- outputRange: itemLayouts.map(l => l.x + l.width / 2),
- }),
- },
- {
- scaleX: panX.interpolate({
- inputRange: items.map((_item, i) => i),
- outputRange: itemLayouts.map(l => l.width),
- }),
- },
- ],
- }
+ useEffect(() => {
+ scrollElRef.current?.scrollTo({x: itemXs[selectedPage] || 0})
+ }, [scrollElRef, itemXs, selectedPage])
- const onLayout = React.useCallback(() => {
- const promises = []
- for (let i = 0; i < items.length; i++) {
- promises.push(
- new Promise(resolve => {
- if (!containerRef.current || !itemRefs[i].current) {
- return resolve({x: 0, width: 0})
- }
-
- itemRefs[i].current?.measureLayout(
- containerRef.current,
- (x: number, _y: number, width: number) => {
- resolve({x, width})
- },
- )
- }),
- )
- }
- Promise.all(promises).then((layouts: Layout[]) => {
- setItemLayouts(layouts)
- })
- }, [containerRef, itemRefs, setItemLayouts, items.length])
-
- const onPressItem = React.useCallback(
+ const onPressItem = useCallback(
(index: number) => {
onSelect?.(index)
if (index === selectedPage) {
@@ -98,33 +56,51 @@ export function TabBar({
[onSelect, onPressSelected, selectedPage],
)
+ const onLayout = React.useCallback(() => {
+ const promises = []
+ for (let i = 0; i < items.length; i++) {
+ promises.push(
+ new Promise(resolve => {
+ if (!itemRefs[i].current) {
+ return resolve(0)
+ }
+
+ itemRefs[i].current?.measure((x: number) => resolve(x))
+ }),
+ )
+ }
+ Promise.all(promises).then((Xs: number[]) => {
+ setItemXs(Xs)
+ })
+ }, [itemRefs, setItemXs, items.length])
+
return (
-
-
- {items.map((item, i) => {
- const selected = i === selectedPage
- return (
- onPressItem(i)}>
-
- {item}
-
-
- )
- })}
+
+
+ {items.map((item, i) => {
+ const selected = i === selectedPage
+ return (
+ onPressItem(i)}>
+
+ {item}
+
+
+ )
+ })}
+
)
}
@@ -133,45 +109,39 @@ const styles = isDesktopWeb
? StyleSheet.create({
outer: {
flexDirection: 'row',
- paddingHorizontal: 18,
+ width: 598,
},
- itemTop: {
- paddingTop: 16,
- paddingBottom: 14,
- paddingHorizontal: 12,
+ contentContainer: {
+ columnGap: 8,
+ marginLeft: 14,
+ paddingRight: 14,
+ backgroundColor: 'transparent',
},
- itemBottom: {
+ item: {
paddingTop: 14,
- paddingBottom: 16,
- paddingHorizontal: 12,
- },
- indicator: {
- position: 'absolute',
- left: 0,
- width: 1,
- height: 3,
- zIndex: 1,
+ paddingBottom: 12,
+ paddingHorizontal: 10,
+ borderBottomWidth: 3,
+ borderBottomColor: 'transparent',
},
})
: StyleSheet.create({
outer: {
+ flex: 1,
flexDirection: 'row',
- paddingHorizontal: 14,
+ backgroundColor: 'transparent',
},
- itemTop: {
+ contentContainer: {
+ columnGap: isMobileWeb ? 0 : 20,
+ marginLeft: isMobileWeb ? 0 : 18,
+ paddingRight: isMobileWeb ? 0 : 36,
+ backgroundColor: 'transparent',
+ },
+ item: {
paddingTop: 10,
paddingBottom: 10,
- marginRight: 24,
- },
- itemBottom: {
- paddingTop: 8,
- paddingBottom: 12,
- marginRight: 24,
- },
- indicator: {
- position: 'absolute',
- left: 0,
- width: 1,
- height: 3,
+ paddingHorizontal: isMobileWeb ? 8 : 0,
+ borderBottomWidth: 3,
+ borderBottomColor: 'transparent',
},
})
diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx
index 084e30a2..4ba2e1a4 100644
--- a/src/view/com/post-thread/PostThreadItem.tsx
+++ b/src/view/com/post-thread/PostThreadItem.tsx
@@ -1,4 +1,4 @@
-import React from 'react'
+import React, {useCallback, useMemo} from 'react'
import {observer} from 'mobx-react-lite'
import {Linking, StyleSheet, View} from 'react-native'
import Clipboard from '@react-native-clipboard/clipboard'
@@ -99,7 +99,11 @@ export const PostThreadItem = observer(function PostThreadItem({
const onOpenTranslate = React.useCallback(() => {
Linking.openURL(
- encodeURI(`https://translate.google.com/#auto|en|${record?.text || ''}`),
+ encodeURI(
+ `https://translate.google.com/?sl=auto&tl=en&text=${
+ record?.text || ''
+ }`,
+ ),
)
}, [record])
@@ -129,6 +133,40 @@ export const PostThreadItem = observer(function PostThreadItem({
)
}, [item, store])
+ const accessibilityActions = useMemo(
+ () => [
+ {
+ name: 'reply',
+ label: 'Reply',
+ },
+ {
+ name: 'repost',
+ label: item.post.viewer?.repost ? 'Undo repost' : 'Repost',
+ },
+ {name: 'like', label: item.post.viewer?.like ? 'Unlike' : 'Like'},
+ ],
+ [item.post.viewer?.like, item.post.viewer?.repost],
+ )
+
+ const onAccessibilityAction = useCallback(
+ event => {
+ switch (event.nativeEvent.actionName) {
+ case 'like':
+ onPressToggleLike()
+ break
+ case 'reply':
+ onPressReply()
+ break
+ case 'repost':
+ onPressToggleRepost()
+ break
+ default:
+ break
+ }
+ },
+ [onPressReply, onPressToggleLike, onPressToggleRepost],
+ )
+
if (!record) {
return
}
@@ -150,7 +188,9 @@ export const PostThreadItem = observer(function PostThreadItem({
+ moderation={item.moderation.thread}
+ accessibilityActions={accessibilityActions}
+ onAccessibilityAction={onAccessibilityAction}>
+ moderation={item.moderation.thread}
+ accessibilityActions={accessibilityActions}
+ onAccessibilityAction={onAccessibilityAction}>
{item._showParentReplyLine && (
{
Linking.openURL(
encodeURI(
- `https://translate.google.com/#auto|en|${record?.text || ''}`,
+ `https://translate.google.com/?sl=auto&tl=en&text=${
+ record?.text || ''
+ }`,
),
)
}, [record])
@@ -203,11 +205,47 @@ const PostLoaded = observer(
)
}, [item, setDeleted, store])
+ const accessibilityActions = useMemo(
+ () => [
+ {
+ name: 'reply',
+ label: 'Reply',
+ },
+ {
+ name: 'repost',
+ label: item.post.viewer?.repost ? 'Undo repost' : 'Repost',
+ },
+ {name: 'like', label: item.post.viewer?.like ? 'Unlike' : 'Like'},
+ ],
+ [item.post.viewer?.like, item.post.viewer?.repost],
+ )
+
+ const onAccessibilityAction = useCallback(
+ event => {
+ switch (event.nativeEvent.actionName) {
+ case 'like':
+ onPressToggleLike()
+ break
+ case 'reply':
+ onPressReply()
+ break
+ case 'repost':
+ onPressToggleRepost()
+ break
+ default:
+ break
+ }
+ },
+ [onPressReply, onPressToggleLike, onPressToggleRepost],
+ )
+
return (
+ moderation={item.moderation.list}
+ accessibilityActions={accessibilityActions}
+ onAccessibilityAction={onAccessibilityAction}>
{showReplyLine && }
diff --git a/src/view/com/posts/WhatsHotEmptyState.tsx b/src/view/com/posts/CustomFeedEmptyState.tsx
similarity index 69%
rename from src/view/com/posts/WhatsHotEmptyState.tsx
rename to src/view/com/posts/CustomFeedEmptyState.tsx
index ade94ca3..e83a94f0 100644
--- a/src/view/com/posts/WhatsHotEmptyState.tsx
+++ b/src/view/com/posts/CustomFeedEmptyState.tsx
@@ -1,5 +1,6 @@
import React from 'react'
import {StyleSheet, View} from 'react-native'
+import {useNavigation} from '@react-navigation/native'
import {
FontAwesomeIcon,
FontAwesomeIconStyle,
@@ -7,18 +8,24 @@ import {
import {Text} from '../util/text/Text'
import {Button} from '../util/forms/Button'
import {MagnifyingGlassIcon} from 'lib/icons'
-import {useStores} from 'state/index'
+import {NavigationProp} from 'lib/routes/types'
import {usePalette} from 'lib/hooks/usePalette'
import {s} from 'lib/styles'
+import {isWeb} from 'platform/detection'
-export function WhatsHotEmptyState() {
+export function CustomFeedEmptyState() {
const pal = usePalette('default')
const palInverted = usePalette('inverted')
- const store = useStores()
+ const navigation = useNavigation()
- const onPressSettings = React.useCallback(() => {
- store.shell.openModal({name: 'content-languages-settings'})
- }, [store])
+ const onPressFindAccounts = React.useCallback(() => {
+ if (isWeb) {
+ navigation.navigate('Search', {})
+ } else {
+ navigation.navigate('SearchTab')
+ navigation.popToTop()
+ }
+ }, [navigation])
return (
@@ -26,12 +33,15 @@ export function WhatsHotEmptyState() {
- Your What's Hot feed is empty! This is because there aren't enough users
- posting in your selected language.
+ This feed is empty! You may need to follow more users or tune your
+ language settings.
-
+
- Update my settings
+ Find accounts to follow
@@ -41,11 +45,15 @@ export const Feed = observer(function Feed({
scrollElRef?: MutableRefObject | null>
onPressTryAgain?: () => void
onScroll?: OnScrollCb
+ scrollEventThrottle?: number
renderEmptyState?: () => JSX.Element
testID?: string
headerOffset?: number
+ ListHeaderComponent?: () => JSX.Element
+ extraData?: any
}) {
const pal = usePalette('default')
+ const theme = useTheme()
const {track} = useAnalytics()
const [isRefreshing, setIsRefreshing] = React.useState(false)
@@ -163,6 +171,7 @@ export const Feed = observer(function Feed({
keyExtractor={item => item._reactKey}
renderItem={renderItem}
ListFooterComponent={FeedFooter}
+ ListHeaderComponent={ListHeaderComponent}
refreshControl={
diff --git a/src/view/com/posts/FeedItem.tsx b/src/view/com/posts/FeedItem.tsx
index fa6131d6..413300bb 100644
--- a/src/view/com/posts/FeedItem.tsx
+++ b/src/view/com/posts/FeedItem.tsx
@@ -1,4 +1,4 @@
-import React, {useMemo, useState} from 'react'
+import React, {useCallback, useMemo, useState} from 'react'
import {observer} from 'mobx-react-lite'
import {Linking, StyleSheet, View} from 'react-native'
import Clipboard from '@react-native-clipboard/clipboard'
@@ -99,7 +99,11 @@ export const FeedItem = observer(function ({
const onOpenTranslate = React.useCallback(() => {
Linking.openURL(
- encodeURI(`https://translate.google.com/#auto|en|${record?.text || ''}`),
+ encodeURI(
+ `https://translate.google.com/?sl=auto&tl=en&text=${
+ record?.text || ''
+ }`,
+ ),
)
}, [record])
@@ -154,12 +158,48 @@ export const FeedItem = observer(function ({
moderation = {behavior: ModerationBehaviorCode.Show}
}
+ const accessibilityActions = useMemo(
+ () => [
+ {
+ name: 'reply',
+ label: 'Reply',
+ },
+ {
+ name: 'repost',
+ label: item.post.viewer?.repost ? 'Undo repost' : 'Repost',
+ },
+ {name: 'like', label: item.post.viewer?.like ? 'Unlike' : 'Like'},
+ ],
+ [item.post.viewer?.like, item.post.viewer?.repost],
+ )
+
+ const onAccessibilityAction = useCallback(
+ event => {
+ switch (event.nativeEvent.actionName) {
+ case 'like':
+ onPressToggleLike()
+ break
+ case 'reply':
+ onPressReply()
+ break
+ case 'repost':
+ onPressToggleRepost()
+ break
+ default:
+ break
+ }
+ },
+ [onPressReply, onPressToggleLike, onPressToggleRepost],
+ )
+
return (
+ moderation={moderation}
+ accessibilityActions={accessibilityActions}
+ onAccessibilityAction={onAccessibilityAction}>
{isThreadChild && (
()
const onPressFindAccounts = React.useCallback(() => {
- navigation.navigate('SearchTab')
- navigation.popToTop()
+ if (isWeb) {
+ navigation.navigate('Search', {})
+ } else {
+ navigation.navigate('SearchTab')
+ navigation.popToTop()
+ }
}, [navigation])
return (
diff --git a/src/view/com/posts/MultiFeed.tsx b/src/view/com/posts/MultiFeed.tsx
new file mode 100644
index 00000000..db353909
--- /dev/null
+++ b/src/view/com/posts/MultiFeed.tsx
@@ -0,0 +1,246 @@
+import React, {MutableRefObject} from 'react'
+import {observer} from 'mobx-react-lite'
+import {
+ ActivityIndicator,
+ RefreshControl,
+ StyleProp,
+ StyleSheet,
+ View,
+ ViewStyle,
+} from 'react-native'
+import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
+import {FlatList} from '../util/Views'
+import {PostFeedLoadingPlaceholder} from '../util/LoadingPlaceholder'
+import {ErrorMessage} from '../util/error/ErrorMessage'
+import {PostsMultiFeedModel, MultiFeedItem} from 'state/models/feeds/multi-feed'
+import {FeedSlice} from './FeedSlice'
+import {Text} from '../util/text/Text'
+import {Link} from '../util/Link'
+import {UserAvatar} from '../util/UserAvatar'
+import {OnScrollCb} from 'lib/hooks/useOnMainScroll'
+import {s} from 'lib/styles'
+import {useAnalytics} from 'lib/analytics'
+import {usePalette} from 'lib/hooks/usePalette'
+import {useTheme} from 'lib/ThemeContext'
+import {isDesktopWeb} from 'platform/detection'
+import {CogIcon} from 'lib/icons'
+
+export const MultiFeed = observer(function Feed({
+ multifeed,
+ style,
+ showPostFollowBtn,
+ scrollElRef,
+ onScroll,
+ scrollEventThrottle,
+ testID,
+ headerOffset = 0,
+ extraData,
+}: {
+ multifeed: PostsMultiFeedModel
+ style?: StyleProp
+ showPostFollowBtn?: boolean
+ scrollElRef?: MutableRefObject | null>
+ onPressTryAgain?: () => void
+ onScroll?: OnScrollCb
+ scrollEventThrottle?: number
+ renderEmptyState?: () => JSX.Element
+ testID?: string
+ headerOffset?: number
+ extraData?: any
+}) {
+ const pal = usePalette('default')
+ const theme = useTheme()
+ const {track} = useAnalytics()
+ const [isRefreshing, setIsRefreshing] = React.useState(false)
+
+ // events
+ // =
+
+ const onRefresh = React.useCallback(async () => {
+ track('MultiFeed:onRefresh')
+ setIsRefreshing(true)
+ try {
+ await multifeed.refresh()
+ } catch (err) {
+ multifeed.rootStore.log.error('Failed to refresh posts feed', err)
+ }
+ setIsRefreshing(false)
+ }, [multifeed, track, setIsRefreshing])
+
+ const onEndReached = React.useCallback(async () => {
+ track('MultiFeed:onEndReached')
+ try {
+ await multifeed.loadMore()
+ } catch (err) {
+ multifeed.rootStore.log.error('Failed to load more posts', err)
+ }
+ }, [multifeed, track])
+
+ // rendering
+ // =
+
+ const renderItem = React.useCallback(
+ ({item}: {item: MultiFeedItem}) => {
+ if (item.type === 'header') {
+ if (isDesktopWeb) {
+ return (
+
+
+ My Feeds
+
+
+
+
+
+ )
+ }
+ return
+ } else if (item.type === 'feed-header') {
+ return (
+
+
+
+ {item.title}
+
+
+ )
+ } else if (item.type === 'feed-slice') {
+ return (
+
+ )
+ } else if (item.type === 'feed-loading') {
+ return
+ } else if (item.type === 'feed-error') {
+ return
+ } else if (item.type === 'feed-footer') {
+ return (
+
+
+ See more from {item.title}
+
+
+
+ )
+ } else if (item.type === 'footer') {
+ return (
+
+
+
+ Discover new feeds
+
+
+ )
+ }
+ return null
+ },
+ [showPostFollowBtn, pal],
+ )
+
+ const FeedFooter = React.useCallback(
+ () =>
+ multifeed.isLoading && !isRefreshing ? (
+
+
+
+ ) : (
+
+ ),
+ [multifeed.isLoading, isRefreshing, pal],
+ )
+
+ return (
+
+ {multifeed.items.length > 0 && (
+ item._reactKey}
+ renderItem={renderItem}
+ ListFooterComponent={FeedFooter}
+ refreshControl={
+
+ }
+ contentContainerStyle={s.contentContainer}
+ style={[{paddingTop: headerOffset}, pal.view, styles.container]}
+ onScroll={onScroll}
+ scrollEventThrottle={scrollEventThrottle}
+ indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'}
+ onEndReached={onEndReached}
+ onEndReachedThreshold={0.6}
+ removeClippedSubviews={true}
+ contentOffset={{x: 0, y: headerOffset * -1}}
+ extraData={extraData}
+ // @ts-ignore our .web version only -prf
+ desktopFixedHeight
+ />
+ )}
+
+ )
+})
+
+const styles = StyleSheet.create({
+ container: {
+ height: '100%',
+ },
+ header: {
+ borderTopWidth: 1,
+ marginBottom: 4,
+ },
+ headerDesktop: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ borderBottomWidth: 1,
+ marginBottom: 4,
+ paddingHorizontal: 16,
+ paddingVertical: 8,
+ },
+ feedHeader: {
+ flexDirection: 'row',
+ gap: 8,
+ alignItems: 'center',
+ paddingHorizontal: 16,
+ paddingBottom: 8,
+ marginTop: 12,
+ },
+ feedHeaderTitle: {
+ fontWeight: 'bold',
+ },
+ feedFooter: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ paddingHorizontal: 16,
+ paddingVertical: 16,
+ marginBottom: 12,
+ borderTopWidth: 1,
+ borderBottomWidth: 1,
+ },
+ footerLink: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ borderRadius: 8,
+ paddingHorizontal: 14,
+ paddingVertical: 12,
+ marginHorizontal: 8,
+ marginBottom: 8,
+ gap: 8,
+ },
+ loadMore: {
+ paddingTop: 10,
+ },
+})
diff --git a/src/view/com/profile/FollowButton.tsx b/src/view/com/profile/FollowButton.tsx
index 7715358c..fcb2225d 100644
--- a/src/view/com/profile/FollowButton.tsx
+++ b/src/view/com/profile/FollowButton.tsx
@@ -33,7 +33,7 @@ export const FollowButton = observer(
store.me.follows.removeFollow(did)
onToggleFollow?.(false)
} catch (e: any) {
- store.log.error('Failed fo delete follow', e)
+ store.log.error('Failed to delete follow', e)
Toast.show('An issue occurred, please try again.')
}
} else if (updatedFollowState === FollowState.NotFollowing) {
@@ -42,7 +42,7 @@ export const FollowButton = observer(
store.me.follows.addFollow(did, res.uri)
onToggleFollow?.(true)
} catch (e: any) {
- store.log.error('Failed fo create follow', e)
+ store.log.error('Failed to create follow', e)
Toast.show('An issue occurred, please try again.')
}
}
diff --git a/src/view/com/profile/ProfileHeader.tsx b/src/view/com/profile/ProfileHeader.tsx
index 3b9ca67c..9b4df098 100644
--- a/src/view/com/profile/ProfileHeader.tsx
+++ b/src/view/com/profile/ProfileHeader.tsx
@@ -218,7 +218,7 @@ const ProfileHeaderLoaded = observer(
onRefreshAll()
Toast.show('Account unblocked')
} catch (e: any) {
- store.log.error('Failed to block unaccount', e)
+ store.log.error('Failed to unblock account', e)
Toast.show(`There was an issue! ${e.toString()}`)
}
},
@@ -289,6 +289,9 @@ const ProfileHeaderLoaded = observer(
])
const blockHide = !isMe && (view.viewer.blocking || view.viewer.blockedBy)
+ const following = formatCount(view.followsCount)
+ const followers = formatCount(view.followersCount)
+ const pluralizedFollowers = pluralize(view.followersCount, 'follower')
return (
@@ -394,13 +397,13 @@ const ProfileHeaderLoaded = observer(
style={[s.flexRow, s.mr10]}
onPress={onPressFollowers}
accessibilityRole="button"
- accessibilityLabel={`Show ${view.handle}'s followers`}
- accessibilityHint={`Shows folks following ${view.handle}`}>
+ accessibilityLabel={`${followers} ${pluralizedFollowers}`}
+ accessibilityHint={'Opens followers list'}>
- {formatCount(view.followersCount)}
+ {followers}
- {pluralize(view.followersCount, 'follower')}
+ {pluralizedFollowers}
+ accessibilityLabel={`${following} following`}
+ accessibilityHint={'Opens following list'}>
- {formatCount(view.followsCount)}
+ {following}
following
diff --git a/src/view/com/search/HeaderWithInput.tsx b/src/view/com/search/HeaderWithInput.tsx
index 7a9e0cc6..d4467371 100644
--- a/src/view/com/search/HeaderWithInput.tsx
+++ b/src/view/com/search/HeaderWithInput.tsx
@@ -4,7 +4,6 @@ import {
FontAwesomeIcon,
FontAwesomeIconStyle,
} from '@fortawesome/react-native-fontawesome'
-import {UserAvatar} from 'view/com/util/UserAvatar'
import {Text} from 'view/com/util/text/Text'
import {MagnifyingGlassIcon} from 'lib/icons'
import {useTheme} from 'lib/ThemeContext'
@@ -56,9 +55,9 @@ export function HeaderWithInput({
hitSlop={MENU_HITSLOP}
style={styles.headerMenuBtn}
accessibilityRole="button"
- accessibilityLabel="Back"
- accessibilityHint="">
-
+ accessibilityLabel="Menu"
+ accessibilityHint="Access navigation links and settings">
+
{query ? (
+
+
+
+ )
+ }
+ if (type === 'list') {
+ // Font Awesome Pro 6.4.0 by @fontawesome -https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc.
+ return (
+
+
+
+
+
+ )
+ }
return (
{
+ if (type === 'algo' || type === 'list') {
+ return {
+ width: size,
+ height: size,
+ borderRadius: 8,
+ }
+ }
+ return {
+ width: size,
+ height: size,
+ borderRadius: Math.floor(size / 2),
+ }
+ }, [type, size])
+
const dropdownItems = useMemo(
() => [
!isWeb && {
@@ -146,16 +208,12 @@ export function UserAvatar({
{avatar ? (
) : (
-
+
)}
) : (
-
+
{warning}
)
@@ -201,11 +255,6 @@ const styles = StyleSheet.create({
justifyContent: 'center',
backgroundColor: colors.gray5,
},
- avatarImage: {
- width: 80,
- height: 80,
- borderRadius: 40,
- },
warningIconContainer: {
position: 'absolute',
right: 0,
diff --git a/src/view/com/util/ViewHeader.tsx b/src/view/com/util/ViewHeader.tsx
index 97802394..732a46d0 100644
--- a/src/view/com/util/ViewHeader.tsx
+++ b/src/view/com/util/ViewHeader.tsx
@@ -4,7 +4,6 @@ import {Animated, StyleSheet, TouchableOpacity, View} from 'react-native'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {useNavigation} from '@react-navigation/native'
import {CenteredView} from './Views'
-import {UserAvatar} from './UserAvatar'
import {Text} from './text/Text'
import {useStores} from 'state/index'
import {usePalette} from 'lib/hooks/usePalette'
@@ -20,12 +19,14 @@ export const ViewHeader = observer(function ({
canGoBack,
hideOnScroll,
showOnDesktop,
+ showBorder,
renderButton,
}: {
title: string
canGoBack?: boolean
hideOnScroll?: boolean
showOnDesktop?: boolean
+ showBorder?: boolean
renderButton?: () => JSX.Element
}) {
const pal = usePalette('default')
@@ -57,7 +58,7 @@ export const ViewHeader = observer(function ({
}
return (
-
+
+ accessibilityHint={
+ canGoBack ? '' : 'Access navigation links and settings'
+ }>
{canGoBack ? (
) : (
-
+
)}
@@ -115,9 +122,11 @@ const Container = observer(
({
children,
hideOnScroll,
+ showBorder,
}: {
children: React.ReactNode
hideOnScroll: boolean
+ showBorder?: boolean
}) => {
const store = useStores()
const pal = usePalette('default')
@@ -145,11 +154,28 @@ const Container = observer(
}
if (!hideOnScroll) {
- return {children}
+ return (
+
+ {children}
+
+ )
}
return (
+ style={[
+ styles.header,
+ pal.view,
+ pal.border,
+ styles.headerFloating,
+ transform,
+ showBorder && styles.border,
+ ]}>
{children}
)
@@ -172,6 +198,9 @@ const styles = StyleSheet.create({
borderBottomWidth: 1,
paddingVertical: 12,
},
+ border: {
+ borderBottomWidth: 1,
+ },
titleContainer: {
marginLeft: 'auto',
diff --git a/src/view/com/util/ViewSelector.tsx b/src/view/com/util/ViewSelector.tsx
index f9ef0945..5b671d06 100644
--- a/src/view/com/util/ViewSelector.tsx
+++ b/src/view/com/util/ViewSelector.tsx
@@ -1,5 +1,5 @@
import React, {useEffect, useState} from 'react'
-import {Pressable, StyleSheet, View} from 'react-native'
+import {Pressable, RefreshControl, StyleSheet, View} from 'react-native'
import {FlatList} from './Views'
import {OnScrollCb} from 'lib/hooks/useOnMainScroll'
import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle'
@@ -41,6 +41,7 @@ export function ViewSelector({
onRefresh?: () => void
onEndReached?: (info: {distanceFromEnd: number}) => void
}) {
+ const pal = usePalette('default')
const [selectedIndex, setSelectedIndex] = useState(0)
// events
@@ -93,10 +94,15 @@ export function ViewSelector({
ListFooterComponent={ListFooterComponent}
// NOTE sticky header disabled on android due to major performance issues -prf
stickyHeaderIndices={isAndroid ? undefined : STICKY_HEADER_INDICES}
- refreshing={refreshing}
onScroll={onScroll}
- onRefresh={onRefresh}
onEndReached={onEndReached}
+ refreshControl={
+
+ }
onEndReachedThreshold={0.6}
contentContainerStyle={s.contentContainer}
removeClippedSubviews={true}
diff --git a/src/view/com/util/Views.web.tsx b/src/view/com/util/Views.web.tsx
index 9d6501d5..3313492e 100644
--- a/src/view/com/util/Views.web.tsx
+++ b/src/view/com/util/Views.web.tsx
@@ -126,5 +126,6 @@ const styles = StyleSheet.create({
},
fixedHeight: {
height: '100vh',
+ scrollbarGutter: 'stable both-edges',
},
})
diff --git a/src/view/com/util/fab/FABInner.tsx b/src/view/com/util/fab/FABInner.tsx
index 5eb4a658..76824e57 100644
--- a/src/view/com/util/fab/FABInner.tsx
+++ b/src/view/com/util/fab/FABInner.tsx
@@ -47,7 +47,7 @@ const styles = StyleSheet.create({
outer: {
position: 'absolute',
zIndex: 1,
- right: 28,
+ right: 24,
bottom: 94,
width: 60,
height: 60,
diff --git a/src/view/com/util/forms/DropdownButton.tsx b/src/view/com/util/forms/DropdownButton.tsx
index 36ef1f40..064b8211 100644
--- a/src/view/com/util/forms/DropdownButton.tsx
+++ b/src/view/com/util/forms/DropdownButton.tsx
@@ -136,7 +136,12 @@ export function DropdownButton({
}
return (
-
+
{children}
diff --git a/src/view/com/util/load-latest/LoadLatestBtn.web.tsx b/src/view/com/util/load-latest/LoadLatestBtn.web.tsx
index 83968502..fefc540c 100644
--- a/src/view/com/util/load-latest/LoadLatestBtn.web.tsx
+++ b/src/view/com/util/load-latest/LoadLatestBtn.web.tsx
@@ -1,8 +1,8 @@
import React from 'react'
import {StyleSheet, TouchableOpacity} from 'react-native'
+import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {Text} from '../text/Text'
import {usePalette} from 'lib/hooks/usePalette'
-import {UpIcon} from 'lib/icons'
import {LoadLatestBtn as LoadLatestBtnMobile} from './LoadLatestBtnMobile'
import {isMobileWeb} from 'platform/detection'
@@ -11,51 +11,97 @@ const HITSLOP = {left: 20, top: 20, right: 20, bottom: 20}
export const LoadLatestBtn = ({
onPress,
label,
+ showIndicator,
+ minimalShellMode,
}: {
onPress: () => void
label: string
+ showIndicator: boolean
+ minimalShellMode?: boolean
}) => {
const pal = usePalette('default')
if (isMobileWeb) {
- return
+ return (
+
+ )
}
return (
-
-
-
- Load new {label}
-
-
+ <>
+ {showIndicator && (
+
+
+ {label}
+
+
+ )}
+
+
+
+
+
+ >
)
}
const styles = StyleSheet.create({
loadLatest: {
flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
position: 'absolute',
left: '50vw',
// @ts-ignore web only -prf
- transform: 'translateX(-50%)',
- top: 60,
- shadowColor: '#000',
- shadowOpacity: 0.2,
- shadowOffset: {width: 0, height: 2},
- shadowRadius: 4,
- paddingLeft: 20,
- paddingRight: 24,
- paddingVertical: 10,
+ transform: 'translateX(-282px)',
+ bottom: 40,
+ width: 54,
+ height: 54,
borderRadius: 30,
borderWidth: 1,
},
icon: {
position: 'relative',
top: 2,
- marginRight: 5,
+ },
+ loadLatestCentered: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ position: 'absolute',
+ left: '50vw',
+ // @ts-ignore web only -prf
+ transform: 'translateX(-50%)',
+ top: 60,
+ paddingHorizontal: 24,
+ paddingVertical: 14,
+ borderRadius: 30,
+ borderWidth: 1,
+ },
+ loadLatestCenteredMinimal: {
+ top: 20,
},
})
diff --git a/src/view/com/util/load-latest/LoadLatestBtnMobile.tsx b/src/view/com/util/load-latest/LoadLatestBtnMobile.tsx
index 5279696a..412b9b80 100644
--- a/src/view/com/util/load-latest/LoadLatestBtnMobile.tsx
+++ b/src/view/com/util/load-latest/LoadLatestBtnMobile.tsx
@@ -1,23 +1,35 @@
import React from 'react'
-import {StyleSheet, TouchableOpacity} from 'react-native'
+import {StyleSheet, TouchableOpacity, View} from 'react-native'
import {observer} from 'mobx-react-lite'
-import LinearGradient from 'react-native-linear-gradient'
+import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {useSafeAreaInsets} from 'react-native-safe-area-context'
-import {Text} from '../text/Text'
-import {colors, gradients} from 'lib/styles'
import {clamp} from 'lodash'
import {useStores} from 'state/index'
+import {usePalette} from 'lib/hooks/usePalette'
+import {colors} from 'lib/styles'
const HITSLOP = {left: 20, top: 20, right: 20, bottom: 20}
export const LoadLatestBtn = observer(
- ({onPress, label}: {onPress: () => void; label: string}) => {
+ ({
+ onPress,
+ label,
+ showIndicator,
+ }: {
+ onPress: () => void
+ label: string
+ showIndicator: boolean
+ minimalShellMode?: boolean // NOTE not used on mobile -prf
+ }) => {
const store = useStores()
+ const pal = usePalette('default')
const safeAreaInsets = useSafeAreaInsets()
return (
-
-
- Load new {label}
-
-
+ accessibilityLabel={label}
+ accessibilityHint="">
+
+ {showIndicator && }
)
},
@@ -44,19 +49,24 @@ export const LoadLatestBtn = observer(
const styles = StyleSheet.create({
loadLatest: {
position: 'absolute',
- left: 20,
+ left: 18,
bottom: 35,
- shadowColor: '#000',
- shadowOpacity: 0.3,
- shadowOffset: {width: 0, height: 1},
- },
- loadLatestInner: {
+ borderWidth: 1,
+ width: 52,
+ height: 52,
+ borderRadius: 26,
flexDirection: 'row',
- paddingHorizontal: 14,
- paddingVertical: 10,
- borderRadius: 30,
+ alignItems: 'center',
+ justifyContent: 'center',
},
- loadLatestText: {
- color: colors.white,
+ indicator: {
+ position: 'absolute',
+ top: 3,
+ right: 3,
+ backgroundColor: colors.blue3,
+ width: 12,
+ height: 12,
+ borderRadius: 6,
+ borderWidth: 1,
},
})
diff --git a/src/view/com/util/moderation/ImageHider.tsx b/src/view/com/util/moderation/ImageHider.tsx
index b42c6397..40add5b6 100644
--- a/src/view/com/util/moderation/ImageHider.tsx
+++ b/src/view/com/util/moderation/ImageHider.tsx
@@ -27,6 +27,10 @@ export function ImageHider({
setOverride(false)
}, [setOverride])
+ if (moderation.behavior === ModerationBehaviorCode.Hide) {
+ return null
+ }
+
if (moderation.behavior !== ModerationBehaviorCode.WarnImages) {
return (
@@ -35,10 +39,6 @@ export function ImageHider({
)
}
- if (moderation.behavior === ModerationBehaviorCode.Hide) {
- return null
- }
-
return (
diff --git a/src/view/com/util/moderation/PostHider.tsx b/src/view/com/util/moderation/PostHider.tsx
index 2cc7ea62..50ccf595 100644
--- a/src/view/com/util/moderation/PostHider.tsx
+++ b/src/view/com/util/moderation/PostHider.tsx
@@ -1,11 +1,5 @@
-import React from 'react'
-import {
- StyleProp,
- StyleSheet,
- TouchableOpacity,
- View,
- ViewStyle,
-} from 'react-native'
+import React, {ComponentProps} from 'react'
+import {StyleSheet, TouchableOpacity, View} from 'react-native'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {usePalette} from 'lib/hooks/usePalette'
import {Link} from '../Link'
@@ -13,18 +7,21 @@ import {Text} from '../text/Text'
import {addStyle} from 'lib/styles'
import {ModerationBehaviorCode, ModerationBehavior} from 'lib/labeling/types'
+interface Props extends ComponentProps {
+ // testID?: string
+ // href?: string
+ // style: StyleProp
+ moderation: ModerationBehavior
+}
+
export function PostHider({
testID,
href,
moderation,
style,
children,
-}: React.PropsWithChildren<{
- testID?: string
- href?: string
- moderation: ModerationBehavior
- style: StyleProp
-}>) {
+ ...props
+}: Props) {
const pal = usePalette('default')
const [override, setOverride] = React.useState(false)
const bg = override ? pal.viewLight : pal.view
@@ -70,7 +67,14 @@ export function PostHider({
// NOTE: any further label enforcement should occur in ContentContainer
return (
-
+
{children}
)
diff --git a/src/view/com/util/numeric/format.ts b/src/view/com/util/numeric/format.ts
index f0e90217..7aa5a4f4 100644
--- a/src/view/com/util/numeric/format.ts
+++ b/src/view/com/util/numeric/format.ts
@@ -3,3 +3,13 @@ export const formatCount = (num: number) =>
notation: 'compact',
maximumFractionDigits: 1,
}).format(num)
+
+export function formatCountShortOnly(num: number): string {
+ if (num >= 1000000) {
+ return (num / 1000000).toFixed(1) + 'M'
+ }
+ if (num >= 1000) {
+ return (num / 1000).toFixed(1) + 'K'
+ }
+ return String(num)
+}
diff --git a/src/view/com/util/post-ctrls/PostCtrls.tsx b/src/view/com/util/post-ctrls/PostCtrls.tsx
index 5c0296e2..12d4c48c 100644
--- a/src/view/com/util/post-ctrls/PostCtrls.tsx
+++ b/src/view/com/util/post-ctrls/PostCtrls.tsx
@@ -10,9 +10,6 @@ import {
FontAwesomeIcon,
FontAwesomeIconStyle,
} from '@fortawesome/react-native-fontawesome'
-import ReactNativeHapticFeedback, {
- HapticFeedbackTypes,
-} from 'react-native-haptic-feedback'
// DISABLED see #135
// import {
// TriggerableAnimated,
@@ -24,8 +21,8 @@ import {HeartIcon, HeartIconSolid, CommentBottomArrow} from 'lib/icons'
import {s, colors} from 'lib/styles'
import {useTheme} from 'lib/ThemeContext'
import {useStores} from 'state/index'
-import {isIOS, isNative} from 'platform/detection'
import {RepostButton} from './RepostButton'
+import {Haptics} from 'lib/haptics'
interface PostCtrlsOpts {
itemUri: string
@@ -58,7 +55,6 @@ interface PostCtrlsOpts {
}
const HITSLOP = {top: 5, left: 5, bottom: 5, right: 5}
-const hapticImpact: HapticFeedbackTypes = isIOS ? 'impactMedium' : 'impactLight' // Users said the medium impact was too strong on Android; see APP-537
// DISABLED see #135
/*
@@ -111,9 +107,7 @@ export function PostCtrls(opts: PostCtrlsOpts) {
const onRepost = useCallback(() => {
store.shell.closeModal()
if (!opts.isReposted) {
- if (isNative) {
- ReactNativeHapticFeedback.trigger(hapticImpact)
- }
+ Haptics.default()
opts.onPressToggleRepost().catch(_e => undefined)
// DISABLED see #135
// repostRef.current?.trigger(
@@ -139,10 +133,7 @@ export function PostCtrls(opts: PostCtrlsOpts) {
indexedAt: opts.indexedAt,
},
})
-
- if (isNative) {
- ReactNativeHapticFeedback.trigger(hapticImpact)
- }
+ Haptics.default()
}, [
opts.author,
opts.indexedAt,
@@ -154,7 +145,7 @@ export function PostCtrls(opts: PostCtrlsOpts) {
const onPressToggleLikeWrapper = async () => {
if (!opts.isLiked) {
- ReactNativeHapticFeedback.trigger(hapticImpact)
+ Haptics.default()
await opts.onPressToggleLike().catch(_e => undefined)
// DISABLED see #135
// likeRef.current?.trigger(
@@ -200,12 +191,10 @@ export function PostCtrls(opts: PostCtrlsOpts) {
onPress={onPressToggleLikeWrapper}
accessibilityRole="button"
accessibilityLabel={opts.isLiked ? 'Unlike' : 'Like'}
- accessibilityHint={
- opts.isReposted ? `Removes like from the post` : `Like the post`
- }>
+ accessibilityHint="">
{opts.isLiked ? (
}
+ style={styles.ctrlIconLiked}
size={opts.big ? 22 : 16}
/>
) : (
diff --git a/src/view/com/util/post-ctrls/RepostButton.tsx b/src/view/com/util/post-ctrls/RepostButton.tsx
index e6de4cb1..59f7f6ee 100644
--- a/src/view/com/util/post-ctrls/RepostButton.tsx
+++ b/src/view/com/util/post-ctrls/RepostButton.tsx
@@ -50,11 +50,7 @@ export const RepostButton = ({
style={styles.control}
accessibilityRole="button"
accessibilityLabel={isReposted ? 'Undo repost' : 'Repost'}
- accessibilityHint={
- isReposted
- ? `Remove your repost of the post`
- : `Repost or quote post the post`
- }>
+ accessibilityHint="">
{
if (firstImageToShow !== item.uri) {
- // First image already prefeched above
+ // First image already prefetched above
RNImage.prefetch(item.uri)
}
})
@@ -132,10 +141,11 @@ export function PostEmbeds({
/>
)
- // }
}
}
+ // external link embed
+ // =
if (AppBskyEmbedExternal.isView(embed)) {
const link = embed.external
const youtubeVideoId = getYoutubeVideoId(link.uri)
@@ -153,9 +163,35 @@ export function PostEmbeds({
)
}
+
+ // custom feed embed (i.e. generator view)
+ // =
+ if (
+ AppBskyEmbedRecord.isView(embed) &&
+ AppBskyFeedDefs.isGeneratorView(embed.record)
+ ) {
+ return
+ }
+
return
}
+function CustomFeedEmbed({record}: {record: AppBskyFeedDefs.GeneratorView}) {
+ const pal = usePalette('default')
+ const store = useStores()
+ const item = React.useMemo(
+ () => new CustomFeedModel(store, record),
+ [store, record],
+ )
+ return (
+
+ )
+}
+
const styles = StyleSheet.create({
stackContainer: {
gap: 6,
@@ -172,6 +208,13 @@ const styles = StyleSheet.create({
borderRadius: 8,
marginTop: 4,
},
+ customFeedOuter: {
+ borderWidth: 1,
+ borderRadius: 8,
+ marginTop: 4,
+ paddingHorizontal: 12,
+ paddingVertical: 12,
+ },
alt: {
backgroundColor: 'rgba(0, 0, 0, 0.75)',
borderRadius: 6,
diff --git a/src/view/index.ts b/src/view/index.ts
index b8a13f7f..f06bdacc 100644
--- a/src/view/index.ts
+++ b/src/view/index.ts
@@ -8,6 +8,7 @@ import {faAngleUp} from '@fortawesome/free-solid-svg-icons/faAngleUp'
import {faArrowLeft} from '@fortawesome/free-solid-svg-icons/faArrowLeft'
import {faArrowRight} from '@fortawesome/free-solid-svg-icons/faArrowRight'
import {faArrowUp} from '@fortawesome/free-solid-svg-icons/faArrowUp'
+import {faArrowDown} from '@fortawesome/free-solid-svg-icons/faArrowDown'
import {faArrowRightFromBracket} from '@fortawesome/free-solid-svg-icons/faArrowRightFromBracket'
import {faArrowUpFromBracket} from '@fortawesome/free-solid-svg-icons/faArrowUpFromBracket'
import {faArrowUpRightFromSquare} from '@fortawesome/free-solid-svg-icons/faArrowUpRightFromSquare'
@@ -59,14 +60,17 @@ import {faPenNib} from '@fortawesome/free-solid-svg-icons/faPenNib'
import {faPenToSquare} from '@fortawesome/free-solid-svg-icons/faPenToSquare'
import {faPlus} from '@fortawesome/free-solid-svg-icons/faPlus'
import {faQuoteLeft} from '@fortawesome/free-solid-svg-icons/faQuoteLeft'
+import {faReply} from '@fortawesome/free-solid-svg-icons/faReply'
+import {faRetweet} from '@fortawesome/free-solid-svg-icons/faRetweet'
+import {faRss} from '@fortawesome/free-solid-svg-icons/faRss'
+import {faSatelliteDish} from '@fortawesome/free-solid-svg-icons/faSatelliteDish'
import {faShare} from '@fortawesome/free-solid-svg-icons/faShare'
import {faShareFromSquare} from '@fortawesome/free-solid-svg-icons/faShareFromSquare'
import {faShield} from '@fortawesome/free-solid-svg-icons/faShield'
import {faSquarePlus} from '@fortawesome/free-regular-svg-icons/faSquarePlus'
import {faSignal} from '@fortawesome/free-solid-svg-icons/faSignal'
-import {faReply} from '@fortawesome/free-solid-svg-icons/faReply'
-import {faRetweet} from '@fortawesome/free-solid-svg-icons/faRetweet'
-import {faRss} from '@fortawesome/free-solid-svg-icons/faRss'
+import {faTicket} from '@fortawesome/free-solid-svg-icons/faTicket'
+import {faTrashCan} from '@fortawesome/free-regular-svg-icons/faTrashCan'
import {faUser} from '@fortawesome/free-regular-svg-icons/faUser'
import {faUsers} from '@fortawesome/free-solid-svg-icons/faUsers'
import {faUserCheck} from '@fortawesome/free-solid-svg-icons/faUserCheck'
@@ -74,12 +78,11 @@ import {faUserSlash} from '@fortawesome/free-solid-svg-icons/faUserSlash'
import {faUserPlus} from '@fortawesome/free-solid-svg-icons/faUserPlus'
import {faUserXmark} from '@fortawesome/free-solid-svg-icons/faUserXmark'
import {faUsersSlash} from '@fortawesome/free-solid-svg-icons/faUsersSlash'
-import {faTicket} from '@fortawesome/free-solid-svg-icons/faTicket'
-import {faTrashCan} from '@fortawesome/free-regular-svg-icons/faTrashCan'
import {faX} from '@fortawesome/free-solid-svg-icons/faX'
import {faXmark} from '@fortawesome/free-solid-svg-icons/faXmark'
import {faPlay} from '@fortawesome/free-solid-svg-icons/faPlay'
import {faPause} from '@fortawesome/free-solid-svg-icons/faPause'
+import {faThumbtack} from '@fortawesome/free-solid-svg-icons/faThumbtack'
export function setup() {
library.add(
@@ -91,6 +94,7 @@ export function setup() {
faArrowLeft,
faArrowRight,
faArrowUp,
+ faArrowDown,
faArrowRightFromBracket,
faArrowUpFromBracket,
faArrowUpRightFromSquare,
@@ -145,6 +149,7 @@ export function setup() {
faReply,
faRetweet,
faRss,
+ faSatelliteDish,
faShare,
faShareFromSquare,
faShield,
@@ -159,6 +164,7 @@ export function setup() {
faUsersSlash,
faTicket,
faTrashCan,
+ faThumbtack,
faX,
faXmark,
faPlay,
diff --git a/src/view/screens/AppPasswords.tsx b/src/view/screens/AppPasswords.tsx
index 3adbf09d..ca60787d 100644
--- a/src/view/screens/AppPasswords.tsx
+++ b/src/view/screens/AppPasswords.tsx
@@ -1,6 +1,5 @@
import React from 'react'
import {StyleSheet, TouchableOpacity, View} from 'react-native'
-import {Alert} from 'view/com/util/Alert'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {ScrollView} from 'react-native-gesture-handler'
import {Text} from '../com/util/text/Text'
@@ -160,24 +159,15 @@ function AppPassword({
const store = useStores()
const onDelete = React.useCallback(async () => {
- Alert.alert(
- 'Delete App Password',
- `Are you sure you want to delete the app password "${name}"?`,
- [
- {
- text: 'Cancel',
- style: 'cancel',
- },
- {
- text: 'Delete',
- style: 'destructive',
- onPress: async () => {
- await store.me.deleteAppPassword(name)
- Toast.show('App password deleted')
- },
- },
- ],
- )
+ store.shell.openModal({
+ name: 'confirm',
+ title: 'Delete App Password',
+ message: `Are you sure you want to delete the app password "${name}"?`,
+ async onPressConfirm() {
+ await store.me.deleteAppPassword(name)
+ Toast.show('App password deleted')
+ },
+ })
}, [store, name])
const {contentLanguages} = store.preferences
diff --git a/src/view/screens/CustomFeed.tsx b/src/view/screens/CustomFeed.tsx
new file mode 100644
index 00000000..4149cd49
--- /dev/null
+++ b/src/view/screens/CustomFeed.tsx
@@ -0,0 +1,418 @@
+import React, {useMemo, useRef} from 'react'
+import {NativeStackScreenProps} from '@react-navigation/native-stack'
+import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
+import {usePalette} from 'lib/hooks/usePalette'
+import {HeartIcon, HeartIconSolid} from 'lib/icons'
+import {CommonNavigatorParams} from 'lib/routes/types'
+import {makeRecordUri} from 'lib/strings/url-helpers'
+import {colors, s} from 'lib/styles'
+import {observer} from 'mobx-react-lite'
+import {FlatList, StyleSheet, View} from 'react-native'
+import {useStores} from 'state/index'
+import {PostsFeedModel} from 'state/models/feeds/posts'
+import {useCustomFeed} from 'lib/hooks/useCustomFeed'
+import {withAuthRequired} from 'view/com/auth/withAuthRequired'
+import {Feed} from 'view/com/posts/Feed'
+import {pluralize} from 'lib/strings/helpers'
+import {TextLink} from 'view/com/util/Link'
+import {UserAvatar} from 'view/com/util/UserAvatar'
+import {ViewHeader} from 'view/com/util/ViewHeader'
+import {Button} from 'view/com/util/forms/Button'
+import {Text} from 'view/com/util/text/Text'
+import * as Toast from 'view/com/util/Toast'
+import {isDesktopWeb} from 'platform/detection'
+import {useSetTitle} from 'lib/hooks/useSetTitle'
+import {shareUrl} from 'lib/sharing'
+import {toShareUrl} from 'lib/strings/url-helpers'
+import {Haptics} from 'lib/haptics'
+import {ComposeIcon2} from 'lib/icons'
+import {FAB} from '../com/util/fab/FAB'
+import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn'
+import {DropdownButton, DropdownItem} from 'view/com/util/forms/DropdownButton'
+import {useOnMainScroll} from 'lib/hooks/useOnMainScroll'
+import {EmptyState} from 'view/com/util/EmptyState'
+
+type Props = NativeStackScreenProps
+export const CustomFeedScreen = withAuthRequired(
+ observer(({route}: Props) => {
+ const store = useStores()
+ const pal = usePalette('default')
+ const {rkey, name} = route.params
+ const uri = useMemo(
+ () => makeRecordUri(name, 'app.bsky.feed.generator', rkey),
+ [rkey, name],
+ )
+ const scrollElRef = useRef(null)
+ const currentFeed = useCustomFeed(uri)
+ const algoFeed: PostsFeedModel = useMemo(() => {
+ const feed = new PostsFeedModel(store, 'custom', {
+ feed: uri,
+ })
+ feed.setup()
+ return feed
+ }, [store, uri])
+ const isPinned = store.me.savedFeeds.isPinned(uri)
+ const [onMainScroll, isScrolledDown, resetMainScroll] =
+ useOnMainScroll(store)
+ useSetTitle(currentFeed?.displayName)
+
+ const onToggleSaved = React.useCallback(async () => {
+ try {
+ Haptics.default()
+ if (currentFeed?.isSaved) {
+ await currentFeed?.unsave()
+ } else {
+ await currentFeed?.save()
+ }
+ } catch (err) {
+ Toast.show(
+ 'There was an an issue updating your feeds, please check your internet connection and try again.',
+ )
+ store.log.error('Failed up update feeds', {err})
+ }
+ }, [store, currentFeed])
+
+ const onToggleLiked = React.useCallback(async () => {
+ Haptics.default()
+ try {
+ if (currentFeed?.isLiked) {
+ await currentFeed?.unlike()
+ } else {
+ await currentFeed?.like()
+ }
+ } catch (err) {
+ Toast.show(
+ 'There was an an issue contacting the server, please check your internet connection and try again.',
+ )
+ store.log.error('Failed up toggle like', {err})
+ }
+ }, [store, currentFeed])
+
+ const onTogglePinned = React.useCallback(async () => {
+ Haptics.default()
+ store.me.savedFeeds.togglePinnedFeed(currentFeed!).catch(e => {
+ Toast.show('There was an issue contacting the server')
+ store.log.error('Failed to toggle pinned feed', {e})
+ })
+ }, [store, currentFeed])
+
+ const onPressShare = React.useCallback(() => {
+ const url = toShareUrl(`/profile/${name}/feed/${rkey}`)
+ shareUrl(url)
+ }, [name, rkey])
+
+ const onScrollToTop = React.useCallback(() => {
+ scrollElRef.current?.scrollToOffset({offset: 0, animated: true})
+ resetMainScroll()
+ }, [scrollElRef, resetMainScroll])
+
+ const onPressCompose = React.useCallback(() => {
+ store.shell.openComposer({})
+ }, [store])
+
+ const dropdownItems: DropdownItem[] = React.useMemo(() => {
+ let items: DropdownItem[] = [
+ {
+ testID: 'feedHeaderDropdownRemoveBtn',
+ label: 'Remove from my feeds',
+ onPress: onToggleSaved,
+ },
+ {
+ testID: 'feedHeaderDropdownShareBtn',
+ label: 'Share link',
+ onPress: onPressShare,
+ },
+ ]
+ return items
+ }, [onToggleSaved, onPressShare])
+
+ const renderHeaderBtns = React.useCallback(() => {
+ return (
+
+
+ {currentFeed?.isLiked ? (
+
+ ) : (
+
+ )}
+
+ {currentFeed?.isSaved ? (
+
+
+
+ ) : undefined}
+ {currentFeed?.isSaved ? (
+
+
+
+ ) : (
+
+
+
+ Add to My Feeds
+
+
+ )}
+
+ )
+ }, [
+ pal,
+ currentFeed?.isSaved,
+ currentFeed?.isLiked,
+ isPinned,
+ onToggleSaved,
+ onTogglePinned,
+ onToggleLiked,
+ dropdownItems,
+ ])
+
+ const renderListHeaderComponent = React.useCallback(() => {
+ return (
+ <>
+
+
+
+ {currentFeed?.displayName}
+
+ {currentFeed && (
+
+ by{' '}
+ {currentFeed.data.creator.did === store.me.did ? (
+ 'you'
+ ) : (
+
+ )}
+
+ )}
+ {isDesktopWeb && (
+
+
+
+
+
+
+ {currentFeed?.isLiked ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+ )}
+
+
+
+
+
+
+ {currentFeed?.data.description ? (
+
+ {currentFeed.data.description}
+
+ ) : null}
+
+ {currentFeed ? (
+
+ ) : null}
+
+
+
+
+
+ Feed
+
+
+
+ >
+ )
+ }, [
+ pal,
+ currentFeed,
+ store.me.did,
+ onToggleSaved,
+ onToggleLiked,
+ onPressShare,
+ name,
+ rkey,
+ isPinned,
+ onTogglePinned,
+ ])
+
+ const renderEmptyState = React.useCallback(() => {
+ return
+ }, [])
+
+ return (
+
+
+
+ {isScrolledDown ? (
+
+ ) : null}
+ }
+ accessibilityRole="button"
+ accessibilityLabel="Compose post"
+ accessibilityHint=""
+ />
+
+ )
+ }),
+)
+
+const styles = StyleSheet.create({
+ header: {
+ flexDirection: 'row',
+ gap: 12,
+ paddingHorizontal: 16,
+ paddingTop: 12,
+ paddingBottom: 16,
+ borderTopWidth: 1,
+ },
+ headerBtns: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ },
+ headerBtnsDesktop: {
+ marginTop: 8,
+ gap: 4,
+ },
+ headerAddBtn: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 4,
+ paddingLeft: 4,
+ },
+ headerDetails: {
+ paddingHorizontal: 16,
+ paddingBottom: 16,
+ },
+ headerDetailsFooter: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ },
+ fakeSelector: {
+ flexDirection: 'row',
+ paddingHorizontal: isDesktopWeb ? 16 : 6,
+ },
+ fakeSelectorItem: {
+ paddingHorizontal: 12,
+ paddingBottom: 8,
+ borderBottomWidth: 3,
+ },
+ liked: {
+ color: colors.red3,
+ },
+ top1: {
+ position: 'relative',
+ top: 1,
+ },
+ top2: {
+ position: 'relative',
+ top: 2,
+ },
+})
diff --git a/src/view/screens/CustomFeedLikedBy.tsx b/src/view/screens/CustomFeedLikedBy.tsx
new file mode 100644
index 00000000..49d0d048
--- /dev/null
+++ b/src/view/screens/CustomFeedLikedBy.tsx
@@ -0,0 +1,29 @@
+import React from 'react'
+import {View} from 'react-native'
+import {useFocusEffect} from '@react-navigation/native'
+import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types'
+import {withAuthRequired} from 'view/com/auth/withAuthRequired'
+import {ViewHeader} from '../com/util/ViewHeader'
+import {PostLikedBy as PostLikedByComponent} from '../com/post-thread/PostLikedBy'
+import {useStores} from 'state/index'
+import {makeRecordUri} from 'lib/strings/url-helpers'
+
+type Props = NativeStackScreenProps
+export const CustomFeedLikedByScreen = withAuthRequired(({route}: Props) => {
+ const store = useStores()
+ const {name, rkey} = route.params
+ const uri = makeRecordUri(name, 'app.bsky.feed.generator', rkey)
+
+ useFocusEffect(
+ React.useCallback(() => {
+ store.shell.setMinimalShellMode(false)
+ }, [store]),
+ )
+
+ return (
+
+
+
+
+ )
+})
diff --git a/src/view/screens/DiscoverFeeds.tsx b/src/view/screens/DiscoverFeeds.tsx
new file mode 100644
index 00000000..cd32ec65
--- /dev/null
+++ b/src/view/screens/DiscoverFeeds.tsx
@@ -0,0 +1,112 @@
+import React from 'react'
+import {RefreshControl, StyleSheet, View} from 'react-native'
+import {observer} from 'mobx-react-lite'
+import {useFocusEffect} from '@react-navigation/native'
+import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types'
+import {withAuthRequired} from 'view/com/auth/withAuthRequired'
+import {ViewHeader} from '../com/util/ViewHeader'
+import {useStores} from 'state/index'
+import {FeedsDiscoveryModel} from 'state/models/discovery/feeds'
+import {CenteredView, FlatList} from 'view/com/util/Views'
+import {CustomFeed} from 'view/com/feeds/CustomFeed'
+import {Text} from 'view/com/util/text/Text'
+import {isDesktopWeb} from 'platform/detection'
+import {usePalette} from 'lib/hooks/usePalette'
+import {s} from 'lib/styles'
+
+type Props = NativeStackScreenProps
+export const DiscoverFeedsScreen = withAuthRequired(
+ observer(({}: Props) => {
+ const store = useStores()
+ const pal = usePalette('default')
+ const feeds = React.useMemo(() => new FeedsDiscoveryModel(store), [store])
+
+ useFocusEffect(
+ React.useCallback(() => {
+ store.shell.setMinimalShellMode(false)
+ feeds.refresh()
+ }, [store, feeds]),
+ )
+
+ const onRefresh = React.useCallback(() => {
+ store.me.savedFeeds.refresh()
+ }, [store])
+
+ const renderListEmptyComponent = React.useCallback(() => {
+ return (
+
+
+ {feeds.isLoading
+ ? 'Loading...'
+ : `We can't find any feeds for some reason. This is probably an error - try refreshing!`}
+
+
+ )
+ }, [pal, feeds.isLoading])
+
+ const renderItem = React.useCallback(
+ ({item}) => (
+
+ ),
+ [],
+ )
+
+ return (
+
+
+
+
+ item.data.uri}
+ contentContainerStyle={styles.contentContainer}
+ refreshControl={
+
+ }
+ renderItem={renderItem}
+ initialNumToRender={10}
+ ListEmptyComponent={renderListEmptyComponent}
+ extraData={feeds.isLoading}
+ />
+
+ )
+ }),
+)
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ contentContainer: {
+ paddingBottom: 100,
+ },
+ containerDesktop: {
+ borderLeftWidth: 1,
+ borderRightWidth: 1,
+ },
+ empty: {
+ paddingHorizontal: 18,
+ paddingVertical: 16,
+ borderRadius: 8,
+ marginHorizontal: 18,
+ marginTop: 10,
+ },
+})
diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx
new file mode 100644
index 00000000..169f8879
--- /dev/null
+++ b/src/view/screens/Feeds.tsx
@@ -0,0 +1,126 @@
+import React from 'react'
+import {StyleSheet, View} from 'react-native'
+import {useFocusEffect} from '@react-navigation/native'
+import isEqual from 'lodash.isequal'
+import {withAuthRequired} from 'view/com/auth/withAuthRequired'
+import {FlatList} from 'view/com/util/Views'
+import {ViewHeader} from 'view/com/util/ViewHeader'
+import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn'
+import {FAB} from 'view/com/util/fab/FAB'
+import {Link} from 'view/com/util/Link'
+import {NativeStackScreenProps, FeedsTabNavigatorParams} from 'lib/routes/types'
+import {observer} from 'mobx-react-lite'
+import {PostsMultiFeedModel} from 'state/models/feeds/multi-feed'
+import {MultiFeed} from 'view/com/posts/MultiFeed'
+import {isDesktopWeb} from 'platform/detection'
+import {usePalette} from 'lib/hooks/usePalette'
+import {useStores} from 'state/index'
+import {useOnMainScroll} from 'lib/hooks/useOnMainScroll'
+import {ComposeIcon2, CogIcon} from 'lib/icons'
+import {s} from 'lib/styles'
+
+const HEADER_OFFSET = isDesktopWeb ? 0 : 40
+
+type Props = NativeStackScreenProps
+export const FeedsScreen = withAuthRequired(
+ observer(({}: Props) => {
+ const pal = usePalette('default')
+ const store = useStores()
+ const flatListRef = React.useRef(null)
+ const multifeed = React.useMemo(
+ () => new PostsMultiFeedModel(store),
+ [store],
+ )
+ const [onMainScroll, isScrolledDown, resetMainScroll] =
+ useOnMainScroll(store)
+
+ const onSoftReset = React.useCallback(() => {
+ flatListRef.current?.scrollToOffset({offset: 0})
+ resetMainScroll()
+ }, [flatListRef, resetMainScroll])
+
+ useFocusEffect(
+ React.useCallback(() => {
+ const softResetSub = store.onScreenSoftReset(onSoftReset)
+ const multifeedCleanup = multifeed.registerListeners()
+ const cleanup = () => {
+ softResetSub.remove()
+ multifeedCleanup()
+ }
+
+ store.shell.setMinimalShellMode(false)
+ return cleanup
+ }, [store, multifeed, onSoftReset]),
+ )
+
+ React.useEffect(() => {
+ if (
+ isEqual(
+ multifeed.feedInfos.map(f => f.uri),
+ store.me.savedFeeds.all.map(f => f.uri),
+ )
+ ) {
+ // no changes
+ return
+ }
+ multifeed.refresh()
+ }, [multifeed, store.me.savedFeeds.all])
+
+ const onPressCompose = React.useCallback(() => {
+ store.shell.openComposer({})
+ }, [store])
+
+ const renderHeaderBtn = React.useCallback(() => {
+ return (
+
+
+
+ )
+ }, [pal])
+
+ return (
+
+
+
+ {isScrolledDown ? (
+
+ ) : null}
+ }
+ accessibilityRole="button"
+ accessibilityLabel="Compose post"
+ accessibilityHint=""
+ />
+
+ )
+ }),
+)
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+})
diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx
index 0ead6b65..d7a2aa23 100644
--- a/src/view/screens/Home.tsx
+++ b/src/view/screens/Home.tsx
@@ -1,18 +1,20 @@
import React from 'react'
import {FlatList, View} from 'react-native'
import {useFocusEffect, useIsFocused} from '@react-navigation/native'
+import {AppBskyFeedGetFeed as GetCustomFeed} from '@atproto/api'
import {observer} from 'mobx-react-lite'
import useAppState from 'react-native-appstate-hook'
+import isEqual from 'lodash.isequal'
import {NativeStackScreenProps, HomeTabNavigatorParams} from 'lib/routes/types'
import {PostsFeedModel} from 'state/models/feeds/posts'
import {withAuthRequired} from 'view/com/auth/withAuthRequired'
import {useTabFocusEffect} from 'lib/hooks/useTabFocusEffect'
import {Feed} from '../com/posts/Feed'
import {FollowingEmptyState} from 'view/com/posts/FollowingEmptyState'
-import {WhatsHotEmptyState} from 'view/com/posts/WhatsHotEmptyState'
+import {CustomFeedEmptyState} from 'view/com/posts/CustomFeedEmptyState'
import {LoadLatestBtn} from '../com/util/load-latest/LoadLatestBtn'
import {FeedsTabBar} from '../com/pager/FeedsTabBar'
-import {Pager, RenderTabBarFnProps} from 'view/com/pager/Pager'
+import {Pager, PagerRef, RenderTabBarFnProps} from 'view/com/pager/Pager'
import {FAB} from '../com/util/fab/FAB'
import {useStores} from 'state/index'
import {s} from 'lib/styles'
@@ -21,30 +23,37 @@ import {useAnalytics} from 'lib/analytics'
import {ComposeIcon2} from 'lib/icons'
import {isDesktopWeb} from 'platform/detection'
-const HEADER_OFFSET = isDesktopWeb ? 50 : 40
+const HEADER_OFFSET = isDesktopWeb ? 50 : 78
const POLL_FREQ = 30e3 // 30sec
type Props = NativeStackScreenProps
export const HomeScreen = withAuthRequired(
observer((_opts: Props) => {
const store = useStores()
+ const pagerRef = React.useRef(null)
const [selectedPage, setSelectedPage] = React.useState(0)
- const [initialLanguages] = React.useState(
- store.preferences.contentLanguages,
- )
-
- const algoFeed: PostsFeedModel = React.useMemo(() => {
- const feed = new PostsFeedModel(store, 'goodstuff', {})
- feed.setup()
- return feed
- }, [store])
+ const [customFeeds, setCustomFeeds] = React.useState([])
React.useEffect(() => {
- // refresh whats hot when lang preferences change
- if (initialLanguages !== store.preferences.contentLanguages) {
- algoFeed.refresh()
+ const {pinned} = store.me.savedFeeds
+ if (
+ isEqual(
+ pinned.map(p => p.uri),
+ customFeeds.map(f => (f.params as GetCustomFeed.QueryParams).feed),
+ )
+ ) {
+ // no changes
+ return
}
- }, [initialLanguages, store.preferences.contentLanguages, algoFeed])
+
+ const feeds = []
+ for (const feed of pinned) {
+ const model = new PostsFeedModel(store, 'custom', {feed: feed.uri})
+ model.setup()
+ feeds.push(model)
+ }
+ setCustomFeeds(feeds)
+ }, [store, store.me.savedFeeds.pinned, customFeeds, setCustomFeeds])
useFocusEffect(
React.useCallback(() => {
@@ -86,18 +95,17 @@ export const HomeScreen = withAuthRequired(
return
}, [])
- const renderWhatsHotEmptyState = React.useCallback(() => {
- return
+ const renderCustomFeedEmptyState = React.useCallback(() => {
+ return
}, [])
- const initialPage = store.me.followsCount === 0 ? 1 : 0
return (
+ tabBarPosition="top">
-
+ {customFeeds.map((f, index) => {
+ return (
+
+ )
+ })}
)
}),
@@ -130,7 +142,8 @@ const FeedPage = observer(
renderEmptyState?: () => JSX.Element
}) => {
const store = useStores()
- const onMainScroll = useOnMainScroll(store)
+ const [onMainScroll, isScrolledDown, resetMainScroll] =
+ useOnMainScroll(store)
const {screen, track} = useAnalytics()
const scrollElRef = React.useRef(null)
const {appState} = useAppState({
@@ -158,12 +171,13 @@ const FeedPage = observer(
const scrollToTop = React.useCallback(() => {
scrollElRef.current?.scrollToOffset({offset: -HEADER_OFFSET})
- }, [scrollElRef])
+ resetMainScroll()
+ }, [scrollElRef, resetMainScroll])
const onSoftReset = React.useCallback(() => {
if (isPageFocused) {
- feed.refresh()
scrollToTop()
+ feed.refresh()
}
}, [isPageFocused, scrollToTop, feed])
@@ -188,7 +202,7 @@ const FeedPage = observer(
}
}, [store, doPoll, onSoftReset, screen, feed]),
)
- // fires when tab is actived/deactivated
+ // fires when tab is activated/deactivated
// - check for latest
useTabFocusEffect(
'Home',
@@ -224,6 +238,7 @@ const FeedPage = observer(
feed.refresh()
}, [feed, scrollToTop])
+ const hasNew = feed.hasNewLatest && !feed.isRefreshing
return (
- {feed.hasNewLatest && !feed.isRefreshing && (
-
+ {(isScrolledDown || hasNew) && (
+
)}
item.did}
+ keyExtractor={item => item.did}
refreshControl={
{
const store = useStores()
- const onMainScroll = useOnMainScroll(store)
+ const [onMainScroll, isScrolledDown, resetMainScroll] =
+ useOnMainScroll(store)
const scrollElRef = React.useRef(null)
const {screen} = useAnalytics()
@@ -37,7 +38,8 @@ export const NotificationsScreen = withAuthRequired(
const scrollToTop = React.useCallback(() => {
scrollElRef.current?.scrollToOffset({offset: 0})
- }, [scrollElRef])
+ resetMainScroll()
+ }, [scrollElRef, resetMainScroll])
const onPressLoadLatest = React.useCallback(() => {
scrollToTop()
@@ -86,6 +88,9 @@ export const NotificationsScreen = withAuthRequired(
),
)
+ const hasNew =
+ store.me.notifications.hasNewLatest &&
+ !store.me.notifications.isRefreshing
return (
@@ -96,10 +101,14 @@ export const NotificationsScreen = withAuthRequired(
onScroll={onMainScroll}
scrollElRef={scrollElRef}
/>
- {store.me.notifications.hasNewLatest &&
- !store.me.notifications.isRefreshing && (
-
- )}
+ {(isScrolledDown || hasNew) && (
+
+ )}
)
}),
diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx
index b6d92e46..a34ceb32 100644
--- a/src/view/screens/Profile.tsx
+++ b/src/view/screens/Profile.tsx
@@ -9,7 +9,7 @@ import {CenteredView} from '../com/util/Views'
import {ScreenHider} from 'view/com/util/moderation/ScreenHider'
import {ProfileUiModel, Sections} from 'state/models/ui/profile'
import {useStores} from 'state/index'
-import {PostsFeedSliceModel} from 'state/models/feeds/posts'
+import {PostsFeedSliceModel} from 'state/models/feeds/post'
import {ProfileHeader} from '../com/profile/ProfileHeader'
import {FeedSlice} from '../com/posts/FeedSlice'
import {ListCard} from 'view/com/lists/ListCard'
@@ -25,6 +25,8 @@ import {FAB} from '../com/util/fab/FAB'
import {s, colors} from 'lib/styles'
import {useAnalytics} from 'lib/analytics'
import {ComposeIcon2} from 'lib/icons'
+import {CustomFeed} from 'view/com/feeds/CustomFeed'
+import {CustomFeedModel} from 'state/models/feeds/custom-feed'
import {useSetTitle} from 'lib/hooks/useSetTitle'
import {combinedDisplayName} from 'lib/strings/display-names'
@@ -45,6 +47,10 @@ export const ProfileScreen = withAuthRequired(
)
useSetTitle(combinedDisplayName(uiState.profile))
+ useEffect(() => {
+ setHasSetup(false)
+ }, [route.params.name])
+
useFocusEffect(
React.useCallback(() => {
let aborted = false
@@ -118,6 +124,7 @@ export const ProfileScreen = withAuthRequired(
}, [uiState.showLoadingMoreFooter])
const renderItem = React.useCallback(
(item: any) => {
+ // if section is lists
if (uiState.selectedView === Sections.Lists) {
if (item === ProfileUiModel.LOADING_ITEM) {
return
@@ -142,6 +149,32 @@ export const ProfileScreen = withAuthRequired(
} else {
return
}
+ // if section is custom algorithms
+ } else if (uiState.selectedView === Sections.CustomAlgorithms) {
+ if (item === ProfileUiModel.LOADING_ITEM) {
+ return
+ } else if (item._reactKey === '__error__') {
+ return (
+
+
+
+ )
+ } else if (item === ProfileUiModel.EMPTY_ITEM) {
+ return (
+
+ )
+ } else if (item instanceof CustomFeedModel) {
+ return
+ }
+ // if section is posts or posts & replies
} else {
if (item === ProfileUiModel.END_ITEM) {
return - end of feed -
diff --git a/src/view/screens/ProfileList.tsx b/src/view/screens/ProfileList.tsx
index 01f27bae..7c3ed831 100644
--- a/src/view/screens/ProfileList.tsx
+++ b/src/view/screens/ProfileList.tsx
@@ -87,7 +87,7 @@ export const ProfileListScreen = withAuthRequired(
return
}, [])
- const renderHeaderBtn = React.useCallback(() => {
+ const renderHeaderBtns = React.useCallback(() => {
return (
{list?.isOwner && (
@@ -148,7 +148,7 @@ export const ProfileListScreen = withAuthRequired(
pal.border,
]}
testID="moderationMutelistsScreen">
-
+
+
+export const SavedFeeds = withAuthRequired(
+ observer(({}: Props) => {
+ const pal = usePalette('default')
+ const store = useStores()
+ const {screen} = useAnalytics()
+
+ const savedFeeds = useMemo(() => store.me.savedFeeds, [store])
+ useFocusEffect(
+ useCallback(() => {
+ screen('SavedFeeds')
+ store.shell.setMinimalShellMode(false)
+ savedFeeds.refresh()
+ }, [screen, store, savedFeeds]),
+ )
+
+ const renderListEmptyComponent = useCallback(() => {
+ return (
+
+
+ You don't have any saved feeds.
+
+
+ )
+ }, [pal])
+
+ const renderListFooterComponent = useCallback(() => {
+ return (
+ <>
+
+
+
+
+ Discover new feeds
+
+
+
+
+
+ Feeds are custom algorithms that users build with a little coding
+ expertise.{' '}
+ {' '}
+ for more information.
+
+
+ {savedFeeds.isLoading && }
+ >
+ )
+ }, [pal, savedFeeds.isLoading])
+
+ const onRefresh = useCallback(() => savedFeeds.refresh(), [savedFeeds])
+
+ const onDragEnd = useCallback(
+ async ({data}) => {
+ try {
+ await savedFeeds.reorderPinnedFeeds(data)
+ } catch (e) {
+ Toast.show('There was an issue contacting the server')
+ store.log.error('Failed to save pinned feed order', {e})
+ }
+ },
+ [savedFeeds, store],
+ )
+
+ return (
+
+
+ item.data.uri}
+ refreshing={savedFeeds.isRefreshing}
+ refreshControl={
+
+ }
+ renderItem={({item, drag}) => }
+ getItemLayout={(data, index) => ({
+ length: 77,
+ offset: 77 * index,
+ index,
+ })}
+ initialNumToRender={10}
+ ListFooterComponent={renderListFooterComponent}
+ ListEmptyComponent={renderListEmptyComponent}
+ extraData={savedFeeds.isLoading}
+ onDragEnd={onDragEnd}
+ />
+
+ )
+ }),
+)
+
+const ListItem = observer(
+ ({item, drag}: {item: CustomFeedModel; drag: () => void}) => {
+ const pal = usePalette('default')
+ const store = useStores()
+ const savedFeeds = useMemo(() => store.me.savedFeeds, [store])
+ const isPinned = savedFeeds.isPinned(item)
+
+ const onTogglePinned = useCallback(() => {
+ Haptics.default()
+ savedFeeds.togglePinnedFeed(item).catch(e => {
+ Toast.show('There was an issue contacting the server')
+ store.log.error('Failed to toggle pinned feed', {e})
+ })
+ }, [savedFeeds, item, store])
+ const onPressUp = useCallback(
+ () =>
+ savedFeeds.movePinnedFeed(item, 'up').catch(e => {
+ Toast.show('There was an issue contacting the server')
+ store.log.error('Failed to set pinned feed order', {e})
+ }),
+ [store, savedFeeds, item],
+ )
+ const onPressDown = useCallback(
+ () =>
+ savedFeeds.movePinnedFeed(item, 'down').catch(e => {
+ Toast.show('There was an issue contacting the server')
+ store.log.error('Failed to set pinned feed order', {e})
+ }),
+ [store, savedFeeds, item],
+ )
+
+ return (
+
+
+
+ {isPinned && isWeb ? (
+
+
+
+
+
+
+
+
+ ) : isPinned ? (
+
+ ) : null}
+
+
+
+
+
+
+
+ )
+ },
+)
+
+const styles = StyleSheet.create({
+ desktopContainer: {
+ borderLeftWidth: 1,
+ borderRightWidth: 1,
+ minHeight: '100vh',
+ },
+ empty: {
+ paddingHorizontal: 20,
+ paddingVertical: 20,
+ borderRadius: 16,
+ marginHorizontal: 24,
+ marginTop: 10,
+ },
+ itemContainer: {
+ flex: 1,
+ flexDirection: 'row',
+ alignItems: 'center',
+ borderBottomWidth: 1,
+ paddingRight: 16,
+ },
+ webArrowButtonsContainer: {
+ paddingLeft: 16,
+ flexDirection: 'column',
+ justifyContent: 'space-around',
+ },
+ webArrowUpButton: {
+ marginBottom: 10,
+ },
+ noBorder: {
+ borderTopWidth: 0,
+ },
+ footerText: {
+ paddingHorizontal: 26,
+ paddingTop: 22,
+ paddingBottom: 100,
+ },
+ footerLinks: {
+ borderBottomWidth: 1,
+ borderTopWidth: 0,
+ },
+ footerLink: {
+ flexDirection: 'row',
+ paddingHorizontal: 26,
+ paddingVertical: 18,
+ gap: 18,
+ },
+})
diff --git a/src/view/screens/SearchMobile.tsx b/src/view/screens/SearchMobile.tsx
index f9b4864b..c9d09373 100644
--- a/src/view/screens/SearchMobile.tsx
+++ b/src/view/screens/SearchMobile.tsx
@@ -35,7 +35,7 @@ export const SearchScreen = withAuthRequired(
const store = useStores()
const scrollViewRef = React.useRef(null)
const flatListRef = React.useRef(null)
- const onMainScroll = useOnMainScroll(store)
+ const [onMainScroll] = useOnMainScroll(store)
const [isInputFocused, setIsInputFocused] = React.useState(false)
const [query, setQuery] = React.useState('')
const autocompleteView = React.useMemo(
diff --git a/src/view/screens/Settings.tsx b/src/view/screens/Settings.tsx
index b222d7db..3f6fa84d 100644
--- a/src/view/screens/Settings.tsx
+++ b/src/view/screens/Settings.tsx
@@ -142,6 +142,11 @@ export const SettingsScreen = withAuthRequired(
store.shell.openModal({name: 'delete-account'})
}, [store])
+ const onPressResetPreferences = React.useCallback(async () => {
+ await store.preferences.reset()
+ Toast.show('Preferences reset')
+ }, [store])
+
return (
@@ -330,6 +335,22 @@ export const SettingsScreen = withAuthRequired(
App passwords
+
+
+
+
+
+ Saved Feeds
+
+
+ {__DEV__ ? (
+
+
+ Reset preferences state
+
+
+ ) : null}
- Build version {AppInfo.appVersion} ({AppInfo.buildVersion})
+ Build version {AppInfo.appVersion}
diff --git a/src/view/shell/Drawer.tsx b/src/view/shell/Drawer.tsx
index 79c713e2..cf863933 100644
--- a/src/view/shell/Drawer.tsx
+++ b/src/view/shell/Drawer.tsx
@@ -2,6 +2,7 @@ import React, {ComponentProps} from 'react'
import {
Linking,
SafeAreaView,
+ ScrollView,
StyleProp,
StyleSheet,
TouchableOpacity,
@@ -27,6 +28,8 @@ import {
MagnifyingGlassIcon2,
MagnifyingGlassIcon2Solid,
UserIconSolid,
+ SatelliteDishIcon,
+ SatelliteDishIconSolid,
HandIcon,
} from 'lib/icons'
import {UserAvatar} from 'view/com/util/UserAvatar'
@@ -39,7 +42,7 @@ import {getTabState, TabState} from 'lib/routes/helpers'
import {NavigationProp} from 'lib/routes/types'
import {useNavigationTabState} from 'lib/hooks/useNavigationTabState'
import {isWeb} from 'platform/detection'
-import {formatCount} from 'view/com/util/numeric/format'
+import {formatCount, formatCountShortOnly} from 'view/com/util/numeric/format'
export const DrawerContent = observer(() => {
const theme = useTheme()
@@ -47,7 +50,7 @@ export const DrawerContent = observer(() => {
const store = useStores()
const navigation = useNavigation()
const {track} = useAnalytics()
- const {isAtHome, isAtSearch, isAtNotifications, isAtMyProfile} =
+ const {isAtHome, isAtSearch, isAtFeeds, isAtNotifications, isAtMyProfile} =
useNavigationTabState()
const {notifications} = store.me
@@ -94,6 +97,11 @@ export const DrawerContent = observer(() => {
onPressTab('MyProfile')
}, [onPressTab])
+ const onPressMyFeeds = React.useCallback(
+ () => onPressTab('Feeds'),
+ [onPressTab],
+ )
+
const onPressModeration = React.useCallback(() => {
track('Menu:ItemClicked', {url: 'Moderation'})
navigation.navigate('Moderation')
@@ -140,19 +148,18 @@ export const DrawerContent = observer(() => {
type="xl"
style={[pal.textLight, styles.profileCardFollowers]}>
- {formatCount(store.me.followersCount ?? 0)}
+ {formatCountShortOnly(store.me.followersCount ?? 0)}
{' '}
{pluralize(store.me.followersCount || 0, 'follower')} ·{' '}
- {formatCount(store.me.followsCount ?? 0)}
+ {formatCountShortOnly(store.me.followsCount ?? 0)}
{' '}
following
-
-
+
{
/>
+ isAtFeeds ? (
+
+ ) : (
+
+ )
}
+ label="My Feeds"
+ accessibilityLabel="My Feeds"
+ accessibilityHint=""
+ onPress={onPressMyFeeds}
+ />
+ }
label="Moderation"
accessibilityLabel="Moderation"
accessibilityHint=""
@@ -271,8 +293,8 @@ export const DrawerContent = observer(() => {
accessibilityHint=""
onPress={onPressSettings}
/>
-
-
+
+
{
const store = useStores()
const pal = usePalette('default')
const safeAreaInsets = useSafeAreaInsets()
const {track} = useAnalytics()
- const {isAtHome, isAtSearch, isAtNotifications, isAtMyProfile} =
+ const {isAtHome, isAtSearch, isAtFeeds, isAtNotifications, isAtMyProfile} =
useNavigationTabState()
const {footerMinimalShellTransform} = useMinimalShellMode()
@@ -60,6 +61,10 @@ export const BottomBar = observer(({navigation}: BottomTabBarProps) => {
() => onPressTab('Search'),
[onPressTab],
)
+ const onPressFeeds = React.useCallback(
+ () => onPressTab('Feeds'),
+ [onPressTab],
+ )
const onPressNotifications = React.useCallback(
() => onPressTab('Notifications'),
[onPressTab],
@@ -121,6 +126,28 @@ export const BottomBar = observer(({navigation}: BottomTabBarProps) => {
accessibilityLabel="Search"
accessibilityHint=""
/>
+
+ ) : (
+
+ )
+ }
+ onPress={onPressFeeds}
+ accessibilityRole="tab"
+ accessibilityLabel="Feeds"
+ accessibilityHint=""
+ />
{
icon={
{isAtMyProfile ? (
-
+
+
+
) : (
-
+
+
+
)}
}
diff --git a/src/view/shell/bottom-bar/BottomBarStyles.tsx b/src/view/shell/bottom-bar/BottomBarStyles.tsx
index 3d5adbc9..2414b991 100644
--- a/src/view/shell/bottom-bar/BottomBarStyles.tsx
+++ b/src/view/shell/bottom-bar/BottomBarStyles.tsx
@@ -58,4 +58,9 @@ export const styles = StyleSheet.create({
profileIcon: {
top: -4,
},
+ onProfile: {
+ borderColor: colors.black,
+ borderWidth: 1,
+ borderRadius: 100,
+ },
})
diff --git a/src/view/shell/bottom-bar/BottomBarWeb.tsx b/src/view/shell/bottom-bar/BottomBarWeb.tsx
index b7daac5a..cbaafd1f 100644
--- a/src/view/shell/bottom-bar/BottomBarWeb.tsx
+++ b/src/view/shell/bottom-bar/BottomBarWeb.tsx
@@ -15,6 +15,8 @@ import {
HomeIconSolid,
MagnifyingGlassIcon2,
MagnifyingGlassIcon2Solid,
+ SatelliteDishIcon,
+ SatelliteDishIconSolid,
UserIcon,
} from 'lib/icons'
import {Link} from 'view/com/util/Link'
@@ -61,6 +63,18 @@ export const BottomBarWeb = observer(() => {
)
}}
+
+ {({isActive}) => {
+ const Icon = isActive ? SatelliteDishIconSolid : SatelliteDishIcon
+ return (
+
+ )
+ }}
+
{({isActive}) => {
const Icon = isActive ? BellIconSolid : BellIcon
diff --git a/src/view/shell/desktop/LeftNav.tsx b/src/view/shell/desktop/LeftNav.tsx
index ba48dd2a..914dfb53 100644
--- a/src/view/shell/desktop/LeftNav.tsx
+++ b/src/view/shell/desktop/LeftNav.tsx
@@ -30,6 +30,8 @@ import {
CogIconSolid,
ComposeIcon2,
HandIcon,
+ SatelliteDishIcon,
+ SatelliteDishIconSolid,
} from 'lib/icons'
import {getCurrentRoute, isTab, isStateAtTabRoot} from 'lib/routes/helpers'
import {NavigationProp} from 'lib/routes/types'
@@ -89,14 +91,17 @@ const NavItem = observer(
const pal = usePalette('default')
const store = useStores()
const [pathName] = React.useMemo(() => router.matchPath(href), [href])
- const currentRouteName = useNavigationState(state => {
+ const currentRouteInfo = useNavigationState(state => {
if (!state) {
- return 'Home'
+ return {name: 'Home'}
}
- return getCurrentRoute(state).name
+ return getCurrentRoute(state)
})
-
- const isCurrent = isTab(currentRouteName, pathName)
+ let isCurrent =
+ currentRouteInfo.name === 'Profile'
+ ? isTab(currentRouteInfo.name, pathName) &&
+ currentRouteInfo.params.name === store.me.handle
+ : isTab(currentRouteInfo.name, pathName)
const {onPress} = useLinkProps({to: href})
const onPressWrapped = React.useCallback(
(e: React.MouseEvent) => {
@@ -195,6 +200,24 @@ export const DesktopLeftNav = observer(function DesktopLeftNav() {
}
label="Search"
/>
+
+ }
+ iconFilled={
+
+ }
+ label="My Feeds"
+ />
{
- {isDesktop && (
+ {isDesktop && store.session.hasSession && (
<>
diff --git a/yarn.lock b/yarn.lock
index 541f5870..a8b2f27e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -30,9 +30,9 @@
leven "^3.1.0"
"@atproto/api@*":
- version "0.2.11"
- resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.2.11.tgz#53b70b0f4942b2e2dd5cb46433f133cde83917bf"
- integrity sha512-5JY1Ii/81Bcy1ZTGRqALsaOdc8fIJTSlMNoSptpGH73uAPQE93weDrb8sc3KoxWi1G2ss3IIBSLPJWxALocJSQ==
+ version "0.3.10"
+ resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.3.10.tgz#98f0ec7b52356f46dc50981a03b64d268b150f96"
+ integrity sha512-6vbJ96kvnvzjUW9OjO5fU/v97UZl4hUwYAjGgRNU1C6Wk8OWa3R2CYolSeotV6pMi9hKpiEb3+cv+Noumthivg==
dependencies:
"@atproto/common-web" "*"
"@atproto/uri" "*"
@@ -40,10 +40,10 @@
tlds "^1.234.0"
typed-emitter "^2.1.0"
-"@atproto/api@0.3.3":
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.3.3.tgz#8c8d41567beb7b37217f76d2aacf2c280e9fd07e"
- integrity sha512-BlgpYbdPO0KSBypg2KgqHM0kS2Pk82P3X0w2rJs/vrdcMl72d2WeI9kQ5PPFiz80p6C6XcLcpnzzKKtQeFvh4A==
+"@atproto/api@0.3.8":
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.3.8.tgz#3fc0ebd092cc212c2d0b31a600fe1945a02f9cf7"
+ integrity sha512-7qaIZGEP5J9FW4z8bXezzAmLRzHSXXHo6bWP9Jyu5MLp8tYt9vG6yR2N0QA7GvO0xSYqP87Q5vblPjYXGqtDKg==
dependencies:
"@atproto/common-web" "*"
"@atproto/uri" "*"
@@ -114,14 +114,14 @@
uint8arrays "3.0.0"
"@atproto/did-resolver@*":
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/@atproto/did-resolver/-/did-resolver-0.0.1.tgz#e54c1b7fddff2cd6adf87c044b4a3b6f00d5eff7"
- integrity sha512-sdva3+nydMaWXwHJED558UZdVZuajfC2CHcsIZz0pQybicm3VI+khkf42ClZeOhf4Bwa4V4SOaaAqwyf86bDew==
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/@atproto/did-resolver/-/did-resolver-0.1.0.tgz#58f42447700aaad61bad2f0d70b721966268aa02"
+ integrity sha512-ztljyMMCqXvJSi/Qqa2zEQFvOm1AUUR7Bybr3cM1BCddbhW46gk6/g8BgdZeDt2sMBdye37qTctR9O/FjhigvQ==
dependencies:
- "@atproto/common" "*"
+ "@atproto/common-web" "*"
"@atproto/crypto" "*"
- axios "^0.24.0"
- did-resolver "^4.0.0"
+ axios "^0.27.2"
+ zod "^3.14.2"
"@atproto/identifier@*":
version "0.1.0"
@@ -148,10 +148,10 @@
resolved "https://registry.yarnpkg.com/@atproto/nsid/-/nsid-0.0.1.tgz#0cdc00cefe8f0b1385f352b9f57b3ad37fff09a4"
integrity sha512-t5M6/CzWBVYoBbIvfKDpqPj/+ZmyoK9ydZSStcTXosJ27XXwOPhz0VDUGKK2SM9G5Y7TPes8S5KTAU0UdVYFCw==
-"@atproto/pds@^0.1.8":
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/@atproto/pds/-/pds-0.1.8.tgz#cf1a9bab2301c3fe1120c63576153ac5a20bf70d"
- integrity sha512-I493U+/NNU9D8L8tVbM/OpD6gQ6/Mv7uE+/i4a1vfBGO6NqYJ6jKw3qeCy4jq3NVbTxcs+lSSpK27hgApx4PtA==
+"@atproto/pds@^0.1.10":
+ version "0.1.11"
+ resolved "https://registry.yarnpkg.com/@atproto/pds/-/pds-0.1.11.tgz#ed59803222558842a343021c20517dbf6d19dc42"
+ integrity sha512-5JE4IkZh1b+tRs1qnChVB74g6As1vDJ/nPkZPg8M57VUDy4gdb+bcctV0AHF45EQo6Mvy9lCw9ShWVT/P/tLoQ==
dependencies:
"@atproto/api" "*"
"@atproto/common" "*"
@@ -212,11 +212,12 @@
"@atproto/nsid" "*"
"@atproto/xrpc-server@*":
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/@atproto/xrpc-server/-/xrpc-server-0.1.0.tgz#2dd3172bb35fbfefb98c3d727d29be8eca5c3d9b"
- integrity sha512-I7EjhnLUrlqQKTe2jDEnyAaOTvj26pg9NRjTXflbIOqCOkh+K9+5ztGSI0djF7TSQ7pegXroj3qRnmpVVCBr7Q==
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/@atproto/xrpc-server/-/xrpc-server-0.2.0.tgz#a36616c2ac70339cd79cda83ede0a0b305c74f9b"
+ integrity sha512-sCJuVUIb1tDIlKCFwHPRHbAgEy0HYGlQ7XhpNqMRKXECh8Z+DRICEne3gLDVaXhyNaC/N7OjHcsyuofDDbuGFQ==
dependencies:
"@atproto/common" "*"
+ "@atproto/crypto" "*"
"@atproto/lexicon" "*"
cbor-x "^1.5.1"
express "^4.17.2"
@@ -241,33 +242,33 @@
dependencies:
"@babel/highlight" "^7.10.4"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.8.3":
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.8.3":
version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39"
integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==
dependencies:
"@babel/highlight" "^7.18.6"
-"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5":
- version "7.21.7"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc"
- integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==
+"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e"
+ integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==
"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.16.0", "@babel/core@^7.20.0", "@babel/core@^7.20.2", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.5.tgz#92f753e8b9f96e15d4b398dbe2f25d1408c9c426"
- integrity sha512-9M398B/QH5DlfCOTKDZT1ozXr0x8uBEeFd+dJraGUZGiaNpGCDVGCc14hZexsMblw3XxltJ+6kSvogp9J+5a9g==
+ version "7.22.1"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd"
+ integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==
dependencies:
"@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.21.4"
- "@babel/generator" "^7.21.5"
- "@babel/helper-compilation-targets" "^7.21.5"
- "@babel/helper-module-transforms" "^7.21.5"
- "@babel/helpers" "^7.21.5"
- "@babel/parser" "^7.21.5"
- "@babel/template" "^7.20.7"
- "@babel/traverse" "^7.21.5"
- "@babel/types" "^7.21.5"
+ "@babel/generator" "^7.22.0"
+ "@babel/helper-compilation-targets" "^7.22.1"
+ "@babel/helper-module-transforms" "^7.22.1"
+ "@babel/helpers" "^7.22.0"
+ "@babel/parser" "^7.22.0"
+ "@babel/template" "^7.21.9"
+ "@babel/traverse" "^7.22.1"
+ "@babel/types" "^7.22.0"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
@@ -275,20 +276,20 @@
semver "^6.3.0"
"@babel/eslint-parser@^7.16.3", "@babel/eslint-parser@^7.18.2":
- version "7.21.3"
- resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz#d79e822050f2de65d7f368a076846e7184234af7"
- integrity sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==
+ version "7.21.8"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz#59fb6fc4f3b017ab86987c076226ceef7b2b2ef2"
+ integrity sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==
dependencies:
"@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
eslint-visitor-keys "^2.1.0"
semver "^6.3.0"
-"@babel/generator@^7.20.0", "@babel/generator@^7.20.4", "@babel/generator@^7.21.5", "@babel/generator@^7.7.2":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f"
- integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==
+"@babel/generator@^7.20.0", "@babel/generator@^7.20.4", "@babel/generator@^7.22.0", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e"
+ integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==
dependencies:
- "@babel/types" "^7.21.5"
+ "@babel/types" "^7.22.3"
"@jridgewell/gen-mapping" "^0.3.2"
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
@@ -301,51 +302,51 @@
"@babel/types" "^7.18.6"
"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz#817f73b6c59726ab39f6ba18c234268a519e5abb"
- integrity sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz#c9b83d1ba74e163e023f008a3d3204588a7ceb60"
+ integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==
dependencies:
- "@babel/types" "^7.21.5"
+ "@babel/types" "^7.22.3"
-"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366"
- integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==
+"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1":
+ version "7.22.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58"
+ integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==
dependencies:
- "@babel/compat-data" "^7.21.5"
+ "@babel/compat-data" "^7.22.0"
"@babel/helper-validator-option" "^7.21.0"
browserslist "^4.21.3"
lru-cache "^5.1.1"
semver "^6.3.0"
-"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.5.tgz#09a259305467d2020bd2492119ee1c1bc55029e9"
- integrity sha512-yNSEck9SuDvPTEUYm4BSXl6ZVC7yO5ZLEMAhG3v3zi7RDxyL/nQDemWWZmw4L0stPWwhpnznRRyJHPRcbXR2jw==
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1":
+ version "7.22.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b"
+ integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==
dependencies:
"@babel/helper-annotate-as-pure" "^7.18.6"
- "@babel/helper-environment-visitor" "^7.21.5"
+ "@babel/helper-environment-visitor" "^7.22.1"
"@babel/helper-function-name" "^7.21.0"
- "@babel/helper-member-expression-to-functions" "^7.21.5"
+ "@babel/helper-member-expression-to-functions" "^7.22.0"
"@babel/helper-optimise-call-expression" "^7.18.6"
- "@babel/helper-replace-supers" "^7.21.5"
+ "@babel/helper-replace-supers" "^7.22.1"
"@babel/helper-skip-transparent-expression-wrappers" "^7.20.0"
"@babel/helper-split-export-declaration" "^7.18.6"
semver "^6.3.0"
-"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.5.tgz#4ce6ffaf497a241aa6c62192416b273987a8daa3"
- integrity sha512-1+DPMcln46eNAta/rPIqQYXYRGvQ/LRy6bRKnSt9Dzt/yLjNUbbsh+6yzD6fUHmtzc9kWvVnAhtcMSMyziHmUA==
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1":
+ version "7.22.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70"
+ integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==
dependencies:
"@babel/helper-annotate-as-pure" "^7.18.6"
regexpu-core "^5.3.1"
semver "^6.3.0"
-"@babel/helper-define-polyfill-provider@^0.3.3":
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a"
- integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==
+"@babel/helper-define-polyfill-provider@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8"
+ integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==
dependencies:
"@babel/helper-compilation-targets" "^7.17.7"
"@babel/helper-plugin-utils" "^7.16.7"
@@ -354,10 +355,10 @@
resolve "^1.14.2"
semver "^6.1.2"
-"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba"
- integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==
+"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1":
+ version "7.22.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8"
+ integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==
"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0":
version "7.21.0"
@@ -374,12 +375,12 @@
dependencies:
"@babel/types" "^7.18.6"
-"@babel/helper-member-expression-to-functions@^7.21.5":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0"
- integrity sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==
+"@babel/helper-member-expression-to-functions@^7.22.0":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f"
+ integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==
dependencies:
- "@babel/types" "^7.21.5"
+ "@babel/types" "^7.22.3"
"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4":
version "7.21.4"
@@ -388,19 +389,19 @@
dependencies:
"@babel/types" "^7.21.4"
-"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420"
- integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==
+"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1":
+ version "7.22.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63"
+ integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==
dependencies:
- "@babel/helper-environment-visitor" "^7.21.5"
+ "@babel/helper-environment-visitor" "^7.22.1"
"@babel/helper-module-imports" "^7.21.4"
"@babel/helper-simple-access" "^7.21.5"
"@babel/helper-split-export-declaration" "^7.18.6"
"@babel/helper-validator-identifier" "^7.19.1"
- "@babel/template" "^7.20.7"
- "@babel/traverse" "^7.21.5"
- "@babel/types" "^7.21.5"
+ "@babel/template" "^7.21.9"
+ "@babel/traverse" "^7.22.1"
+ "@babel/types" "^7.22.0"
"@babel/helper-optimise-call-expression@^7.18.6":
version "7.18.6"
@@ -424,17 +425,17 @@
"@babel/helper-wrap-function" "^7.18.9"
"@babel/types" "^7.18.9"
-"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz#a6ad005ba1c7d9bc2973dfde05a1bba7065dde3c"
- integrity sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==
+"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1":
+ version "7.22.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95"
+ integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==
dependencies:
- "@babel/helper-environment-visitor" "^7.21.5"
- "@babel/helper-member-expression-to-functions" "^7.21.5"
+ "@babel/helper-environment-visitor" "^7.22.1"
+ "@babel/helper-member-expression-to-functions" "^7.22.0"
"@babel/helper-optimise-call-expression" "^7.18.6"
- "@babel/template" "^7.20.7"
- "@babel/traverse" "^7.21.5"
- "@babel/types" "^7.21.5"
+ "@babel/template" "^7.21.9"
+ "@babel/traverse" "^7.22.1"
+ "@babel/types" "^7.22.0"
"@babel/helper-simple-access@^7.21.5":
version "7.21.5"
@@ -467,7 +468,7 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
-"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0":
+"@babel/helper-validator-option@^7.21.0":
version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180"
integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==
@@ -482,14 +483,14 @@
"@babel/traverse" "^7.20.5"
"@babel/types" "^7.20.5"
-"@babel/helpers@^7.21.5":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08"
- integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==
+"@babel/helpers@^7.22.0":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e"
+ integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==
dependencies:
- "@babel/template" "^7.20.7"
- "@babel/traverse" "^7.21.5"
- "@babel/types" "^7.21.5"
+ "@babel/template" "^7.21.9"
+ "@babel/traverse" "^7.22.1"
+ "@babel/types" "^7.22.3"
"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6":
version "7.18.6"
@@ -500,10 +501,10 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.5.tgz#821bb520118fd25b982eaf8d37421cf5c64a312b"
- integrity sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ==
+"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4":
+ version "7.22.4"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32"
+ integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
version "7.18.6"
@@ -512,16 +513,16 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7":
- version "7.20.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1"
- integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659"
+ integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/helper-plugin-utils" "^7.21.5"
"@babel/helper-skip-transparent-expression-wrappers" "^7.20.0"
- "@babel/plugin-proposal-optional-chaining" "^7.20.7"
+ "@babel/plugin-transform-optional-chaining" "^7.22.3"
-"@babel/plugin-proposal-async-generator-functions@^7.0.0", "@babel/plugin-proposal-async-generator-functions@^7.20.7":
+"@babel/plugin-proposal-async-generator-functions@^7.0.0":
version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==
@@ -531,7 +532,7 @@
"@babel/helper-remap-async-to-generator" "^7.18.9"
"@babel/plugin-syntax-async-generators" "^7.8.4"
-"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6":
+"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.16.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
@@ -539,33 +540,16 @@
"@babel/helper-create-class-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-proposal-class-static-block@^7.21.0":
- version "7.21.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d"
- integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.21.0"
- "@babel/helper-plugin-utils" "^7.20.2"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
-
"@babel/plugin-proposal-decorators@^7.12.9", "@babel/plugin-proposal-decorators@^7.16.4":
- version "7.21.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz#70e0c89fdcd7465c97593edb8f628ba6e4199d63"
- integrity sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.3.tgz#3502c0f8cfe0cdb79b62102c9c9b111309d942b7"
+ integrity sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.21.0"
- "@babel/helper-plugin-utils" "^7.20.2"
- "@babel/helper-replace-supers" "^7.20.7"
+ "@babel/helper-create-class-features-plugin" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/helper-replace-supers" "^7.22.1"
"@babel/helper-split-export-declaration" "^7.18.6"
- "@babel/plugin-syntax-decorators" "^7.21.0"
-
-"@babel/plugin-proposal-dynamic-import@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94"
- integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-decorators" "^7.22.3"
"@babel/plugin-proposal-export-default-from@^7.0.0":
version "7.18.10"
@@ -583,23 +567,7 @@
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-"@babel/plugin-proposal-json-strings@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b"
- integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
-
-"@babel/plugin-proposal-logical-assignment-operators@^7.20.7":
- version "7.20.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83"
- integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==
- dependencies:
- "@babel/helper-plugin-utils" "^7.20.2"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
@@ -607,7 +575,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6":
+"@babel/plugin-proposal-numeric-separator@^7.16.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75"
integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==
@@ -615,7 +583,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.13", "@babel/plugin-proposal-object-rest-spread@^7.20.7":
+"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.13":
version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a"
integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==
@@ -626,7 +594,7 @@
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-transform-parameters" "^7.20.7"
-"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.18.6":
+"@babel/plugin-proposal-optional-catch-binding@^7.0.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
@@ -634,7 +602,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0":
+"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.16.0":
version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea"
integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==
@@ -643,7 +611,7 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.20.0"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
-"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6":
+"@babel/plugin-proposal-private-methods@^7.16.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
@@ -661,7 +629,7 @@
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+"@babel/plugin-proposal-unicode-property-regex@^7.4.4":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==
@@ -697,12 +665,12 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-decorators@^7.21.0":
- version "7.21.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz#d2b3f31c3e86fa86e16bb540b7660c55bd7d0e78"
- integrity sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==
+"@babel/plugin-syntax-decorators@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.3.tgz#760f2d812d56c1d05970d01cdcd3c05e3d87d6ca"
+ integrity sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg==
dependencies:
- "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/helper-plugin-utils" "^7.21.5"
"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3":
version "7.8.3"
@@ -739,6 +707,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.19.0"
+"@babel/plugin-syntax-import-attributes@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b"
+ integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.21.5"
+
"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
@@ -816,13 +791,21 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2":
+"@babel/plugin-syntax-typescript@^7.21.4", "@babel/plugin-syntax-typescript@^7.7.2":
version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8"
integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
+"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
+ integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929"
@@ -830,6 +813,16 @@
dependencies:
"@babel/helper-plugin-utils" "^7.21.5"
+"@babel/plugin-transform-async-generator-functions@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527"
+ integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/helper-remap-async-to-generator" "^7.18.9"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.20.7":
version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354"
@@ -853,6 +846,23 @@
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
+"@babel/plugin-transform-class-properties@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c"
+ integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+
+"@babel/plugin-transform-class-static-block@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773"
+ integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.21.0":
version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665"
@@ -898,6 +908,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.9"
+"@babel/plugin-transform-dynamic-import@^7.22.1":
+ version "7.22.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1"
+ integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
"@babel/plugin-transform-exponentiation-operator@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd"
@@ -906,6 +924,14 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
+"@babel/plugin-transform-export-namespace-from@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9"
+ integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.16.0", "@babel/plugin-transform-flow-strip-types@^7.21.0":
version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz#6aeca0adcb81dc627c8986e770bfaa4d9812aff5"
@@ -930,6 +956,14 @@
"@babel/helper-function-name" "^7.18.9"
"@babel/helper-plugin-utils" "^7.18.9"
+"@babel/plugin-transform-json-strings@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9"
+ integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc"
@@ -937,6 +971,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.9"
+"@babel/plugin-transform-logical-assignment-operators@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0"
+ integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e"
@@ -961,14 +1003,14 @@
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/helper-simple-access" "^7.21.5"
-"@babel/plugin-transform-modules-systemjs@^7.20.11":
- version "7.20.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e"
- integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==
+"@babel/plugin-transform-modules-systemjs@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e"
+ integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==
dependencies:
"@babel/helper-hoist-variables" "^7.18.6"
- "@babel/helper-module-transforms" "^7.20.11"
- "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/helper-module-transforms" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
"@babel/helper-validator-identifier" "^7.19.1"
"@babel/plugin-transform-modules-umd@^7.18.6":
@@ -979,20 +1021,36 @@
"@babel/helper-module-transforms" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.20.5":
- version "7.20.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8"
- integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4"
+ integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.20.5"
- "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/helper-create-regexp-features-plugin" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
-"@babel/plugin-transform-new-target@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8"
- integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==
+"@babel/plugin-transform-new-target@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2"
+ integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==
dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.21.5"
+
+"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9"
+ integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-transform-numeric-separator@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0"
+ integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-transform-object-assign@^7.16.7":
version "7.18.6"
@@ -1001,6 +1059,17 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
+"@babel/plugin-transform-object-rest-spread@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9"
+ integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==
+ dependencies:
+ "@babel/compat-data" "^7.22.3"
+ "@babel/helper-compilation-targets" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.22.3"
+
"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c"
@@ -1009,12 +1078,47 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/helper-replace-supers" "^7.18.6"
-"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3":
- version "7.21.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db"
- integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==
+"@babel/plugin-transform-optional-catch-binding@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f"
+ integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==
dependencies:
- "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-transform-optional-chaining@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290"
+ integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d"
+ integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.21.5"
+
+"@babel/plugin-transform-private-methods@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6"
+ integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+
+"@babel/plugin-transform-private-property-in-object@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56"
+ integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-create-class-features-plugin" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.18.6":
version "7.18.6"
@@ -1024,11 +1128,11 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-react-constant-elements@^7.12.1":
- version "7.21.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz#b32a5556100d424b25e388dd689050d78396884d"
- integrity sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.3.tgz#b87a436c3377f29b37409f9c02c99c9ce377909d"
+ integrity sha512-b5J6muxQYp4H7loAQv/c7GO5cPuRA6H5hx4gO+/Hn+Cu9MRQU0PNiUoWq1L//8sq6kFSNxGXFb2XTaUfa9y+Pg==
dependencies:
- "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/helper-plugin-utils" "^7.21.5"
"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6":
version "7.18.6"
@@ -1058,16 +1162,16 @@
dependencies:
"@babel/helper-plugin-utils" "^7.19.0"
-"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.18.6":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz#bd98f3b429688243e4fa131fe1cbb2ef31ce6f38"
- integrity sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==
+"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz#5a1f380df3703ba92eb1a930a539c6d88836f690"
+ integrity sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==
dependencies:
"@babel/helper-annotate-as-pure" "^7.18.6"
"@babel/helper-module-imports" "^7.21.4"
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/plugin-syntax-jsx" "^7.21.4"
- "@babel/types" "^7.21.5"
+ "@babel/types" "^7.22.3"
"@babel/plugin-transform-react-pure-annotations@^7.18.6":
version "7.18.6"
@@ -1093,15 +1197,15 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-runtime@^7.0.0", "@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.16.4":
- version "7.21.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa"
- integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==
+ version "7.22.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz#f8353f313f18c3ce1315688631ec48657b97af42"
+ integrity sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA==
dependencies:
"@babel/helper-module-imports" "^7.21.4"
- "@babel/helper-plugin-utils" "^7.20.2"
- babel-plugin-polyfill-corejs2 "^0.3.3"
- babel-plugin-polyfill-corejs3 "^0.6.0"
- babel-plugin-polyfill-regenerator "^0.4.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+ babel-plugin-polyfill-corejs2 "^0.4.3"
+ babel-plugin-polyfill-corejs3 "^0.8.1"
+ babel-plugin-polyfill-regenerator "^0.5.0"
semver "^6.3.0"
"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.18.6":
@@ -1141,14 +1245,14 @@
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/plugin-transform-typescript@^7.21.3", "@babel/plugin-transform-typescript@^7.5.0":
- version "7.21.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b"
- integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz#8f662cec8ba88c873f1c7663c0c94e3f68592f09"
+ integrity sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==
dependencies:
"@babel/helper-annotate-as-pure" "^7.18.6"
- "@babel/helper-create-class-features-plugin" "^7.21.0"
- "@babel/helper-plugin-utils" "^7.20.2"
- "@babel/plugin-syntax-typescript" "^7.20.0"
+ "@babel/helper-create-class-features-plugin" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/plugin-syntax-typescript" "^7.21.4"
"@babel/plugin-transform-unicode-escapes@^7.21.5":
version "7.21.5"
@@ -1157,6 +1261,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.21.5"
+"@babel/plugin-transform-unicode-property-regex@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380"
+ integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+
"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca"
@@ -1165,38 +1277,33 @@
"@babel/helper-create-regexp-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.20.0":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb"
- integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==
+"@babel/plugin-transform-unicode-sets-regex@^7.22.3":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700"
+ integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==
dependencies:
- "@babel/compat-data" "^7.21.5"
- "@babel/helper-compilation-targets" "^7.21.5"
+ "@babel/helper-create-regexp-features-plugin" "^7.22.1"
+ "@babel/helper-plugin-utils" "^7.21.5"
+
+"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.20.0":
+ version "7.22.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed"
+ integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==
+ dependencies:
+ "@babel/compat-data" "^7.22.3"
+ "@babel/helper-compilation-targets" "^7.22.1"
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/helper-validator-option" "^7.21.0"
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7"
- "@babel/plugin-proposal-async-generator-functions" "^7.20.7"
- "@babel/plugin-proposal-class-properties" "^7.18.6"
- "@babel/plugin-proposal-class-static-block" "^7.21.0"
- "@babel/plugin-proposal-dynamic-import" "^7.18.6"
- "@babel/plugin-proposal-export-namespace-from" "^7.18.9"
- "@babel/plugin-proposal-json-strings" "^7.18.6"
- "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
- "@babel/plugin-proposal-numeric-separator" "^7.18.6"
- "@babel/plugin-proposal-object-rest-spread" "^7.20.7"
- "@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
- "@babel/plugin-proposal-optional-chaining" "^7.21.0"
- "@babel/plugin-proposal-private-methods" "^7.18.6"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3"
"@babel/plugin-proposal-private-property-in-object" "^7.21.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.18.6"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-class-properties" "^7.12.13"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
"@babel/plugin-syntax-import-assertions" "^7.20.0"
+ "@babel/plugin-syntax-import-attributes" "^7.22.3"
"@babel/plugin-syntax-import-meta" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.3"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
@@ -1207,28 +1314,43 @@
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
"@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
"@babel/plugin-transform-arrow-functions" "^7.21.5"
+ "@babel/plugin-transform-async-generator-functions" "^7.22.3"
"@babel/plugin-transform-async-to-generator" "^7.20.7"
"@babel/plugin-transform-block-scoped-functions" "^7.18.6"
"@babel/plugin-transform-block-scoping" "^7.21.0"
+ "@babel/plugin-transform-class-properties" "^7.22.3"
+ "@babel/plugin-transform-class-static-block" "^7.22.3"
"@babel/plugin-transform-classes" "^7.21.0"
"@babel/plugin-transform-computed-properties" "^7.21.5"
"@babel/plugin-transform-destructuring" "^7.21.3"
"@babel/plugin-transform-dotall-regex" "^7.18.6"
"@babel/plugin-transform-duplicate-keys" "^7.18.9"
+ "@babel/plugin-transform-dynamic-import" "^7.22.1"
"@babel/plugin-transform-exponentiation-operator" "^7.18.6"
+ "@babel/plugin-transform-export-namespace-from" "^7.22.3"
"@babel/plugin-transform-for-of" "^7.21.5"
"@babel/plugin-transform-function-name" "^7.18.9"
+ "@babel/plugin-transform-json-strings" "^7.22.3"
"@babel/plugin-transform-literals" "^7.18.9"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.22.3"
"@babel/plugin-transform-member-expression-literals" "^7.18.6"
"@babel/plugin-transform-modules-amd" "^7.20.11"
"@babel/plugin-transform-modules-commonjs" "^7.21.5"
- "@babel/plugin-transform-modules-systemjs" "^7.20.11"
+ "@babel/plugin-transform-modules-systemjs" "^7.22.3"
"@babel/plugin-transform-modules-umd" "^7.18.6"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5"
- "@babel/plugin-transform-new-target" "^7.18.6"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3"
+ "@babel/plugin-transform-new-target" "^7.22.3"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3"
+ "@babel/plugin-transform-numeric-separator" "^7.22.3"
+ "@babel/plugin-transform-object-rest-spread" "^7.22.3"
"@babel/plugin-transform-object-super" "^7.18.6"
- "@babel/plugin-transform-parameters" "^7.21.3"
+ "@babel/plugin-transform-optional-catch-binding" "^7.22.3"
+ "@babel/plugin-transform-optional-chaining" "^7.22.3"
+ "@babel/plugin-transform-parameters" "^7.22.3"
+ "@babel/plugin-transform-private-methods" "^7.22.3"
+ "@babel/plugin-transform-private-property-in-object" "^7.22.3"
"@babel/plugin-transform-property-literals" "^7.18.6"
"@babel/plugin-transform-regenerator" "^7.21.5"
"@babel/plugin-transform-reserved-words" "^7.18.6"
@@ -1238,13 +1360,15 @@
"@babel/plugin-transform-template-literals" "^7.18.9"
"@babel/plugin-transform-typeof-symbol" "^7.18.9"
"@babel/plugin-transform-unicode-escapes" "^7.21.5"
+ "@babel/plugin-transform-unicode-property-regex" "^7.22.3"
"@babel/plugin-transform-unicode-regex" "^7.18.6"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.22.3"
"@babel/preset-modules" "^0.1.5"
- "@babel/types" "^7.21.5"
- babel-plugin-polyfill-corejs2 "^0.3.3"
- babel-plugin-polyfill-corejs3 "^0.6.0"
- babel-plugin-polyfill-regenerator "^0.4.1"
- core-js-compat "^3.25.1"
+ "@babel/types" "^7.22.4"
+ babel-plugin-polyfill-corejs2 "^0.4.3"
+ babel-plugin-polyfill-corejs3 "^0.8.1"
+ babel-plugin-polyfill-regenerator "^0.5.0"
+ core-js-compat "^3.30.2"
semver "^6.3.0"
"@babel/preset-flow@^7.13.13":
@@ -1268,18 +1392,18 @@
esutils "^2.0.2"
"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d"
- integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.3.tgz#2ec7f91d0c924fa2ea0c7cfbbf690bc62b79cd84"
+ integrity sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug==
dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/helper-validator-option" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.21.5"
+ "@babel/helper-validator-option" "^7.21.0"
"@babel/plugin-transform-react-display-name" "^7.18.6"
- "@babel/plugin-transform-react-jsx" "^7.18.6"
+ "@babel/plugin-transform-react-jsx" "^7.22.3"
"@babel/plugin-transform-react-jsx-development" "^7.18.6"
"@babel/plugin-transform-react-pure-annotations" "^7.18.6"
-"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.0", "@babel/preset-typescript@^7.16.7":
+"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.0", "@babel/preset-typescript@^7.16.7", "@babel/preset-typescript@^7.17.12":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f"
integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==
@@ -1307,41 +1431,41 @@
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200"
- integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb"
+ integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==
dependencies:
regenerator-runtime "^0.13.11"
-"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3":
- version "7.20.7"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
- integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
- dependencies:
- "@babel/code-frame" "^7.18.6"
- "@babel/parser" "^7.20.7"
- "@babel/types" "^7.20.7"
-
-"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2", "@babel/traverse@^7.7.4":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133"
- integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==
+"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9", "@babel/template@^7.3.3":
+ version "7.21.9"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb"
+ integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==
dependencies:
"@babel/code-frame" "^7.21.4"
- "@babel/generator" "^7.21.5"
- "@babel/helper-environment-visitor" "^7.21.5"
+ "@babel/parser" "^7.21.9"
+ "@babel/types" "^7.21.5"
+
+"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.2", "@babel/traverse@^7.7.4":
+ version "7.22.4"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0"
+ integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==
+ dependencies:
+ "@babel/code-frame" "^7.21.4"
+ "@babel/generator" "^7.22.3"
+ "@babel/helper-environment-visitor" "^7.22.1"
"@babel/helper-function-name" "^7.21.0"
"@babel/helper-hoist-variables" "^7.18.6"
"@babel/helper-split-export-declaration" "^7.18.6"
- "@babel/parser" "^7.21.5"
- "@babel/types" "^7.21.5"
+ "@babel/parser" "^7.22.4"
+ "@babel/types" "^7.22.4"
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
- version "7.21.5"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6"
- integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==
+"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.22.4"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071"
+ integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==
dependencies:
"@babel/helper-string-parser" "^7.21.5"
"@babel/helper-validator-identifier" "^7.19.1"
@@ -1579,14 +1703,14 @@
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884"
integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==
-"@eslint/eslintrc@^2.0.2":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.2.tgz#01575e38707add677cf73ca1589abba8da899a02"
- integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==
+"@eslint/eslintrc@^2.0.3":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331"
+ integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
- espree "^9.5.1"
+ espree "^9.5.2"
globals "^13.19.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
@@ -1594,10 +1718,10 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@8.39.0":
- version "8.39.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b"
- integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==
+"@eslint/js@8.41.0":
+ version "8.41.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3"
+ integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==
"@expo/bunyan@4.0.0", "@expo/bunyan@^4.0.0":
version "4.0.0"
@@ -1684,14 +1808,14 @@
node-forge "^1.2.1"
nullthrows "^1.1.1"
-"@expo/config-plugins@4.1.1":
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-4.1.1.tgz#ffb20b3d2be4e2509e8bf846721641dc072718c7"
- integrity sha512-lo3tVxRhwM9jfxPHJcURsH5WvU26kX12h5EB3C7kjVhgdQPLkvT8Jk8Cx0KSL8MXKcry2xQvZ2uuwWLkMeplJw==
+"@expo/config-plugins@6.0.2":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-6.0.2.tgz#cf07319515022ba94d9aa9fa30e0cff43a14256f"
+ integrity sha512-Cn01fXMHwjU042EgO9oO3Mna0o/UCrW91MQLMbJa4pXM41CYGjNgVy1EVXiuRRx/upegHhvltBw5D+JaUm8aZQ==
dependencies:
- "@expo/config-types" "^44.0.0"
- "@expo/json-file" "8.2.35"
- "@expo/plist" "0.0.18"
+ "@expo/config-types" "^48.0.0"
+ "@expo/json-file" "~8.2.37"
+ "@expo/plist" "^0.0.20"
"@expo/sdk-runtime-versions" "^1.0.0"
"@react-native/normalize-color" "^2.0.0"
chalk "^4.1.2"
@@ -1705,7 +1829,7 @@
xcode "^3.0.1"
xml2js "0.4.23"
-"@expo/config-plugins@6.0.1", "@expo/config-plugins@~6.0.0":
+"@expo/config-plugins@~6.0.0":
version "6.0.1"
resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-6.0.1.tgz#827cb34c51f725d8825b0768df6550c1cf81d457"
integrity sha512-6mqZutxeibXFeqFfoZApFUEH2n1RxGXYMHCdJrDj4eXDBBFZ3aJ0XBoroZcHHHvfRieEsf54vNyJoWp7JZGj8g==
@@ -1726,33 +1850,11 @@
xcode "^3.0.1"
xml2js "0.4.23"
-"@expo/config-types@^44.0.0":
- version "44.0.0"
- resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-44.0.0.tgz#d3480fe2c99f9e895dae4ebba58b74ed72d03e26"
- integrity sha512-d+gpdKOAhqaD5RmcMzGgKzNtvE1w+GCqpFQNSXLliYlXjj+Tv0eL8EPeAdPtvke0vowpPFwd5McXLA90dgY6Jg==
-
"@expo/config-types@^48.0.0":
version "48.0.0"
resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-48.0.0.tgz#15a46921565ffeda3c3ba010701398f05193d5b3"
integrity sha512-DwyV4jTy/+cLzXGAo1xftS6mVlSiLIWZjl9DjTCLPFVgNYQxnh7htPilRv4rBhiNs7KaznWqKU70+4zQoKVT9A==
-"@expo/config@6.0.20":
- version "6.0.20"
- resolved "https://registry.yarnpkg.com/@expo/config/-/config-6.0.20.tgz#fb3b9fbcaf97f678714fe05603ba5d3aacfa0a25"
- integrity sha512-m2T1/hB4TyLkQElOUwOajn/7gBcPaGyfVwoVsuJMEh0yrNvNFtXP+nl87Cm53g5q+VyfwJUgbewPQ3j/UXkI6Q==
- dependencies:
- "@babel/code-frame" "~7.10.4"
- "@expo/config-plugins" "4.1.1"
- "@expo/config-types" "^44.0.0"
- "@expo/json-file" "8.2.35"
- getenv "^1.0.0"
- glob "7.1.6"
- require-from-string "^2.0.2"
- resolve-from "^5.0.0"
- semver "7.3.2"
- slugify "^1.3.4"
- sucrase "^3.20.0"
-
"@expo/config@8.0.2", "@expo/config@~8.0.0":
version "8.0.2"
resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.0.2.tgz#53ecfa9bafc97b990ff9e34e210205b0e3f05751"
@@ -1859,15 +1961,6 @@
semver "7.3.2"
tempy "0.3.0"
-"@expo/json-file@8.2.35":
- version "8.2.35"
- resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.35.tgz#d0f0c74cdde2ae26686708912cf23ff81a8d67ac"
- integrity sha512-cQFLGSNRRFbN9EIhVDpMCYuzXbrHUOmKEqitBR+nrU6surjKGsOsN9Ubyn/L/LAGlFvT293E4XY5zsOtJyiPZQ==
- dependencies:
- "@babel/code-frame" "~7.10.4"
- json5 "^1.0.1"
- write-file-atomic "^2.3.0"
-
"@expo/json-file@^8.2.37", "@expo/json-file@~8.2.37":
version "8.2.37"
resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.37.tgz#9c02d3b42134907c69cc0a027b18671b69344049"
@@ -1915,15 +2008,6 @@
split "^1.0.1"
sudo-prompt "9.1.1"
-"@expo/plist@0.0.18":
- version "0.0.18"
- resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.18.tgz#9abcde78df703a88f6d9fa1a557ee2f045d178b0"
- integrity sha512-+48gRqUiz65R21CZ/IXa7RNBXgAI/uPSdvJqoN9x1hfL44DNbUoWHgHiEXTx7XelcATpDwNTz6sHLfy0iNqf+w==
- dependencies:
- "@xmldom/xmldom" "~0.7.0"
- base64-js "^1.2.3"
- xmlbuilder "^14.0.0"
-
"@expo/plist@^0.0.20":
version "0.0.20"
resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.20.tgz#a6b3124438031c02b762bad5a47b70584d3c0072"
@@ -1987,19 +2071,18 @@
integrity sha512-TI+l71+5aSKnShYclFa14Kum+hQMZ86b95SH6tQUG3qZEmLTarvWpKwqtTwQKqvlJSJrpFiSFu3eCuZokY6zWA==
"@expo/webpack-config@^18.0.1":
- version "18.0.4"
- resolved "https://registry.yarnpkg.com/@expo/webpack-config/-/webpack-config-18.0.4.tgz#4743428a546c2affb7a551cfc01139b5973193ec"
- integrity sha512-TfQSQCJ9o5MXat+y6cqTnix2adBA61fgYpotDXONxVB8aZ8xi81D/Wp3CBT6WnNeukEyKzQFCBqrX3BTfewyJQ==
+ version "18.1.0"
+ resolved "https://registry.yarnpkg.com/@expo/webpack-config/-/webpack-config-18.1.0.tgz#61f767531053afe14fd301bb6d88b3ca259665ff"
+ integrity sha512-P2P5MjbcIqSlepr8216eIy+rI8UK+K10r/3Y+eoV/pNABKXc/bjk/QSJICLayouxQSOp2YU6GipdfnwJRUsEUA==
dependencies:
"@babel/core" "^7.20.2"
- "@expo/config" "6.0.20"
babel-loader "^8.3.0"
chalk "^4.0.0"
clean-webpack-plugin "^4.0.0"
copy-webpack-plugin "^10.2.0"
css-loader "^6.5.1"
css-minimizer-webpack-plugin "^3.4.1"
- expo-pwa "0.0.124"
+ expo-pwa "0.0.125"
find-up "^5.0.0"
find-yarn-workspace-root "~2.0.0"
getenv "^1.0.0"
@@ -2064,10 +2147,10 @@
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
-"@gorhom/bottom-sheet@^4":
- version "4.4.6"
- resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-4.4.6.tgz#49fa6728f10133de772baaeb67ebe0f63125cf80"
- integrity sha512-okqJPtFQjfqPZdh6wGDzQKkMevG1IfplQeoWY0VqOFCp3E0p7WHNeW41voK7KXXCVTQaGXibPfd9GNGjXgFNyg==
+"@gorhom/bottom-sheet@4.4.5":
+ version "4.4.5"
+ resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-4.4.5.tgz#b9041b01ce1af9a936e7c0fc1d78f026d759eebe"
+ integrity sha512-Z5Z20wshLUB8lIdtMKoJaRnjd64wBR/q8EeVPThrg+skrcBwBPHfUwZJ2srB0rEszA/01ejSJy/ixyd7Ra7vUA==
dependencies:
"@gorhom/portal" "1.0.14"
invariant "^2.2.4"
@@ -2656,18 +2739,18 @@
picocolors "^1.0.0"
"@linaria/tags@^4.3.4":
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/@linaria/tags/-/tags-4.3.4.tgz#3c98108e4b48b8413662b4c62c2b2abdebacaca4"
- integrity sha512-W8zaLKtC4YFCwkZ9DMu2enCiD/zGyYmFSTzEvJP7ZycdftMizoOrWNOyF9kITyjGdq+jZvAXJz0BZDT6axgIRg==
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/@linaria/tags/-/tags-4.3.5.tgz#bf2e070d11179addf2f27a66cd29d8192e71ca89"
+ integrity sha512-PgaIi8Vv89YOjc6rpKL/uPg2w4k0rAwAYxcqeXqzKqsEAste5rgB8xp1/KUOG0oAOkPd3MRL6Duj+m0ZwJ3g+g==
dependencies:
"@babel/generator" "^7.20.4"
"@linaria/logger" "^4.0.0"
- "@linaria/utils" "^4.3.3"
+ "@linaria/utils" "^4.3.4"
-"@linaria/utils@^4.3.3":
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/@linaria/utils/-/utils-4.3.3.tgz#9f66ae41187e8a2f2cc3471b44935128ebd1dab3"
- integrity sha512-xSe/tod9A44aIMbtds9fWLNe2TT080lLdRSaoqX+UHsBWqClkrw5cXEt3lm8Vr4hZiXT2r/1AldjuHb9YbUlMg==
+"@linaria/utils@^4.3.3", "@linaria/utils@^4.3.4":
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/@linaria/utils/-/utils-4.3.4.tgz#860db9131e498b62510e49dc6fd4a8f0ed44bf4d"
+ integrity sha512-vt6WJG54n+KANaqxOfzIIU7aSfFHEWFbnGLsgxL7nASHqO0zezrNA2y2Rrp80zSeTW+wSpbmDM4uJyC9UW1qoA==
dependencies:
"@babel/core" "^7.20.2"
"@babel/plugin-proposal-export-namespace-from" "^7.18.9"
@@ -2772,9 +2855,9 @@
source-map "^0.7.3"
"@popperjs/core@^2.9.0":
- version "2.11.7"
- resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7"
- integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==
+ version "2.11.8"
+ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
+ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
"@react-native-async-storage/async-storage@^1.15.15", "@react-native-async-storage/async-storage@^1.17.6":
version "1.18.1"
@@ -2784,9 +2867,9 @@
merge-options "^3.0.4"
"@react-native-camera-roll/camera-roll@^5.2.2":
- version "5.4.0"
- resolved "https://registry.yarnpkg.com/@react-native-camera-roll/camera-roll/-/camera-roll-5.4.0.tgz#f9dfb2fb37f6f88b70801e727282dd9157bf62be"
- integrity sha512-SMEhc+2hQWubwzxR6Zac0CmrJ2rdoHHBo0ibG2iNMsxR0dnU5AdRGnYF/tyK9i20/i7ZNxn+qsEJ69shpkd6gg==
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/@react-native-camera-roll/camera-roll/-/camera-roll-5.5.0.tgz#3f7cc64e90e923eea8d956b09dd9a15ad0303670"
+ integrity sha512-oKj4J01auootXOAjh3CBJ+wYWxy536Ys1Ej0WzRmn/EbeDHiMQ3kAcAGvy0zsQkO4VeFXNISwCGfTQe3fTBh1w==
"@react-native-clipboard/clipboard@^1.10.0":
version "1.11.2"
@@ -2794,9 +2877,9 @@
integrity sha512-bHyZVW62TuleiZsXNHS1Pv16fWc0fh8O9WvBzl4h2fykqZRW9a+Pv/RGTH56E3X2PqzHP38K5go8zmCZUoIsoQ==
"@react-native-community/blur@^4.3.0":
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/@react-native-community/blur/-/blur-4.3.1.tgz#817a9b9762f738e578a2cd5306902f4510a6df34"
- integrity sha512-XVjTKs+nSXG7DCmxIr7HSjeAB276OO9KZ7XUVCdjK+RGTlvlCRZIPV0ygi+WN87zsdvfWsQOTZv3k0/BI86gsA==
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/@react-native-community/blur/-/blur-4.3.2.tgz#185a2c7dd03ba168cc95069bc4742e9505fd6c6c"
+ integrity sha512-0ID+pyZKdC4RdgC7HePxUQ6JmsbNrgz03u+6SgqYpmBoK/rE+7JffqIw7IEsfoKitLEcRNLGekIBsfwCqiEkew==
"@react-native-community/cli-clean@^10.1.1":
version "10.1.1"
@@ -3139,26 +3222,26 @@
picomatch "^2.2.2"
"@rushstack/eslint-patch@^1.1.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728"
- integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz#f5635b36fc0dad96ef1e542a302cd914230188c0"
+ integrity sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==
-"@segment/analytics-core@1.2.4":
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/@segment/analytics-core/-/analytics-core-1.2.4.tgz#a01f0c87246292e0b9790e12c73d2f7e5fceb168"
- integrity sha512-M16osD6+z/bQPSVCZdlU+BAhCk968ppi+SGxU2gVa4B196Qr8SEkBPr3NxUCGTSoULo4/T+k8Ea5cF+pXlgf6Q==
+"@segment/analytics-core@1.2.5":
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/@segment/analytics-core/-/analytics-core-1.2.5.tgz#bd17034be9393aa245a684f137a7950debee240b"
+ integrity sha512-T+AyZe4eKAO08T138RcvCTqUCT609H07VQL6+kh58VJiIalowrnqSdWf9rc+AsUMvPnxUOsnyGBOqNdZ5KNqYw==
dependencies:
"@lukeed/uuid" "^2.0.0"
dset "^3.1.2"
tslib "^2.4.1"
"@segment/analytics-next@^1.51.3":
- version "1.51.6"
- resolved "https://registry.yarnpkg.com/@segment/analytics-next/-/analytics-next-1.51.6.tgz#56c99782fc333025906dbf8f5efd9b7f9f87c197"
- integrity sha512-SiuuCHLq2sWM3fwF0peQ9J9Ku+FAbsx5XsGl9pL4rfHoaItlQuBETxkmT3BD2YltFxhr4FCQ5+phdT0/X5QUFA==
+ version "1.51.7"
+ resolved "https://registry.yarnpkg.com/@segment/analytics-next/-/analytics-next-1.51.7.tgz#f0d3c9b06b2ff5e46802a0ec8e9f676b41bd3658"
+ integrity sha512-WXrgQPkB4MBa4Op4X1SKZL/WEBX3vM04jChHClXZK3QcMAezy4A0vblcHK9vtm8RGOuiickVuemU7ZN3/iaGPA==
dependencies:
"@lukeed/uuid" "^2.0.0"
- "@segment/analytics-core" "1.2.4"
+ "@segment/analytics-core" "1.2.5"
"@segment/analytics.js-video-plugins" "^0.2.1"
"@segment/facade" "^3.4.9"
"@segment/tsub" "1.0.1"
@@ -3170,9 +3253,9 @@
unfetch "^4.1.0"
"@segment/analytics-react-native@^2.10.1":
- version "2.13.5"
- resolved "https://registry.yarnpkg.com/@segment/analytics-react-native/-/analytics-react-native-2.13.5.tgz#e8373d1584812afbe39e9fb935b83655d15ce750"
- integrity sha512-uWezHOghP3yf3tgEfpe2OxP/54l9SM7+YNwkrFhumhoe4cw4xTptlFi6zU4p8lRdmmoJQgQ+/rh3AUP/i4yFTA==
+ version "2.14.0"
+ resolved "https://registry.yarnpkg.com/@segment/analytics-react-native/-/analytics-react-native-2.14.0.tgz#24727b9fee5c559a2ce8e67df6a23dd92670273d"
+ integrity sha512-614qdb4pncYZJw09pvHd1cQURHYkbTQOWAPo262F98ouxiiR7SAHPQv0vRrkflhiDyHm9glez0PY168J+Mw0jg==
dependencies:
"@segment/sovran-react-native" "^1"
deepmerge "^4.2.2"
@@ -3234,9 +3317,9 @@
shell-quote "1.7.3"
"@segment/sovran-react-native@^1":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@segment/sovran-react-native/-/sovran-react-native-1.0.2.tgz#b9b260368d95546b8dfd028970ba01756e63f20c"
- integrity sha512-2zr37YDWD9vdBHvsTTP2yXJ6qtNH1gAvocHFkzZBQ9E4YcO3FbbvO4gUoscHqYfRyo/+kUovysRKtUsXCcrm/Q==
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@segment/sovran-react-native/-/sovran-react-native-1.0.3.tgz#6dac4166ea51bd4fb08b5645546edec6c8cc922d"
+ integrity sha512-Xe00FPFeJE3Y85LQfArRQGdbmCdOzX1Ejws0at0PtaBHBADhrpZdOh7XxZzFvD3PUqMFyaSK91dKXNdACDx4Kg==
dependencies:
ansi-regex "5.0.1"
deepmerge "^4.2.2"
@@ -3427,19 +3510,19 @@
dependencies:
type-detect "4.0.8"
-"@sinonjs/commons@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3"
- integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==
+"@sinonjs/commons@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72"
+ integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==
dependencies:
type-detect "4.0.8"
"@sinonjs/fake-timers@^10.0.2":
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c"
- integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz#b3e322a34c5f26e3184e7f6115695f299c1b1194"
+ integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==
dependencies:
- "@sinonjs/commons" "^2.0.0"
+ "@sinonjs/commons" "^3.0.0"
"@sinonjs/fake-timers@^8.0.1":
version "8.1.0"
@@ -4561,9 +4644,9 @@
integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
"@tsconfig/node16@^1.0.2":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e"
- integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
+ integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
"@tsconfig/react-native@^2.0.3":
version "2.0.3"
@@ -4571,9 +4654,9 @@
integrity sha512-jE58snEKBd9DXfyR4+ssZmYJ/W2mOSnNrvljR0aLyQJL9JKX6vlWELHkRjb3HBbcM9Uy0hZGijXbqEAjOERW2A==
"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
- version "7.20.0"
- resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891"
- integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==
+ version "7.20.1"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b"
+ integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==
dependencies:
"@babel/parser" "^7.20.7"
"@babel/types" "^7.20.7"
@@ -4597,11 +4680,11 @@
"@babel/types" "^7.0.0"
"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
- version "7.18.5"
- resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.5.tgz#c107216842905afafd3b6e774f6f935da6f5db80"
- integrity sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==
+ version "7.20.0"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.0.tgz#4709d34d3eba3e1dad1950d40e80c6b5e0b81fc9"
+ integrity sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q==
dependencies:
- "@babel/types" "^7.3.0"
+ "@babel/types" "^7.20.7"
"@types/body-parser@*":
version "1.19.2"
@@ -4642,9 +4725,9 @@
"@types/estree" "*"
"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1":
- version "8.37.0"
- resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1"
- integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==
+ version "8.40.0"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.0.tgz#ae73dc9ec5237f2794c4f79efd6a4c73b13daf23"
+ integrity sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
@@ -4660,9 +4743,9 @@
integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33":
- version "4.17.34"
- resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz#c119e85b75215178bc127de588e93100698ab4cc"
- integrity sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==
+ version "4.17.35"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f"
+ integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==
dependencies:
"@types/node" "*"
"@types/qs" "*"
@@ -4753,9 +4836,9 @@
parse5 "^7.0.0"
"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
- version "7.0.11"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
- integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+ version "7.0.12"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
+ integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
"@types/json5@^0.0.29":
version "0.0.29"
@@ -4769,13 +4852,6 @@
dependencies:
"@types/lodash" "*"
-"@types/lodash.clonedeep@^4.5.7":
- version "4.5.7"
- resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.7.tgz#0e119f582ed6f9e6b373c04a644651763214f197"
- integrity sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw==
- dependencies:
- "@types/lodash" "*"
-
"@types/lodash.debounce@^4.0.7":
version "4.0.7"
resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.7.tgz#0285879defb7cdb156ae633cecd62d5680eded9f"
@@ -4819,9 +4895,9 @@
"@types/lodash" "*"
"@types/lodash@*":
- version "4.14.194"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76"
- integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==
+ version "4.14.195"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632"
+ integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==
"@types/mime@*":
version "3.0.1"
@@ -4839,14 +4915,14 @@
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
"@types/node@*":
- version "18.16.3"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.3.tgz#6bda7819aae6ea0b386ebc5b24bdf602f1b42b01"
- integrity sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==
+ version "20.2.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb"
+ integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==
"@types/node@^18.16.2":
- version "18.16.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.2.tgz#2f610ea71034b3971c312192377f8a7178eb57f1"
- integrity sha512-GQW/JL/5Fz/0I8RpeBG9lKp0+aNcXEaVL71c0D2Q0QHDTFvlYKT7an0onCUXj85anv7b4/WesqdfchLc0jtsCg==
+ version "18.16.16"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.16.tgz#3b64862856c7874ccf7439e6bab872d245c86d8e"
+ integrity sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==
"@types/object.omit@^3.0.0":
version "3.0.0"
@@ -4896,9 +4972,9 @@
"@types/react" "*"
"@types/react-native@^0.67.3":
- version "0.67.20"
- resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.67.20.tgz#0a4293613f26e8ea468b7c4403fc8e9886575dce"
- integrity sha512-a9i1+mpt4Jcztvqfx6SFQVh12vmd4AX2T8Q1NwBhMAFRQm+BPbXwYMjiO7GUS2H6FAx4qysROWMK/OZlfZQ1qA==
+ version "0.67.21"
+ resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.67.21.tgz#d7a46cb1a1e5c9cdc8d83efefe9e54dc179d7126"
+ integrity sha512-p++6s9efGcIPjDJFxlfXS9zCb2ZVMhDM3eaEUqjmn9InVM1NhquyQlDABn6yZUAhBMqqoor62CXNKR0wC6sPKA==
dependencies:
"@types/react" "^17"
@@ -4917,9 +4993,9 @@
"@types/react" "^17"
"@types/react@*", "@types/react@^17":
- version "17.0.58"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.58.tgz#c8bbc82114e5c29001548ebe8ed6c4ba4d3c9fb0"
- integrity sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==
+ version "17.0.60"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.60.tgz#a4a97dcdbebad76612c188fc06440e4995fd8ad2"
+ integrity sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
@@ -4943,9 +5019,9 @@
integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==
"@types/semver@^7.3.12":
- version "7.3.13"
- resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91"
- integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a"
+ integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==
"@types/send@*":
version "0.17.1"
@@ -5031,14 +5107,14 @@
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^5.30.5", "@typescript-eslint/eslint-plugin@^5.48.2", "@typescript-eslint/eslint-plugin@^5.5.0":
- version "5.59.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz#684a2ce7182f3b4dac342eef7caa1c2bae476abd"
- integrity sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==
+ version "5.59.8"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz#1e7a3e5318ece22251dfbc5c9c6feeb4793cc509"
+ integrity sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==
dependencies:
"@eslint-community/regexpp" "^4.4.0"
- "@typescript-eslint/scope-manager" "5.59.2"
- "@typescript-eslint/type-utils" "5.59.2"
- "@typescript-eslint/utils" "5.59.2"
+ "@typescript-eslint/scope-manager" "5.59.8"
+ "@typescript-eslint/type-utils" "5.59.8"
+ "@typescript-eslint/utils" "5.59.8"
debug "^4.3.4"
grapheme-splitter "^1.0.4"
ignore "^5.2.0"
@@ -5047,78 +5123,78 @@
tsutils "^3.21.0"
"@typescript-eslint/experimental-utils@^5.0.0":
- version "5.59.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.2.tgz#c2785247c4c8929cb6946e46280ea44f54d9cf79"
- integrity sha512-JLw2UImsjHDuVukpA8Nt+UK7JKE/LQAeV3tU5f7wJo2/NNYVwcakzkWjoYzu/2qzWY/Z9c7zojngNDfecNt92g==
+ version "5.59.8"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.8.tgz#21d20f3b657f8dbd237887d9bbb40bf1b5b38cd0"
+ integrity sha512-jAf+hihtd0G2RLB9x796+3i8D0L5T5xjftuPpJ82RLsPNHdzGXmbZNNftQ558h90ogc45DD8/W3OrxmdSO5Nng==
dependencies:
- "@typescript-eslint/utils" "5.59.2"
+ "@typescript-eslint/utils" "5.59.8"
"@typescript-eslint/parser@^5.30.5", "@typescript-eslint/parser@^5.48.2", "@typescript-eslint/parser@^5.5.0":
- version "5.59.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.2.tgz#c2c443247901d95865b9f77332d9eee7c55655e8"
- integrity sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==
+ version "5.59.8"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.8.tgz#60cbb00671d86cf746044ab797900b1448188567"
+ integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==
dependencies:
- "@typescript-eslint/scope-manager" "5.59.2"
- "@typescript-eslint/types" "5.59.2"
- "@typescript-eslint/typescript-estree" "5.59.2"
+ "@typescript-eslint/scope-manager" "5.59.8"
+ "@typescript-eslint/types" "5.59.8"
+ "@typescript-eslint/typescript-estree" "5.59.8"
debug "^4.3.4"
-"@typescript-eslint/scope-manager@5.59.2":
- version "5.59.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz#f699fe936ee4e2c996d14f0fdd3a7da5ba7b9a4c"
- integrity sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==
+"@typescript-eslint/scope-manager@5.59.8":
+ version "5.59.8"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8"
+ integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==
dependencies:
- "@typescript-eslint/types" "5.59.2"
- "@typescript-eslint/visitor-keys" "5.59.2"
+ "@typescript-eslint/types" "5.59.8"
+ "@typescript-eslint/visitor-keys" "5.59.8"
-"@typescript-eslint/type-utils@5.59.2":
- version "5.59.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz#0729c237503604cd9a7084b5af04c496c9a4cdcf"
- integrity sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==
+"@typescript-eslint/type-utils@5.59.8":
+ version "5.59.8"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz#aa6c029a9d7706d26bbd25eb4666398781df6ea2"
+ integrity sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==
dependencies:
- "@typescript-eslint/typescript-estree" "5.59.2"
- "@typescript-eslint/utils" "5.59.2"
+ "@typescript-eslint/typescript-estree" "5.59.8"
+ "@typescript-eslint/utils" "5.59.8"
debug "^4.3.4"
tsutils "^3.21.0"
-"@typescript-eslint/types@5.59.2":
- version "5.59.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.2.tgz#b511d2b9847fe277c5cb002a2318bd329ef4f655"
- integrity sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==
+"@typescript-eslint/types@5.59.8":
+ version "5.59.8"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8"
+ integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==
-"@typescript-eslint/typescript-estree@5.59.2":
- version "5.59.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz#6e2fabd3ba01db5d69df44e0b654c0b051fe9936"
- integrity sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==
+"@typescript-eslint/typescript-estree@5.59.8":
+ version "5.59.8"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7"
+ integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==
dependencies:
- "@typescript-eslint/types" "5.59.2"
- "@typescript-eslint/visitor-keys" "5.59.2"
+ "@typescript-eslint/types" "5.59.8"
+ "@typescript-eslint/visitor-keys" "5.59.8"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/utils@5.59.2", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.58.0":
- version "5.59.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.2.tgz#0c45178124d10cc986115885688db6abc37939f4"
- integrity sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==
+"@typescript-eslint/utils@5.59.8", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.58.0":
+ version "5.59.8"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b"
+ integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@types/json-schema" "^7.0.9"
"@types/semver" "^7.3.12"
- "@typescript-eslint/scope-manager" "5.59.2"
- "@typescript-eslint/types" "5.59.2"
- "@typescript-eslint/typescript-estree" "5.59.2"
+ "@typescript-eslint/scope-manager" "5.59.8"
+ "@typescript-eslint/types" "5.59.8"
+ "@typescript-eslint/typescript-estree" "5.59.8"
eslint-scope "^5.1.1"
semver "^7.3.7"
-"@typescript-eslint/visitor-keys@5.59.2":
- version "5.59.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz#37a419dc2723a3eacbf722512b86d6caf7d3b750"
- integrity sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==
+"@typescript-eslint/visitor-keys@5.59.8":
+ version "5.59.8"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40"
+ integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==
dependencies:
- "@typescript-eslint/types" "5.59.2"
+ "@typescript-eslint/types" "5.59.8"
eslint-visitor-keys "^3.3.0"
"@urql/core@2.3.6":
@@ -5145,146 +5221,146 @@
"@urql/core" ">=2.3.1"
wonka "^4.0.14"
-"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c"
- integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==
+"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24"
+ integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==
dependencies:
- "@webassemblyjs/helper-numbers" "1.11.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.5"
+ "@webassemblyjs/helper-numbers" "1.11.6"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
-"@webassemblyjs/floating-point-hex-parser@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4"
- integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==
+"@webassemblyjs/floating-point-hex-parser@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431"
+ integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==
-"@webassemblyjs/helper-api-error@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1"
- integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==
+"@webassemblyjs/helper-api-error@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768"
+ integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==
-"@webassemblyjs/helper-buffer@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba"
- integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==
+"@webassemblyjs/helper-buffer@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093"
+ integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==
-"@webassemblyjs/helper-numbers@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9"
- integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==
+"@webassemblyjs/helper-numbers@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5"
+ integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==
dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.11.5"
- "@webassemblyjs/helper-api-error" "1.11.5"
+ "@webassemblyjs/floating-point-hex-parser" "1.11.6"
+ "@webassemblyjs/helper-api-error" "1.11.6"
"@xtuc/long" "4.2.2"
-"@webassemblyjs/helper-wasm-bytecode@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f"
- integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==
+"@webassemblyjs/helper-wasm-bytecode@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9"
+ integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==
-"@webassemblyjs/helper-wasm-section@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e"
- integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==
+"@webassemblyjs/helper-wasm-section@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577"
+ integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==
dependencies:
- "@webassemblyjs/ast" "1.11.5"
- "@webassemblyjs/helper-buffer" "1.11.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.5"
- "@webassemblyjs/wasm-gen" "1.11.5"
+ "@webassemblyjs/ast" "1.11.6"
+ "@webassemblyjs/helper-buffer" "1.11.6"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/wasm-gen" "1.11.6"
-"@webassemblyjs/ieee754@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60"
- integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==
+"@webassemblyjs/ieee754@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a"
+ integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==
dependencies:
"@xtuc/ieee754" "^1.2.0"
-"@webassemblyjs/leb128@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a"
- integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==
+"@webassemblyjs/leb128@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7"
+ integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==
dependencies:
"@xtuc/long" "4.2.2"
-"@webassemblyjs/utf8@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a"
- integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==
+"@webassemblyjs/utf8@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a"
+ integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==
"@webassemblyjs/wasm-edit@^1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d"
- integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab"
+ integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==
dependencies:
- "@webassemblyjs/ast" "1.11.5"
- "@webassemblyjs/helper-buffer" "1.11.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.5"
- "@webassemblyjs/helper-wasm-section" "1.11.5"
- "@webassemblyjs/wasm-gen" "1.11.5"
- "@webassemblyjs/wasm-opt" "1.11.5"
- "@webassemblyjs/wasm-parser" "1.11.5"
- "@webassemblyjs/wast-printer" "1.11.5"
+ "@webassemblyjs/ast" "1.11.6"
+ "@webassemblyjs/helper-buffer" "1.11.6"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/helper-wasm-section" "1.11.6"
+ "@webassemblyjs/wasm-gen" "1.11.6"
+ "@webassemblyjs/wasm-opt" "1.11.6"
+ "@webassemblyjs/wasm-parser" "1.11.6"
+ "@webassemblyjs/wast-printer" "1.11.6"
-"@webassemblyjs/wasm-gen@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1"
- integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==
+"@webassemblyjs/wasm-gen@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268"
+ integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==
dependencies:
- "@webassemblyjs/ast" "1.11.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.5"
- "@webassemblyjs/ieee754" "1.11.5"
- "@webassemblyjs/leb128" "1.11.5"
- "@webassemblyjs/utf8" "1.11.5"
+ "@webassemblyjs/ast" "1.11.6"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/ieee754" "1.11.6"
+ "@webassemblyjs/leb128" "1.11.6"
+ "@webassemblyjs/utf8" "1.11.6"
-"@webassemblyjs/wasm-opt@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a"
- integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==
+"@webassemblyjs/wasm-opt@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2"
+ integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==
dependencies:
- "@webassemblyjs/ast" "1.11.5"
- "@webassemblyjs/helper-buffer" "1.11.5"
- "@webassemblyjs/wasm-gen" "1.11.5"
- "@webassemblyjs/wasm-parser" "1.11.5"
+ "@webassemblyjs/ast" "1.11.6"
+ "@webassemblyjs/helper-buffer" "1.11.6"
+ "@webassemblyjs/wasm-gen" "1.11.6"
+ "@webassemblyjs/wasm-parser" "1.11.6"
-"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2"
- integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==
+"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1"
+ integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==
dependencies:
- "@webassemblyjs/ast" "1.11.5"
- "@webassemblyjs/helper-api-error" "1.11.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.5"
- "@webassemblyjs/ieee754" "1.11.5"
- "@webassemblyjs/leb128" "1.11.5"
- "@webassemblyjs/utf8" "1.11.5"
+ "@webassemblyjs/ast" "1.11.6"
+ "@webassemblyjs/helper-api-error" "1.11.6"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
+ "@webassemblyjs/ieee754" "1.11.6"
+ "@webassemblyjs/leb128" "1.11.6"
+ "@webassemblyjs/utf8" "1.11.6"
-"@webassemblyjs/wast-printer@1.11.5":
- version "1.11.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98"
- integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==
+"@webassemblyjs/wast-printer@1.11.6":
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20"
+ integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==
dependencies:
- "@webassemblyjs/ast" "1.11.5"
+ "@webassemblyjs/ast" "1.11.6"
"@xtuc/long" "4.2.2"
-"@webpack-cli/configtest@^2.0.1":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.0.1.tgz#a69720f6c9bad6aef54a8fa6ba9c3533e7ef4c7f"
- integrity sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==
+"@webpack-cli/configtest@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.0.tgz#b59b33377b1b896a9a7357cfc643b39c1524b1e6"
+ integrity sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==
"@webpack-cli/info@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.1.tgz#eed745799c910d20081e06e5177c2b2569f166c0"
integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==
-"@webpack-cli/serve@^2.0.2":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.2.tgz#10aa290e44a182c02e173a89452781b1acbc86d9"
- integrity sha512-S9h3GmOmzUseyeFW3tYNnWS7gNUuwxZ3mmMq0JyW78Vx1SGKPSkt5bT4pB0rUnVfHjP0EL9gW2bOzmtiTfQt0A==
+"@webpack-cli/serve@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.4.tgz#3982ee6f8b42845437fc4d391e93ac5d9da52f0f"
+ integrity sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==
-"@xmldom/xmldom@~0.7.0", "@xmldom/xmldom@~0.7.7":
- version "0.7.10"
- resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.10.tgz#b1f4a7dc63ac35b2750847644d5dacf5b4ead12f"
- integrity sha512-hb9QhOg5MGmpVkFcoZ9XJMe1em5gd0e2eqqjK87O1dwULedXsnY/Zg/Ju6lcohA+t6jVkmKpe7I1etqhvdRdrQ==
+"@xmldom/xmldom@~0.7.7":
+ version "0.7.11"
+ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.11.tgz#adecc134521274711d071d5b0200907cc83b38ee"
+ integrity sha512-UDi3g6Jss/W5FnSzO9jCtQwEpfymt0M+sPPlmLhDH6h2TJ8j4ESE/LpmNPBij15J5NKkk4/cg/qoVMdWI3vnlQ==
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
@@ -5347,10 +5423,10 @@ acorn-globals@^7.0.0:
acorn "^8.1.0"
acorn-walk "^8.0.2"
-acorn-import-assertions@^1.7.6:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
- integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
+acorn-import-assertions@^1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac"
+ integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==
acorn-jsx@^5.3.2:
version "5.3.2"
@@ -5789,16 +5865,17 @@ await-lock@^2.2.2:
integrity sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==
axe-core@^4.6.2:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf"
- integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==
+ version "4.7.2"
+ resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0"
+ integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==
-axios@^0.24.0:
- version "0.24.0"
- resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6"
- integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==
+axios@^0.27.2:
+ version "0.27.2"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
+ integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
dependencies:
- follow-redirects "^1.14.4"
+ follow-redirects "^1.14.9"
+ form-data "^4.0.0"
axios@^1.3.4:
version "1.4.0"
@@ -5941,29 +6018,29 @@ babel-plugin-named-asset-import@^0.3.8:
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2"
integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==
-babel-plugin-polyfill-corejs2@^0.3.3:
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122"
- integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==
+babel-plugin-polyfill-corejs2@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd"
+ integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==
dependencies:
"@babel/compat-data" "^7.17.7"
- "@babel/helper-define-polyfill-provider" "^0.3.3"
+ "@babel/helper-define-polyfill-provider" "^0.4.0"
semver "^6.1.1"
-babel-plugin-polyfill-corejs3@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a"
- integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==
+babel-plugin-polyfill-corejs3@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a"
+ integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.3.3"
- core-js-compat "^3.25.1"
+ "@babel/helper-define-polyfill-provider" "^0.4.0"
+ core-js-compat "^3.30.1"
-babel-plugin-polyfill-regenerator@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747"
- integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==
+babel-plugin-polyfill-regenerator@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380"
+ integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.3.3"
+ "@babel/helper-define-polyfill-provider" "^0.4.0"
babel-plugin-react-native-web@^0.18.12, babel-plugin-react-native-web@~0.18.10:
version "0.18.12"
@@ -6302,14 +6379,14 @@ browser-process-hrtime@^1.0.0:
integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5:
- version "4.21.5"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7"
- integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==
+ version "4.21.7"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551"
+ integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==
dependencies:
- caniuse-lite "^1.0.30001449"
- electron-to-chromium "^1.4.284"
- node-releases "^2.0.8"
- update-browserslist-db "^1.0.10"
+ caniuse-lite "^1.0.30001489"
+ electron-to-chromium "^1.4.411"
+ node-releases "^2.0.12"
+ update-browserslist-db "^1.0.11"
bser@2.1.1:
version "2.1.1"
@@ -6518,15 +6595,15 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464:
- version "1.0.30001482"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001482.tgz#8b3fad73dc35b2674a5c96df2d4f9f1c561435de"
- integrity sha512-F1ZInsg53cegyjroxLNW9DmrEQ1SuGRTO1QlpA0o2/6OpQ0gFeDRoq1yFmnr8Sakn9qwwt9DmbxHB6w167OSuQ==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001489:
+ version "1.0.30001491"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001491.tgz#eab0e0f392de6f7411751d148de9b5bd6b203e46"
+ integrity sha512-17EYIi4TLnPiTzVKMveIxU5ETlxbSO3B6iPvMbprqnKh4qJsQGk5Nh1Lp4jIMAE0XfrujsJuWZAM3oJdMHaKBA==
case-anything@^2.1.10:
- version "2.1.10"
- resolved "https://registry.yarnpkg.com/case-anything/-/case-anything-2.1.10.tgz#d18a6ca968d54ec3421df71e3e190f3bced23410"
- integrity sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==
+ version "2.1.13"
+ resolved "https://registry.yarnpkg.com/case-anything/-/case-anything-2.1.13.tgz#0cdc16278cb29a7fcdeb072400da3f342ba329e9"
+ integrity sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==
case-sensitive-paths-webpack-plugin@^2.4.0:
version "2.4.0"
@@ -6553,16 +6630,16 @@ cbor-extract@^2.1.1:
"@cbor-extract/cbor-extract-win32-x64" "2.1.1"
cbor-x@^1.5.1:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.5.2.tgz#ceabc48bda06185de1f3a078bb4a793e6e222de5"
- integrity sha512-JArE6xcgj3eo13fpnShO42QFBUuXP2uG12RLeF2Nb+dJcETFYxkUa27gXQrRYp67Ahtaxyfbg+ihc62XTyQqsQ==
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.5.3.tgz#f8252fec7cab86b66c500e0c991788618e6638de"
+ integrity sha512-adrN0S67C7jY2hgqeGcw+Uj6iEGLQa5D/p6/9YNl5AaVIYJaJz/bARfWsP8UikBZWbhS27LN0DJK4531vo9ODw==
optionalDependencies:
cbor-extract "^2.1.1"
cborg@^1.6.0:
- version "1.10.1"
- resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.10.1.tgz#24cfe52c69ec0f66f95e23dc57f2086954c8d718"
- integrity sha512-et6Qm8MOUY2kCWa5GKk2MlBVoPjHv0hQBmlzI/Z7+5V3VJCeIkGehIB3vWknNsm2kOkAIs6wEKJFJo8luWQQ/w==
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.10.2.tgz#83cd581b55b3574c816f82696307c7512db759a1"
+ integrity sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
@@ -6712,9 +6789,9 @@ cli-cursor@^3.1.0:
restore-cursor "^3.1.0"
cli-spinners@^2.0.0, cli-spinners@^2.5.0:
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.8.0.tgz#e97a3e2bd00e6d85aa0c13d7f9e3ce236f7787fc"
- integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db"
+ integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==
cli-width@^2.0.0:
version "2.2.1"
@@ -7040,22 +7117,22 @@ copy-webpack-plugin@^10.2.0:
schema-utils "^4.0.0"
serialize-javascript "^6.0.0"
-core-js-compat@^3.25.1:
- version "3.30.1"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.1.tgz#961541e22db9c27fc48bfc13a3cafa8734171dfe"
- integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==
+core-js-compat@^3.30.1, core-js-compat@^3.30.2:
+ version "3.30.2"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b"
+ integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==
dependencies:
browserslist "^4.21.5"
core-js-pure@^3.23.3:
- version "3.30.1"
- resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.1.tgz#7d93dc89e7d47b8ef05d7e79f507b0e99ea77eec"
- integrity sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg==
+ version "3.30.2"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.2.tgz#005a82551f4af3250dcfb46ed360fad32ced114e"
+ integrity sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==
core-js@^3.19.2:
- version "3.30.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.1.tgz#fc9c5adcc541d8e9fa3e381179433cbf795628ba"
- integrity sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ==
+ version "3.30.2"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.2.tgz#6528abfda65e5ad728143ea23f7a14f0dcf503fc"
+ integrity sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==
core-util-is@~1.0.0:
version "1.0.3"
@@ -7116,16 +7193,16 @@ create-require@^1.1.0:
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
crelt@^1.0.0:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94"
- integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72"
+ integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==
cross-fetch@^3.1.5:
- version "3.1.5"
- resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
- integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c"
+ integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==
dependencies:
- node-fetch "2.6.7"
+ node-fetch "^2.6.11"
cross-spawn@^4.0.2:
version "4.0.2"
@@ -7197,14 +7274,14 @@ css-in-js-utils@^3.1.0:
hyphenate-style-name "^1.0.3"
css-loader@^6.5.1:
- version "6.7.3"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd"
- integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==
+ version "6.8.1"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88"
+ integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==
dependencies:
icss-utils "^5.1.0"
- postcss "^8.4.19"
+ postcss "^8.4.21"
postcss-modules-extract-imports "^3.0.0"
- postcss-modules-local-by-default "^4.0.0"
+ postcss-modules-local-by-default "^4.0.3"
postcss-modules-scope "^3.0.0"
postcss-modules-values "^4.0.0"
postcss-value-parser "^4.2.0"
@@ -7296,9 +7373,9 @@ css-what@^6.0.1, css-what@^6.1.0:
integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
cssdb@^7.1.0:
- version "7.5.4"
- resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.5.4.tgz#e34dafee5184d67634604e345e389ca79ac179ea"
- integrity sha512-fGD+J6Jlq+aurfE1VDXlLS4Pt0VtNlu2+YgfGOdMxRyl/HQ9bDiHTwSck1Yz8A97Dt/82izSK6Bp/4nVqacOsg==
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.6.0.tgz#beac8f7a5f676db62d3c33da517ef4c9eb008f8b"
+ integrity sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w==
cssesc@^3.0.0:
version "3.0.0"
@@ -7685,9 +7762,9 @@ detect-port-alt@^1.1.6:
debug "^2.6.0"
detox@^20.1.2:
- version "20.7.1"
- resolved "https://registry.yarnpkg.com/detox/-/detox-20.7.1.tgz#3e3981a8eaa223135ca85d44aa9dc3b742b8ed46"
- integrity sha512-a8y+M40g4goqWnyHZnestmVL/EII8Hq4utCK4kuSpvRHWkBA5KuQFlXErfNrrOcqXuXhPqdBnxqO9VsMAlLHFA==
+ version "20.9.1"
+ resolved "https://registry.yarnpkg.com/detox/-/detox-20.9.1.tgz#78c351c6d5f140d29151ebfe986362276e156d08"
+ integrity sha512-o7x9fHhOoVDZK1069RgefqIxY0B53eAnk7N5/3D8qEa8N0YmvylqzAqeYVtnzHYkveZb1pkcruzKC9jomWTEnw==
dependencies:
ajv "^8.6.3"
bunyan "^1.8.12"
@@ -7724,11 +7801,6 @@ detox@^20.1.2:
yargs-parser "^21.0.0"
yargs-unparser "^2.0.0"
-did-resolver@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-4.1.0.tgz#740852083c4fd5bf9729d528eca5d105aff45eb6"
- integrity sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==
-
didyoumean@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
@@ -7903,9 +7975,9 @@ dotenv@^10.0.0:
integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
dotenv@^16.0.0, dotenv@^16.0.3:
- version "16.0.3"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07"
- integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==
+ version "16.1.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.1.0.tgz#beb4232166ea080520a42245b8007227ad84b052"
+ integrity sha512-XiwP/4cqatBNLEnKe169vPZCrovUmYngyVA4DgZ3uIVLJfZaBgr4uT0EF2TrEQqgWDDlekGo0muEYme5SR78Ww==
dset@^3.1.1, dset@^3.1.2:
version "3.1.2"
@@ -7955,10 +8027,10 @@ ejs@^3.1.6:
dependencies:
jake "^10.8.5"
-electron-to-chromium@^1.4.284:
- version "1.4.378"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.378.tgz#73431ffd5fffebc18b4e897fac2e7d4ae6d559d9"
- integrity sha512-RfCD26kGStl6+XalfX3DGgt3z2DNwJS5DKRHCpkPq5T/PqpZMPB1moSRXuK9xhkt/sF57LlpzJgNoYl7mO7Z6w==
+electron-to-chromium@^1.4.411:
+ version "1.4.414"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.414.tgz#f9eedb6fb01b50439d8228d8ee3a6fa5e0108437"
+ integrity sha512-RRuCvP6ekngVh2SAJaOKT/hxqc9JAsK+Pe0hP5tGQIfonU2Zy9gMGdJ+mBdyl/vNucMG6gkXYtuM4H/1giws5w==
email-validator@^2.0.4:
version "2.0.4"
@@ -8007,10 +8079,10 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1:
dependencies:
once "^1.4.0"
-enhanced-resolve@^5.13.0:
- version "5.13.0"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275"
- integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==
+enhanced-resolve@^5.14.1:
+ version "5.14.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3"
+ integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@@ -8379,9 +8451,9 @@ eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.30.1:
string.prototype.matchall "^4.0.8"
eslint-plugin-testing-library@^5.0.1:
- version "5.10.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.3.tgz#e613fbaf9a145e9eef115d080b32cb488fae622e"
- integrity sha512-0yhsKFsjHLud5PM+f2dWr9K3rqYzMy4cSHs3lcmFYMa1CdSzRvHGgXvsFarBjZ41gU8jhTdMIkg8jHLxGJqLqw==
+ version "5.11.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz#0bad7668e216e20dd12f8c3652ca353009163121"
+ integrity sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==
dependencies:
"@typescript-eslint/utils" "^5.58.0"
@@ -8406,10 +8478,10 @@ eslint-visitor-keys@^2.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc"
- integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
+ integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
eslint-webpack-plugin@^3.1.1:
version "3.2.0"
@@ -8423,14 +8495,14 @@ eslint-webpack-plugin@^3.1.1:
schema-utils "^4.0.0"
eslint@^8.19.0, eslint@^8.3.0:
- version "8.39.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.39.0.tgz#7fd20a295ef92d43809e914b70c39fd5a23cf3f1"
- integrity sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==
+ version "8.41.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c"
+ integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.4.0"
- "@eslint/eslintrc" "^2.0.2"
- "@eslint/js" "8.39.0"
+ "@eslint/eslintrc" "^2.0.3"
+ "@eslint/js" "8.41.0"
"@humanwhocodes/config-array" "^0.11.8"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
@@ -8441,8 +8513,8 @@ eslint@^8.19.0, eslint@^8.3.0:
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
eslint-scope "^7.2.0"
- eslint-visitor-keys "^3.4.0"
- espree "^9.5.1"
+ eslint-visitor-keys "^3.4.1"
+ espree "^9.5.2"
esquery "^1.4.2"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
@@ -8450,13 +8522,12 @@ eslint@^8.19.0, eslint@^8.3.0:
find-up "^5.0.0"
glob-parent "^6.0.2"
globals "^13.19.0"
- grapheme-splitter "^1.0.4"
+ graphemer "^1.4.0"
ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
is-path-inside "^3.0.3"
- js-sdsl "^4.1.4"
js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
@@ -8468,14 +8539,14 @@ eslint@^8.19.0, eslint@^8.3.0:
strip-json-comments "^3.1.0"
text-table "^0.2.0"
-espree@^9.5.1:
- version "9.5.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.1.tgz#4f26a4d5f18905bf4f2e0bd99002aab807e96dd4"
- integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==
+espree@^9.5.2:
+ version "9.5.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b"
+ integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==
dependencies:
acorn "^8.8.0"
acorn-jsx "^5.3.2"
- eslint-visitor-keys "^3.4.0"
+ eslint-visitor-keys "^3.4.1"
esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
version "4.0.1"
@@ -8783,18 +8854,18 @@ expo-modules-autolinking@1.2.0:
find-up "^5.0.0"
fs-extra "^9.1.0"
-expo-modules-core@1.2.6:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-1.2.6.tgz#921abc8031fe0e5474ee48905071902b9627d051"
- integrity sha512-vyleKepkP8F6L+D55B/E4FbZ8x9pdy3yw/mdbGBkDkrmo2gmeMjOM1mKLSszOkLIqet05O7Wy8m0FZHZTo0VBg==
+expo-modules-core@1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-1.2.7.tgz#c80627b13a8f1c94ae9da8eea41e1ef1df5788c8"
+ integrity sha512-sulqn2M8+tIdxi6QFkKppDEzbePAscgE2LEHocYoQOgHxJpeT7axE0Hkzc+81EeviQilZzGeFZMtNMGh3c9yJg==
dependencies:
compare-versions "^3.4.0"
invariant "^2.2.4"
-expo-pwa@0.0.124:
- version "0.0.124"
- resolved "https://registry.yarnpkg.com/expo-pwa/-/expo-pwa-0.0.124.tgz#684e68aea6c7f95864a8cde17a57e223ed017199"
- integrity sha512-hYvQQhxATNTivWSRc9nrd1WVYJJnBG8P/SVrJ4PPu0pmsS7ZIvWt981IXYG461y9UWnTbXdZEG4UOt0Thak1Gg==
+expo-pwa@0.0.125:
+ version "0.0.125"
+ resolved "https://registry.yarnpkg.com/expo-pwa/-/expo-pwa-0.0.125.tgz#fb5a66f21e7c9a51cdfa76d692b48bd116e6e002"
+ integrity sha512-A40Man5vMO1WWHwVDJr/7Y2N6vwHCQDX4gQ1LM9GngEFHRMK2lxx/tMVV2v+UF2g1lr84RVRGzMvO/tV9LYiaA==
dependencies:
"@expo/image-utils" "0.3.23"
chalk "^4.0.0"
@@ -8855,14 +8926,14 @@ expo-updates@~0.16.4:
resolve-from "^5.0.0"
expo@~48.0.15:
- version "48.0.15"
- resolved "https://registry.yarnpkg.com/expo/-/expo-48.0.15.tgz#28194c03ac85f7f5a87b7493b8cef0eb405eccbe"
- integrity sha512-me2Xxr7Faxf60BiKq8WBSwkYV9BVbS+VqeHRFdXduVA0Uj2zp1a0zYB5eblmWqpRco75VBUgOa9M+/eR1YVZmw==
+ version "48.0.17"
+ resolved "https://registry.yarnpkg.com/expo/-/expo-48.0.17.tgz#000773a2675e5bf95688a84fbc625c105f8b8af9"
+ integrity sha512-5T1CsMUlfI+xFB89GOU+/xtSSbSBBFVTqwgheAU0cQolfbs+YyJCMTKU5vN45N5OK+ym7p/LKPa6DQAxYPF8YQ==
dependencies:
"@babel/runtime" "^7.20.0"
"@expo/cli" "0.7.1"
"@expo/config" "8.0.2"
- "@expo/config-plugins" "6.0.1"
+ "@expo/config-plugins" "6.0.2"
"@expo/vector-icons" "^13.0.0"
babel-preset-expo "~9.3.2"
cross-spawn "^6.0.5"
@@ -8873,7 +8944,7 @@ expo@~48.0.15:
expo-font "~11.1.1"
expo-keep-awake "~12.0.1"
expo-modules-autolinking "1.2.0"
- expo-modules-core "1.2.6"
+ expo-modules-core "1.2.7"
fbemitter "^3.0.0"
getenv "^1.0.0"
invariant "^2.2.4"
@@ -8973,9 +9044,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-diff@^1.1.2:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
- integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
+ integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
fast-glob@^3.2.12, fast-glob@^3.2.5, fast-glob@^3.2.7, fast-glob@^3.2.9:
version "3.2.12"
@@ -9021,9 +9092,9 @@ fast-printf@^1.6.9:
boolean "^3.1.4"
fast-redact@^3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa"
- integrity sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.2.0.tgz#b1e2d39bc731376d28bde844454fa23e26919987"
+ integrity sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==
fast-text-encoding@^1.0.6:
version "1.0.6"
@@ -9129,7 +9200,7 @@ file-uri-to-path@1.0.0:
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
-filelist@^1.0.1:
+filelist@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
@@ -9272,16 +9343,16 @@ flatted@^3.1.0:
integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
flow-parser@0.*:
- version "0.205.0"
- resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.205.0.tgz#8756173b6488dedc31ab838e80c8f008d7a44e05"
- integrity sha512-ZJ6VuLe/BoqeI4GsF+ZuzlpfGi3FCnBrb4xDYhgEJxRt7SAj3ibRuRSsuJSRcY+lQhPZRPNbNWiQqFMxramUzw==
+ version "0.207.0"
+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.207.0.tgz#376975f6b88991bf0ef9496fa3bffd5eb3120046"
+ integrity sha512-s90OlXqzWj1xc4yUtqD1Gr8pGVx0/5rk9gsqPrOYF1kBAPMH4opkmzdWgQ8aNe3Pckqtwr8DlYGbfE2GnW+zsg==
flow-parser@^0.185.0:
version "0.185.2"
resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.185.2.tgz#cb7ee57f77377d6c5d69a469e980f6332a15e492"
integrity sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ==
-follow-redirects@^1.0.0, follow-redirects@^1.14.4, follow-redirects@^1.15.0:
+follow-redirects@^1.0.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0:
version "1.15.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
@@ -9491,12 +9562,13 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f"
- integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82"
+ integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==
dependencies:
function-bind "^1.1.1"
has "^1.0.3"
+ has-proto "^1.0.1"
has-symbols "^1.0.3"
get-own-enumerable-property-symbols@^3.0.0:
@@ -10261,9 +10333,9 @@ ipaddr.js@1.9.1, ipaddr.js@^1.9.0:
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
ipaddr.js@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0"
- integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f"
+ integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==
is-accessor-descriptor@^0.1.6:
version "0.1.6"
@@ -10346,9 +10418,9 @@ is-ci@^2.0.0:
ci-info "^2.0.0"
is-core-module@^2.11.0, is-core-module@^2.9.0:
- version "2.12.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4"
- integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd"
+ integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==
dependencies:
has "^1.0.3"
@@ -10750,14 +10822,14 @@ istanbul-reports@^3.1.3:
istanbul-lib-report "^3.0.0"
jake@^10.8.5:
- version "10.8.5"
- resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46"
- integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==
+ version "10.8.7"
+ resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f"
+ integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==
dependencies:
async "^3.2.3"
chalk "^4.0.2"
- filelist "^1.0.1"
- minimatch "^3.0.4"
+ filelist "^1.0.4"
+ minimatch "^3.1.2"
jest-changed-files@^27.5.1:
version "27.5.1"
@@ -11724,11 +11796,6 @@ js-queue@2.0.2:
dependencies:
easy-stack "^1.0.1"
-js-sdsl@^4.1.4:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430"
- integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==
-
js-sha256@^0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966"
@@ -11913,7 +11980,7 @@ json5@^0.5.1:
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==
-json5@^1.0.1, json5@^1.0.2:
+json5@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
@@ -12168,11 +12235,6 @@ lodash.chunk@^4.2.0:
resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc"
integrity sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==
-lodash.clonedeep@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
- integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
-
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@@ -12838,9 +12900,9 @@ min-indent@^1.0.0:
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
mini-css-extract-plugin@^2.4.5, mini-css-extract-plugin@^2.5.2:
- version "2.7.5"
- resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz#afbb344977659ec0f1f6e050c7aea456b121cfc5"
- integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==
+ version "2.7.6"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d"
+ integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==
dependencies:
schema-utils "^4.0.0"
@@ -12903,10 +12965,10 @@ minipass@^3.0.0, minipass@^3.1.1:
dependencies:
yallist "^4.0.0"
-minipass@^4.0.0:
- version "4.2.8"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a"
- integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==
+minipass@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
+ integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
minizlib@^2.1.1:
version "2.1.2"
@@ -13131,17 +13193,10 @@ node-dir@^0.1.17:
dependencies:
minimatch "^3.0.2"
-node-fetch@2.6.7:
- version "2.6.7"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
- integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
- dependencies:
- whatwg-url "^5.0.0"
-
-node-fetch@^2.0.0-alpha.8, node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
- integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
+node-fetch@^2.0.0-alpha.8, node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.11, node-fetch@^2.6.7:
+ version "2.6.11"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25"
+ integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==
dependencies:
whatwg-url "^5.0.0"
@@ -13177,10 +13232,10 @@ node-ipc@9.2.1:
js-message "1.0.7"
js-queue "2.0.2"
-node-releases@^2.0.8:
- version "2.0.10"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f"
- integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==
+node-releases@^2.0.12:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039"
+ integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==
node-stream-zip@^1.9.1:
version "1.15.0"
@@ -13200,9 +13255,9 @@ nodemailer-html-to-text@^3.2.0:
html-to-text "7.1.1"
nodemailer@^6.8.0:
- version "6.9.1"
- resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.1.tgz#8249d928a43ed85fec17b13d2870c8f758a126ed"
- integrity sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==
+ version "6.9.3"
+ resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.3.tgz#e4425b85f05d83c43c5cd81bf84ab968f8ef5cbe"
+ integrity sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==
normalize-css-color@^1.0.2:
version "1.0.2"
@@ -13288,9 +13343,9 @@ number-is-nan@^1.0.0:
integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
nwsapi@^2.2.0, nwsapi@^2.2.2:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5"
- integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2"
+ integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==
ob1@0.73.9:
version "0.73.9"
@@ -13559,9 +13614,9 @@ ora@^5.4.1:
wcwidth "^1.0.1"
orderedmap@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.0.tgz#819457082fa3a06abd316d83a281a1ca467437cd"
- integrity sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2"
+ integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==
os-homedir@^1.0.0:
version "1.0.2"
@@ -13831,10 +13886,15 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
-pg-connection-string@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34"
- integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==
+pg-cloudflare@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz#833d70870d610d14bf9df7afb40e1cba310c17a0"
+ integrity sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==
+
+pg-connection-string@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.0.tgz#12a36cc4627df19c25cc1b9b736cc39ee1f73ae8"
+ integrity sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==
pg-int8@1.0.1:
version "1.0.1"
@@ -13863,17 +13923,19 @@ pg-types@^2.1.0:
postgres-interval "^1.1.0"
pg@^8.10.0, pg@^8.9.0:
- version "8.10.0"
- resolved "https://registry.yarnpkg.com/pg/-/pg-8.10.0.tgz#5b8379c9b4a36451d110fc8cd98fc325fe62ad24"
- integrity sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==
+ version "8.11.0"
+ resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.0.tgz#a37e534e94b57a7ed811e926f23a7c56385f55d9"
+ integrity sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA==
dependencies:
buffer-writer "2.0.0"
packet-reader "1.0.0"
- pg-connection-string "^2.5.0"
+ pg-connection-string "^2.6.0"
pg-pool "^3.6.0"
pg-protocol "^1.6.0"
pg-types "^2.1.0"
pgpass "1.x"
+ optionalDependencies:
+ pg-cloudflare "^1.1.0"
pgpass@1.x:
version "1.0.5"
@@ -13938,14 +14000,14 @@ pino-http@^8.2.1, pino-http@^8.3.3:
process-warning "^2.0.0"
pino-std-serializers@^6.0.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz#169048c0df3f61352fce56aeb7fb962f1b66ab43"
- integrity sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.1.tgz#369f4ae2a19eb6d769ddf2c88a2164b76879a284"
+ integrity sha512-wHuWB+CvSVb2XqXM0W/WOYUkVSPbiJb9S5fNB7TBhd8s892Xq910bRxwHtC4l71hgztObTjXL6ZheZXFjhDrDQ==
pino@^8.0.0, pino@^8.11.0, pino@^8.6.1:
- version "8.11.0"
- resolved "https://registry.yarnpkg.com/pino/-/pino-8.11.0.tgz#2a91f454106b13e708a66c74ebc1c2ab7ab38498"
- integrity sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==
+ version "8.14.1"
+ resolved "https://registry.yarnpkg.com/pino/-/pino-8.14.1.tgz#bb38dcda8b500dd90c1193b6c9171eb777a47ac8"
+ integrity sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==
dependencies:
atomic-sleep "^1.0.0"
fast-redact "^3.1.1"
@@ -14284,10 +14346,10 @@ postcss-modules-extract-imports@^3.0.0:
resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d"
integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==
-postcss-modules-local-by-default@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c"
- integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==
+postcss-modules-local-by-default@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524"
+ integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==
dependencies:
icss-utils "^5.0.0"
postcss-selector-parser "^6.0.2"
@@ -14516,9 +14578,9 @@ postcss-selector-not@^6.0.1:
postcss-selector-parser "^6.0.10"
postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9:
- version "6.0.12"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz#2efae5ffab3c8bfb2b7fbf0c426e3bca616c4abb"
- integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==
+ version "6.0.13"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b"
+ integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
@@ -14551,10 +14613,10 @@ postcss@^7.0.35:
picocolors "^0.2.1"
source-map "^0.6.1"
-postcss@^8.3.5, postcss@^8.4.19, postcss@^8.4.23, postcss@^8.4.4:
- version "8.4.23"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab"
- integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==
+postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4:
+ version "8.4.24"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df"
+ integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==
dependencies:
nanoid "^3.3.6"
picocolors "^1.0.0"
@@ -14749,41 +14811,41 @@ proper-lockfile@^3.0.2:
signal-exit "^3.0.2"
prosemirror-changeset@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/prosemirror-changeset/-/prosemirror-changeset-2.2.0.tgz#22c05da271a118be40d3e339fa2cace789b1254b"
- integrity sha512-QM7ohGtkpVpwVGmFb8wqVhaz9+6IUXcIQBGZ81YNAKYuHiFJ1ShvSzab4pKqTinJhwciZbrtBEk/2WsqSt2PYg==
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz#dae94b63aec618fac7bb9061648e6e2a79988383"
+ integrity sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==
dependencies:
prosemirror-transform "^1.0.0"
prosemirror-collab@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.3.0.tgz#601d33473bf72e6c43041a54b860c84c60b37769"
- integrity sha512-+S/IJ69G2cUu2IM5b3PBekuxs94HO1CxJIWOFrLQXUaUDKL/JfBx+QcH31ldBlBXyDEUl+k3Vltfi1E1MKp2mA==
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz#0e8c91e76e009b53457eb3b3051fb68dad029a33"
+ integrity sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==
dependencies:
prosemirror-state "^1.0.0"
prosemirror-commands@^1.0.0, prosemirror-commands@^1.3.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.5.1.tgz#89ddfa14e144dcc7fb0938aa0e2568c7fdde306f"
- integrity sha512-ga1ga/RkbzxfAvb6iEXYmrEpekn5NCwTb8w1dr/gmhSoaGcQ0VPuCzOn5qDEpC45ql2oDkKoKQbRxLJwKLpMTQ==
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz#e94aeea52286f658cd984270de9b4c3fff580852"
+ integrity sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
prosemirror-dropcursor@^1.5.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.0.tgz#7bfa11925e0da41d1db869954fe51e1aa55158e4"
- integrity sha512-TZMitR8nlp9Xh42pDYGcWopCoFPmJduoyGJ7FjYM2/7gZKnfD41TIaZN5Q1cQjm6Fm/P5vk/DpVYFhS8kDdigw==
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz#49b9fb2f583e0d0f4021ff87db825faa2be2832d"
+ integrity sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==
dependencies:
prosemirror-state "^1.0.0"
prosemirror-transform "^1.1.0"
prosemirror-view "^1.1.0"
prosemirror-gapcursor@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz#8cfd874592e4504d63720e14ed680c7866e64554"
- integrity sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz#5fa336b83789c6199a7341c9493587e249215cb4"
+ integrity sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==
dependencies:
prosemirror-keymap "^1.0.0"
prosemirror-model "^1.0.0"
@@ -14791,9 +14853,9 @@ prosemirror-gapcursor@^1.3.1:
prosemirror-view "^1.0.0"
prosemirror-history@^1.0.0, prosemirror-history@^1.3.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.3.1.tgz#d0dba9ed1cc2bce55a45ce9c7c8224e641f276b8"
- integrity sha512-YMV/IWBZ+LZSfaNcBbPcaQUiAiJRYFyJW2aapuNzL8nhIRsI7fIO0ykJFSe802+mWeoTsVJ1jxvRWPYqaUqljQ==
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.3.2.tgz#ce6ad7ab9db83e761aee716f3040d74738311b15"
+ integrity sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==
dependencies:
prosemirror-state "^1.2.2"
prosemirror-transform "^1.0.0"
@@ -14801,33 +14863,33 @@ prosemirror-history@^1.0.0, prosemirror-history@^1.3.0:
rope-sequence "^1.3.0"
prosemirror-inputrules@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz#476dde2dc244050b3aca00cf58a82adfad6749e7"
- integrity sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.2.1.tgz#8faf3d78c16150aedac71d326a3e3947417ce557"
+ integrity sha512-3LrWJX1+ULRh5SZvbIQlwZafOXqp1XuV21MGBu/i5xsztd+9VD15x6OtN6mdqSFI7/8Y77gYUbQ6vwwJ4mr6QQ==
dependencies:
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.1.tgz#3839e7db66cecddae7451f4246e73bdd8489be1d"
- integrity sha512-kVK6WGC+83LZwuSJnuCb9PsADQnFZllt94qPP3Rx/vLcOUV65+IbBeH2nS5cFggPyEVJhGkGrgYFRrG250WhHQ==
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz#14a54763a29c7b2704f561088ccf3384d14eb77e"
+ integrity sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==
dependencies:
prosemirror-state "^1.0.0"
w3c-keyname "^2.2.0"
prosemirror-markdown@^1.10.1:
- version "1.10.1"
- resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.10.1.tgz#e20468201cda1916a6182686159398b242bb78ab"
- integrity sha512-s7iaTLiX+qO5z8kF2NcMmy2T7mIlxzkS4Sp3vTKSYChPtbMpg6YxFkU0Y06rUg2WtKlvBu7v1bXzlGBkfjUWAA==
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.11.0.tgz#75f2d6f14655762b4b8a247436b87ed81e22c7ee"
+ integrity sha512-yP9mZqPRstjZhhf3yykCQNE3AijxARrHe4e7esV9A+gp4cnGOH4QvrKYPpXLHspNWyvJJ+0URH+iIvV5qP1I2Q==
dependencies:
markdown-it "^13.0.1"
prosemirror-model "^1.0.0"
prosemirror-menu@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/prosemirror-menu/-/prosemirror-menu-1.2.1.tgz#94d99a8547b7ba5680c20e9c497ce19846ce3b2c"
- integrity sha512-sBirXxVfHalZO4f1ZS63WzewINK4182+7dOmoMeBkqYO8wqMBvBS7wQuwVOHnkMWPEh0+N0LJ856KYUN+vFkmQ==
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-menu/-/prosemirror-menu-1.2.2.tgz#c545a2de0b8cb79babc07682b1d93de0f273aa33"
+ integrity sha512-437HIWTq4F9cTX+kPfqZWWm+luJm95Aut/mLUy+9OMrOml0bmWDS26ceC6SNfb2/S94et1sZ186vLO7pDHzxSw==
dependencies:
crelt "^1.0.0"
prosemirror-commands "^1.0.0"
@@ -14835,32 +14897,32 @@ prosemirror-menu@^1.2.1:
prosemirror-state "^1.0.0"
prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.18.1, prosemirror-model@^1.19.0, prosemirror-model@^1.8.1:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.19.0.tgz#d7ad9a65ada0bb12196f64fe0dd4fc392c841c29"
- integrity sha512-/CvFGJnwc41EJSfDkQLly1cAJJJmBpZwwUJtwZPTjY2RqZJfM8HVbCreOY/jti8wTRbVyjagcylyGoeJH/g/3w==
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.19.2.tgz#297c9ecfb103154e605f0dbaf3cc72ee32ca0ad5"
+ integrity sha512-RXl0Waiss4YtJAUY3NzKH0xkJmsZupCIccqcIFoLTIKFlKNbIvFDRl27/kQy1FP8iUAxrjRRfIVvOebnnXJgqQ==
dependencies:
orderedmap "^2.0.0"
prosemirror-schema-basic@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.1.tgz#a5a137a6399d1a829873332117d2fe8131d291d0"
- integrity sha512-vYBdIHsYKSDIqYmPBC7lnwk9DsKn8PnVqK97pMYP5MLEDFqWIX75JiaJTzndBii4bRuNqhC2UfDOfM3FKhlBHg==
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz#6695f5175e4628aab179bf62e5568628b9cfe6c7"
+ integrity sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==
dependencies:
prosemirror-model "^1.19.0"
prosemirror-schema-list@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz#bafda37b72367d39accdcaf6ddf8fb654a16e8e5"
- integrity sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.2.3.tgz#12e3d70cb17780980a3c28588ed7c888121d5e8d"
+ integrity sha512-HD8yjDOusz7JB3oBFCaMOpEN9Z9DZttLr6tcASjnvKMc0qTyX5xgAN8YiMFFEcwyhF7WZrZ2YQkAwzsn8ICVbQ==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.4.1:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.2.tgz#f93bd8a33a4454efab917ba9b738259d828db7e5"
- integrity sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.3.tgz#94aecf3ffd54ec37e87aa7179d13508da181a080"
+ integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-transform "^1.0.0"
@@ -14888,16 +14950,16 @@ prosemirror-trailing-node@^2.0.2:
escape-string-regexp "^4.0.0"
prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.0:
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.7.1.tgz#b516e818c3add0bdf960f4ca8ccb9d057a3ba21b"
- integrity sha512-VteoifAfpt46z0yEt6Fc73A5OID9t/y2QIeR5MgxEwTuitadEunD/V0c9jQW8ziT8pbFM54uTzRLJ/nLuQjMxg==
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.7.2.tgz#f3e57d8424afa6ab7c2b2319cc0ac58e75f7160b"
+ integrity sha512-b94lVUdA9NyaYRb2WuGSgb5YANiITa05dtew9eSK+KkYu64BCnU27WhJPE95gAWAnhV57CM3FabWXM23gri8Kg==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.28.2, prosemirror-view@^1.31.0:
- version "1.31.1"
- resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.31.1.tgz#706611f134018a4dd832110911bdd908e3af92c1"
- integrity sha512-9NKJdXnGV4+1qFRi16XFZxpnx6zNok9MEj/HElkqUJ1HtOyKOICffKxqoXUUCAdHrrP+yMDvdXc6wT7GGWBL3A==
+ version "1.31.3"
+ resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.31.3.tgz#cfe171c4e50a577526d0235d9ec757cdddf6017d"
+ integrity sha512-UYDa8WxRFZm0xQLXiPJUVTl6H08Fn0IUVDootA7ZlQwzooqVWnBOXLovJyyTKgws1nprfsPhhlvWgt2jo4ZA6g==
dependencies:
prosemirror-model "^1.16.0"
prosemirror-state "^1.0.0"
@@ -15101,9 +15163,9 @@ react-dev-utils@^12.0.1:
text-table "^0.2.0"
react-devtools-core@^4.26.1:
- version "4.27.6"
- resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.27.6.tgz#e5a613014f7506801ed6c1a97bd0e6316cc9c48a"
- integrity sha512-jeFNhEzcSwpiqmw+zix5IFibNEPmUodICN7ClrlRKGktzO/3FMteMb52l1NRUiz/ABSYt9hOZ9IPgVDrg5pyUw==
+ version "4.27.8"
+ resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.27.8.tgz#b7b387b079c14ae9a214d4846a402da2b6efd164"
+ integrity sha512-KwoH8/wN/+m5wTItLnsgVraGNmFrcTWR3k1VimP1HjtMMw4CNF+F5vg4S/0tzTEKIdpCi2R7mPNTC+/dswZMgw==
dependencies:
shell-quote "^1.6.1"
ws "^7"
@@ -15147,9 +15209,9 @@ react-native-appstate-hook@^1.0.6:
integrity sha512-0hPVyf5yLxCSVrrNEuGqN1ZnSSj3Ye2gZex0NtcK/AHYwMc0rXWFNZjBKOoZSouspqu3hXBbQ6NOUSTzrME1AQ==
react-native-background-fetch@^4.1.8:
- version "4.1.9"
- resolved "https://registry.yarnpkg.com/react-native-background-fetch/-/react-native-background-fetch-4.1.9.tgz#10ebff9ca45a8868f1a72b2aa6cea40d499ece6e"
- integrity sha512-sk4MCXRhGghBXu9ReabuT8U0WRzjsMt2i/nqCwR9eHi0hux+4kUh5ubpLKLByw5G8WifUv1sp6qsA7uvQERrrQ==
+ version "4.1.10"
+ resolved "https://registry.yarnpkg.com/react-native-background-fetch/-/react-native-background-fetch-4.1.10.tgz#12c7e85140af67fb05edb7cd9960e4f09a457797"
+ integrity sha512-Ug54vTctZuD/c06ZLk/VyvFdhw/hCVVOHYR5heyMqc6FlT/m9fVhFWyl4uH3JmPCzmWDVR3fO28CzrGpKOrusw==
react-native-codegen@^0.71.5:
version "0.71.5"
@@ -15168,6 +15230,13 @@ react-native-dotenv@^3.3.1:
dependencies:
dotenv "^16.0.3"
+react-native-draggable-flatlist@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/react-native-draggable-flatlist/-/react-native-draggable-flatlist-4.0.1.tgz#2f027d387ba4b8f3eb0907340e32cb85e6460df2"
+ integrity sha512-ZO1QUTNx64KZfXGXeXcBfql67l38X7kBcJ3rxUVZzPHt5r035GnGzIC0F8rqSXp6zgnwgUYMfB6zQc5PKmPL9Q==
+ dependencies:
+ "@babel/preset-typescript" "^7.17.12"
+
react-native-drawer-layout@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-3.2.0.tgz#1ab05d0bed6bb684353c17c96e1d3e6c1a4e225d"
@@ -15195,16 +15264,16 @@ react-native-gesture-handler@~2.9.0:
prop-types "^15.7.2"
react-native-get-random-values@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/react-native-get-random-values/-/react-native-get-random-values-1.8.0.tgz#1cb4bd4bd3966a356e59697b8f372999fe97cb16"
- integrity sha512-H/zghhun0T+UIJLmig3+ZuBCvF66rdbiWUfRSNS6kv5oDSpa1ZiVyvRWtuPesQpT8dXj+Bv7WJRQOUP+5TB1sA==
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/react-native-get-random-values/-/react-native-get-random-values-1.9.0.tgz#6cb30511c406922e75fe73833dc1812a85bfb37e"
+ integrity sha512-+29IR2oxzxNVeaRwCqGZ9ABadzMI8SLTBidrIDXPOkKnm5+kEmLt34QKM4JV+d2usPErvKyS85le0OmGTHnyWQ==
dependencies:
fast-base64-decode "^1.0.0"
-react-native-gradle-plugin@^0.71.17:
- version "0.71.17"
- resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.17.tgz#cf780a27270f0a32dca8184eff91555d7627dd00"
- integrity sha512-OXXYgpISEqERwjSlaCiaQY6cTY5CH6j73gdkWpK0hedxtiWMWgH+i5TOi4hIGYitm9kQBeyDu+wim9fA8ROFJA==
+react-native-gradle-plugin@^0.71.18:
+ version "0.71.18"
+ resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.18.tgz#20ef199bc85be32e45bb6cc069ec2e7dcb1a74a6"
+ integrity sha512-7F6bD7B8Xsn3JllxcwHhFcsl9aHIig47+3eN4IHFNqfLhZr++3ElDrcqfMzugM+niWbaMi7bJ0kAkAL8eCpdWg==
react-native-haptic-feedback@^1.14.0:
version "1.14.0"
@@ -15259,9 +15328,9 @@ react-native-root-siblings@^4.1.1:
integrity sha512-sdmLElNs5PDWqmZmj4/aNH4anyxreaPm61c4ZkRiR8SO/GzLg6KjAbb0e17RmMdnBdD0AIQbS38h/l55YKN4ZA==
react-native-safe-area-context@^4.4.1:
- version "4.5.2"
- resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.5.2.tgz#38438c7a52ce2a6a05fc4de6cd3ee47f78a9366e"
- integrity sha512-oH4/Dm7/PWOOZtFRiA4HE08lsfA948BRq8Fn7TEndYjoDXFoNdbjQRahXzCV8JGP/tv3qrVNeaDE8rmdRRUOlA==
+ version "4.5.3"
+ resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.5.3.tgz#e98eb1a73a6b3846d296545fe74760754dbaaa69"
+ integrity sha512-ihYeGDEBSkYH+1aWnadNhVtclhppVgd/c0tm4mj0+HV11FoiWJ8N6ocnnZnRLvM5Fxc+hUqxR9bm5AXU3rXiyA==
react-native-screens@^3.13.1:
version "3.20.0"
@@ -15319,10 +15388,10 @@ react-native-web@^0.18.11:
postcss-value-parser "^4.2.0"
styleq "^0.1.2"
-react-native@0.71.7:
- version "0.71.7"
- resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.7.tgz#d0ae409f6ee4fc7e7a876b4ca9d8d28934133228"
- integrity sha512-Id6iRLS581fJMFGbBl1jP5uSmjExtGOvw5Gvh7694zISXjsRAsFMmU+izs0pyCLqDBoHK7y4BT7WGPGw693nYw==
+react-native@0.71.8:
+ version "0.71.8"
+ resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.8.tgz#4314145341c49448cf7465b93ced52a433a5e191"
+ integrity sha512-ftMAuhpgTkbHU9brrqsEyxcNrpYvXKeATY+if22Nfhhg1zW+6wn95w9otwTnA3xHkljPCbng8mUhmmERjGEl7g==
dependencies:
"@jest/create-cache-key-function" "^29.2.1"
"@react-native-community/cli" "10.2.2"
@@ -15349,7 +15418,7 @@ react-native@0.71.7:
promise "^8.3.0"
react-devtools-core "^4.26.1"
react-native-codegen "^0.71.5"
- react-native-gradle-plugin "^0.71.17"
+ react-native-gradle-plugin "^0.71.18"
react-refresh "^0.4.0"
react-shallow-renderer "^16.15.0"
regenerator-runtime "^0.13.2"
@@ -15495,9 +15564,9 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable
util-deprecate "^1.0.1"
readable-stream@^4.0.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.3.0.tgz#0914d0c72db03b316c9733bb3461d64a3cc50cba"
- integrity sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.0.tgz#55ce132d60a988c460d75c631e9ccf6a7229b468"
+ integrity sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==
dependencies:
abort-controller "^3.0.0"
buffer "^6.0.3"
@@ -15895,9 +15964,9 @@ rollup@^2.43.1:
fsevents "~2.3.2"
rope-sequence@^1.3.0:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.3.tgz#3f67fc106288b84b71532b4a5fd9d4881e4457f0"
- integrity sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.4.tgz#df85711aaecd32f1e756f76e43a415171235d425"
+ integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==
rtl-detect@^1.0.2:
version "1.0.4"
@@ -16104,9 +16173,9 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8:
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0"
- integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==
+ version "7.5.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec"
+ integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==
dependencies:
lru-cache "^6.0.0"
@@ -16358,9 +16427,9 @@ slash@^4.0.0:
integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
slash@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/slash/-/slash-5.0.1.tgz#c354c3a49c0d3b4da1cb0bbeb15a85c2a6defa71"
- integrity sha512-ywNzUOiXwetmLvTUiCBZpLi+vxqN3i+zDqjs2HHfUSV3wN4UJxVVKWrS1JZDeiJIeBFNgB5pmioC2g0IUTL+rQ==
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce"
+ integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==
slice-ansi@^2.0.0:
version "2.1.0"
@@ -16624,9 +16693,9 @@ stream-chain@^2.2.5:
integrity sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==
stream-json@^1.7.4:
- version "1.7.5"
- resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.7.5.tgz#2ff0563011f22cea4f6a28dbfc0344a53c761fe4"
- integrity sha512-NSkoVduGakxZ8a+pTPUlcGEeAGQpWL9rKJhOFCV+J/QtdQUEU5vtBgVg6eJXn8JB8RZvpbJWZGvXkhz70MLWoA==
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.8.0.tgz#53f486b2e3b4496c506131f8d7260ba42def151c"
+ integrity sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==
dependencies:
stream-chain "^2.2.5"
@@ -16785,9 +16854,9 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
ansi-regex "^5.0.1"
strip-ansi@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
- integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
dependencies:
ansi-regex "^6.0.1"
@@ -16852,9 +16921,9 @@ structured-headers@^0.4.1:
integrity sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==
style-loader@^3.3.1:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.2.tgz#eaebca714d9e462c19aa1e3599057bc363924899"
- integrity sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff"
+ integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==
stylehacks@^5.1.1:
version "5.1.1"
@@ -17034,13 +17103,13 @@ tar-stream@^2.1.4:
readable-stream "^3.1.1"
tar@^6.0.2, tar@^6.0.5:
- version "6.1.13"
- resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b"
- integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==
+ version "6.1.15"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69"
+ integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==
dependencies:
chownr "^2.0.0"
fs-minipass "^2.0.0"
- minipass "^4.0.0"
+ minipass "^5.0.0"
minizlib "^2.1.1"
mkdirp "^1.0.3"
yallist "^4.0.0"
@@ -17124,20 +17193,20 @@ terminal-link@^2.0.0, terminal-link@^2.1.1:
supports-hyperlinks "^2.0.0"
terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.0, terser-webpack-plugin@^5.3.7:
- version "5.3.7"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7"
- integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==
+ version "5.3.9"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1"
+ integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==
dependencies:
"@jridgewell/trace-mapping" "^0.3.17"
jest-worker "^27.4.5"
schema-utils "^3.1.1"
serialize-javascript "^6.0.1"
- terser "^5.16.5"
+ terser "^5.16.8"
-terser@^5.0.0, terser@^5.10.0, terser@^5.15.0, terser@^5.16.5:
- version "5.17.1"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69"
- integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==
+terser@^5.0.0, terser@^5.10.0, terser@^5.15.0, terser@^5.16.8:
+ version "5.17.6"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.6.tgz#d810e75e1bb3350c799cd90ebefe19c9412c12de"
+ integrity sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==
dependencies:
"@jridgewell/source-map" "^0.3.2"
acorn "^8.5.0"
@@ -17333,12 +17402,11 @@ tr46@~0.0.3:
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
trace-event-lib@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/trace-event-lib/-/trace-event-lib-1.3.1.tgz#8113146caa30778f45d0ec479d899f9eda94d594"
- integrity sha512-RO/TD5E9RNqU6MhOfi/njFWKYhrzOJCpRXlEQHgXwM+6boLSrQnOZ9xbHwOXzC+Luyixc7LNNSiTsqTVeF7I1g==
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/trace-event-lib/-/trace-event-lib-1.4.1.tgz#a749b8141650f56dcdecea760df4735f28d1ac6b"
+ integrity sha512-TOgFolKG8JFY+9d5EohGWMvwvteRafcyfPWWNIqcuD1W/FUvxWcy2MSCZ/beYHM63oYPHYHCd3tkbgCctHVP7w==
dependencies:
browser-process-hrtime "^1.0.0"
- lodash "^4.17.21"
traverse@~0.6.6:
version "0.6.7"
@@ -17397,9 +17465,9 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.4.1:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
- integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338"
+ integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==
tsutils@^3.21.0:
version "3.21.0"
@@ -17470,9 +17538,9 @@ type-fest@^2.19.0, type-fest@^2.3.3:
integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==
type-fest@^3.0.0:
- version "3.9.0"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.9.0.tgz#36a9e46e6583649f9e6098b267bc577275e9e4f4"
- integrity sha512-hR8JP2e8UiH7SME5JZjsobBlEiatFoxpzCP+R3ZeCo7kAaG1jXQE5X/buLzogM6GJu8le9Y4OcfNuIQX0rZskA==
+ version "3.11.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.11.1.tgz#d8e62c7f42e14537d5b8796de5450d541f3a33a7"
+ integrity sha512-aCuRNRERRVh33lgQaJRlUxZqzfhzwTrsE98Mc3o3VXqmiaQdHacgUtJ0esp+7MvZ92qhtzKPeusaX6vIEcoreA==
type-is@~1.6.18:
version "1.6.18"
@@ -17664,7 +17732,7 @@ upath@^1.2.0:
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
-update-browserslist-db@^1.0.10:
+update-browserslist-db@^1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940"
integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==
@@ -17842,9 +17910,9 @@ w3c-hr-time@^1.0.2:
browser-process-hrtime "^1.0.0"
w3c-keyname@^2.2.0:
- version "2.2.6"
- resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f"
- integrity sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.7.tgz#e29549e9ac97ac5cb2993c8222994e97922ef377"
+ integrity sha512-XB8aa62d4rrVfoZYQaYNy3fy+z4nrfy2ooea3/0BnBzXW0tSdZ+lRgjzBZhk0La0H6h8fVyYCxx/qkQcAIuvfg==
w3c-xmlserializer@^2.0.0:
version "2.0.0"
@@ -17920,14 +17988,14 @@ webidl-conversions@^7.0.0:
integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
webpack-cli@^5.0.1:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.0.2.tgz#2954c10ecb61c5d4dad6f68ee2d77f051741946c"
- integrity sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.1.tgz#c211ac6d911e77c512978f7132f0d735d4a97ace"
+ integrity sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==
dependencies:
"@discoveryjs/json-ext" "^0.5.0"
- "@webpack-cli/configtest" "^2.0.1"
+ "@webpack-cli/configtest" "^2.1.0"
"@webpack-cli/info" "^2.0.1"
- "@webpack-cli/serve" "^2.0.2"
+ "@webpack-cli/serve" "^2.0.4"
colorette "^2.0.14"
commander "^10.0.1"
cross-spawn "^7.0.3"
@@ -17950,9 +18018,9 @@ webpack-dev-middleware@^5.3.1:
schema-utils "^4.0.0"
webpack-dev-server@^4.11.1, webpack-dev-server@^4.6.0:
- version "4.13.3"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz#9feb740b8b56b886260bae1360286818a221bae8"
- integrity sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug==
+ version "4.15.0"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21"
+ integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==
dependencies:
"@types/bonjour" "^3.5.9"
"@types/connect-history-api-fallback" "^1.3.5"
@@ -17994,9 +18062,9 @@ webpack-manifest-plugin@^4.0.2, webpack-manifest-plugin@^4.1.1:
webpack-sources "^2.2.0"
webpack-merge@^5.7.3:
- version "5.8.0"
- resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
- integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
+ version "5.9.0"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826"
+ integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==
dependencies:
clone-deep "^4.0.1"
wildcard "^2.0.0"
@@ -18023,9 +18091,9 @@ webpack-sources@^3.2.3:
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
webpack@^5.64.4, webpack@^5.75.0:
- version "5.81.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.81.0.tgz#27a2e8466c8b4820d800a8d90f06ef98294f9956"
- integrity sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q==
+ version "5.84.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.84.1.tgz#d4493acdeca46b26ffc99d86d784cabfeb925a15"
+ integrity sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg==
dependencies:
"@types/eslint-scope" "^3.7.3"
"@types/estree" "^1.0.0"
@@ -18033,10 +18101,10 @@ webpack@^5.64.4, webpack@^5.75.0:
"@webassemblyjs/wasm-edit" "^1.11.5"
"@webassemblyjs/wasm-parser" "^1.11.5"
acorn "^8.7.1"
- acorn-import-assertions "^1.7.6"
+ acorn-import-assertions "^1.9.0"
browserslist "^4.14.5"
chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.13.0"
+ enhanced-resolve "^5.14.1"
es-module-lexer "^1.2.1"
eslint-scope "5.1.1"
events "^3.2.0"
@@ -18222,25 +18290,25 @@ wordwrap@^1.0.0:
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
-workbox-background-sync@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9"
- integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==
+workbox-background-sync@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f"
+ integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg==
dependencies:
idb "^7.0.1"
- workbox-core "6.5.4"
+ workbox-core "6.6.1"
-workbox-broadcast-update@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66"
- integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==
+workbox-broadcast-update@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e"
+ integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ==
dependencies:
- workbox-core "6.5.4"
+ workbox-core "6.6.1"
-workbox-build@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389"
- integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==
+workbox-build@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0"
+ integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw==
dependencies:
"@apideck/better-ajv-errors" "^0.3.1"
"@babel/core" "^7.11.1"
@@ -18264,132 +18332,132 @@ workbox-build@6.5.4:
strip-comments "^2.0.1"
tempy "^0.6.0"
upath "^1.2.0"
- workbox-background-sync "6.5.4"
- workbox-broadcast-update "6.5.4"
- workbox-cacheable-response "6.5.4"
- workbox-core "6.5.4"
- workbox-expiration "6.5.4"
- workbox-google-analytics "6.5.4"
- workbox-navigation-preload "6.5.4"
- workbox-precaching "6.5.4"
- workbox-range-requests "6.5.4"
- workbox-recipes "6.5.4"
- workbox-routing "6.5.4"
- workbox-strategies "6.5.4"
- workbox-streams "6.5.4"
- workbox-sw "6.5.4"
- workbox-window "6.5.4"
+ workbox-background-sync "6.6.1"
+ workbox-broadcast-update "6.6.1"
+ workbox-cacheable-response "6.6.1"
+ workbox-core "6.6.1"
+ workbox-expiration "6.6.1"
+ workbox-google-analytics "6.6.1"
+ workbox-navigation-preload "6.6.1"
+ workbox-precaching "6.6.1"
+ workbox-range-requests "6.6.1"
+ workbox-recipes "6.6.1"
+ workbox-routing "6.6.1"
+ workbox-strategies "6.6.1"
+ workbox-streams "6.6.1"
+ workbox-sw "6.6.1"
+ workbox-window "6.6.1"
-workbox-cacheable-response@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137"
- integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==
+workbox-cacheable-response@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9"
+ integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag==
dependencies:
- workbox-core "6.5.4"
+ workbox-core "6.6.1"
-workbox-core@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba"
- integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==
+workbox-core@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.6.1.tgz#7184776d4134c5ed2f086878c882728fc9084265"
+ integrity sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==
-workbox-expiration@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539"
- integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==
+workbox-expiration@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739"
+ integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A==
dependencies:
idb "^7.0.1"
- workbox-core "6.5.4"
+ workbox-core "6.6.1"
-workbox-google-analytics@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d"
- integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==
+workbox-google-analytics@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d"
+ integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA==
dependencies:
- workbox-background-sync "6.5.4"
- workbox-core "6.5.4"
- workbox-routing "6.5.4"
- workbox-strategies "6.5.4"
+ workbox-background-sync "6.6.1"
+ workbox-core "6.6.1"
+ workbox-routing "6.6.1"
+ workbox-strategies "6.6.1"
-workbox-navigation-preload@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212"
- integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==
+workbox-navigation-preload@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059"
+ integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA==
dependencies:
- workbox-core "6.5.4"
+ workbox-core "6.6.1"
-workbox-precaching@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72"
- integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==
+workbox-precaching@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2"
+ integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A==
dependencies:
- workbox-core "6.5.4"
- workbox-routing "6.5.4"
- workbox-strategies "6.5.4"
+ workbox-core "6.6.1"
+ workbox-routing "6.6.1"
+ workbox-strategies "6.6.1"
-workbox-range-requests@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399"
- integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==
+workbox-range-requests@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39"
+ integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g==
dependencies:
- workbox-core "6.5.4"
+ workbox-core "6.6.1"
-workbox-recipes@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb"
- integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==
+workbox-recipes@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae"
+ integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g==
dependencies:
- workbox-cacheable-response "6.5.4"
- workbox-core "6.5.4"
- workbox-expiration "6.5.4"
- workbox-precaching "6.5.4"
- workbox-routing "6.5.4"
- workbox-strategies "6.5.4"
+ workbox-cacheable-response "6.6.1"
+ workbox-core "6.6.1"
+ workbox-expiration "6.6.1"
+ workbox-precaching "6.6.1"
+ workbox-routing "6.6.1"
+ workbox-strategies "6.6.1"
-workbox-routing@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da"
- integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==
+workbox-routing@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.6.1.tgz#cba9a1c7e0d1ea11e24b6f8c518840efdc94f581"
+ integrity sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg==
dependencies:
- workbox-core "6.5.4"
+ workbox-core "6.6.1"
-workbox-strategies@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d"
- integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==
+workbox-strategies@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf"
+ integrity sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw==
dependencies:
- workbox-core "6.5.4"
+ workbox-core "6.6.1"
-workbox-streams@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69"
- integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==
+workbox-streams@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26"
+ integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q==
dependencies:
- workbox-core "6.5.4"
- workbox-routing "6.5.4"
+ workbox-core "6.6.1"
+ workbox-routing "6.6.1"
-workbox-sw@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736"
- integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==
+workbox-sw@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c"
+ integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ==
workbox-webpack-plugin@^6.4.1:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7"
- integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531"
+ integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA==
dependencies:
fast-json-stable-stringify "^2.1.0"
pretty-bytes "^5.4.1"
upath "^1.2.0"
webpack-sources "^1.4.3"
- workbox-build "6.5.4"
+ workbox-build "6.6.1"
-workbox-window@6.5.4:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91"
- integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==
+workbox-window@6.6.1:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e"
+ integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ==
dependencies:
"@types/trusted-types" "^2.0.2"
- workbox-core "6.5.4"
+ workbox-core "6.6.1"
wrap-ansi@^6.2.0:
version "6.2.0"
@@ -18552,9 +18620,9 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2:
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yaml@^2.1.1:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.2.tgz#ec551ef37326e6d42872dad1970300f8eb83a073"
- integrity sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b"
+ integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==
yargs-parser@^18.1.2:
version "18.1.3"