Merge remote-tracking branch 'origin/main' into app-1750

* origin/main:
  [AAv2] Improve minimum age handling (#9650)
  Handle AA config failure (#9660)
  Fix full-screen back gesture over PagerView on iOS 26 (#9659)
  Bump version to v1.114 (#9661)
  Unify build concurrency to one build per platform (#9655)
This commit is contained in:
Eric Bailey
2026-01-08 15:38:17 -06:00
25 changed files with 492 additions and 318 deletions
@@ -16,6 +16,9 @@ jobs:
if: github.repository == 'bluesky-social/social-app' if: github.repository == 'bluesky-social/social-app'
name: Build and Submit Android name: Build and Submit Android
runs-on: Linux-x64-32core runs-on: Linux-x64-32core
concurrency:
group: android-build
cancel-in-progress: false
steps: steps:
- name: Check for EXPO_TOKEN - name: Check for EXPO_TOKEN
run: > run: >
+3
View File
@@ -16,6 +16,9 @@ jobs:
if: github.repository == 'bluesky-social/social-app' if: github.repository == 'bluesky-social/social-app'
name: Build and Submit iOS name: Build and Submit iOS
runs-on: macos-26-xlarge runs-on: macos-26-xlarge
concurrency:
group: ios-build
cancel-in-progress: false
steps: steps:
- name: Check for EXPO_TOKEN - name: Check for EXPO_TOKEN
run: > run: >
@@ -157,8 +157,8 @@ jobs:
name: Build and Submit iOS name: Build and Submit iOS
runs-on: macos-26 runs-on: macos-26
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}-build-ios group: ios-build
cancel-in-progress: true cancel-in-progress: false
needs: [bundleDeploy] needs: [bundleDeploy]
# Gotta check if its NOT '[]' because any md5 hash in the outputs is detected as a possible secret and won't be # Gotta check if its NOT '[]' because any md5 hash in the outputs is detected as a possible secret and won't be
# available here # available here
@@ -262,7 +262,7 @@ jobs:
name: Build and Submit Android name: Build and Submit Android
runs-on: ubuntu-latest runs-on: ubuntu-latest
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}-build-android group: android-build
cancel-in-progress: false cancel-in-progress: false
needs: [bundleDeploy] needs: [bundleDeploy]
# Gotta check if its NOT '[]' because any md5 hash in the outputs is detected as a possible secret and won't be # Gotta check if its NOT '[]' because any md5 hash in the outputs is detected as a possible secret and won't be
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "bsky.app", "name": "bsky.app",
"version": "1.113.1", "version": "1.114.0",
"private": true, "private": true,
"engines": { "engines": {
"node": ">=20" "node": ">=20"
@@ -226,7 +226,7 @@
"zod": "^3.20.2" "zod": "^3.20.2"
}, },
"devDependencies": { "devDependencies": {
"@atproto/dev-env": "^0.3.201", "@atproto/dev-env": "^0.3.196",
"@babel/core": "^7.26.0", "@babel/core": "^7.26.0",
"@babel/preset-env": "^7.26.0", "@babel/preset-env": "^7.26.0",
"@babel/runtime": "^7.26.0", "@babel/runtime": "^7.26.0",
@@ -0,0 +1,30 @@
diff --git a/node_modules/react-native-pager-view/ios/RNCPagerView.m b/node_modules/react-native-pager-view/ios/RNCPagerView.m
index adfc7c6..366df60 100644
--- a/node_modules/react-native-pager-view/ios/RNCPagerView.m
+++ b/node_modules/react-native-pager-view/ios/RNCPagerView.m
@@ -498,6 +498,25 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecogni
return YES;
}
+ // iOS 26+ full-screen back gesture (interactiveContentPopGestureRecognizer)
+ if (@available(iOS 26, *)) {
+ if (gestureRecognizer == self.panGestureRecognizer &&
+ otherGestureRecognizer == self.reactViewController.navigationController.interactiveContentPopGestureRecognizer) {
+ UIPanGestureRecognizer* panGestureRecognizer = (UIPanGestureRecognizer*) gestureRecognizer;
+ CGPoint velocity = [panGestureRecognizer velocityInView:self];
+ BOOL isLTR = [self isLtrLayout];
+ BOOL isBackGesture = (isLTR && velocity.x > 0) || (!isLTR && velocity.x < 0);
+
+ if (self.currentIndex == 0 && isBackGesture) {
+ self.scrollView.panGestureRecognizer.enabled = false;
+ } else {
+ self.scrollView.panGestureRecognizer.enabled = self.scrollEnabled;
+ }
+
+ return YES;
+ }
+ }
+
self.scrollView.panGestureRecognizer.enabled = self.scrollEnabled;
return NO;
}
@@ -0,0 +1,11 @@
# react-native-pager-view+6.8.0.patch
Adds support for iOS 26's `interactiveContentPopGestureRecognizer` (full-screen back gesture).
The pager already handles `RNSPanGestureRecognizer` (react-native-screens' custom full-screen gesture for pre-iOS 26) in `shouldRecognizeSimultaneouslyWithGestureRecognizer:`. It checks if the user is on the leftmost page and swiping right - if so, it disables the scrollview's pan gesture to let the back gesture through.
This patch adds the same logic for iOS 26's native `interactiveContentPopGestureRecognizer`, so the back gesture works on the leftmost page while the pager still handles swipes on other pages.
Related issues:
- https://github.com/software-mansion/react-native-screens/issues/3512
- https://github.com/software-mansion/react-native-screens/pull/3420
+10 -1
View File
@@ -177,10 +177,19 @@ export function NoAccessScreen() {
</Trans> </Trans>
</Text> </Text>
{!aa.flags.isOverRegionMinAccessAge && (
<Text style={[textStyles]}>
<Trans>
Unfortunately, your declared age indicates that you
are not old enough to access Bluesky in your region.
</Trans>
</Text>
)}
{!isBlocked && birthdateUpdateText} {!isBlocked && birthdateUpdateText}
</View> </View>
<AccessSection /> {aa.flags.isOverRegionMinAccessAge && <AccessSection />}
</> </>
) : ( ) : (
<View style={[a.gap_lg]}> <View style={[a.gap_lg]}>
+13
View File
@@ -136,6 +136,15 @@ export async function prefetchConfig() {
} }
}) })
} }
export async function refetchConfig() {
logger.debug(`refetchConfig: fetching...`)
const res = await getConfig()
qc.setQueryData<AppBskyAgeassuranceGetConfig.OutputSchema>(
configQueryKey,
res,
)
return res
}
export function useConfigQuery() { export function useConfigQuery() {
return useQuery( return useQuery(
{ {
@@ -146,6 +155,10 @@ export function useConfigQuery() {
* @see https://tanstack.com/query/latest/docs/framework/react/guides/initial-query-data#initial-data-from-the-cache-with-initialdataupdatedat * @see https://tanstack.com/query/latest/docs/framework/react/guides/initial-query-data#initial-data-from-the-cache-with-initialdataupdatedat
*/ */
staleTime: IS_DEV ? 5e3 : 1000 * 60 * 60, staleTime: IS_DEV ? 5e3 : 1000 * 60 * 60,
/**
* N.B. if prefetch failed above, we'll have no `initialData`, and this
* query will run on startup.
*/
initialData: getConfigFromCache(), initialData: getConfigFromCache(),
initialDataUpdatedAt: () => initialDataUpdatedAt: () =>
qc.getQueryState(configQueryKey)?.dataUpdatedAt, qc.getQueryState(configQueryKey)?.dataUpdatedAt,
+16 -2
View File
@@ -12,12 +12,14 @@ export const enabled = (IS_DEV && false) || IS_E2E
export const geolocation: Geolocation | undefined = enabled export const geolocation: Geolocation | undefined = enabled
? { ? {
countryCode: 'AA', countryCode: 'BB',
regionCode: undefined, regionCode: undefined,
} }
: undefined : undefined
export const deviceGeolocation: Geolocation | undefined = enabled const deviceGeolocationEnabled = false
export const deviceGeolocation: Geolocation | undefined =
enabled && deviceGeolocationEnabled
? { ? {
countryCode: 'AA', countryCode: 'AA',
regionCode: undefined, regionCode: undefined,
@@ -29,6 +31,7 @@ export const config: AppBskyAgeassuranceDefs.Config = {
{ {
countryCode: 'AA', countryCode: 'AA',
regionCode: undefined, regionCode: undefined,
minAccessAge: 13,
rules: [ rules: [
{ {
$type: ids.Default, $type: ids.Default,
@@ -36,6 +39,17 @@ export const config: AppBskyAgeassuranceDefs.Config = {
}, },
], ],
}, },
{
countryCode: 'BB',
regionCode: undefined,
minAccessAge: 16,
rules: [
{
$type: ids.Default,
access: 'none',
},
],
},
], ],
} }
+23 -5
View File
@@ -14,7 +14,11 @@ import {
type AgeAssuranceState, type AgeAssuranceState,
AgeAssuranceStatus, AgeAssuranceStatus,
} from '#/ageAssurance/types' } from '#/ageAssurance/types'
import {isUserUnderAdultAge} from '#/ageAssurance/util' import {
isUnderAge,
MIN_ACCESS_AGE,
useAgeAssuranceRegionConfigWithFallback,
} from '#/ageAssurance/util'
export { export {
prefetchConfig as prefetchAgeAssuranceConfig, prefetchConfig as prefetchAgeAssuranceConfig,
@@ -24,6 +28,7 @@ export {
usePatchServerState as usePatchAgeAssuranceServerState, usePatchServerState as usePatchAgeAssuranceServerState,
} from '#/ageAssurance/data' } from '#/ageAssurance/data'
export {logger} from '#/ageAssurance/logger' export {logger} from '#/ageAssurance/logger'
export {MIN_ACCESS_AGE} from '#/ageAssurance/util'
const AgeAssuranceStateContext = createContext<{ const AgeAssuranceStateContext = createContext<{
Access: typeof AgeAssuranceAccess Access: typeof AgeAssuranceAccess
@@ -32,6 +37,8 @@ const AgeAssuranceStateContext = createContext<{
flags: { flags: {
adultContentDisabled: boolean adultContentDisabled: boolean
chatDisabled: boolean chatDisabled: boolean
isOverRegionMinAccessAge: boolean
isOverAppMinAccessAge: boolean
} }
}>({ }>({
Access: AgeAssuranceAccess, Access: AgeAssuranceAccess,
@@ -44,6 +51,8 @@ const AgeAssuranceStateContext = createContext<{
flags: { flags: {
adultContentDisabled: false, adultContentDisabled: false,
chatDisabled: false, chatDisabled: false,
isOverRegionMinAccessAge: false,
isOverAppMinAccessAge: false,
}, },
}) })
@@ -69,6 +78,7 @@ export function Provider({children}: {children: React.ReactNode}) {
function InnerProvider({children}: {children: React.ReactNode}) { function InnerProvider({children}: {children: React.ReactNode}) {
const state = useAgeAssuranceState() const state = useAgeAssuranceState()
const {data} = useAgeAssuranceDataContext() const {data} = useAgeAssuranceDataContext()
const config = useAgeAssuranceRegionConfigWithFallback()
const getAndRegisterPushToken = useGetAndRegisterPushToken() const getAndRegisterPushToken = useGetAndRegisterPushToken()
const handleAccessUpdate = useCallback( const handleAccessUpdate = useCallback(
@@ -89,11 +99,17 @@ function InnerProvider({children}: {children: React.ReactNode}) {
<AgeAssuranceStateContext.Provider <AgeAssuranceStateContext.Provider
value={useMemo(() => { value={useMemo(() => {
const chatDisabled = state.access !== AgeAssuranceAccess.Full const chatDisabled = state.access !== AgeAssuranceAccess.Full
const isUnderage = data?.birthdate const isUnderAdultAge = data?.birthdate
? isUserUnderAdultAge(data.birthdate) ? isUnderAge(data.birthdate, 18)
: true : true
const isOverRegionMinAccessAge = data?.birthdate
? !isUnderAge(data.birthdate, config.minAccessAge)
: false
const isOverAppMinAccessAge = data?.birthdate
? !isUnderAge(data.birthdate, MIN_ACCESS_AGE)
: false
const adultContentDisabled = const adultContentDisabled =
state.access !== AgeAssuranceAccess.Full || isUnderage state.access !== AgeAssuranceAccess.Full || isUnderAdultAge
return { return {
Access: AgeAssuranceAccess, Access: AgeAssuranceAccess,
Status: AgeAssuranceStatus, Status: AgeAssuranceStatus,
@@ -101,9 +117,11 @@ function InnerProvider({children}: {children: React.ReactNode}) {
flags: { flags: {
adultContentDisabled, adultContentDisabled,
chatDisabled, chatDisabled,
isOverRegionMinAccessAge,
isOverAppMinAccessAge,
}, },
} }
}, [state, data])}> }, [state, data, config])}>
{children} {children}
</AgeAssuranceStateContext.Provider> </AgeAssuranceStateContext.Provider>
) )
+9 -2
View File
@@ -30,12 +30,19 @@ export function useAgeAssuranceState(): AgeAssuranceState {
access: AgeAssuranceAccess.Safe, access: AgeAssuranceAccess.Safe,
} }
// should never happen, but need to guard /**
* This can happen if the prefetch fails (such as due to network issues).
* The query handler will try it again, but if it continues to fail, of
* course we won't have config.
*
* In this case, fail open to avoid blocking users.
*/
if (!config) { if (!config) {
logger.warn('useAgeAssuranceState: missing config') logger.warn('useAgeAssuranceState: missing config')
return { return {
status: AgeAssuranceStatus.Unknown, status: AgeAssuranceStatus.Unknown,
access: AgeAssuranceAccess.Unknown, access: AgeAssuranceAccess.Safe,
error: 'config',
} }
} }
+1
View File
@@ -18,6 +18,7 @@ export type AgeAssuranceState = {
lastInitiatedAt?: string lastInitiatedAt?: string
status: AgeAssuranceStatus status: AgeAssuranceStatus
access: AgeAssuranceAccess access: AgeAssuranceAccess
error?: 'config' // maybe other specific cases in the future
} }
export function parseStatusFromString(raw: string) { export function parseStatusFromString(raw: string) {
+30 -26
View File
@@ -12,7 +12,23 @@ import {useAgeAssuranceDataContext} from '#/ageAssurance/data'
import {AgeAssuranceAccess} from '#/ageAssurance/types' import {AgeAssuranceAccess} from '#/ageAssurance/types'
import {type Geolocation, useGeolocation} from '#/geolocation' import {type Geolocation, useGeolocation} from '#/geolocation'
const DEFAULT_MIN_AGE = 13 export const MIN_ACCESS_AGE = 13
const FALLBACK_REGION_CONFIG: AppBskyAgeassuranceDefs.ConfigRegion = {
countryCode: '*',
regionCode: undefined,
minAccessAge: MIN_ACCESS_AGE,
rules: [
{
$type: ids.IfDeclaredOverAge,
age: MIN_ACCESS_AGE,
access: AgeAssuranceAccess.Full,
},
{
$type: ids.Default,
access: AgeAssuranceAccess.None,
},
],
}
/** /**
* Get age assurance region config based on geolocation, with fallback to * Get age assurance region config based on geolocation, with fallback to
@@ -30,23 +46,7 @@ export function getAgeAssuranceRegionConfigWithFallback(
regionCode: geolocation.regionCode, regionCode: geolocation.regionCode,
}) })
return ( return region || FALLBACK_REGION_CONFIG
region || {
countryCode: '*',
regionCode: undefined,
rules: [
{
$type: ids.IfDeclaredOverAge,
age: DEFAULT_MIN_AGE,
access: AgeAssuranceAccess.Full,
},
{
$type: ids.Default,
access: AgeAssuranceAccess.None,
},
],
}
)
} }
/** /**
@@ -67,6 +67,14 @@ export function useAgeAssuranceRegionConfig() {
}, [config, geolocation]) }, [config, geolocation])
} }
/**
* Hook to get the age assurance region config based on current geolocation.
* Falls back to our app defaults if no region config is found.
*/
export function useAgeAssuranceRegionConfigWithFallback() {
return useAgeAssuranceRegionConfig() || FALLBACK_REGION_CONFIG
}
/** /**
* Some users may have erroneously set their birth date to the current date * Some users may have erroneously set their birth date to the current date
* if one wasn't set on their account. We previously didn't do validation on * if one wasn't set on their account. We previously didn't do validation on
@@ -78,15 +86,11 @@ export function isLegacyBirthdateBug(birthDate: string) {
} }
/** /**
* Returns whether the user is under the minimum age required to use the app. * Returns whether the date (converted to an age as a whole integer) is under
* This applies to all regions. * the provided minimum age.
*/ */
export function isUserUnderMinimumAge(birthDate: string) { export function isUnderAge(birthDate: string, age: number) {
return getAge(new Date(birthDate)) < DEFAULT_MIN_AGE return getAge(new Date(birthDate)) < age
}
export function isUserUnderAdultAge(birthDate: string) {
return getAge(new Date(birthDate)) < 18
} }
export function getBirthdateStringFromAge(age: number) { export function getBirthdateStringFromAge(age: number) {
@@ -8,6 +8,7 @@ import {atoms as a, useBreakpoints, useTheme, type ViewStyleProp} from '#/alf'
import {Admonition} from '#/components/Admonition' import {Admonition} from '#/components/Admonition'
import {AgeAssuranceAppealDialog} from '#/components/ageAssurance/AgeAssuranceAppealDialog' import {AgeAssuranceAppealDialog} from '#/components/ageAssurance/AgeAssuranceAppealDialog'
import {AgeAssuranceBadge} from '#/components/ageAssurance/AgeAssuranceBadge' import {AgeAssuranceBadge} from '#/components/ageAssurance/AgeAssuranceBadge'
import {AgeAssuranceConfigUnavailableError} from '#/components/ageAssurance/AgeAssuranceErrors'
import { import {
AgeAssuranceInitDialog, AgeAssuranceInitDialog,
useDialogControl, useDialogControl,
@@ -27,6 +28,13 @@ import {useDeviceGeolocationApi} from '#/geolocation'
export function AgeAssuranceAccountCard({style}: ViewStyleProp & {}) { export function AgeAssuranceAccountCard({style}: ViewStyleProp & {}) {
const aa = useAgeAssurance() const aa = useAgeAssurance()
if (aa.state.access === aa.Access.Full) return null if (aa.state.access === aa.Access.Full) return null
if (aa.state.error === 'config') {
return (
<View style={style}>
<AgeAssuranceConfigUnavailableError />
</View>
)
}
return <Inner style={style} /> return <Inner style={style} />
} }
@@ -3,6 +3,7 @@ import {msg, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {atoms as a, select, useTheme, type ViewStyleProp} from '#/alf' import {atoms as a, select, useTheme, type ViewStyleProp} from '#/alf'
import {AgeAssuranceConfigUnavailableError} from '#/components/ageAssurance/AgeAssuranceErrors'
import {useDialogControl} from '#/components/ageAssurance/AgeAssuranceInitDialog' import {useDialogControl} from '#/components/ageAssurance/AgeAssuranceInitDialog'
import type * as Dialog from '#/components/Dialog' import type * as Dialog from '#/components/Dialog'
import {ShieldCheck_Stroke2_Corner0_Rounded as Shield} from '#/components/icons/Shield' import {ShieldCheck_Stroke2_Corner0_Rounded as Shield} from '#/components/icons/Shield'
@@ -19,6 +20,9 @@ export function AgeAssuranceAdmonition({
const aa = useAgeAssurance() const aa = useAgeAssurance()
if (aa.state.access === aa.Access.Full) return null if (aa.state.access === aa.Access.Full) return null
if (aa.state.error === 'config') {
return <AgeAssuranceConfigUnavailableError style={style} />
}
return ( return (
<Inner style={style} control={control}> <Inner style={style} control={control}>
@@ -23,6 +23,7 @@ export function useInternalState() {
const visible = useMemo(() => { const visible = useMemo(() => {
if (aa.state.access === aa.Access.Full) return false if (aa.state.access === aa.Access.Full) return false
if (aa.state.lastInitiatedAt) return false if (aa.state.lastInitiatedAt) return false
if (aa.state.error === 'config') return false
if (hidden) return false if (hidden) return false
if (nux && nux.completed) return false if (nux && nux.completed) return false
return true return true
@@ -5,6 +5,7 @@ import {useLingui} from '@lingui/react'
import {Nux, useNux, useSaveNux} from '#/state/queries/nuxs' import {Nux, useNux, useSaveNux} from '#/state/queries/nuxs'
import {atoms as a, type ViewStyleProp} from '#/alf' import {atoms as a, type ViewStyleProp} from '#/alf'
import {AgeAssuranceAdmonition} from '#/components/ageAssurance/AgeAssuranceAdmonition' import {AgeAssuranceAdmonition} from '#/components/ageAssurance/AgeAssuranceAdmonition'
import {AgeAssuranceConfigUnavailableError} from '#/components/ageAssurance/AgeAssuranceErrors'
import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy' import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy'
import {Button, ButtonIcon} from '#/components/Button' import {Button, ButtonIcon} from '#/components/Button'
import {TimesLarge_Stroke2_Corner0_Rounded as X} from '#/components/icons/Times' import {TimesLarge_Stroke2_Corner0_Rounded as X} from '#/components/icons/Times'
@@ -26,6 +27,9 @@ export function AgeAssuranceDismissibleNotice({style}: ViewStyleProp & {}) {
return ( return (
<View style={style}> <View style={style}>
{aa.state.error === 'config' ? (
<AgeAssuranceConfigUnavailableError />
) : (
<View> <View>
<AgeAssuranceAdmonition>{copy.notice}</AgeAssuranceAdmonition> <AgeAssuranceAdmonition>{copy.notice}</AgeAssuranceAdmonition>
@@ -53,6 +57,7 @@ export function AgeAssuranceDismissibleNotice({style}: ViewStyleProp & {}) {
<ButtonIcon icon={X} /> <ButtonIcon icon={X} />
</Button> </Button>
</View> </View>
)}
</View> </View>
) )
} }
@@ -0,0 +1,37 @@
import {msg, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {type ViewStyleProp} from '#/alf'
import * as Admonition from '#/components/Admonition'
import {ButtonIcon, ButtonText} from '#/components/Button'
import {ArrowRotateCounterClockwise_Stroke2_Corner0_Rounded as RetryIcon} from '#/components/icons/ArrowRotate'
import {refetchConfig} from '#/ageAssurance/data'
export function AgeAssuranceConfigUnavailableError(props: ViewStyleProp) {
const {_} = useLingui()
return (
<Admonition.Outer type="error" style={props.style}>
<Admonition.Row>
<Admonition.Icon />
<Admonition.Content>
<Admonition.Text>
<Trans>
We were unable to load the age assurance configuration for your
region, probably due to a network error. Some content and features
may be unavailable temporarily. Please try again later.
</Trans>
</Admonition.Text>
</Admonition.Content>
<Admonition.Button
color="negative_subtle"
label={_(msg`Retry`)}
onPress={() => refetchConfig().catch(() => {})}>
<ButtonText>
<Trans>Retry</Trans>
</ButtonText>
<ButtonIcon icon={RetryIcon} />
</Admonition.Button>
</Admonition.Row>
</Admonition.Outer>
)
}
@@ -5,6 +5,7 @@ import {useLingui} from '@lingui/react'
import {atoms as a} from '#/alf' import {atoms as a} from '#/alf'
import {Admonition} from '#/components/Admonition' import {Admonition} from '#/components/Admonition'
import {AgeAssuranceBadge} from '#/components/ageAssurance/AgeAssuranceBadge' import {AgeAssuranceBadge} from '#/components/ageAssurance/AgeAssuranceBadge'
import {AgeAssuranceConfigUnavailableError} from '#/components/ageAssurance/AgeAssuranceErrors'
import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy' import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy'
import {ButtonIcon, ButtonText} from '#/components/Button' import {ButtonIcon, ButtonText} from '#/components/Button'
import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRight} from '#/components/icons/Chevron' import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRight} from '#/components/icons/Chevron'
@@ -44,6 +45,12 @@ export function AgeRestrictedScreen({
</Layout.Header.Outer> </Layout.Header.Outer>
<Layout.Content> <Layout.Content>
<View style={[a.p_lg]}> <View style={[a.p_lg]}>
{aa.state.error === 'config' && (
<View style={[a.pb_lg]}>
<AgeAssuranceConfigUnavailableError />
</View>
)}
<View style={[a.align_start, a.pb_lg]}> <View style={[a.align_start, a.pb_lg]}>
<AgeAssuranceBadge /> <AgeAssuranceBadge />
</View> </View>
+12 -6
View File
@@ -5,14 +5,20 @@ import {type Geolocation} from '#/geolocation/types'
const localEnabled = false const localEnabled = false
export const enabled = IS_DEV && (localEnabled || aaDebug.geolocation) export const enabled = IS_DEV && (localEnabled || aaDebug.geolocation)
export const geolocation: Geolocation = aaDebug.geolocation ?? { export const geolocation: Geolocation = aaDebug.geolocation ?? {
countryCode: 'AU', countryCode: 'US',
regionCode: undefined, regionCode: 'TX',
}
export const deviceGeolocation: Geolocation = aaDebug.deviceGeolocation ?? {
countryCode: 'AU',
regionCode: undefined,
} }
const deviceLocalEnabled = false
export const deviceGeolocation: Geolocation | undefined =
aaDebug.deviceGeolocation ||
(deviceLocalEnabled
? {
countryCode: 'US',
regionCode: 'TX',
}
: undefined)
export async function resolve<T>(data: T) { export async function resolve<T>(data: T) {
await new Promise(y => setTimeout(y, 500)) // simulate network await new Promise(y => setTimeout(y, 500)) // simulate network
return data return data
+7 -1
View File
@@ -46,7 +46,8 @@ const useForegroundPermissions = createPermissionHook({
}) })
export async function getDeviceGeolocation(): Promise<Geolocation> { export async function getDeviceGeolocation(): Promise<Geolocation> {
if (debug.enabled) return debug.resolve(debug.deviceGeolocation) if (debug.enabled && debug.deviceGeolocation)
return debug.resolve(debug.deviceGeolocation)
try { try {
const geocode = await Location.getCurrentPositionAsync() const geocode = await Location.getCurrentPositionAsync()
@@ -142,3 +143,8 @@ export function useSyncDeviceGeolocationOnStartup(
}) })
}, [status, sync]) }, [status, sync])
} }
export function useIsDeviceGeolocationGranted() {
const [status] = useForegroundPermissions()
return status?.granted === true
}
+4 -1
View File
@@ -12,7 +12,10 @@ import {type Geolocation} from '#/geolocation/types'
import {mergeGeolocations} from '#/geolocation/util' import {mergeGeolocations} from '#/geolocation/util'
import {device, useStorage} from '#/storage' import {device, useStorage} from '#/storage'
export {useRequestDeviceGeolocation} from '#/geolocation/device' export {
useIsDeviceGeolocationGranted,
useRequestDeviceGeolocation,
} from '#/geolocation/device'
export {resolve} from '#/geolocation/service' export {resolve} from '#/geolocation/service'
export * from '#/geolocation/types' export * from '#/geolocation/types'
+3 -28
View File
@@ -11,12 +11,8 @@ import {Text} from '#/components/Typography'
export const Policies = ({ export const Policies = ({
serviceDescription, serviceDescription,
needsGuardian,
under13,
}: { }: {
serviceDescription: ComAtprotoServerDescribeServer.OutputSchema serviceDescription: ComAtprotoServerDescribeServer.OutputSchema
needsGuardian: boolean
under13: boolean
}) => { }) => {
const t = useTheme() const t = useTheme()
const {_} = useLingui() const {_} = useLingui()
@@ -91,30 +87,9 @@ export const Policies = ({
return null return null
} }
return ( return els ? (
<View style={[a.gap_sm]}> <Text style={[a.leading_snug, t.atoms.text_contrast_medium]}>{els}</Text>
{els ? ( ) : null
<Text style={[a.leading_snug, t.atoms.text_contrast_medium]}>
{els}
</Text>
) : null}
{under13 ? (
<Admonition type="error">
<Trans>
You must be 13 years of age or older to create an account.
</Trans>
</Admonition>
) : needsGuardian ? (
<Admonition type="warning">
<Trans>
If you are not yet an adult according to the laws of your country,
your parent or legal guardian must read these Terms on your behalf.
</Trans>
</Admonition>
) : undefined}
</View>
)
} }
function validWebLink(url?: string): string | undefined { function validWebLink(url?: string): string | undefined {
+99 -7
View File
@@ -7,9 +7,13 @@ import type tldts from 'tldts'
import {isEmailMaybeInvalid} from '#/lib/strings/email' import {isEmailMaybeInvalid} from '#/lib/strings/email'
import {logger} from '#/logger' import {logger} from '#/logger'
import {is13, is18, useSignupContext} from '#/screens/Signup/state' import {isNative} from '#/platform/detection'
import {useSignupContext} from '#/screens/Signup/state'
import {Policies} from '#/screens/Signup/StepInfo/Policies' import {Policies} from '#/screens/Signup/StepInfo/Policies'
import {atoms as a, native} from '#/alf' import {atoms as a, native} from '#/alf'
import * as Admonition from '#/components/Admonition'
import * as Dialog from '#/components/Dialog'
import {DeviceLocationRequestDialog} from '#/components/dialogs/DeviceLocationRequestDialog'
import * as DateField from '#/components/forms/DateField' import * as DateField from '#/components/forms/DateField'
import {type DateFieldRef} from '#/components/forms/DateField/types' import {type DateFieldRef} from '#/components/forms/DateField/types'
import {FormError} from '#/components/forms/FormError' import {FormError} from '#/components/forms/FormError'
@@ -18,8 +22,19 @@ import * as TextField from '#/components/forms/TextField'
import {Envelope_Stroke2_Corner0_Rounded as Envelope} from '#/components/icons/Envelope' import {Envelope_Stroke2_Corner0_Rounded as Envelope} from '#/components/icons/Envelope'
import {Lock_Stroke2_Corner0_Rounded as Lock} from '#/components/icons/Lock' import {Lock_Stroke2_Corner0_Rounded as Lock} from '#/components/icons/Lock'
import {Ticket_Stroke2_Corner0_Rounded as Ticket} from '#/components/icons/Ticket' import {Ticket_Stroke2_Corner0_Rounded as Ticket} from '#/components/icons/Ticket'
import {createStaticClick, SimpleInlineLinkText} from '#/components/Link'
import {Loader} from '#/components/Loader' import {Loader} from '#/components/Loader'
import {usePreemptivelyCompleteActivePolicyUpdate} from '#/components/PolicyUpdateOverlay/usePreemptivelyCompleteActivePolicyUpdate' import {usePreemptivelyCompleteActivePolicyUpdate} from '#/components/PolicyUpdateOverlay/usePreemptivelyCompleteActivePolicyUpdate'
import * as Toast from '#/components/Toast'
import {
isUnderAge,
MIN_ACCESS_AGE,
useAgeAssuranceRegionConfigWithFallback,
} from '#/ageAssurance/util'
import {
useDeviceGeolocationApi,
useIsDeviceGeolocationGranted,
} from '#/geolocation'
import {BackNextButtons} from '../BackNextButtons' import {BackNextButtons} from '../BackNextButtons'
function sanitizeDate(date: Date): Date { function sanitizeDate(date: Date): Date {
@@ -57,6 +72,20 @@ export function StepInfo({
const passwordInputRef = useRef<TextInput>(null) const passwordInputRef = useRef<TextInput>(null)
const birthdateInputRef = useRef<DateFieldRef>(null) const birthdateInputRef = useRef<DateFieldRef>(null)
const aaRegionConfig = useAgeAssuranceRegionConfigWithFallback()
const {setDeviceGeolocation} = useDeviceGeolocationApi()
const locationControl = Dialog.useDialogControl()
const isOverRegionMinAccessAge = state.dateOfBirth
? !isUnderAge(state.dateOfBirth.toISOString(), aaRegionConfig.minAccessAge)
: true
const isOverAppMinAccessAge = state.dateOfBirth
? !isUnderAge(state.dateOfBirth.toISOString(), MIN_ACCESS_AGE)
: true
const isOverMinAdultAge = state.dateOfBirth
? !isUnderAge(state.dateOfBirth.toISOString(), 18)
: true
const isDeviceGeolocationGranted = useIsDeviceGeolocationGranted()
const [hasWarnedEmail, setHasWarnedEmail] = React.useState<boolean>(false) const [hasWarnedEmail, setHasWarnedEmail] = React.useState<boolean>(false)
const tldtsRef = React.useRef<typeof tldts>(undefined) const tldtsRef = React.useRef<typeof tldts>(undefined)
@@ -76,7 +105,7 @@ export function StepInfo({
const emailChanged = prevEmailValueRef.current !== email const emailChanged = prevEmailValueRef.current !== email
const password = passwordValueRef.current const password = passwordValueRef.current
if (!is13(state.dateOfBirth)) { if (!isOverRegionMinAccessAge) {
return return
} }
@@ -274,16 +303,79 @@ export function StepInfo({
maximumDate={new Date()} maximumDate={new Date()}
/> />
</View> </View>
<Policies
serviceDescription={state.serviceDescription} <View style={[a.gap_sm]}>
needsGuardian={!is18(state.dateOfBirth)} <Policies serviceDescription={state.serviceDescription} />
under13={!is13(state.dateOfBirth)}
{!isOverRegionMinAccessAge || !isOverAppMinAccessAge ? (
<Admonition.Outer type="error">
<Admonition.Row>
<Admonition.Icon />
<Admonition.Content>
<Admonition.Text>
{!isOverAppMinAccessAge ? (
<Trans>
You must be {MIN_ACCESS_AGE} years of age or older
to create an account.
</Trans>
) : (
<Trans>
You must be {aaRegionConfig.minAccessAge} years of
age or older to create an account in your region.
</Trans>
)}
</Admonition.Text>
{isNative &&
!isDeviceGeolocationGranted &&
isOverAppMinAccessAge && (
<Admonition.Text>
<Trans>
Have we got your location wrong?{' '}
<SimpleInlineLinkText
label={_(
msg`Tap here to confirm your location with GPS.`,
)}
{...createStaticClick(() => {
locationControl.open()
})}>
Tap here to confirm your location with GPS.
</SimpleInlineLinkText>
</Trans>
</Admonition.Text>
)}
</Admonition.Content>
</Admonition.Row>
</Admonition.Outer>
) : !isOverMinAdultAge ? (
<Admonition.Admonition type="warning">
<Trans>
If you are not yet an adult according to the laws of your
country, your parent or legal guardian must read these Terms
on your behalf.
</Trans>
</Admonition.Admonition>
) : undefined}
</View>
{isNative && (
<DeviceLocationRequestDialog
control={locationControl}
onLocationAcquired={props => {
props.closeDialog(() => {
// set this after close!
setDeviceGeolocation(props.geolocation)
Toast.show(_(msg`Your location has been updated.`), {
type: 'success',
})
})
}}
/> />
)}
</> </>
) : undefined} ) : undefined}
</View> </View>
<BackNextButtons <BackNextButtons
hideNext={!is13(state.dateOfBirth)} hideNext={!isOverRegionMinAccessAge}
showRetry={isServerError} showRetry={isServerError}
isLoading={state.isLoading} isLoading={state.isLoading}
onBackPress={onPressBack} onBackPress={onPressBack}
+119 -202
View File
@@ -20,16 +20,16 @@
"@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/gen-mapping" "^0.3.0"
"@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/trace-mapping" "^0.3.9"
"@atproto-labs/did-resolver@0.2.5": "@atproto-labs/did-resolver@0.2.4":
version "0.2.5" version "0.2.4"
resolved "https://registry.yarnpkg.com/@atproto-labs/did-resolver/-/did-resolver-0.2.5.tgz#74b34e38b10fe1d18a42b35b32909b9a196e9693" resolved "https://registry.yarnpkg.com/@atproto-labs/did-resolver/-/did-resolver-0.2.4.tgz#3df8f94845fae10bb284303d6e73ffaa5a91b158"
integrity sha512-he7EC6OMSifNs01a4RT9mta/yYitoKDzlK9ty2TFV5Uj/+HpB4vYMRdIDFrRW0Hcsehy90E2t/dw0t7361MEKQ== integrity sha512-sbXxBnAJWsKv/FEGG6a/WLz7zQYUr1vA2TXvNnPwwJQJCjPwEJMOh1vM22wBr185Phy7D2GD88PcRokn7eUVyw==
dependencies: dependencies:
"@atproto-labs/fetch" "0.2.3" "@atproto-labs/fetch" "0.2.3"
"@atproto-labs/pipe" "0.1.1" "@atproto-labs/pipe" "0.1.1"
"@atproto-labs/simple-store" "0.3.0" "@atproto-labs/simple-store" "0.3.0"
"@atproto-labs/simple-store-memory" "0.1.4" "@atproto-labs/simple-store-memory" "0.1.4"
"@atproto/did" "0.2.4" "@atproto/did" "0.2.3"
zod "^3.23.8" zod "^3.23.8"
"@atproto-labs/fetch-node@0.2.0": "@atproto-labs/fetch-node@0.2.0":
@@ -82,20 +82,6 @@
"@atproto/xrpc" "^0.7.6" "@atproto/xrpc" "^0.7.6"
"@atproto/xrpc-server" "^0.10.0" "@atproto/xrpc-server" "^0.10.0"
"@atproto/api@^0.18.12", "@atproto/api@^0.18.9":
version "0.18.12"
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.12.tgz#8a32e7ddda260eda79fa877d6d3586d21c066286"
integrity sha512-b4MdUhYzebb6nQLo8LLZvBC9yvlzF69XqZeKewvmz9SleK2sJX2cqAPj78IStjNzT/3Xm9vVQrq9DkCkhSiTiQ==
dependencies:
"@atproto/common-web" "^0.4.10"
"@atproto/lexicon" "^0.6.0"
"@atproto/syntax" "^0.4.2"
"@atproto/xrpc" "^0.7.7"
await-lock "^2.2.2"
multiformats "^9.9.0"
tlds "^1.234.0"
zod "^3.23.8"
"@atproto/api@^0.18.13": "@atproto/api@^0.18.13":
version "0.18.13" version "0.18.13"
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.13.tgz#63eee310e6715752eb87748323cf9ab57dd91e4b" resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.13.tgz#63eee310e6715752eb87748323cf9ab57dd91e4b"
@@ -110,10 +96,24 @@
tlds "^1.234.0" tlds "^1.234.0"
zod "^3.23.8" zod "^3.23.8"
"@atproto/api@^0.18.8": "@atproto/api@^0.18.5", "@atproto/api@^0.18.7":
version "0.18.8" version "0.18.7"
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.8.tgz#6df69731005413d8507345829a12abeda787c32d" resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.7.tgz#3175ec8f1909ddcae488183a2180de234e7acce4"
integrity sha512-Qo3sGd1N5hdHTaEWUBgptvPkULt2SXnMcWRhveSyctSd/IQwTMyaIH6E62A1SU+8xBSN5QLpoUJNE7iSrYM2Zg== integrity sha512-vUluqN1XU5AX5tgfSJjjjUzALCMq8DjdI0jlIhRYyn2Chb0ZOCU8k0ZTpUAcuDFE2FoxxW4S3kvtlHwLMtN5dQ==
dependencies:
"@atproto/common-web" "^0.4.7"
"@atproto/lexicon" "^0.6.0"
"@atproto/syntax" "^0.4.2"
"@atproto/xrpc" "^0.7.7"
await-lock "^2.2.2"
multiformats "^9.9.0"
tlds "^1.234.0"
zod "^3.23.8"
"@atproto/api@^0.18.6":
version "0.18.6"
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.18.6.tgz#04c26b97bda01cbe276dea523de6e4a184894c18"
integrity sha512-dkzy2OHSAGgzG9GExvOiwRY73EzVD2AiD3nksng+V6erG0kwLfbmVYjoP9mq9Y16BCXr/7q9lekfogthqU614Q==
dependencies: dependencies:
"@atproto/common-web" "^0.4.7" "@atproto/common-web" "^0.4.7"
"@atproto/lexicon" "^0.6.0" "@atproto/lexicon" "^0.6.0"
@@ -142,23 +142,23 @@
multiformats "^9.9.0" multiformats "^9.9.0"
uint8arrays "3.0.0" uint8arrays "3.0.0"
"@atproto/bsky@^0.0.207": "@atproto/bsky@^0.0.202":
version "0.0.207" version "0.0.202"
resolved "https://registry.yarnpkg.com/@atproto/bsky/-/bsky-0.0.207.tgz#1a2a072e55e28ed6743bb9b12cbf966918297d70" resolved "https://registry.yarnpkg.com/@atproto/bsky/-/bsky-0.0.202.tgz#7b4376dba273a4c1b810846074974d1b11a58e5c"
integrity sha512-DlAF85Sapf9knKWuLiMgxw1rAWWWbfLmI9draGw0DuL0lDTcb4lw2I4sv2j+hyezhzFW5wjbqkPEyGrPR7RySw== integrity sha512-QE0T/Vr/WdPZ1lUAZNtNqkH9D+Ii7+95oUR0Q2EYyr0J9G3hlLTvc/FJog91aSe6fzZludRB/n1sRUfdMRePdg==
dependencies: dependencies:
"@atproto-labs/fetch-node" "0.2.0" "@atproto-labs/fetch-node" "0.2.0"
"@atproto-labs/xrpc-utils" "0.0.24" "@atproto-labs/xrpc-utils" "0.0.24"
"@atproto/api" "^0.18.12" "@atproto/api" "^0.18.7"
"@atproto/common" "^0.5.6" "@atproto/common" "^0.5.3"
"@atproto/crypto" "^0.4.5" "@atproto/crypto" "^0.4.5"
"@atproto/did" "^0.2.4" "@atproto/did" "^0.2.3"
"@atproto/identity" "^0.4.10" "@atproto/identity" "^0.4.10"
"@atproto/lexicon" "^0.6.0" "@atproto/lexicon" "^0.6.0"
"@atproto/repo" "^0.8.12" "@atproto/repo" "^0.8.12"
"@atproto/sync" "^0.1.39" "@atproto/sync" "^0.1.39"
"@atproto/syntax" "^0.4.2" "@atproto/syntax" "^0.4.2"
"@atproto/xrpc-server" "^0.10.7" "@atproto/xrpc-server" "^0.10.3"
"@bufbuild/protobuf" "^1.5.0" "@bufbuild/protobuf" "^1.5.0"
"@connectrpc/connect" "^1.1.4" "@connectrpc/connect" "^1.1.4"
"@connectrpc/connect-express" "^1.1.4" "@connectrpc/connect-express" "^1.1.4"
@@ -208,15 +208,6 @@
pino-http "^8.2.1" pino-http "^8.2.1"
typed-emitter "^2.1.0" typed-emitter "^2.1.0"
"@atproto/common-web@^0.4.10":
version "0.4.10"
resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.10.tgz#3d29df4dc3ea8f5c149161209f55e146f27867c1"
integrity sha512-TLDZSgSKzT8ZgOrBrTGK87J1CXve9TEuY6NVVUBRkOMzRRtQzpFb9/ih5WVS/hnaWVvE30CfuyaetRoma+WKNw==
dependencies:
"@atproto/lex-data" "0.0.6"
"@atproto/lex-json" "0.0.6"
zod "^3.23.8"
"@atproto/common-web@^0.4.11": "@atproto/common-web@^0.4.11":
version "0.4.11" version "0.4.11"
resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.11.tgz#eb41dc02c1ea4221388630e193d181fb098186e0" resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.11.tgz#eb41dc02c1ea4221388630e193d181fb098186e0"
@@ -288,18 +279,6 @@
multiformats "^9.9.0" multiformats "^9.9.0"
pino "^8.21.0" pino "^8.21.0"
"@atproto/common@^0.5.6":
version "0.5.6"
resolved "https://registry.yarnpkg.com/@atproto/common/-/common-0.5.6.tgz#e46c6ab9649e89514dccc954b0e6af9b7838b794"
integrity sha512-rbWoZwHQNP8jcwjCREVecchw8aaoM5A1NCONyb9PVDWOJLRLCzojYMeIS8IbFqXo6NyIByOGddupADkkLeVBGQ==
dependencies:
"@atproto/common-web" "^0.4.10"
"@atproto/lex-cbor" "0.0.6"
"@atproto/lex-data" "0.0.6"
iso-datestring-validator "^2.2.2"
multiformats "^9.9.0"
pino "^8.21.0"
"@atproto/crypto@0.1.0": "@atproto/crypto@0.1.0":
version "0.1.0" version "0.1.0"
resolved "https://registry.yarnpkg.com/@atproto/crypto/-/crypto-0.1.0.tgz#bc73a479f9dbe06fa025301c182d7f7ab01bc568" resolved "https://registry.yarnpkg.com/@atproto/crypto/-/crypto-0.1.0.tgz#bc73a479f9dbe06fa025301c182d7f7ab01bc568"
@@ -329,23 +308,23 @@
"@noble/hashes" "^1.6.1" "@noble/hashes" "^1.6.1"
uint8arrays "3.0.0" uint8arrays "3.0.0"
"@atproto/dev-env@^0.3.201": "@atproto/dev-env@^0.3.196":
version "0.3.201" version "0.3.196"
resolved "https://registry.yarnpkg.com/@atproto/dev-env/-/dev-env-0.3.201.tgz#e97078fccb842387f1b8aa6c8622704b3d7769eb" resolved "https://registry.yarnpkg.com/@atproto/dev-env/-/dev-env-0.3.196.tgz#e98d3f3e7a7cee874425b01bfc164e22d1111664"
integrity sha512-xWsXyawwdvigvkMcfwjY65tHhhpvA90MmecexMstIKizbMW62ueNdtfEwCWdm60MNA0PcobrpNEnYlDQ5m6slA== integrity sha512-65LrDGcGIFrZ+JnQlW38ZFO9jYO1Sp9fHc2rRq6bZzfAGT6c7K3EWHhXhNDtQ4oL3DYAT9+p56Pcv68XMaSipA==
dependencies: dependencies:
"@atproto/api" "^0.18.12" "@atproto/api" "^0.18.7"
"@atproto/bsky" "^0.0.207" "@atproto/bsky" "^0.0.202"
"@atproto/bsync" "^0.0.23" "@atproto/bsync" "^0.0.23"
"@atproto/common-web" "^0.4.10" "@atproto/common-web" "^0.4.7"
"@atproto/crypto" "^0.4.5" "@atproto/crypto" "^0.4.5"
"@atproto/identity" "^0.4.10" "@atproto/identity" "^0.4.10"
"@atproto/lexicon" "^0.6.0" "@atproto/lexicon" "^0.6.0"
"@atproto/ozone" "^0.1.161" "@atproto/ozone" "^0.1.160"
"@atproto/pds" "^0.4.202" "@atproto/pds" "^0.4.199"
"@atproto/sync" "^0.1.39" "@atproto/sync" "^0.1.39"
"@atproto/syntax" "^0.4.2" "@atproto/syntax" "^0.4.2"
"@atproto/xrpc-server" "^0.10.7" "@atproto/xrpc-server" "^0.10.3"
"@did-plc/lib" "^0.0.1" "@did-plc/lib" "^0.0.1"
"@did-plc/server" "^0.0.1" "@did-plc/server" "^0.0.1"
dotenv "^16.0.3" dotenv "^16.0.3"
@@ -355,14 +334,7 @@
uint8arrays "3.0.0" uint8arrays "3.0.0"
undici "^6.14.1" undici "^6.14.1"
"@atproto/did@0.2.4", "@atproto/did@^0.2.4": "@atproto/did@0.2.3", "@atproto/did@^0.2.3":
version "0.2.4"
resolved "https://registry.yarnpkg.com/@atproto/did/-/did-0.2.4.tgz#8843b4e53cc1de22e710d4db47170ca2f631dee4"
integrity sha512-nxNiCgXeo7pfjojq9fpfZxCO0X0xUipNVKW+AHNZwQKiUDt6zYL0VXEfm8HBUwQOCmKvj2pRRSM1Cur+tUWk3g==
dependencies:
zod "^3.23.8"
"@atproto/did@^0.2.3":
version "0.2.3" version "0.2.3"
resolved "https://registry.yarnpkg.com/@atproto/did/-/did-0.2.3.tgz#83cd18ae105324913b30a2259cd9d886677b2d15" resolved "https://registry.yarnpkg.com/@atproto/did/-/did-0.2.3.tgz#83cd18ae105324913b30a2259cd9d886677b2d15"
integrity sha512-VI8JJkSizvM2cHYJa37WlbzeCm5tWpojyc1/Zy8q8OOjyoy6X4S4BEfoP941oJcpxpMTObamibQIXQDo7tnIjg== integrity sha512-VI8JJkSizvM2cHYJa37WlbzeCm5tWpojyc1/Zy8q8OOjyoy6X4S4BEfoP941oJcpxpMTObamibQIXQDo7tnIjg==
@@ -402,7 +374,7 @@
multiformats "^9.9.0" multiformats "^9.9.0"
tslib "^2.8.1" tslib "^2.8.1"
"@atproto/lex-cbor@0.0.3": "@atproto/lex-cbor@0.0.3", "@atproto/lex-cbor@^0.0.3":
version "0.0.3" version "0.0.3"
resolved "https://registry.yarnpkg.com/@atproto/lex-cbor/-/lex-cbor-0.0.3.tgz#13712fa5216cd336ebbd31fbd34d35bf6ea21492" resolved "https://registry.yarnpkg.com/@atproto/lex-cbor/-/lex-cbor-0.0.3.tgz#13712fa5216cd336ebbd31fbd34d35bf6ea21492"
integrity sha512-N8lCV3kK5ZcjSOWxKLWqzlnaSpK4isjXRZ0EqApl/5y9KB64s78hQ/U3KIE5qnPRlBbW5kSH3YACoU27u9nTOA== integrity sha512-N8lCV3kK5ZcjSOWxKLWqzlnaSpK4isjXRZ0EqApl/5y9KB64s78hQ/U3KIE5qnPRlBbW5kSH3YACoU27u9nTOA==
@@ -411,23 +383,14 @@
multiformats "^9.9.0" multiformats "^9.9.0"
tslib "^2.8.1" tslib "^2.8.1"
"@atproto/lex-cbor@0.0.6", "@atproto/lex-cbor@^0.0.6": "@atproto/lex-client@0.0.4":
version "0.0.6" version "0.0.4"
resolved "https://registry.yarnpkg.com/@atproto/lex-cbor/-/lex-cbor-0.0.6.tgz#cf0df090906afcaf27d589820f2b7563655cc6fe" resolved "https://registry.yarnpkg.com/@atproto/lex-client/-/lex-client-0.0.4.tgz#04fca87296f3177ba122e41bed89d36b4d81b01a"
integrity sha512-lee2T00owDy3I1plRHuURT6f98NIpYZZr2wXa5pJZz5JzefZ+nv8gJ2V70C2f+jmSG+5S9NTIy4uJw94vaHf4A== integrity sha512-tGaenywYo6IvzKKMYuZB+sMBQNDkQ53PLz/NM0WeXnaa/e58VhOGzwVLnNSI/QR9qLlwHFfMf8AIFZyAVHBWCw==
dependencies: dependencies:
"@atproto/lex-data" "0.0.6" "@atproto/lex-data" "0.0.3"
multiformats "^9.9.0" "@atproto/lex-json" "0.0.3"
tslib "^2.8.1" "@atproto/lex-schema" "0.0.4"
"@atproto/lex-client@0.0.7":
version "0.0.7"
resolved "https://registry.yarnpkg.com/@atproto/lex-client/-/lex-client-0.0.7.tgz#108687e1062714ba57698ea08ec9e9b79258f32a"
integrity sha512-ofUz3yXJ0nN/M9aqqF2ZUL/4D1wWT1P4popCfV3OEDsDrtWofMflYPFz1IWuyPa2e83paaEHRhaw3bZEhgXH1w==
dependencies:
"@atproto/lex-data" "0.0.6"
"@atproto/lex-json" "0.0.6"
"@atproto/lex-schema" "0.0.7"
tslib "^2.8.1" tslib "^2.8.1"
"@atproto/lex-data@0.0.2": "@atproto/lex-data@0.0.2":
@@ -441,7 +404,7 @@
uint8arrays "3.0.0" uint8arrays "3.0.0"
unicode-segmenter "^0.14.0" unicode-segmenter "^0.14.0"
"@atproto/lex-data@0.0.3": "@atproto/lex-data@0.0.3", "@atproto/lex-data@^0.0.3":
version "0.0.3" version "0.0.3"
resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.3.tgz#1ce1bd19e17af41b2991a2a02ad439a136dec4e9" resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.3.tgz#1ce1bd19e17af41b2991a2a02ad439a136dec4e9"
integrity sha512-ivo1IpY/EX+RIpxPgCf4cPhQo5bfu4nrpa1vJCt8hCm9SfoonJkDFGa0n4SMw4JnXZoUcGcrJ46L+D8bH6GI2g== integrity sha512-ivo1IpY/EX+RIpxPgCf4cPhQo5bfu4nrpa1vJCt8hCm9SfoonJkDFGa0n4SMw4JnXZoUcGcrJ46L+D8bH6GI2g==
@@ -452,17 +415,6 @@
uint8arrays "3.0.0" uint8arrays "3.0.0"
unicode-segmenter "^0.14.0" unicode-segmenter "^0.14.0"
"@atproto/lex-data@0.0.6", "@atproto/lex-data@^0.0.6":
version "0.0.6"
resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.6.tgz#280d05ec9579ab091dc4a8b696ebbeddcb8ee37d"
integrity sha512-MBNB4ghRJQzuXK1zlUPljpPbQcF1LZ5dzxy274KqPt4p3uPuRw0mHjgcCoWzRUNBQC685WMQR4IN9DHtsnG57A==
dependencies:
"@atproto/syntax" "0.4.2"
multiformats "^9.9.0"
tslib "^2.8.1"
uint8arrays "3.0.0"
unicode-segmenter "^0.14.0"
"@atproto/lex-data@0.0.7": "@atproto/lex-data@0.0.7":
version "0.0.7" version "0.0.7"
resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.7.tgz#6aa87423f6d47849bec8ff3ca0b00ce93964adc8" resolved "https://registry.yarnpkg.com/@atproto/lex-data/-/lex-data-0.0.7.tgz#6aa87423f6d47849bec8ff3ca0b00ce93964adc8"
@@ -474,12 +426,12 @@
uint8arrays "3.0.0" uint8arrays "3.0.0"
unicode-segmenter "^0.14.0" unicode-segmenter "^0.14.0"
"@atproto/lex-document@0.0.8": "@atproto/lex-document@0.0.5":
version "0.0.8" version "0.0.5"
resolved "https://registry.yarnpkg.com/@atproto/lex-document/-/lex-document-0.0.8.tgz#03ff4698126326e8c5d2cc138c05765816ee5f59" resolved "https://registry.yarnpkg.com/@atproto/lex-document/-/lex-document-0.0.5.tgz#8d4851b351149ba673c1de9c1898c3c9ebd8b4b3"
integrity sha512-p3l5h96Hx0vxUwbO/eas6x5h2vU0JVN1a/ktX4k3PlK9YLXfWMFsv+RdVwVZom8o0irHwlcyh1D/cY0PyUojDA== integrity sha512-faGcwsupdtvoFZ8ILEu14MYJ0z/pCiQ+Yu4WEkVtJvy8jIkFxeZ8MxxZgm8KrlSt6jxsyYvMpscQCtYpVmafFQ==
dependencies: dependencies:
"@atproto/lex-schema" "0.0.7" "@atproto/lex-schema" "0.0.4"
core-js "^3" core-js "^3"
tslib "^2.8.1" tslib "^2.8.1"
@@ -499,14 +451,6 @@
"@atproto/lex-data" "0.0.3" "@atproto/lex-data" "0.0.3"
tslib "^2.8.1" tslib "^2.8.1"
"@atproto/lex-json@0.0.6":
version "0.0.6"
resolved "https://registry.yarnpkg.com/@atproto/lex-json/-/lex-json-0.0.6.tgz#50618efb1cc11708b3897de14dcd3bd9c06e064d"
integrity sha512-EILnN5cditPvf+PCNjXt7reMuzjugxAL1fpSzmzJbEMGMUwxOf5pPWxRsaA/M3Boip4NQZ+6DVrPOGUMlnqceg==
dependencies:
"@atproto/lex-data" "0.0.6"
tslib "^2.8.1"
"@atproto/lex-json@0.0.7": "@atproto/lex-json@0.0.7":
version "0.0.7" version "0.0.7"
resolved "https://registry.yarnpkg.com/@atproto/lex-json/-/lex-json-0.0.7.tgz#c06e1fc3e06d739bbb74694f5d846055bed37866" resolved "https://registry.yarnpkg.com/@atproto/lex-json/-/lex-json-0.0.7.tgz#c06e1fc3e06d739bbb74694f5d846055bed37866"
@@ -515,27 +459,27 @@
"@atproto/lex-data" "0.0.7" "@atproto/lex-data" "0.0.7"
tslib "^2.8.1" tslib "^2.8.1"
"@atproto/lex-resolver@0.0.8": "@atproto/lex-resolver@0.0.5":
version "0.0.8" version "0.0.5"
resolved "https://registry.yarnpkg.com/@atproto/lex-resolver/-/lex-resolver-0.0.8.tgz#69da8685b1ab18e91b5fd9a5488286f146968cae" resolved "https://registry.yarnpkg.com/@atproto/lex-resolver/-/lex-resolver-0.0.5.tgz#9d0645c43423cb99b491ca8e658770395d2cd630"
integrity sha512-4hXT560+k5BIttouuhXOr+UkhAuFvvkJaVdqYb8vx2Ez7eHPiZ+yWkUK6FKpyGsx2whHkJzgleEA6DNWtdDlWA== integrity sha512-gBqHY1HS/g2rxuk8CPzB1cmMxmOWK897/jIboMhYDXnuavg8zh54eljCFXr8GvaJdo5DnMGyBEilHNppJOD4mg==
dependencies: dependencies:
"@atproto-labs/did-resolver" "0.2.5" "@atproto-labs/did-resolver" "0.2.4"
"@atproto/crypto" "0.4.5" "@atproto/crypto" "0.4.5"
"@atproto/lex-client" "0.0.7" "@atproto/lex-client" "0.0.4"
"@atproto/lex-data" "0.0.6" "@atproto/lex-data" "0.0.3"
"@atproto/lex-document" "0.0.8" "@atproto/lex-document" "0.0.5"
"@atproto/lex-schema" "0.0.7" "@atproto/lex-schema" "0.0.4"
"@atproto/repo" "0.8.12" "@atproto/repo" "0.8.12"
"@atproto/syntax" "0.4.2" "@atproto/syntax" "0.4.2"
tslib "^2.8.1" tslib "^2.8.1"
"@atproto/lex-schema@0.0.7": "@atproto/lex-schema@0.0.4":
version "0.0.7" version "0.0.4"
resolved "https://registry.yarnpkg.com/@atproto/lex-schema/-/lex-schema-0.0.7.tgz#a924acd5fcb9adb9f136d5a4779ca3ad22ba83fd" resolved "https://registry.yarnpkg.com/@atproto/lex-schema/-/lex-schema-0.0.4.tgz#382998f5c384b864a1bc0c00bd073c1168503895"
integrity sha512-/7HkTUsnP1rlzmVE6nnY0kl/hydL/W8V29V8BhFwdAvdDKpYcdRgzzsMe38LAt+ZOjHknRCZDIKGsbQMSbJErw== integrity sha512-WlF+w/OH16KR9XYW9J7hNEDgHp37uG2EWm8/iJknDFsWYjbhgl71x1jcqqCM8BcDxAYxyJLOvPuadOC6cG5JjA==
dependencies: dependencies:
"@atproto/lex-data" "0.0.6" "@atproto/lex-data" "0.0.3"
"@atproto/syntax" "0.4.2" "@atproto/syntax" "0.4.2"
tslib "^2.8.1" tslib "^2.8.1"
@@ -561,49 +505,49 @@
multiformats "^9.9.0" multiformats "^9.9.0"
zod "^3.23.8" zod "^3.23.8"
"@atproto/oauth-provider-api@0.3.6": "@atproto/oauth-provider-api@0.3.4":
version "0.3.6" version "0.3.4"
resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-api/-/oauth-provider-api-0.3.6.tgz#ab8ee8f86c3eac7c6008f786205b7f149678f85a" resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-api/-/oauth-provider-api-0.3.4.tgz#bce9b1a5a6bd759b0de8f6b80c4aced9b64f0c79"
integrity sha512-ddUCbBH/1X+3YaegJzOTESAc8+ZUwn0sLgKpxp4Na3J6cPeZfXiheWGKxbu5pTPwJr1msCNOakqSMkoLbP7UEA== integrity sha512-K3gBqyf9VlYE6tvfD0EDya9WQ9XWtbuhxkI1XHyCIyAvAemhBGoJ1As0ESo3UpJmd2JhA2DmLj4oOvBqknamBA==
dependencies: dependencies:
"@atproto/jwk" "0.6.0" "@atproto/jwk" "0.6.0"
"@atproto/oauth-types" "0.6.1" "@atproto/oauth-types" "0.5.2"
"@atproto/oauth-provider-frontend@0.2.7": "@atproto/oauth-provider-frontend@0.2.5":
version "0.2.7" version "0.2.5"
resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-frontend/-/oauth-provider-frontend-0.2.7.tgz#b4157fea9fffd970c357f25ed7588359e820d94a" resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-frontend/-/oauth-provider-frontend-0.2.5.tgz#6a62475bf70cc9d198e8e5f6683fb0c8d39797a0"
integrity sha512-cXS/lonP0WzPEcCiv1BuMUyp1Oq+eZpwX3sbvhsNYwtyM+7PLU1KhD9y2VR01S7UhCxRPmpQiIMLvsdVWNddZA== integrity sha512-9+23B2Wp2G5UvHPiKQGwoK3sOu3JHa+jVfWjbUkXhho0HGL60hAbyrdm0C6n3UER/mLfn8MTjzW9jQSuJXHosg==
optionalDependencies: optionalDependencies:
"@atproto/oauth-provider-api" "0.3.6" "@atproto/oauth-provider-api" "0.3.4"
"@atproto/oauth-provider-ui@0.4.1": "@atproto/oauth-provider-ui@0.3.6":
version "0.4.1" version "0.3.6"
resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-ui/-/oauth-provider-ui-0.4.1.tgz#5f957f1eed89409ba842bffb5b7e9bf25c6bcc44" resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-ui/-/oauth-provider-ui-0.3.6.tgz#1181040d33b19ed7124f5ad12833200bcd7892e6"
integrity sha512-70K0uwCCz68qK5bwce8NG6RsBp1pBp/YMzZUGq09XhYVwx/wHgaf1HUFuwLIGV4sVKgahLsNBrRHY9n7fXFbRA== integrity sha512-uxnBWEX/Ht2JJbeibMhCu3OatKchhQGV4v5KfXzTylX2VIZrRmG8PVr5YnHmijjJZD+NgeDWlFSdyGdZZ7qU9w==
optionalDependencies: optionalDependencies:
"@atproto/oauth-provider-api" "0.3.6" "@atproto/oauth-provider-api" "0.3.4"
"@atproto/oauth-provider@^0.15.2": "@atproto/oauth-provider@^0.14.1":
version "0.15.2" version "0.14.1"
resolved "https://registry.yarnpkg.com/@atproto/oauth-provider/-/oauth-provider-0.15.2.tgz#e0de8e09ee9db412db9263c3c8fd0ffb2c84ed9d" resolved "https://registry.yarnpkg.com/@atproto/oauth-provider/-/oauth-provider-0.14.1.tgz#b1fd01408bb988ee29f19e2ab6ab323a31ea7590"
integrity sha512-94Xg6XS5IccDSQ54t+FqEXe8v+oeYftms0YX6xky8jY+EK0W1jUbO4vsxkaTv3PDe0QfSLoDvB3SoVcRi46JGA== integrity sha512-n0qHOhUfSwp6w3i54tC5IjmeE5raoxEyxchJkqvoj/xWBiysdMJwpLTIvQ90rcXbjIA22Jv58oQ/mtx07w82xA==
dependencies: dependencies:
"@atproto-labs/fetch" "0.2.3" "@atproto-labs/fetch" "0.2.3"
"@atproto-labs/fetch-node" "0.2.0" "@atproto-labs/fetch-node" "0.2.0"
"@atproto-labs/pipe" "0.1.1" "@atproto-labs/pipe" "0.1.1"
"@atproto-labs/simple-store" "0.3.0" "@atproto-labs/simple-store" "0.3.0"
"@atproto-labs/simple-store-memory" "0.1.4" "@atproto-labs/simple-store-memory" "0.1.4"
"@atproto/common" "^0.5.6" "@atproto/common" "^0.5.3"
"@atproto/did" "0.2.4" "@atproto/did" "0.2.3"
"@atproto/jwk" "0.6.0" "@atproto/jwk" "0.6.0"
"@atproto/jwk-jose" "0.1.11" "@atproto/jwk-jose" "0.1.11"
"@atproto/lex-document" "0.0.8" "@atproto/lex-document" "0.0.5"
"@atproto/lex-resolver" "0.0.8" "@atproto/lex-resolver" "0.0.5"
"@atproto/oauth-provider-api" "0.3.6" "@atproto/oauth-provider-api" "0.3.4"
"@atproto/oauth-provider-frontend" "0.2.7" "@atproto/oauth-provider-frontend" "0.2.5"
"@atproto/oauth-provider-ui" "0.4.1" "@atproto/oauth-provider-ui" "0.3.6"
"@atproto/oauth-scopes" "0.3.0" "@atproto/oauth-scopes" "0.3.0"
"@atproto/oauth-types" "0.6.1" "@atproto/oauth-types" "0.5.2"
"@atproto/syntax" "0.4.2" "@atproto/syntax" "0.4.2"
"@hapi/accept" "^6.0.3" "@hapi/accept" "^6.0.3"
"@hapi/address" "^5.1.1" "@hapi/address" "^5.1.1"
@@ -625,29 +569,29 @@
"@atproto/did" "^0.2.3" "@atproto/did" "^0.2.3"
"@atproto/syntax" "^0.4.2" "@atproto/syntax" "^0.4.2"
"@atproto/oauth-types@0.6.1": "@atproto/oauth-types@0.5.2":
version "0.6.1" version "0.5.2"
resolved "https://registry.yarnpkg.com/@atproto/oauth-types/-/oauth-types-0.6.1.tgz#c75be82016052fd2f877030a4f4832af7d7d7016" resolved "https://registry.yarnpkg.com/@atproto/oauth-types/-/oauth-types-0.5.2.tgz#443d2b004403f33fbdcbe4f3406f645c2785fe04"
integrity sha512-3z92GN/6zCq9E2GTTfZM27tWEbvi1qwFSA7KoS5+wqBC4kSsLvnLxmbKH402Z40DfWS4YWqw0DkHsgP0LNFDEA== integrity sha512-9DCDvtvCanTwAaU5UakYDO0hzcOITS3RutK5zfLytE5Y9unj0REmTDdN8Xd8YCfUJl7T/9pYpf04Uyq7bFTASg==
dependencies: dependencies:
"@atproto/did" "0.2.4" "@atproto/did" "0.2.3"
"@atproto/jwk" "0.6.0" "@atproto/jwk" "0.6.0"
zod "^3.23.8" zod "^3.23.8"
"@atproto/ozone@^0.1.161": "@atproto/ozone@^0.1.160":
version "0.1.161" version "0.1.160"
resolved "https://registry.yarnpkg.com/@atproto/ozone/-/ozone-0.1.161.tgz#31f776c168c4eba8e095ebcf8f4cfbd13f6f175c" resolved "https://registry.yarnpkg.com/@atproto/ozone/-/ozone-0.1.160.tgz#1131fa6c0d1b37e3a7b0aaa2f788b36eb2f7a750"
integrity sha512-gGbo0sbopWnW2zkpeGBrERLuAeI0lhWmnAKoHK3g1/F/r3V/8k2MRAEMq7bhwOY7uCVoZq4ob4sX+pCNPUM8AQ== integrity sha512-p0CP5/1Anv1qbxoRBC4IOaSkFe28Y3nKmzfrx0Z6in/o8VF/LZ9dhuW1UgrDQs4PyMzMOar3UFfO2ZUL4Gg58A==
dependencies: dependencies:
"@atproto/api" "^0.18.8" "@atproto/api" "^0.18.5"
"@atproto/common" "^0.5.3" "@atproto/common" "^0.5.3"
"@atproto/crypto" "^0.4.5" "@atproto/crypto" "^0.4.5"
"@atproto/identity" "^0.4.10" "@atproto/identity" "^0.4.10"
"@atproto/lexicon" "^0.6.0" "@atproto/lexicon" "^0.6.0"
"@atproto/syntax" "^0.4.2" "@atproto/syntax" "^0.4.2"
"@atproto/ws-client" "^0.0.4" "@atproto/ws-client" "^0.0.3"
"@atproto/xrpc" "^0.7.7" "@atproto/xrpc" "^0.7.7"
"@atproto/xrpc-server" "^0.10.4" "@atproto/xrpc-server" "^0.10.3"
"@did-plc/lib" "^0.0.1" "@did-plc/lib" "^0.0.1"
compression "^1.7.4" compression "^1.7.4"
cors "^2.8.5" cors "^2.8.5"
@@ -665,30 +609,30 @@
undici "^6.14.1" undici "^6.14.1"
ws "^8.12.0" ws "^8.12.0"
"@atproto/pds@^0.4.202": "@atproto/pds@^0.4.199":
version "0.4.202" version "0.4.199"
resolved "https://registry.yarnpkg.com/@atproto/pds/-/pds-0.4.202.tgz#05f57beff004f1625d9be796e0d711d32e1f940b" resolved "https://registry.yarnpkg.com/@atproto/pds/-/pds-0.4.199.tgz#8cdf10ad449c57206b4820191ecfb358346908bd"
integrity sha512-EzTQ/10nYX2bkikRSNAWjjjZQgPbJKnSzz+q3X+ofZM6k5tZk816b/njMD9i3PqKMtke9GReAao1IhF71Jur9w== integrity sha512-EtXVzPusvLVRIhjUutKcb75lPN9oWD24bZGbRrDaehcbI0QXbosGek/vgil0ZFLn0YW3G/BssM0K63KUotscrw==
dependencies: dependencies:
"@atproto-labs/fetch-node" "0.2.0" "@atproto-labs/fetch-node" "0.2.0"
"@atproto-labs/simple-store" "0.3.0" "@atproto-labs/simple-store" "0.3.0"
"@atproto-labs/simple-store-memory" "0.1.4" "@atproto-labs/simple-store-memory" "0.1.4"
"@atproto-labs/simple-store-redis" "0.0.1" "@atproto-labs/simple-store-redis" "0.0.1"
"@atproto-labs/xrpc-utils" "0.0.24" "@atproto-labs/xrpc-utils" "0.0.24"
"@atproto/api" "^0.18.9" "@atproto/api" "^0.18.6"
"@atproto/aws" "^0.2.31" "@atproto/aws" "^0.2.31"
"@atproto/common" "^0.5.6" "@atproto/common" "^0.5.3"
"@atproto/crypto" "^0.4.5" "@atproto/crypto" "^0.4.5"
"@atproto/identity" "^0.4.10" "@atproto/identity" "^0.4.10"
"@atproto/lex-cbor" "^0.0.6" "@atproto/lex-cbor" "^0.0.3"
"@atproto/lex-data" "^0.0.6" "@atproto/lex-data" "^0.0.3"
"@atproto/lexicon" "^0.6.0" "@atproto/lexicon" "^0.6.0"
"@atproto/oauth-provider" "^0.15.2" "@atproto/oauth-provider" "^0.14.1"
"@atproto/oauth-scopes" "^0.3.0" "@atproto/oauth-scopes" "^0.3.0"
"@atproto/repo" "^0.8.12" "@atproto/repo" "^0.8.12"
"@atproto/syntax" "^0.4.2" "@atproto/syntax" "^0.4.2"
"@atproto/xrpc" "^0.7.7" "@atproto/xrpc" "^0.7.7"
"@atproto/xrpc-server" "^0.10.7" "@atproto/xrpc-server" "^0.10.3"
"@did-plc/lib" "^0.0.4" "@did-plc/lib" "^0.0.4"
"@hapi/address" "^5.1.1" "@hapi/address" "^5.1.1"
better-sqlite3 "^10.0.0" better-sqlite3 "^10.0.0"
@@ -781,14 +725,6 @@
"@atproto/common" "^0.5.0" "@atproto/common" "^0.5.0"
ws "^8.12.0" ws "^8.12.0"
"@atproto/ws-client@^0.0.4":
version "0.0.4"
resolved "https://registry.yarnpkg.com/@atproto/ws-client/-/ws-client-0.0.4.tgz#9e436c0e72abea5da0d5a7e8ec862cec0fdb10cd"
integrity sha512-dox1XIymuC7/ZRhUqKezIGgooZS45C6vHCfu0PnWjfvsLCK2kAlnvX4IBkA/WpcoijDhQ9ejChnFbo/sLmgvAg==
dependencies:
"@atproto/common" "^0.5.3"
ws "^8.12.0"
"@atproto/xrpc-server@^0.10.0": "@atproto/xrpc-server@^0.10.0":
version "0.10.2" version "0.10.2"
resolved "https://registry.yarnpkg.com/@atproto/xrpc-server/-/xrpc-server-0.10.2.tgz#b68f42a7b6df5bb8081525e5c981a709b9b02739" resolved "https://registry.yarnpkg.com/@atproto/xrpc-server/-/xrpc-server-0.10.2.tgz#b68f42a7b6df5bb8081525e5c981a709b9b02739"
@@ -827,25 +763,6 @@
ws "^8.12.0" ws "^8.12.0"
zod "^3.23.8" zod "^3.23.8"
"@atproto/xrpc-server@^0.10.4", "@atproto/xrpc-server@^0.10.7":
version "0.10.7"
resolved "https://registry.yarnpkg.com/@atproto/xrpc-server/-/xrpc-server-0.10.7.tgz#d38400755d37c185d0e4d431e211e65728110625"
integrity sha512-7SWUeNeRIKGpg35b2OU4bkTr8CpgOHfEvyEfU3wuzfgeDgC3lxIhHB49O+8OxDipDSlVbHePziyoyHs3mFHnRA==
dependencies:
"@atproto/common" "^0.5.6"
"@atproto/crypto" "^0.4.5"
"@atproto/lex-cbor" "0.0.6"
"@atproto/lex-data" "0.0.6"
"@atproto/lexicon" "^0.6.0"
"@atproto/ws-client" "^0.0.4"
"@atproto/xrpc" "^0.7.7"
express "^4.17.2"
http-errors "^2.0.0"
mime-types "^2.1.35"
rate-limiter-flexible "^2.4.1"
ws "^8.12.0"
zod "^3.23.8"
"@atproto/xrpc@^0.7.6": "@atproto/xrpc@^0.7.6":
version "0.7.6" version "0.7.6"
resolved "https://registry.yarnpkg.com/@atproto/xrpc/-/xrpc-0.7.6.tgz#bc12b0e37f81fa76589691634d4fac9774fd0cb5" resolved "https://registry.yarnpkg.com/@atproto/xrpc/-/xrpc-0.7.6.tgz#bc12b0e37f81fa76589691634d4fac9774fd0cb5"