From 28543c285c5b840c372765b7e6fd3b3c11555d6b Mon Sep 17 00:00:00 2001 From: gibbyb Date: Wed, 30 Oct 2024 15:03:53 -0500 Subject: [PATCH] No more periodic api calls. all websockets --- app/(tabs)/index.tsx | 9 +- app/(tabs)/messages.tsx | 4 +- components/home/Countdown.tsx | 16 ++-- components/home/RelationshipView.tsx | 65 +++++++------- components/home/UserInfo.tsx | 2 - pnpm-lock.yaml | 122 +++++++++++++-------------- 6 files changed, 106 insertions(+), 112 deletions(-) diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index 0c3032f..648aa3c 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -13,10 +13,8 @@ const IndexScreen = () => { return ( - - - + ); }; @@ -25,10 +23,5 @@ export default IndexScreen; const styles = StyleSheet.create({ container: { flex: 1, - alignItems: 'center', - }, - footerContainer: { - flex: 1 / 3, - alignItems: 'center', }, }); diff --git a/app/(tabs)/messages.tsx b/app/(tabs)/messages.tsx index 086a0fc..a09867d 100644 --- a/app/(tabs)/messages.tsx +++ b/app/(tabs)/messages.tsx @@ -107,12 +107,12 @@ const MessagesScreen = () => { }); socket.on('connect', () => { console.log('Connected to WebSocket server'); - socket.emit('join', user.id); + socket.emit('join', { userId: user.id }); }); socket.on('connect_error', (error) => { console.error('Error connecting to WebSocket server:', error); }); - socket.on('message', async (newMessage) => { + socket.on('new_message', async (newMessage) => { const initialMessages = await getMessages(user.id, 20, 0); if (!initialMessages) return; const formattedMessages = formatMessages(initialMessages); diff --git a/components/home/Countdown.tsx b/components/home/Countdown.tsx index fe83ee4..ecc4ec4 100644 --- a/components/home/Countdown.tsx +++ b/components/home/Countdown.tsx @@ -24,7 +24,6 @@ const CountdownView = () => { const [isDateModalOpen, setIsDateModalOpen] = useState(false); const [user, setUser] = useState(null); const [relationship, setRelationship] = useState(null); - const [title, setTitle] = useState(''); useEffect(() => { const loadData = async () => { @@ -135,9 +134,9 @@ const CountdownView = () => { /> setIsDateModalOpen(true)} /> {user && countdown && ( @@ -171,13 +170,12 @@ const styles = StyleSheet.create({ }, innerContainer: { flex: 1, - justifyContent: 'center', alignItems: 'center', paddingHorizontal: 10, backgroundColor: 'transparent', }, title: { - fontSize: 32, + fontSize: 24, lineHeight: 32, fontWeight: '600', textAlign: 'center', @@ -187,17 +185,17 @@ const styles = StyleSheet.create({ flexDirection: 'row', justifyContent: 'space-around', alignItems: 'center', - width: '100%', + width: '90%', backgroundColor: 'transparent', - marginVertical: 20, + marginVertical: 10, }, countdownItem: { alignItems: 'center', - marginHorizontal: 10, + marginHorizontal: 5, backgroundColor: 'transparent', }, countdownValue: { - fontSize: 32, + fontSize: 28, lineHeight: 42, fontWeight: 'bold', }, diff --git a/components/home/RelationshipView.tsx b/components/home/RelationshipView.tsx index 2d760a7..5295d05 100644 --- a/components/home/RelationshipView.tsx +++ b/components/home/RelationshipView.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState } from 'react'; +import { io } from 'socket.io-client'; import { Image, StyleSheet, AppState } from 'react-native'; import { ThemedText, ThemedView } from '@/components/theme/Theme'; import { getUser, getRelationship, getPartner, saveRelationshipData } from '@/components/services/SecureStore'; @@ -7,8 +8,6 @@ import TextButton from '@/components/theme/buttons/TextButton'; import { checkRelationshipStatus, updateRelationshipStatus } from '@/constants/APIs'; import type { User, Relationship, RelationshipData } from '@/constants/Types'; -const CHECK_TIME = 2; // In minutes - type RelationshipProps = { pfpUrl: string | null; }; @@ -16,12 +15,12 @@ type RelationshipProps = { const RelationshipView: React.FC = ({ pfpUrl }) => { const [status, setStatus] = useState(null); const [user, setUser] = useState(null); + const [relationship, setRelationship] = useState(null); const [showRequestRelationship, setShowRequestRelationship] = useState(false); const [loading, setLoading] = useState(true); useEffect(() => { fetchRelationshipStatus(); - setUpPeriodicCheck(); }, []); useEffect(() => { @@ -31,35 +30,35 @@ const RelationshipView: React.FC = ({ pfpUrl }) => { } }, [pfpUrl]); + useEffect(() => { + if (!user || !relationship) { + console.log('User or relationship not found'); + return; + } + const socket = io(process.env.EXPO_PUBLIC_WEBSOCKET_URL as string, { + transports: ['websocket'], + }); + socket.on('connect', () => { + console.log('Connected to WebSocket server'); + socket.emit('join', { relationshipId: relationship.id }); + }); + socket.on('connect_error', (error) => { + console.error('Error connecting to WebSocket server:', error); + }); + socket.on('relationship_status_change', async (relationshipStatus) => { + handleCheckRelationshipStatus(); + }); + return () => { + socket.disconnect(); + }; + }, [relationship]); + + const handleRequestSent = (relationshipData: RelationshipData) => { setStatus(relationshipData); setShowRequestRelationship(false); }; - const setUpPeriodicCheck = () => { - let intervalId: NodeJS.Timeout | null = null; - const startChecking = () => { - handleCheckRelationshipStatus(); - intervalId = setInterval(handleCheckRelationshipStatus, 60000*CHECK_TIME); - }; - const stopChecking = () => { - if (intervalId) { - clearInterval(intervalId); - intervalId = null; - } - }; - const handleAppStateChange = (nextAppState: string) => { - if (nextAppState === 'active') startChecking(); - else stopChecking(); - }; - const subscription = AppState.addEventListener('change', handleAppStateChange); - if (AppState.currentState === 'active') startChecking(); - return () => { - stopChecking(); - subscription.remove(); - }; - }; - const fetchRelationshipStatus = async () => { setLoading(true); try { @@ -67,6 +66,7 @@ const RelationshipView: React.FC = ({ pfpUrl }) => { if (!userFromStore) throw new Error('User not found in store.'); setUser(userFromStore); const relationshipFromStore: Relationship = await getRelationship() as Relationship; + setRelationship(relationshipFromStore); const partnerFromStore: User = await getPartner() as User; if (!relationshipFromStore || !partnerFromStore) throw new Error('Relationship not found in store.'); @@ -105,7 +105,7 @@ const RelationshipView: React.FC = ({ pfpUrl }) => { try { if (newStatus === 'accepted') { const updatedRelationshipData: RelationshipData = - await updateRelationshipStatus(user.id, newStatus); + await updateRelationshipStatus(user.id, newStatus) as RelationshipData; setStatus(updatedRelationshipData); await saveRelationshipData(updatedRelationshipData); } else { @@ -243,6 +243,12 @@ const RelationshipView: React.FC = ({ pfpUrl }) => { )} + handleRejectRequest()} + /> ); } @@ -260,7 +266,6 @@ const styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', - justifyContent: 'center', }, title: { fontSize: 24, @@ -271,7 +276,6 @@ const styles = StyleSheet.create({ flexDirection: 'row', justifyContent: 'center', alignItems: 'center', - marginTop: 20, }, profileWrapper: { alignItems: 'center', @@ -292,6 +296,7 @@ const styles = StyleSheet.create({ marginBottom: 10, }, buttonContainer: { + alignItems: 'center', justifyContent: 'space-around', width: '100%', marginTop: 20, diff --git a/components/home/UserInfo.tsx b/components/home/UserInfo.tsx index 0493ba0..3eb9454 100644 --- a/components/home/UserInfo.tsx +++ b/components/home/UserInfo.tsx @@ -97,7 +97,6 @@ const styles = StyleSheet.create({ profileContainer: { alignItems: 'center', marginTop: 20, - marginBottom: 20, }, profilePicture: { width: 100, @@ -112,6 +111,5 @@ const styles = StyleSheet.create({ }, email: { fontSize: 16, - marginBottom: 20, }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e7ba63..e2a1350 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,10 +134,10 @@ importers: version: 18.3.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.8.2) + version: 29.7.0(@types/node@22.8.4) jest-expo: specifier: ~51.0.4 - version: 51.0.4(@babel/core@7.26.0)(jest@29.7.0(@types/node@22.8.2))(react@18.2.0) + version: 51.0.4(@babel/core@7.26.0)(jest@29.7.0(@types/node@22.8.4))(react@18.2.0) react-test-renderer: specifier: 18.2.0 version: 18.2.0(react@18.2.0) @@ -1482,17 +1482,17 @@ packages: '@types/lodash.isequal@4.5.8': resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==} - '@types/lodash@4.17.12': - resolution: {integrity: sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==} + '@types/lodash@4.17.13': + resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - '@types/node@18.19.60': - resolution: {integrity: sha512-cYRj7igVqgxhlHFdBHHpU2SNw3+dN2x0VTZJtLYk6y/ieuGN4XiBgtDjYVktM/yk2y/8pKMileNc6IoEzEJnUw==} + '@types/node@18.19.61': + resolution: {integrity: sha512-z8fH66NcVkDzBItOao+Nyh0fiy7CYdxIyxnNCcZ60aY0I+EA/y4TSi/S/W9i8DIQvwVo7a0pgzAxmDeNnqrpkw==} - '@types/node@22.8.2': - resolution: {integrity: sha512-NzaRNFV+FZkvK/KLCsNdTvID0SThyrs5SHB6tsD/lajr22FGC73N2QeDPM2wHtVde8mgcXuSsHQkH5cX1pbPLw==} + '@types/node@22.8.4': + resolution: {integrity: sha512-SpNNxkftTJOPk0oN+y2bIqurEXHTA2AOZ3EJDDKeJ5VzkvvORSvmQXGQarcOzWV1ac7DCaPBEdMDxBsM+d8jWw==} '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} @@ -1861,8 +1861,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001674: - resolution: {integrity: sha512-jOsKlZVRnzfhLojb+Ykb+gyUSp9Xb57So+fAiFlLzzTKpqg8xxSav0e40c8/4F/v9N8QSvrRRaLeVzQbLqomYw==} + caniuse-lite@1.0.30001675: + resolution: {integrity: sha512-/wV1bQwPrkLiQMjaJF5yUMVM/VdRPOCU8QZ+PmG6uW6DvYSrNY1bpwHI/3mOcUosLaJCzYDi5o91IQB51ft6cg==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -2017,8 +2017,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.2.1: - resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} cookie@0.6.0: @@ -2590,8 +2590,8 @@ packages: flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} - flow-parser@0.250.0: - resolution: {integrity: sha512-8mkLh/CotlvqA9vCyQMbhJoPx2upEg9oKxARAayz8zQ58wCdABnTZy6U4xhMHvHvbTUFgZQk4uH2cglOCOel5A==} + flow-parser@0.251.0: + resolution: {integrity: sha512-iEGv3JbQ9jRXdhkijpluoltiLzmG9upZH58sCx3Qr4s437PvRp/8ntNNMoUaXehXizzoHB8mAwzA6jkRv8cQng==} engines: {node: '>=0.4.0'} fontfaceobserver@2.3.0: @@ -6451,7 +6451,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -6464,14 +6464,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.8.2) + jest-config: 29.7.0(@types/node@22.8.4) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -6500,7 +6500,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -6518,7 +6518,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.8.2 + '@types/node': 22.8.4 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6540,7 +6540,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.8.2 + '@types/node': 22.8.4 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -6615,7 +6615,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.8.2 + '@types/node': 22.8.4 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -6624,7 +6624,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.8.2 + '@types/node': 22.8.4 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -7074,7 +7074,7 @@ snapshots: '@remix-run/server-runtime': 2.13.1(typescript@5.3.3) '@remix-run/web-fetch': 4.4.2 '@web3-storage/multipart-parser': 1.0.0 - cookie-signature: 1.2.1 + cookie-signature: 1.2.2 source-map-support: 0.5.21 stream-slice: 0.1.2 undici: 6.20.1 @@ -7125,7 +7125,7 @@ snapshots: '@rnx-kit/chromium-edge-launcher@1.0.0': dependencies: - '@types/node': 18.19.60 + '@types/node': 18.19.61 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -7199,7 +7199,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.8.2 + '@types/node': 22.8.4 '@types/hammerjs@2.0.46': {} @@ -7230,7 +7230,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 22.8.2 + '@types/node': 22.8.4 '@types/tough-cookie': 4.0.5 parse5: 7.2.1 @@ -7238,23 +7238,23 @@ snapshots: '@types/lodash.debounce@4.0.9': dependencies: - '@types/lodash': 4.17.12 + '@types/lodash': 4.17.13 '@types/lodash.isequal@4.5.8': dependencies: - '@types/lodash': 4.17.12 + '@types/lodash': 4.17.13 - '@types/lodash@4.17.12': {} + '@types/lodash@4.17.13': {} '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.8.2 + '@types/node': 22.8.4 - '@types/node@18.19.60': + '@types/node@18.19.61': dependencies: undici-types: 5.26.5 - '@types/node@22.8.2': + '@types/node@22.8.4': dependencies: undici-types: 6.19.8 @@ -7619,7 +7619,7 @@ snapshots: browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001674 + caniuse-lite: 1.0.30001675 electron-to-chromium: 1.5.49 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) @@ -7687,7 +7687,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001674: {} + caniuse-lite@1.0.30001675: {} chalk@2.4.2: dependencies: @@ -7715,7 +7715,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 22.8.2 + '@types/node': 22.8.4 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -7837,7 +7837,7 @@ snapshots: convert-source-map@2.0.0: {} - cookie-signature@1.2.1: {} + cookie-signature@1.2.2: {} cookie@0.6.0: {} @@ -7854,13 +7854,13 @@ snapshots: js-yaml: 3.14.1 parse-json: 4.0.0 - create-jest@29.7.0(@types/node@22.8.2): + create-jest@29.7.0(@types/node@22.8.4): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.8.2) + jest-config: 29.7.0(@types/node@22.8.4) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -8505,7 +8505,7 @@ snapshots: flow-enums-runtime@0.0.6: {} - flow-parser@0.250.0: {} + flow-parser@0.251.0: {} fontfaceobserver@2.3.0: {} @@ -9008,7 +9008,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -9028,16 +9028,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.8.2): + jest-cli@29.7.0(@types/node@22.8.4): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.8.2) + create-jest: 29.7.0(@types/node@22.8.4) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.8.2) + jest-config: 29.7.0(@types/node@22.8.4) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -9047,7 +9047,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.8.2): + jest-config@29.7.0(@types/node@22.8.4): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 @@ -9072,7 +9072,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.8.2 + '@types/node': 22.8.4 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -9102,7 +9102,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 22.8.2 + '@types/node': 22.8.4 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -9116,11 +9116,11 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 jest-mock: 29.7.0 jest-util: 29.7.0 - jest-expo@51.0.4(@babel/core@7.26.0)(jest@29.7.0(@types/node@22.8.2))(react@18.2.0): + jest-expo@51.0.4(@babel/core@7.26.0)(jest@29.7.0(@types/node@22.8.4))(react@18.2.0): dependencies: '@expo/config': 9.0.4 '@expo/json-file': 8.3.3 @@ -9129,7 +9129,7 @@ snapshots: find-up: 5.0.0 jest-environment-jsdom: 29.7.0 jest-watch-select-projects: 2.0.0 - jest-watch-typeahead: 2.2.1(jest@29.7.0(@types/node@22.8.2)) + jest-watch-typeahead: 2.2.1(jest@29.7.0(@types/node@22.8.4)) json5: 2.2.3 lodash: 4.17.21 react-test-renderer: 18.2.0(react@18.2.0) @@ -9149,7 +9149,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.8.2 + '@types/node': 22.8.4 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -9188,7 +9188,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -9223,7 +9223,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -9251,7 +9251,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 chalk: 4.1.2 cjs-module-lexer: 1.4.1 collect-v8-coverage: 1.0.2 @@ -9297,7 +9297,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -9318,11 +9318,11 @@ snapshots: chalk: 3.0.0 prompts: 2.4.2 - jest-watch-typeahead@2.2.1(jest@29.7.0(@types/node@22.8.2)): + jest-watch-typeahead@2.2.1(jest@29.7.0(@types/node@22.8.4)): dependencies: ansi-escapes: 6.2.1 chalk: 4.1.2 - jest: 29.7.0(@types/node@22.8.2) + jest: 29.7.0(@types/node@22.8.4) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -9333,7 +9333,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.2 + '@types/node': 22.8.4 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -9342,17 +9342,17 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.8.2 + '@types/node': 22.8.4 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.8.2): + jest@29.7.0(@types/node@22.8.4): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.8.2) + jest-cli: 29.7.0(@types/node@22.8.4) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -9400,7 +9400,7 @@ snapshots: '@babel/register': 7.25.9(@babel/core@7.26.0) babel-core: 7.0.0-bridge.0(@babel/core@7.26.0) chalk: 4.1.2 - flow-parser: 0.250.0 + flow-parser: 0.251.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2