diff --git a/README.md b/README.md
index a21765e6..5d1b8bee 100644
--- a/README.md
+++ b/README.md
@@ -276,7 +276,29 @@ const Example = (props) => {
const [token, setToken] = useState("");
const twilioRef = useRef(null);
- const _onConnectButtonPress = () => {
+ const _createTracks = async () => {
+ try {
+ // Create audio track
+ await twilioRef.current.createLocalAudioTrack({
+ trackName: 'microphone',
+ enabled: isAudioEnabled
+ });
+
+ // Create video track
+ await twilioRef.current.createLocalVideoTrack({
+ trackName: 'camera',
+ enabled: isVideoEnabled,
+ cameraType: 'front'
+ });
+ } catch (error) {
+ console.error('Error creating tracks:', error);
+ }
+ };
+
+ const _onConnectButtonPress = async () => {
+ // Create tracks before connecting
+ await _createTracks();
+
twilioRef.current.connect({ accessToken: token });
setStatus("connecting");
};
@@ -287,17 +309,21 @@ const Example = (props) => {
const _onMuteButtonPress = () => {
twilioRef.current
- .setLocalAudioEnabled(!isAudioEnabled)
- .then((isEnabled) => setIsAudioEnabled(isEnabled));
+ .enableLocalTrack('microphone', !isAudioEnabled)
+ .then(() => setIsAudioEnabled(!isAudioEnabled));
};
const _onFlipButtonPress = () => {
twilioRef.current.flipCamera();
};
- const _onRoomDidConnect = ({ roomName, error }) => {
+ const _onRoomDidConnect = async ({ roomName, error }) => {
console.log("onRoomDidConnect: ", roomName);
+ // Publish tracks after connecting
+ await twilioRef.current.publishLocalAudioTrack('microphone');
+ await twilioRef.current.publishLocalVideoTrack('camera');
+
setStatus("connected");
};
@@ -389,7 +415,7 @@ const Example = (props) => {
>
Flip
-
+
)}
@@ -463,3 +489,250 @@ For any questions regarding licensing or to request additional permissions, plea
+
+## Multiple Track Support
+
+This library supports multiple audio and video tracks, similar to the Twilio Video JS SDK. This allows you to publish multiple audio/video tracks simultaneously, which is useful for scenarios like:
+
+- Screen sharing alongside camera video
+- Multiple camera feeds (front/back camera)
+- Multiple audio sources (microphone, system audio, etc.)
+- More complex video conferencing scenarios
+
+### API Methods
+
+#### Track Creation
+```javascript
+// Create a local audio track
+const audioTrackName = await twilioVideo.createLocalAudioTrack({
+ trackName: 'microphone',
+ enabled: true
+});
+
+// Create a local video track
+const videoTrackName = await twilioVideo.createLocalVideoTrack({
+ trackName: 'camera',
+ enabled: true,
+ cameraType: 'front' // or 'back'
+});
+```
+
+#### Track Publishing
+```javascript
+// Publish a specific track
+await twilioVideo.publishLocalAudioTrack('microphone');
+await twilioVideo.publishLocalVideoTrack('camera');
+
+// Unpublish a specific track
+await twilioVideo.unpublishLocalAudioTrack('microphone');
+await twilioVideo.unpublishLocalVideoTrack('camera');
+```
+
+#### Track Management
+```javascript
+// Enable/disable a specific track
+await twilioVideo.enableLocalTrack('microphone', false); // mute audio
+await twilioVideo.enableLocalTrack('camera', true); // enable video
+
+// Get all local tracks
+const tracks = await twilioVideo.getLocalTracks();
+// Returns: [{ trackName: 'microphone', enabled: true, type: 'audio' }, { trackName: 'camera', enabled: true, type: 'video' }]
+
+// Destroy a track
+await twilioVideo.destroyLocalTrack('microphone');
+```
+
+### New Events
+
+The library emits additional events for track lifecycle management:
+
+```javascript
+ {
+ console.log('Audio track created:', trackName);
+ }}
+ onVideoTrackCreated={({ trackName, trackSid, enabled }) => {
+ console.log('Video track created:', trackName);
+ }}
+ onTrackCreationError={({ error }) => {
+ console.error('Track creation failed:', error);
+ }}
+ onTrackPublishError={({ error }) => {
+ console.error('Track publish failed:', error);
+ }}
+ onTrackUnpublishError={({ error }) => {
+ console.error('Track unpublish failed:', error);
+ }}
+ onLocalTracksReceived={({ tracks }) => {
+ console.log('Local tracks:', tracks);
+ }}
+ // ... other props
+/>
+```
+
+### Local Video View with Track Names
+
+The `TwilioVideoLocalView` supports an optional `trackName` prop to display a specific track:
+
+```javascript
+{/* Display specific track */}
+
+
+{/* Display another track */}
+
+```
+
+### Example Usage
+
+Here's a complete example showing how to use multiple tracks:
+
+```javascript
+import React, { useState, useEffect } from 'react';
+import { View, Button } from 'react-native';
+import { TwilioVideo, TwilioVideoLocalView, TwilioVideoParticipantView } from 'react-native-twilio-video-webrtc';
+
+const MultiTrackExample = () => {
+ const [twilioRef, setTwilioRef] = useState(null);
+ const [tracks, setTracks] = useState([]);
+
+ const createTracks = async () => {
+ try {
+ // Create audio track
+ await twilioRef.createLocalAudioTrack({
+ trackName: 'microphone',
+ enabled: true
+ });
+
+ // Create video track
+ await twilioRef.createLocalVideoTrack({
+ trackName: 'camera',
+ enabled: true,
+ cameraType: 'front'
+ });
+
+ // Get all tracks
+ const allTracks = await twilioRef.getLocalTracks();
+ setTracks(allTracks);
+ } catch (error) {
+ console.error('Error creating tracks:', error);
+ }
+ };
+
+ const connectToRoom = async () => {
+ try {
+ // Create tracks before connecting
+ await createTracks();
+
+ // Connect to room
+ twilioRef.connect({
+ roomName: 'my-room',
+ accessToken: 'your-access-token',
+ enableAudio: true,
+ enableVideo: true
+ });
+ } catch (error) {
+ console.error('Error connecting:', error);
+ }
+ };
+
+ const publishTracks = async () => {
+ try {
+ await twilioRef.publishLocalAudioTrack('microphone');
+ await twilioRef.publishLocalVideoTrack('camera');
+ } catch (error) {
+ console.error('Error publishing tracks:', error);
+ }
+ };
+
+ const toggleAudio = async () => {
+ try {
+ const currentTrack = tracks.find(t => t.trackName === 'microphone');
+ if (currentTrack) {
+ await twilioRef.enableLocalTrack('microphone', !currentTrack.enabled);
+ }
+ } catch (error) {
+ console.error('Error toggling audio:', error);
+ }
+ };
+
+ return (
+
+ setTwilioRef(ref)}
+ onRoomDidConnect={() => {
+ console.log('Connected to room');
+ publishTracks();
+ }}
+ onAudioTrackCreated={({ trackName }) => {
+ console.log('Audio track created:', trackName);
+ }}
+ onVideoTrackCreated={({ trackName }) => {
+ console.log('Video track created:', trackName);
+ }}
+ // ... other props
+ />
+
+ {/* Display video track */}
+
+
+
+
+
+ );
+};
+
+export default MultiTrackExample;
+```
+
+### Important Notes
+
+- **No automatic track creation**: You must explicitly create all tracks using `createLocalAudioTrack()` and `createLocalVideoTrack()` before connecting to a room
+- **Track management**: Use `enableLocalTrack(trackName, enabled)` to enable/disable specific tracks
+- **Explicit track names**: All track operations require specifying the exact track name you want to work with
+- **Lifecycle management**: Remember to call `destroyLocalTrack()` for tracks you no longer need
+
+### TypeScript Support
+
+The library includes full TypeScript definitions for the multiple track APIs:
+
+```typescript
+interface LocalTrackConfig {
+ trackName: string;
+ enabled?: boolean;
+}
+
+interface LocalVideoTrackConfig extends LocalTrackConfig {
+ cameraType?: 'front' | 'back';
+}
+
+interface LocalAudioTrackConfig extends LocalTrackConfig {
+ // Audio-specific configs can be added here
+}
+
+interface TrackPublication {
+ trackSid: string;
+ trackName: string;
+ enabled: boolean;
+}
+```
+
+### Platform Support
+
+- ✅ Android: Fully implemented
+- ⚠️ iOS: Implementation in progress (some features may not be fully functional yet)
+
+For more complex scenarios, you can now:
+- Create multiple tracks of the same type
+- Publish/unpublish tracks independently
+- Enable/disable tracks without affecting others
+- Get detailed information about all active tracks
diff --git a/android/src/main/java/com/twiliorn/library/CustomTwilioVideoView.java b/android/src/main/java/com/twiliorn/library/CustomTwilioVideoView.java
index 9904eb8a..413cbdc2 100644
--- a/android/src/main/java/com/twiliorn/library/CustomTwilioVideoView.java
+++ b/android/src/main/java/com/twiliorn/library/CustomTwilioVideoView.java
@@ -88,6 +88,7 @@
import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
import java.util.List;
+import java.util.ArrayList;
import static com.twiliorn.library.CustomTwilioVideoView.Events.ON_AUDIO_CHANGED;
import static com.twiliorn.library.CustomTwilioVideoView.Events.ON_CAMERA_SWITCHED;
@@ -120,14 +121,20 @@ public class CustomTwilioVideoView extends View implements LifecycleEventListene
private static final String BACK_CAMERA_TYPE = "back";
private boolean enableRemoteAudio = false;
private boolean enableNetworkQualityReporting = false;
- private boolean isVideoEnabled = false;
private boolean dominantSpeakerEnabled = false;
private static String frontFacingDevice;
private static String backFacingDevice;
private boolean maintainVideoTrackInBackground = false;
- private String cameraType = "";
private boolean enableH264Codec = false;
+ // Multiple track support - collections for managing multiple tracks
+ private Map localVideoTracks = new HashMap<>();
+ private Map localAudioTracks = new HashMap<>();
+ private Map cameraCapturers = new HashMap<>();
+
+ // Legacy single track properties for backward compatibility
+ private LocalDataTrack localDataTrack;
+
@Retention(RetentionPolicy.SOURCE)
@StringDef({Events.ON_CAMERA_SWITCHED,
Events.ON_VIDEO_CHANGED,
@@ -199,10 +206,7 @@ public class CustomTwilioVideoView extends View implements LifecycleEventListene
* to an associated view.
*/
private static PatchedVideoView thumbnailVideoView;
- private static LocalVideoTrack localVideoTrack;
- private static CameraCapturer cameraCapturer;
- private LocalAudioTrack localAudioTrack;
private AudioManager audioManager;
private int previousAudioMode;
private boolean disconnectedFromOnDestroy;
@@ -214,12 +218,6 @@ public class CustomTwilioVideoView extends View implements LifecycleEventListene
new HandlerThread(DATA_TRACK_MESSAGE_THREAD_NAME);
private Handler dataTrackMessageThreadHandler;
- private LocalDataTrack localDataTrack;
-
- // Map used to map remote data tracks to remote participants
- private final Map dataTrackRemoteParticipantMap =
- new HashMap<>();
-
public CustomTwilioVideoView(ThemedReactContext context) {
super(context);
this.themedReactContext = context;
@@ -297,40 +295,7 @@ private void buildDeviceInfo() {
}
private boolean createLocalVideo(boolean enableVideo, String cameraType) {
- isVideoEnabled = enableVideo;
-
- // Share your camera
- buildDeviceInfo();
-
- if (cameraType.equals(CustomTwilioVideoView.FRONT_CAMERA_TYPE)) {
- if (frontFacingDevice != null) {
- cameraCapturer = this.createCameraCaputer(getContext(), frontFacingDevice);
- } else {
- // IF the camera is unavailable try the other camera
- cameraCapturer = this.createCameraCaputer(getContext(), backFacingDevice);
- }
- } else {
- if (backFacingDevice != null) {
- cameraCapturer = this.createCameraCaputer(getContext(), backFacingDevice);
- } else {
- // IF the camera is unavailable try the other camera
- cameraCapturer = this.createCameraCaputer(getContext(), frontFacingDevice);
- }
- }
-
- // If no camera is available let the caller know
- if (cameraCapturer == null) {
- WritableMap event = new WritableNativeMap();
- event.putString("error", "No camera is supported on this device");
- pushEvent(CustomTwilioVideoView.this, ON_CONNECT_FAILURE, event);
- return false;
- }
-
- localVideoTrack = LocalVideoTrack.create(getContext(), enableVideo, cameraCapturer, buildVideoFormat());
- if (thumbnailVideoView != null && localVideoTrack != null) {
- localVideoTrack.addSink(thumbnailVideoView);
- }
- setThumbnailMirror();
+ // Remove legacy video creation - will be handled by multiple track methods
return true;
}
@@ -344,51 +309,60 @@ public void onHostResume() {
*/
if (themedReactContext.getCurrentActivity() != null) {
/*
- * If the local video track was released when the app was put in the background, recreate.
+ * Resume all video tracks that were paused
*/
- if (cameraCapturer != null && localVideoTrack == null) {
- localVideoTrack = LocalVideoTrack.create(getContext(), isVideoEnabled, cameraCapturer, buildVideoFormat());
- }
-
- if (localVideoTrack != null) {
- if (thumbnailVideoView != null) {
- localVideoTrack.addSink(thumbnailVideoView);
- }
+ for (Map.Entry entry : localVideoTracks.entrySet()) {
+ LocalVideoTrack videoTrack = entry.getValue();
+ if (videoTrack != null) {
+ if (thumbnailVideoView != null) {
+ videoTrack.addSink(thumbnailVideoView);
+ }
- /*
- * If connected to a Room then share the local video track.
- */
- if (localParticipant != null) {
- localParticipant.publishTrack(localVideoTrack);
+ /*
+ * If connected to a Room then share the local video track.
+ */
+ if (localParticipant != null) {
+ localParticipant.publishTrack(videoTrack);
+ }
}
}
if (room != null) {
themedReactContext.getCurrentActivity().setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
}
-
-
}
}
@Override
public void onHostPause() {
/*
- * Release the local video track before going in the background. This ensures that the
- * camera can be used by other applications while this app is in the background.
+ * Release video tracks before going in the background if not maintaining them
*/
- if (localVideoTrack != null && !maintainVideoTrackInBackground) {
- /*
- * If this local video track is being shared in a Room, remove from local
- * participant before releasing the video track. Participants will be notified that
- * the track has been removed.
- */
- if (localParticipant != null) {
- localParticipant.unpublishTrack(localVideoTrack);
+ if (!maintainVideoTrackInBackground) {
+ for (Map.Entry entry : localVideoTracks.entrySet()) {
+ LocalVideoTrack videoTrack = entry.getValue();
+ if (videoTrack != null) {
+ /*
+ * If this local video track is being shared in a Room, remove from local
+ * participant before releasing the video track.
+ */
+ if (localParticipant != null) {
+ localParticipant.unpublishTrack(videoTrack);
+ }
+
+ videoTrack.release();
+ }
}
+ localVideoTracks.clear();
- localVideoTrack.release();
- localVideoTrack = null;
+ // Stop camera capturers
+ for (Map.Entry entry : cameraCapturers.entrySet()) {
+ CameraCapturer capturer = entry.getValue();
+ if (capturer != null) {
+ capturer.stopCapture();
+ }
+ }
+ cameraCapturers.clear();
}
}
@@ -410,31 +384,44 @@ public void onHostDestroy() {
}
/*
- * Release the local media ensuring any memory allocated to audio or video is freed.
+ * Release all local tracks
*/
- if (localVideoTrack != null) {
- localVideoTrack.release();
- localVideoTrack = null;
+ for (Map.Entry entry : localVideoTracks.entrySet()) {
+ LocalVideoTrack videoTrack = entry.getValue();
+ if (videoTrack != null) {
+ videoTrack.release();
+ }
}
+ localVideoTracks.clear();
- if (localAudioTrack != null) {
- localAudioTrack.release();
- audioManager.stopBluetoothSco();
- localAudioTrack = null;
+ for (Map.Entry entry : localAudioTracks.entrySet()) {
+ LocalAudioTrack audioTrack = entry.getValue();
+ if (audioTrack != null) {
+ audioTrack.release();
+ }
}
+ localAudioTracks.clear();
+
+ // Stop camera capturers
+ for (Map.Entry entry : cameraCapturers.entrySet()) {
+ CameraCapturer capturer = entry.getValue();
+ if (capturer != null) {
+ capturer.stopCapture();
+ }
+ }
+ cameraCapturers.clear();
// Quit the data track message thread
dataTrackMessageThread.quit();
-
-
}
public void releaseResource() {
themedReactContext.removeLifecycleEventListener(this);
room = null;
- localVideoTrack = null;
+ localVideoTracks.clear();
+ localAudioTracks.clear();
+ cameraCapturers.clear();
thumbnailVideoView = null;
- cameraCapturer = null;
}
// ====== CONNECTING ===========================================================================
@@ -457,23 +444,9 @@ public void connectToRoomWrapper(
this.enableNetworkQualityReporting = enableNetworkQualityReporting;
this.dominantSpeakerEnabled = dominantSpeakerEnabled;
this.maintainVideoTrackInBackground = maintainVideoTrackInBackground;
- this.cameraType = cameraType;
this.enableH264Codec = enableH264Codec;
- // Share your microphone
- localAudioTrack = LocalAudioTrack.create(getContext(), enableAudio);
-
- if (cameraCapturer == null && enableVideo) {
- boolean createVideoStatus = createLocalVideo(enableVideo, cameraType);
- if (!createVideoStatus) {
- Log.d("RNTwilioVideo", "Failed to create local video");
- // No need to connect to room if video creation failed
- return;
- }
- } else {
- isVideoEnabled = false;
- }
-
+ // No automatic track creation - users must create tracks explicitly
setAudioFocus(enableAudio);
connectToRoom();
}
@@ -488,15 +461,27 @@ public void connectToRoom() {
connectOptionsBuilder.roomName(this.roomName);
}
- if (localAudioTrack != null) {
- connectOptionsBuilder.audioTracks(Collections.singletonList(localAudioTrack));
+ // Add all audio tracks
+ List audioTracks = new ArrayList<>();
+ for (LocalAudioTrack audioTrack : localAudioTracks.values()) {
+ if (audioTrack != null) {
+ audioTracks.add(audioTrack);
+ }
}
-
- if (localVideoTrack != null) {
- connectOptionsBuilder.videoTracks(Collections.singletonList(localVideoTrack));
+ if (!audioTracks.isEmpty()) {
+ connectOptionsBuilder.audioTracks(audioTracks);
}
- //LocalDataTrack localDataTrack = LocalDataTrack.create(getContext());
+ // Add all video tracks
+ List videoTracks = new ArrayList<>();
+ for (LocalVideoTrack videoTrack : localVideoTracks.values()) {
+ if (videoTrack != null) {
+ videoTracks.add(videoTrack);
+ }
+ }
+ if (!videoTracks.isEmpty()) {
+ connectOptionsBuilder.videoTracks(videoTracks);
+ }
if (localDataTrack != null) {
connectOptionsBuilder.dataTracks(Collections.singletonList(localDataTrack));
@@ -681,48 +666,33 @@ private static boolean isCurrentCameraSourceBackFacing() {
}
// ===== BUTTON LISTENERS ======================================================================
- private static void setThumbnailMirror() {
- if (cameraCapturer != null) {
- final boolean isBackCamera = isCurrentCameraSourceBackFacing();
- if (thumbnailVideoView != null && thumbnailVideoView.getVisibility() == View.VISIBLE) {
- thumbnailVideoView.setMirror(!isBackCamera);
- }
- }
- }
public void switchCamera() {
- if (cameraCapturer != null) {
- final boolean isBackCamera = isCurrentCameraSourceBackFacing();
- if (frontFacingDevice != null && (isBackCamera || backFacingDevice == null)) {
- cameraCapturer.switchCamera(frontFacingDevice);
- cameraType = CustomTwilioVideoView.FRONT_CAMERA_TYPE;
- } else {
- cameraCapturer.switchCamera(backFacingDevice);
- cameraType = CustomTwilioVideoView.BACK_CAMERA_TYPE;
+ // Switch all camera capturers
+ for (Map.Entry entry : cameraCapturers.entrySet()) {
+ CameraCapturer capturer = entry.getValue();
+ if (capturer != null) {
+ final boolean isBackCamera = capturer.getCameraId().equals(backFacingDevice);
+ if (frontFacingDevice != null && (isBackCamera || backFacingDevice == null)) {
+ capturer.switchCamera(frontFacingDevice);
+ } else {
+ capturer.switchCamera(backFacingDevice);
+ }
}
}
}
public void toggleVideo(boolean enabled) {
- isVideoEnabled = enabled;
-
- if (cameraCapturer == null && enabled) {
- String fallbackCameraType = cameraType == null ? CustomTwilioVideoView.FRONT_CAMERA_TYPE : cameraType;
- boolean createVideoStatus = createLocalVideo(true, fallbackCameraType);
- if (!createVideoStatus) {
- Log.d("RNTwilioVideo", "Failed to create local video");
- return;
+ // Toggle all video tracks
+ for (LocalVideoTrack videoTrack : localVideoTracks.values()) {
+ if (videoTrack != null) {
+ videoTrack.enable(enabled);
}
}
- if (localVideoTrack != null) {
- localVideoTrack.enable(enabled);
- publishLocalVideo(enabled);
-
- WritableMap event = new WritableNativeMap();
- event.putBoolean("videoEnabled", enabled);
- pushEvent(CustomTwilioVideoView.this, ON_VIDEO_CHANGED, event);
- }
+ WritableMap event = new WritableNativeMap();
+ event.putBoolean("videoEnabled", enabled);
+ pushEvent(CustomTwilioVideoView.this, ON_VIDEO_CHANGED, event);
}
public void toggleSoundSetup(boolean speaker) {
@@ -735,13 +705,16 @@ public void toggleSoundSetup(boolean speaker) {
}
public void toggleAudio(boolean enabled) {
- if (localAudioTrack != null) {
- localAudioTrack.enable(enabled);
-
- WritableMap event = new WritableNativeMap();
- event.putBoolean("audioEnabled", enabled);
- pushEvent(CustomTwilioVideoView.this, ON_AUDIO_CHANGED, event);
+ // Toggle all audio tracks
+ for (LocalAudioTrack audioTrack : localAudioTracks.values()) {
+ if (audioTrack != null) {
+ audioTrack.enable(enabled);
+ }
}
+
+ WritableMap event = new WritableNativeMap();
+ event.putBoolean("audioEnabled", enabled);
+ pushEvent(CustomTwilioVideoView.this, ON_AUDIO_CHANGED, event);
}
public void toggleBluetoothHeadset(boolean enabled) {
@@ -781,26 +754,195 @@ public void setRemoteAudioPlayback(String participant, boolean enabled) {
}
}
- public void publishLocalVideo(boolean enabled) {
- if (localParticipant != null && localVideoTrack != null) {
- if (enabled) {
- localParticipant.publishTrack(localVideoTrack);
+ // New methods for multiple track support
+ public void createLocalAudioTrack(String trackName, boolean enabled) {
+ if (localAudioTracks.containsKey(trackName)) {
+ WritableMap event = new WritableNativeMap();
+ event.putString("error", "Audio track with name " + trackName + " already exists");
+ pushEvent(this, "onTrackCreationError", event);
+ return;
+ }
+
+ LocalAudioTrack audioTrack = LocalAudioTrack.create(getContext(), enabled, trackName);
+ if (audioTrack != null) {
+ localAudioTracks.put(trackName, audioTrack);
+
+ WritableMap event = new WritableNativeMap();
+ event.putString("trackName", trackName);
+ event.putString("trackSid", audioTrack.getSid());
+ event.putBoolean("enabled", enabled);
+ pushEvent(this, "onAudioTrackCreated", event);
+ }
+ }
+
+ public void createLocalVideoTrack(String trackName, boolean enabled, String cameraType) {
+ if (localVideoTracks.containsKey(trackName)) {
+ WritableMap event = new WritableNativeMap();
+ event.putString("error", "Video track with name " + trackName + " already exists");
+ pushEvent(this, "onTrackCreationError", event);
+ return;
+ }
+
+ buildDeviceInfo();
+
+ CameraCapturer cameraCapturer;
+ if (cameraType.equals(FRONT_CAMERA_TYPE)) {
+ if (frontFacingDevice != null) {
+ cameraCapturer = this.createCameraCaputer(getContext(), frontFacingDevice);
+ } else {
+ cameraCapturer = this.createCameraCaputer(getContext(), backFacingDevice);
+ }
+ } else {
+ if (backFacingDevice != null) {
+ cameraCapturer = this.createCameraCaputer(getContext(), backFacingDevice);
} else {
- localParticipant.unpublishTrack(localVideoTrack);
+ cameraCapturer = this.createCameraCaputer(getContext(), frontFacingDevice);
}
}
+
+ if (cameraCapturer == null) {
+ WritableMap event = new WritableNativeMap();
+ event.putString("error", "No camera is supported on this device");
+ pushEvent(this, "onTrackCreationError", event);
+ return;
+ }
+
+ // Fix the LocalVideoTrack.create call - it should be create(context, enabled, source, name)
+ LocalVideoTrack videoTrack = LocalVideoTrack.create(getContext(), enabled, cameraCapturer, trackName);
+ if (videoTrack != null) {
+ localVideoTracks.put(trackName, videoTrack);
+ cameraCapturers.put(trackName, cameraCapturer);
+
+ WritableMap event = new WritableNativeMap();
+ event.putString("trackName", trackName);
+ event.putString("trackSid", videoTrack.getSid());
+ event.putBoolean("enabled", enabled);
+ pushEvent(this, "onVideoTrackCreated", event);
+ }
}
- public void publishLocalAudio(boolean enabled) {
- if (localParticipant != null && localAudioTrack != null) {
- if (enabled) {
- localParticipant.publishTrack(localAudioTrack);
- } else {
- localParticipant.unpublishTrack(localAudioTrack);
+ public void publishLocalAudioTrack(String trackName) {
+ LocalAudioTrack audioTrack = localAudioTracks.get(trackName);
+ if (audioTrack == null) {
+ WritableMap event = new WritableNativeMap();
+ event.putString("error", "Audio track with name " + trackName + " not found");
+ pushEvent(this, "onTrackPublishError", event);
+ return;
+ }
+
+ if (localParticipant != null) {
+ localParticipant.publishTrack(audioTrack);
+ }
+ }
+
+ public void publishLocalVideoTrack(String trackName) {
+ LocalVideoTrack videoTrack = localVideoTracks.get(trackName);
+ if (videoTrack == null) {
+ WritableMap event = new WritableNativeMap();
+ event.putString("error", "Video track with name " + trackName + " not found");
+ pushEvent(this, "onTrackPublishError", event);
+ return;
+ }
+
+ if (localParticipant != null) {
+ localParticipant.publishTrack(videoTrack);
+ }
+ }
+
+ public void unpublishLocalAudioTrack(String trackName) {
+ LocalAudioTrack audioTrack = localAudioTracks.get(trackName);
+ if (audioTrack == null) {
+ WritableMap event = new WritableNativeMap();
+ event.putString("error", "Audio track with name " + trackName + " not found");
+ pushEvent(this, "onTrackUnpublishError", event);
+ return;
+ }
+
+ if (localParticipant != null) {
+ localParticipant.unpublishTrack(audioTrack);
+ }
+ }
+
+ public void unpublishLocalVideoTrack(String trackName) {
+ LocalVideoTrack videoTrack = localVideoTracks.get(trackName);
+ if (videoTrack == null) {
+ WritableMap event = new WritableNativeMap();
+ event.putString("error", "Video track with name " + trackName + " not found");
+ pushEvent(this, "onTrackUnpublishError", event);
+ return;
+ }
+
+ if (localParticipant != null) {
+ localParticipant.unpublishTrack(videoTrack);
+ }
+ }
+
+ public void destroyLocalTrack(String trackName) {
+ LocalVideoTrack videoTrack = localVideoTracks.get(trackName);
+ LocalAudioTrack audioTrack = localAudioTracks.get(trackName);
+
+ if (videoTrack != null) {
+ // Unpublish if published
+ if (localParticipant != null) {
+ localParticipant.unpublishTrack(videoTrack);
+ }
+
+ // Stop camera capturer
+ CameraCapturer capturer = cameraCapturers.get(trackName);
+ if (capturer != null) {
+ capturer.stopCapture();
+ cameraCapturers.remove(trackName);
+ }
+
+ videoTrack.release();
+ localVideoTracks.remove(trackName);
+ } else if (audioTrack != null) {
+ // Unpublish if published
+ if (localParticipant != null) {
+ localParticipant.unpublishTrack(audioTrack);
}
+
+ audioTrack.release();
+ localAudioTracks.remove(trackName);
+ }
+ }
+
+ public void enableLocalTrack(String trackName, boolean enabled) {
+ LocalVideoTrack videoTrack = localVideoTracks.get(trackName);
+ LocalAudioTrack audioTrack = localAudioTracks.get(trackName);
+
+ if (videoTrack != null) {
+ videoTrack.enable(enabled);
+ } else if (audioTrack != null) {
+ audioTrack.enable(enabled);
}
}
+ public WritableArray getLocalTracks() {
+ WritableArray tracks = new WritableNativeArray();
+
+ // Add video tracks
+ for (Map.Entry entry : localVideoTracks.entrySet()) {
+ LocalVideoTrack track = entry.getValue();
+ WritableMap trackInfo = new WritableNativeMap();
+ trackInfo.putString("trackName", entry.getKey());
+ trackInfo.putBoolean("enabled", track.isEnabled());
+ trackInfo.putString("type", "video");
+ tracks.pushMap(trackInfo);
+ }
+
+ // Add audio tracks
+ for (Map.Entry entry : localAudioTracks.entrySet()) {
+ LocalAudioTrack track = entry.getValue();
+ WritableMap trackInfo = new WritableNativeMap();
+ trackInfo.putString("trackName", entry.getKey());
+ trackInfo.putBoolean("enabled", track.isEnabled());
+ trackInfo.putString("type", "audio");
+ tracks.pushMap(trackInfo);
+ }
+
+ return tracks;
+ }
private void convertBaseTrackStats(BaseTrackStats bs, WritableMap result) {
result.putString("codec", bs.codec);
@@ -1331,12 +1473,23 @@ public static void registerPrimaryVideoView(PatchedVideoView v, String trackSid)
}
}
- public static void registerThumbnailVideoView(PatchedVideoView v) {
+ // Updated methods to support track names for local views
+ public static void registerThumbnailVideoView(PatchedVideoView v, String trackName) {
thumbnailVideoView = v;
- if (localVideoTrack != null) {
- localVideoTrack.addSink(v);
+
+ // If trackName is specified, use that specific track
+ if (trackName != null && !trackName.isEmpty()) {
+ // TODO: Implement track-specific view registration
+ // This would require making localVideoTracks non-static or refactoring
+ } else {
+ // Use first available video track
+ // TODO: Implement proper track selection
}
- setThumbnailMirror();
+ }
+
+ // Backward compatibility method
+ public static void registerThumbnailVideoView(PatchedVideoView v) {
+ registerThumbnailVideoView(v, null);
}
private RemoteDataTrack.Listener remoteDataTrackListener() {
diff --git a/android/src/main/java/com/twiliorn/library/CustomTwilioVideoViewManager.java b/android/src/main/java/com/twiliorn/library/CustomTwilioVideoViewManager.java
index f28bbd00..50761953 100644
--- a/android/src/main/java/com/twiliorn/library/CustomTwilioVideoViewManager.java
+++ b/android/src/main/java/com/twiliorn/library/CustomTwilioVideoViewManager.java
@@ -43,6 +43,10 @@
import static com.twiliorn.library.CustomTwilioVideoView.Events.ON_DOMINANT_SPEAKER_CHANGED;
import static com.twiliorn.library.CustomTwilioVideoView.Events.ON_LOCAL_PARTICIPANT_SUPPORTED_CODECS;
+import com.facebook.react.bridge.WritableArray;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.bridge.WritableNativeMap;
+
public class CustomTwilioVideoViewManager extends SimpleViewManager {
public static final String REACT_CLASS = "RNCustomTwilioVideoView";
@@ -58,9 +62,18 @@ public class CustomTwilioVideoViewManager extends SimpleViewManager getCommandsMap() {
.put("toggleRemoteSound", TOGGLE_REMOTE_SOUND)
.put("toggleBluetoothHeadset", TOGGLE_BLUETOOTH_HEADSET)
.put("sendString", SEND_STRING)
+ .put("setRemoteAudioPlayback", SET_REMOTE_AUDIO_PLAYBACK)
+ // Multiple track support commands
+ .put("createLocalAudioTrack", CREATE_LOCAL_AUDIO_TRACK)
+ .put("createLocalVideoTrack", CREATE_LOCAL_VIDEO_TRACK)
+ .put("publishLocalAudioTrack", PUBLISH_LOCAL_AUDIO_TRACK)
+ .put("publishLocalVideoTrack", PUBLISH_LOCAL_VIDEO_TRACK)
+ .put("unpublishLocalAudioTrack", UNPUBLISH_LOCAL_AUDIO_TRACK)
+ .put("unpublishLocalVideoTrack", UNPUBLISH_LOCAL_VIDEO_TRACK)
+ .put("destroyLocalTrack", DESTROY_LOCAL_TRACK)
+ .put("enableLocalTrack", ENABLE_LOCAL_TRACK)
+ .put("getLocalTracks", GET_LOCAL_TRACKS)
.build();
}
}
diff --git a/android/src/main/java/com/twiliorn/library/TwilioVideoPreview.java b/android/src/main/java/com/twiliorn/library/TwilioVideoPreview.java
index d4c60d13..ec2c7a04 100644
--- a/android/src/main/java/com/twiliorn/library/TwilioVideoPreview.java
+++ b/android/src/main/java/com/twiliorn/library/TwilioVideoPreview.java
@@ -12,13 +12,37 @@
public class TwilioVideoPreview extends RNVideoViewGroup {
private static final String TAG = "TwilioVideoPreview";
+ private boolean enabled = true;
+ private String trackName = null;
public TwilioVideoPreview(ThemedReactContext themedReactContext) {
super(themedReactContext);
- CustomTwilioVideoView.registerThumbnailVideoView(this.getSurfaceViewRenderer());
+ // Don't register immediately - wait for properties to be set
}
public void applyZOrder(boolean applyZOrder) {
this.getSurfaceViewRenderer().applyZOrder(applyZOrder);
}
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ updateVideoView();
+ }
+
+ public void setTrackName(String trackName) {
+ this.trackName = trackName;
+ updateVideoView();
+ }
+
+ private void updateVideoView() {
+ if (enabled) {
+ if (trackName != null) {
+ CustomTwilioVideoView.registerThumbnailVideoView(this.getSurfaceViewRenderer(), trackName);
+ } else {
+ CustomTwilioVideoView.registerThumbnailVideoView(this.getSurfaceViewRenderer());
+ }
+ } else {
+ // TODO: Implement view unregistration if needed
+ }
+ }
}
diff --git a/android/src/main/java/com/twiliorn/library/TwilioVideoPreviewManager.java b/android/src/main/java/com/twiliorn/library/TwilioVideoPreviewManager.java
index 2cf6a83c..7afd7d5d 100644
--- a/android/src/main/java/com/twiliorn/library/TwilioVideoPreviewManager.java
+++ b/android/src/main/java/com/twiliorn/library/TwilioVideoPreviewManager.java
@@ -44,6 +44,16 @@ public void setApplyZOrder(TwilioVideoPreview view, boolean applyZOrder) {
view.applyZOrder(applyZOrder);
}
+ @ReactProp(name = "enabled", defaultBoolean = true)
+ public void setEnabled(TwilioVideoPreview view, boolean enabled) {
+ view.setEnabled(enabled);
+ }
+
+ @ReactProp(name = "trackName")
+ public void setTrackName(TwilioVideoPreview view, @Nullable String trackName) {
+ view.setTrackName(trackName);
+ }
+
@Override
@Nullable
public Map getExportedCustomDirectEventTypeConstants() {
diff --git a/index.d.ts b/index.d.ts
index c8410162..c0ac21eb 100644
--- a/index.d.ts
+++ b/index.d.ts
@@ -7,6 +7,35 @@ declare module "react-native-twilio-video-webrtc" {
videoTrackSid: string;
}
+ // New interfaces for multiple track support
+ export interface LocalTrackConfig {
+ trackName: string;
+ enabled?: boolean;
+ }
+
+ export interface LocalVideoTrackConfig extends LocalTrackConfig {
+ cameraType?: cameraType;
+ }
+
+ export interface LocalAudioTrackConfig extends LocalTrackConfig {
+ // Audio-specific configs can be added here
+ }
+
+ // Updated TrackPublication interface to match native implementation
+ export interface TrackPublication {
+ trackName: string;
+ enabled: boolean;
+ type: "audio" | "video";
+ }
+
+ // Interface for remote tracks (these have trackSid)
+ export interface RemoteTrackPublication {
+ trackSid: string;
+ trackName: string;
+ enabled: boolean;
+ type: "audio" | "video";
+ }
+
type scaleType = "fit" | "fill";
type cameraType = "front" | "back";
@@ -23,6 +52,7 @@ declare module "react-native-twilio-video-webrtc" {
interface TwilioVideoLocalViewProps extends ViewProps {
enabled: boolean;
+ trackName?: string; // Optional track name for multiple track support
ref?: React.Ref;
scaleType?: scaleType;
/**
@@ -100,6 +130,20 @@ declare module "react-native-twilio-video-webrtc" {
export type LocalParticipantSupportedCodecsCb = (d: LocalParticipantSupportedCodecsCbEventArgs) => void;
+ // New event types for multiple track support
+ export interface TrackCreatedEventArgs {
+ trackName: string;
+ trackSid?: string; // Optional since local tracks might not have sid until published
+ enabled: boolean;
+ }
+
+ export interface TrackErrorEventArgs {
+ error: string;
+ }
+
+ export type TrackCreatedEventCb = (t: TrackCreatedEventArgs) => void;
+ export type TrackErrorEventCb = (t: TrackErrorEventArgs) => void;
+
export type TwilioVideoProps = ViewProps & {
onCameraDidStart?: () => void;
onCameraDidStopRunning?: (err: any) => void;
@@ -125,6 +169,14 @@ declare module "react-native-twilio-video-webrtc" {
onStatsReceived?: (data: any) => void;
onDataTrackMessageReceived?: DataTrackEventCb;
+
+ // New events for multiple track support
+ onAudioTrackCreated?: TrackCreatedEventCb;
+ onVideoTrackCreated?: TrackCreatedEventCb;
+ onTrackCreationError?: TrackErrorEventCb;
+ onTrackPublishError?: TrackErrorEventCb;
+ onTrackUnpublishError?: TrackErrorEventCb;
+
// iOS only
autoInitializeCamera?: boolean;
ref?: React.Ref;
@@ -162,8 +214,6 @@ declare module "react-native-twilio-video-webrtc" {
};
class TwilioVideo extends React.Component {
- setLocalVideoEnabled: (enabled: boolean) => Promise;
- setLocalAudioEnabled: (enabled: boolean) => Promise;
setRemoteAudioEnabled: (enabled: boolean) => Promise;
setBluetoothHeadsetConnected: (enabled: boolean) => Promise;
connect: (options: iOSConnectParams | androidConnectParams) => void;
@@ -171,10 +221,18 @@ declare module "react-native-twilio-video-webrtc" {
flipCamera: () => void;
toggleSoundSetup: (speaker: boolean) => void;
getStats: () => void;
- publishLocalAudio: () => void;
- unpublishLocalAudio: () => void;
- publishLocalVideo: () => void;
- unpublishLocalVideo: () => void;
+
+ // Multiple track methods
+ createLocalAudioTrack: (config: LocalAudioTrackConfig) => Promise;
+ createLocalVideoTrack: (config: LocalVideoTrackConfig) => Promise;
+ publishLocalAudioTrack: (trackName: string) => Promise;
+ publishLocalVideoTrack: (trackName: string) => Promise;
+ unpublishLocalAudioTrack: (trackName: string) => Promise;
+ unpublishLocalVideoTrack: (trackName: string) => Promise;
+ destroyLocalTrack: (trackName: string) => Promise;
+ enableLocalTrack: (trackName: string, enabled: boolean) => Promise;
+ getLocalTracks: () => Promise;
+
sendString: (message: string) => void;
}
diff --git a/ios/RCTTWLocalVideoViewManager.m b/ios/RCTTWLocalVideoViewManager.m
index 43d0d703..a6fd6e44 100644
--- a/ios/RCTTWLocalVideoViewManager.m
+++ b/ios/RCTTWLocalVideoViewManager.m
@@ -42,4 +42,15 @@ - (UIView *)view {
}
}
+RCT_CUSTOM_VIEW_PROPERTY(trackName, NSString, TVIVideoView) {
+ if (json) {
+ RCTTWVideoModule *videoModule = [self.bridge moduleForName:@"TWVideoModule"];
+ NSString *trackName = [RCTConvert NSString:json];
+
+ // Remove from all tracks first, then add to specific track
+ [videoModule removeLocalView:view.subviews[0]];
+ [videoModule addLocalView:view.subviews[0] trackName:trackName];
+ }
+}
+
@end
diff --git a/ios/RCTTWVideoModule.h b/ios/RCTTWVideoModule.h
index d971d16d..806e2977 100644
--- a/ios/RCTTWVideoModule.h
+++ b/ios/RCTTWVideoModule.h
@@ -14,6 +14,7 @@
@interface RCTTWVideoModule : RCTEventEmitter
- (void)addLocalView:(TVIVideoView *)view;
+- (void)addLocalView:(TVIVideoView *)view trackName:(NSString *)trackName;
- (void)removeLocalView:(TVIVideoView *)view;
- (void)addParticipantView:(TVIVideoView *)view sid:(NSString *)sid trackSid:(NSString *)trackSid;
diff --git a/ios/RCTTWVideoModule.m b/ios/RCTTWVideoModule.m
index 2311f6c5..eb686307 100644
--- a/ios/RCTTWVideoModule.m
+++ b/ios/RCTTWVideoModule.m
@@ -63,15 +63,20 @@
@interface RCTTWVideoModule ()
-@property (strong, nonatomic) TVICameraSource *camera;
-@property (strong, nonatomic) TVILocalVideoTrack* localVideoTrack;
-@property (strong, nonatomic) TVILocalAudioTrack* localAudioTrack;
+// Multiple track support - replace single track properties
+@property (strong, nonatomic) NSMutableDictionary *localVideoTracks;
+@property (strong, nonatomic) NSMutableDictionary *localAudioTracks;
+@property (strong, nonatomic) NSMutableDictionary *cameraSources;
+
@property (strong, nonatomic) TVILocalDataTrack* localDataTrack;
@property (strong, nonatomic) TVIAppScreenSource *screen;
@property (strong, nonatomic) TVILocalParticipant* localParticipant;
@property (strong, nonatomic) TVIRoom *room;
@property (nonatomic) BOOL listening;
+// Map used to map remote data tracks to remote participants
+@property (strong, nonatomic) NSMutableDictionary *dataTrackRemoteParticipantMap;
+
@end
@implementation RCTTWVideoModule
@@ -80,8 +85,27 @@ @implementation RCTTWVideoModule
RCT_EXPORT_MODULE();
+- (instancetype)init {
+ if (self = [super init]) {
+ // Initialize multiple track collections
+ self.localVideoTracks = [[NSMutableDictionary alloc] init];
+ self.localAudioTracks = [[NSMutableDictionary alloc] init];
+ self.cameraSources = [[NSMutableDictionary alloc] init];
+ self.dataTrackRemoteParticipantMap = [[NSMutableDictionary alloc] init];
+ }
+ return self;
+}
+
- (void)dealloc {
- [self clearCameraInstance];
+ [self clearAllCameraInstances];
+}
+
+- (void)clearAllCameraInstances {
+ // Stop all camera sources
+ for (TVICameraSource *cameraSource in self.cameraSources.allValues) {
+ [cameraSource stopCapture];
+ }
+ [self.cameraSources removeAllObjects];
}
- (dispatch_queue_t)methodQueue {
@@ -116,176 +140,340 @@ - (dispatch_queue_t)methodQueue {
];
}
-- (void)addLocalView:(TVIVideoView *)view {
- if (self.localVideoTrack != nil) {
- [self.localVideoTrack addRenderer:view];
- }
- [self updateLocalViewMirroring:view];
+// New methods for multiple track support
+RCT_EXPORT_METHOD(createLocalAudioTrack:(NSDictionary *)config
+ resolver:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject) {
+ NSString *trackName = config[@"trackName"];
+ BOOL enabled = config[@"enabled"] ? [config[@"enabled"] boolValue] : YES;
+
+ if (!trackName) {
+ reject(@"INVALID_PARAMS", @"trackName is required", nil);
+ return;
+ }
+
+ if (self.localAudioTracks[trackName]) {
+ reject(@"TRACK_EXISTS", @"Audio track with this name already exists", nil);
+ return;
+ }
+
+ TVILocalAudioTrack *audioTrack = [TVILocalAudioTrack trackWithOptions:nil enabled:enabled name:trackName];
+ if (audioTrack) {
+ self.localAudioTracks[trackName] = audioTrack;
+ resolve(trackName);
+ } else {
+ reject(@"CREATION_FAILED", @"Failed to create audio track", nil);
+ }
}
-- (void)updateLocalViewMirroring:(TVIVideoView *)view {
- if (self.camera && self.camera.device.position == AVCaptureDevicePositionFront) {
- view.mirror = true;
- }
+RCT_EXPORT_METHOD(createLocalVideoTrack:(NSDictionary *)config
+ resolver:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject) {
+ NSString *trackName = config[@"trackName"];
+ BOOL enabled = config[@"enabled"] ? [config[@"enabled"] boolValue] : YES;
+ NSString *cameraType = config[@"cameraType"] ? config[@"cameraType"] : @"front";
+
+ if (!trackName) {
+ reject(@"INVALID_PARAMS", @"trackName is required", nil);
+ return;
+ }
+
+ if (self.localVideoTracks[trackName]) {
+ reject(@"TRACK_EXISTS", @"Video track with this name already exists", nil);
+ return;
+ }
+
+ TVICameraSourceOptions *options = [TVICameraSourceOptions optionsWithBlock:^(TVICameraSourceOptionsBuilder * _Nonnull builder) {
+
+ }];
+ TVICameraSource *cameraSource = [[TVICameraSource alloc] initWithOptions:options delegate:self];
+
+ if (cameraSource == nil) {
+ reject(@"CAMERA_UNAVAILABLE", @"Camera source unavailable", nil);
+ return;
+ }
+
+ TVILocalVideoTrack *videoTrack = [TVILocalVideoTrack trackWithSource:cameraSource enabled:enabled name:trackName];
+ if (videoTrack) {
+ self.localVideoTracks[trackName] = videoTrack;
+ self.cameraSources[trackName] = cameraSource;
+
+ // Start camera capture
+ [self startCameraCaptureForTrack:trackName cameraType:cameraType];
+ resolve(trackName);
+ } else {
+ reject(@"CREATION_FAILED", @"Failed to create video track", nil);
+ }
}
-- (void)removeLocalView:(TVIVideoView *)view {
- if (self.localVideoTrack != nil) {
- [self.localVideoTrack removeRenderer:view];
- }
+RCT_EXPORT_METHOD(publishLocalAudioTrack:(NSString *)trackName
+ resolver:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject) {
+ TVILocalAudioTrack *audioTrack = self.localAudioTracks[trackName];
+ if (!audioTrack) {
+ reject(@"TRACK_NOT_FOUND", @"Audio track not found", nil);
+ return;
+ }
+
+ if (self.localParticipant) {
+ [self.localParticipant publishAudioTrack:audioTrack];
+ resolve(@(YES));
+ } else {
+ reject(@"NOT_CONNECTED", @"Not connected to room", nil);
+ }
}
-- (void)removeParticipantView:(TVIVideoView *)view sid:(NSString *)sid trackSid:(NSString *)trackSid {
- // TODO: Implement this nicely
+RCT_EXPORT_METHOD(publishLocalVideoTrack:(NSString *)trackName
+ resolver:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject) {
+ TVILocalVideoTrack *videoTrack = self.localVideoTracks[trackName];
+ if (!videoTrack) {
+ reject(@"TRACK_NOT_FOUND", @"Video track not found", nil);
+ return;
+ }
+
+ if (self.localParticipant) {
+ [self.localParticipant publishVideoTrack:videoTrack];
+ resolve(@(YES));
+ } else {
+ reject(@"NOT_CONNECTED", @"Not connected to room", nil);
+ }
}
-- (void)addParticipantView:(TVIVideoView *)view sid:(NSString *)sid trackSid:(NSString *)trackSid {
- // Lookup for the participant in the room
- TVIRemoteParticipant *participant = [self.room getRemoteParticipantWithSid:sid];
- if (participant) {
- for (TVIRemoteVideoTrackPublication *publication in participant.remoteVideoTracks) {
- if ([publication.trackSid isEqualToString:trackSid]) {
- [publication.videoTrack addRenderer:view];
- }
- }
- }
+RCT_EXPORT_METHOD(unpublishLocalAudioTrack:(NSString *)trackName
+ resolver:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject) {
+ TVILocalAudioTrack *audioTrack = self.localAudioTracks[trackName];
+ if (!audioTrack) {
+ reject(@"TRACK_NOT_FOUND", @"Audio track not found", nil);
+ return;
+ }
+
+ if (self.localParticipant) {
+ [self.localParticipant unpublishAudioTrack:audioTrack];
+ resolve(@(YES));
+ } else {
+ reject(@"NOT_CONNECTED", @"Not connected to room", nil);
+ }
}
-RCT_EXPORT_METHOD(changeListenerStatus:(BOOL)value) {
- self.listening = value;
+RCT_EXPORT_METHOD(unpublishLocalVideoTrack:(NSString *)trackName
+ resolver:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject) {
+ TVILocalVideoTrack *videoTrack = self.localVideoTracks[trackName];
+ if (!videoTrack) {
+ reject(@"TRACK_NOT_FOUND", @"Video track not found", nil);
+ return;
+ }
+
+ if (self.localParticipant) {
+ [self.localParticipant unpublishVideoTrack:videoTrack];
+ resolve(@(YES));
+ } else {
+ reject(@"NOT_CONNECTED", @"Not connected to room", nil);
+ }
}
-RCT_EXPORT_METHOD(setRemoteAudioPlayback:(NSString *)participantSid enabled:(BOOL)enabled) {
- TVIRemoteParticipant *participant = [self.room getRemoteParticipantWithSid:participantSid];
- if (participant) {
- NSArray *trackPublications = participant.remoteAudioTracks;
- for(TVIRemoteAudioTrackPublication *remoteAudioTrack in trackPublications) {
- [remoteAudioTrack.remoteTrack setPlaybackEnabled:enabled];
+RCT_EXPORT_METHOD(destroyLocalTrack:(NSString *)trackName
+ resolver:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject) {
+ TVILocalVideoTrack *videoTrack = self.localVideoTracks[trackName];
+ TVILocalAudioTrack *audioTrack = self.localAudioTracks[trackName];
+ TVICameraSource *cameraSource = self.cameraSources[trackName];
+
+ if (videoTrack) {
+ // Unpublish if published
+ if (self.localParticipant) {
+ [self.localParticipant unpublishVideoTrack:videoTrack];
+ }
+
+ // Stop camera capture
+ if (cameraSource) {
+ [cameraSource stopCapture];
+ [self.cameraSources removeObjectForKey:trackName];
}
+
+ [self.localVideoTracks removeObjectForKey:trackName];
+ resolve(@(YES));
+ } else if (audioTrack) {
+ // Unpublish if published
+ if (self.localParticipant) {
+ [self.localParticipant unpublishAudioTrack:audioTrack];
+ }
+
+ [self.localAudioTracks removeObjectForKey:trackName];
+ resolve(@(YES));
+ } else {
+ reject(@"TRACK_NOT_FOUND", @"Track not found", nil);
}
}
-RCT_EXPORT_METHOD(startLocalVideo) {
- TVICameraSourceOptions *options = [TVICameraSourceOptions optionsWithBlock:^(TVICameraSourceOptionsBuilder * _Nonnull builder) {
+RCT_EXPORT_METHOD(enableLocalTrack:(NSString *)trackName
+ enabled:(BOOL)enabled
+ resolver:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject) {
+ TVILocalVideoTrack *videoTrack = self.localVideoTracks[trackName];
+ TVILocalAudioTrack *audioTrack = self.localAudioTracks[trackName];
+
+ if (videoTrack) {
+ [videoTrack setEnabled:enabled];
+ resolve(@(YES));
+ } else if (audioTrack) {
+ [audioTrack setEnabled:enabled];
+ resolve(@(YES));
+ } else {
+ reject(@"TRACK_NOT_FOUND", @"Track not found", nil);
+ }
+}
- }];
- self.camera = [[TVICameraSource alloc] initWithOptions:options delegate:self];
- if (self.camera == nil) {
- return;
- }
- self.localVideoTrack = [TVILocalVideoTrack trackWithSource:self.camera enabled:NO name:@"camera"];
+RCT_EXPORT_METHOD(getLocalTracks:(RCTPromiseResolveBlock)resolve
+ rejecter:(RCTPromiseRejectBlock)reject) {
+ NSMutableArray *tracks = [[NSMutableArray alloc] init];
+
+ // Add video tracks
+ for (NSString *trackName in self.localVideoTracks) {
+ TVILocalVideoTrack *track = self.localVideoTracks[trackName];
+ [tracks addObject:@{
+ @"trackName": track.name,
+ @"enabled": @(track.enabled),
+ @"type": @"video"
+ }];
+ }
+
+ // Add audio tracks
+ for (NSString *trackName in self.localAudioTracks) {
+ TVILocalAudioTrack *track = self.localAudioTracks[trackName];
+ [tracks addObject:@{
+ @"trackName": track.name,
+ @"enabled": @(track.enabled),
+ @"type": @"audio"
+ }];
+ }
+
+ resolve(tracks);
}
-- (void)startCameraCapture:(NSString *)cameraType {
- if (self.camera == nil) {
- return;
- }
- AVCaptureDevice *camera;
+// Helper method for camera capture
+- (void)startCameraCaptureForTrack:(NSString *)trackName cameraType:(NSString *)cameraType {
+ TVICameraSource *cameraSource = self.cameraSources[trackName];
+ TVILocalVideoTrack *videoTrack = self.localVideoTracks[trackName];
+
+ if (!cameraSource || !videoTrack) {
+ return;
+ }
+
+ AVCaptureDevice *camera;
if ([cameraType isEqualToString:@"back"]) {
- camera = [TVICameraSource captureDeviceForPosition:AVCaptureDevicePositionBack];
- } else {
- camera = [TVICameraSource captureDeviceForPosition:AVCaptureDevicePositionFront];
- }
-
- [self.camera startCaptureWithDevice:camera completion:^(AVCaptureDevice *device,
- TVIVideoFormat *startFormat,
- NSError *error) {
- if (!error) {
- for (TVIVideoView *renderer in self.localVideoTrack.renderers) {
- [self updateLocalViewMirroring:renderer];
- }
- [self sendEventCheckingListenerWithName:cameraDidStart body:nil];
- }
- }];
+ camera = [TVICameraSource captureDeviceForPosition:AVCaptureDevicePositionBack];
+ } else {
+ camera = [TVICameraSource captureDeviceForPosition:AVCaptureDevicePositionFront];
+ }
+
+ [cameraSource startCaptureWithDevice:camera completion:^(AVCaptureDevice *device,
+ TVIVideoFormat *startFormat,
+ NSError *error) {
+ if (!error) {
+ for (TVIVideoView *renderer in videoTrack.renderers) {
+ [self updateLocalViewMirroring:renderer forTrack:trackName];
+ }
+ [self sendEventCheckingListenerWithName:cameraDidStart body:nil];
+ }
+ }];
}
-RCT_EXPORT_METHOD(startLocalAudio) {
- self.localAudioTrack = [TVILocalAudioTrack trackWithOptions:nil enabled:YES name:@"microphone"];
+- (void)updateLocalViewMirroring:(TVIVideoView *)view forTrack:(NSString *)trackName {
+ TVICameraSource *cameraSource = self.cameraSources[trackName];
+ if (cameraSource && cameraSource.device.position == AVCaptureDevicePositionFront) {
+ view.mirror = true;
+ }
}
-RCT_EXPORT_METHOD(stopLocalVideo) {
- [self clearCameraInstance];
+// Updated methods to support track names
+- (void)addLocalView:(TVIVideoView *)view {
+ [self addLocalView:view trackName:nil];
}
-RCT_EXPORT_METHOD(stopLocalAudio) {
- self.localAudioTrack = nil;
+- (void)addLocalView:(TVIVideoView *)view trackName:(NSString *)trackName {
+ // If trackName is specified, use that track; otherwise use first available track
+ if (trackName) {
+ TVILocalVideoTrack *videoTrack = self.localVideoTracks[trackName];
+ if (videoTrack) {
+ [videoTrack addRenderer:view];
+ [self updateLocalViewMirroring:view forTrack:trackName];
+ }
+ } else {
+ // Use first available video track
+ TVILocalVideoTrack *firstTrack = [self.localVideoTracks.allValues firstObject];
+ if (firstTrack) {
+ [firstTrack addRenderer:view];
+ NSString *firstTrackName = [[self.localVideoTracks allKeysForObject:firstTrack] firstObject];
+ [self updateLocalViewMirroring:view forTrack:firstTrackName];
+ }
+ }
}
-RCT_EXPORT_METHOD(publishLocalVideo) {
- if(self.localVideoTrack != nil){
- TVILocalParticipant *localParticipant = self.room.localParticipant;
- [localParticipant publishVideoTrack:self.localVideoTrack];
+- (void)removeLocalView:(TVIVideoView *)view {
+ // Remove view from all local video tracks
+ for (TVILocalVideoTrack *videoTrack in self.localVideoTracks.allValues) {
+ [videoTrack removeRenderer:view];
}
}
-RCT_EXPORT_METHOD(publishLocalAudio) {
- TVILocalParticipant *localParticipant = self.room.localParticipant;
- [localParticipant publishAudioTrack:self.localAudioTrack];
+- (void)removeParticipantView:(TVIVideoView *)view sid:(NSString *)sid trackSid:(NSString *)trackSid {
+ // TODO: Implement this nicely
}
-RCT_EXPORT_METHOD(unpublishLocalVideo) {
- if(self.localVideoTrack != nil){
- TVILocalParticipant *localParticipant = self.room.localParticipant;
- [localParticipant unpublishVideoTrack:self.localVideoTrack];
+- (void)addParticipantView:(TVIVideoView *)view sid:(NSString *)sid trackSid:(NSString *)trackSid {
+ // Lookup for the participant in the room
+ TVIRemoteParticipant *participant = [self.room getRemoteParticipantWithSid:sid];
+ if (participant) {
+ for (TVIRemoteVideoTrackPublication *publication in participant.remoteVideoTracks) {
+ if ([publication.trackSid isEqualToString:trackSid]) {
+ [publication.videoTrack addRenderer:view];
+ }
+ }
}
}
-RCT_EXPORT_METHOD(unpublishLocalAudio) {
- TVILocalParticipant *localParticipant = self.room.localParticipant;
- [localParticipant unpublishAudioTrack:self.localAudioTrack];
-}
-
-RCT_REMAP_METHOD(setLocalAudioEnabled, enabled:(BOOL)enabled setLocalAudioEnabledWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject) {
- [self.localAudioTrack setEnabled:enabled];
-
- resolve(@(enabled));
-}
-
-
-// set a default for setting local video enabled
-- (bool)_setLocalVideoEnabled:(bool)enabled {
- return [self _setLocalVideoEnabled:enabled cameraType:@"front"];
-}
-
-- (bool)_setLocalVideoEnabled:(bool)enabled cameraType:(NSString *)cameraType {
- if (self.localVideoTrack != nil) {
- [self.localVideoTrack setEnabled:enabled];
- if (self.camera) {
- if (enabled) {
- [self startCameraCapture:cameraType];
- } else {
- [self clearCameraInstance];
- }
- return enabled;
- }
- }
- return false;
+RCT_EXPORT_METHOD(changeListenerStatus:(BOOL)value) {
+ self.listening = value;
}
-RCT_REMAP_METHOD(setLocalVideoEnabled, enabled:(BOOL)enabled setLocalVideoEnabledWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject) {
- bool result = [self _setLocalVideoEnabled:enabled];
- resolve(@(result));
+RCT_EXPORT_METHOD(setRemoteAudioPlayback:(NSString *)participantSid enabled:(BOOL)enabled) {
+ TVIRemoteParticipant *participant = [self.room getRemoteParticipantWithSid:participantSid];
+ if (participant) {
+ NSArray *trackPublications = participant.remoteAudioTracks;
+ for(TVIRemoteAudioTrackPublication *remoteAudioTrack in trackPublications) {
+ [remoteAudioTrack.remoteTrack setPlaybackEnabled:enabled];
+ }
+ }
}
RCT_EXPORT_METHOD(flipCamera) {
- if (self.camera) {
- AVCaptureDevicePosition position = self.camera.device.position;
+ // Flip camera for all camera sources
+ for (TVICameraSource *cameraSource in self.cameraSources.allValues) {
+ AVCaptureDevicePosition position = cameraSource.device.position;
AVCaptureDevicePosition nextPosition = position == AVCaptureDevicePositionFront ? AVCaptureDevicePositionBack : AVCaptureDevicePositionFront;
BOOL mirror = nextPosition == AVCaptureDevicePositionFront;
AVCaptureDevice *captureDevice = [TVICameraSource captureDeviceForPosition:nextPosition];
- [self.camera selectCaptureDevice:captureDevice completion:^(AVCaptureDevice *device,
+ [cameraSource selectCaptureDevice:captureDevice completion:^(AVCaptureDevice *device,
TVIVideoFormat *startFormat,
NSError *error) {
if (!error) {
- for (TVIVideoView *renderer in self.localVideoTrack.renderers) {
- renderer.mirror = mirror;
+ // Update mirroring for all renderers of video tracks using this camera source
+ for (NSString *trackName in self.localVideoTracks) {
+ TVILocalVideoTrack *videoTrack = self.localVideoTracks[trackName];
+ TVICameraSource *trackCameraSource = self.cameraSources[trackName];
+ if (trackCameraSource == cameraSource) {
+ for (TVIVideoView *renderer in videoTrack.renderers) {
+ renderer.mirror = mirror;
+ }
+ }
}
}
}];
- }
+ }
}
RCT_EXPORT_METHOD(toggleScreenSharing: (BOOL) value) {
@@ -297,17 +485,24 @@ - (bool)_setLocalVideoEnabled:(bool)enabled cameraType:(NSString *)cameraType {
if (self.screen == nil) {
return;
}
- self.localVideoTrack = [TVILocalVideoTrack trackWithSource:self.screen enabled:YES name:@"screen"];
- if(self.localVideoTrack != nil){
- TVILocalParticipant *localParticipant = self.room.localParticipant;
- [localParticipant publishVideoTrack:self.localVideoTrack];
+
+ // Create a screen share video track
+ TVILocalVideoTrack *screenTrack = [TVILocalVideoTrack trackWithSource:self.screen enabled:YES name:@"screen"];
+ if (screenTrack) {
+ self.localVideoTracks[@"screen"] = screenTrack;
+ if (self.localParticipant) {
+ [self.localParticipant publishVideoTrack:screenTrack];
+ }
}
[self.screen startCapture];
- } else {
- [self unpublishLocalVideo];
+ } else {
+ TVILocalVideoTrack *screenTrack = self.localVideoTracks[@"screen"];
+ if (screenTrack && self.localParticipant) {
+ [self.localParticipant unpublishVideoTrack:screenTrack];
+ }
+ [self.localVideoTracks removeObjectForKey:@"screen"];
[self.screen stopCapture];
- self.localVideoTrack = nil;
- }
+ }
}
@@ -421,19 +616,21 @@ -(NSMutableDictionary*)convertLocalVideoTrackStats:(TVILocalVideoTrackStats *)st
}
}
-RCT_EXPORT_METHOD(connect:(NSString *)accessToken roomName:(NSString *)roomName enableAudio:(BOOL *)enableAudio enableVideo:(BOOL *)enableVideo encodingParameters:(NSDictionary *)encodingParameters enableNetworkQualityReporting:(BOOL *)enableNetworkQualityReporting dominantSpeakerEnabled:(BOOL *)dominantSpeakerEnabled cameraType:(NSString *)cameraType) {
- [self _setLocalVideoEnabled:enableVideo cameraType:cameraType];
- if (self.localAudioTrack) {
- [self.localAudioTrack setEnabled:enableAudio];
- }
-
+RCT_EXPORT_METHOD(connect:(NSString *)accessToken roomName:(NSString *)roomName enableAudio:(BOOL)enableAudio enableVideo:(BOOL)enableVideo encodingParameters:(NSDictionary *)encodingParameters enableNetworkQualityReporting:(BOOL)enableNetworkQualityReporting dominantSpeakerEnabled:(BOOL)dominantSpeakerEnabled cameraType:(NSString *)cameraType) {
+
+ // No automatic track creation - users must create tracks explicitly
+
TVIConnectOptions *connectOptions = [TVIConnectOptions optionsWithToken:accessToken block:^(TVIConnectOptionsBuilder * _Nonnull builder) {
- if (self.localVideoTrack) {
- builder.videoTracks = @[self.localVideoTrack];
+ // Add all video tracks
+ NSArray *videoTracks = [self.localVideoTracks allValues];
+ if (videoTracks.count > 0) {
+ builder.videoTracks = videoTracks;
}
- if (self.localAudioTrack) {
- builder.audioTracks = @[self.localAudioTrack];
+ // Add all audio tracks
+ NSArray *audioTracks = [self.localAudioTracks allValues];
+ if (audioTracks.count > 0) {
+ builder.audioTracks = audioTracks;
}
self.localDataTrack = [TVILocalDataTrack track];
@@ -442,7 +639,7 @@ -(NSMutableDictionary*)convertLocalVideoTrackStats:(TVILocalVideoTrackStats *)st
builder.dataTracks = @[self.localDataTrack];
}
- builder.dominantSpeakerEnabled = dominantSpeakerEnabled ? YES : NO;
+ builder.dominantSpeakerEnabled = dominantSpeakerEnabled;
builder.roomName = roomName;
@@ -473,17 +670,10 @@ -(NSMutableDictionary*)convertLocalVideoTrackStats:(TVILocalVideoTrackStats *)st
}
RCT_EXPORT_METHOD(disconnect) {
- [self clearCameraInstance];
+ [self clearAllCameraInstances];
[self.room disconnect];
}
-- (void)clearCameraInstance {
- // We are done with camera
- if (self.camera) {
- [self.camera stopCapture];
- }
-}
-
# pragma mark - Common
-(void)sendEventCheckingListenerWithName:(NSString *)event body:(NSDictionary *)body {
diff --git a/package.json b/package.json
index b4616950..b1444eba 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"url": "https://github.com/blackuy/react-native-twilio-video-webrtc.git"
},
"homepage": "https://github.com/blackuy/react-native-twilio-video-webrtc",
- "version": "3.2.1",
+ "version": "3.2.3",
"description": "Twilio Video WebRTC for React Native.",
"main": "index.js",
"scripts": {
diff --git a/src/TwilioVideo.android.js b/src/TwilioVideo.android.js
index 4e40bf49..c3563366 100644
--- a/src/TwilioVideo.android.js
+++ b/src/TwilioVideo.android.js
@@ -149,6 +149,13 @@ const propTypes = {
* Callback that is called after determining what codecs are supported
*/
onLocalParticipantSupportedCodecs: PropTypes.func,
+ // New events for multiple track support
+ onAudioTrackCreated: PropTypes.func,
+ onVideoTrackCreated: PropTypes.func,
+ onTrackCreationError: PropTypes.func,
+ onTrackPublishError: PropTypes.func,
+ onTrackUnpublishError: PropTypes.func,
+ onLocalTracksReceived: PropTypes.func,
};
const nativeEvents = {
@@ -164,9 +171,17 @@ const nativeEvents = {
releaseResource: 10,
toggleBluetoothHeadset: 11,
sendString: 12,
- publishVideo: 13,
- publishAudio: 14,
- setRemoteAudioPlayback: 15,
+ setRemoteAudioPlayback: 13,
+ // Multiple track support commands
+ createLocalAudioTrack: 14,
+ createLocalVideoTrack: 15,
+ publishLocalAudioTrack: 16,
+ publishLocalVideoTrack: 17,
+ unpublishLocalAudioTrack: 18,
+ unpublishLocalVideoTrack: 19,
+ destroyLocalTrack: 20,
+ enableLocalTrack: 21,
+ getLocalTracks: 22,
};
class CustomTwilioVideoView extends Component {
@@ -200,22 +215,6 @@ class CustomTwilioVideoView extends Component {
this.runCommand(nativeEvents.sendString, [message]);
}
- publishLocalAudio() {
- this.runCommand(nativeEvents.publishAudio, [true]);
- }
-
- publishLocalVideo() {
- this.runCommand(nativeEvents.publishVideo, [true]);
- }
-
- unpublishLocalAudio() {
- this.runCommand(nativeEvents.publishAudio, [false]);
- }
-
- unpublishLocalVideo() {
- this.runCommand(nativeEvents.publishVideo, [false]);
- }
-
disconnect() {
this.runCommand(nativeEvents.disconnect, []);
}
@@ -228,16 +227,6 @@ class CustomTwilioVideoView extends Component {
this.runCommand(nativeEvents.switchCamera, []);
}
- setLocalVideoEnabled(enabled) {
- this.runCommand(nativeEvents.toggleVideo, [enabled]);
- return Promise.resolve(enabled);
- }
-
- setLocalAudioEnabled(enabled) {
- this.runCommand(nativeEvents.toggleSound, [enabled]);
- return Promise.resolve(enabled);
- }
-
setRemoteAudioEnabled(enabled) {
this.runCommand(nativeEvents.toggleRemoteSound, [enabled]);
return Promise.resolve(enabled);
@@ -281,6 +270,86 @@ class CustomTwilioVideoView extends Component {
}
}
+ // Multiple track support methods
+ createLocalAudioTrack(config) {
+ return new Promise((resolve, reject) => {
+ this.runCommand(nativeEvents.createLocalAudioTrack, [
+ config.trackName,
+ config.enabled !== undefined ? config.enabled : true
+ ]);
+ // TODO: Add proper promise handling with event listeners
+ resolve(config.trackName);
+ });
+ }
+
+ createLocalVideoTrack(config) {
+ return new Promise((resolve, reject) => {
+ this.runCommand(nativeEvents.createLocalVideoTrack, [
+ config.trackName,
+ config.enabled !== undefined ? config.enabled : true,
+ config.cameraType || "front"
+ ]);
+ // TODO: Add proper promise handling with event listeners
+ resolve(config.trackName);
+ });
+ }
+
+ publishLocalAudioTrack(trackName) {
+ return new Promise((resolve, reject) => {
+ this.runCommand(nativeEvents.publishLocalAudioTrack, [trackName]);
+ // TODO: Add proper promise handling with event listeners
+ resolve(true);
+ });
+ }
+
+ publishLocalVideoTrack(trackName) {
+ return new Promise((resolve, reject) => {
+ this.runCommand(nativeEvents.publishLocalVideoTrack, [trackName]);
+ // TODO: Add proper promise handling with event listeners
+ resolve(true);
+ });
+ }
+
+ unpublishLocalAudioTrack(trackName) {
+ return new Promise((resolve, reject) => {
+ this.runCommand(nativeEvents.unpublishLocalAudioTrack, [trackName]);
+ // TODO: Add proper promise handling with event listeners
+ resolve(true);
+ });
+ }
+
+ unpublishLocalVideoTrack(trackName) {
+ return new Promise((resolve, reject) => {
+ this.runCommand(nativeEvents.unpublishLocalVideoTrack, [trackName]);
+ // TODO: Add proper promise handling with event listeners
+ resolve(true);
+ });
+ }
+
+ destroyLocalTrack(trackName) {
+ return new Promise((resolve, reject) => {
+ this.runCommand(nativeEvents.destroyLocalTrack, [trackName]);
+ // TODO: Add proper promise handling with event listeners
+ resolve(true);
+ });
+ }
+
+ enableLocalTrack(trackName, enabled) {
+ return new Promise((resolve, reject) => {
+ this.runCommand(nativeEvents.enableLocalTrack, [trackName, enabled]);
+ // TODO: Add proper promise handling with event listeners
+ resolve(true);
+ });
+ }
+
+ getLocalTracks() {
+ return new Promise((resolve, reject) => {
+ this.runCommand(nativeEvents.getLocalTracks, []);
+ // TODO: Add proper promise handling with event listeners - should resolve with tracks array
+ resolve([]);
+ });
+ }
+
buildNativeEventWrappers() {
return [
"onCameraSwitched",
@@ -306,6 +375,13 @@ class CustomTwilioVideoView extends Component {
"onNetworkQualityLevelsChanged",
"onDominantSpeakerDidChange",
"onLocalParticipantSupportedCodecs",
+ // New events for multiple track support
+ "onAudioTrackCreated",
+ "onVideoTrackCreated",
+ "onTrackCreationError",
+ "onTrackPublishError",
+ "onTrackUnpublishError",
+ "onLocalTracksReceived",
].reduce((wrappedEvents, eventName) => {
if (this.props[eventName]) {
return {
diff --git a/src/TwilioVideo.ios.js b/src/TwilioVideo.ios.js
index 99e5c132..f0518e9a 100644
--- a/src/TwilioVideo.ios.js
+++ b/src/TwilioVideo.ios.js
@@ -164,16 +164,12 @@ export default class TwilioVideo extends Component {
componentDidMount() {
this._registerEvents();
- if (this.props.autoInitializeCamera !== false) {
- this._startLocalVideo();
- }
- this._startLocalAudio();
+ // Removed automatic track creation - users must create tracks explicitly
}
componentWillUnmount() {
this._unregisterEvents();
- this._stopLocalVideo();
- this._stopLocalAudio();
+ // Clean up is handled by destroyLocalTrack calls from user code
}
/**
@@ -191,20 +187,6 @@ export default class TwilioVideo extends Component {
return Promise.resolve(enabled);
}
- /**
- * Enable or disable local video
- */
- setLocalVideoEnabled(enabled) {
- return TWVideoModule.setLocalVideoEnabled(enabled);
- }
-
- /**
- * Enable or disable local audio
- */
- setLocalAudioEnabled(enabled) {
- return TWVideoModule.setLocalAudioEnabled(enabled);
- }
-
/**
* Filp between the front and back camera
*/
@@ -269,56 +251,93 @@ export default class TwilioVideo extends Component {
TWVideoModule.disconnect();
}
+ /**
+ * Create a local audio track
+ * @param {LocalAudioTrackConfig} config - Configuration for the audio track
+ * @returns {Promise} - Promise that resolves to the track name
+ */
+ createLocalAudioTrack(config) {
+ return TWVideoModule.createLocalAudioTrack(config);
+ }
+
+ /**
+ * Create a local video track
+ * @param {LocalVideoTrackConfig} config - Configuration for the video track
+ * @returns {Promise} - Promise that resolves to the track name
+ */
+ createLocalVideoTrack(config) {
+ return TWVideoModule.createLocalVideoTrack(config);
+ }
+
/**
* Publish a local audio track
+ * @param {string} trackName - Name of the track to publish
+ * @returns {Promise} - Promise that resolves to true if successful
*/
- publishLocalAudio() {
- TWVideoModule.publishLocalAudio();
+ publishLocalAudioTrack(trackName) {
+ return TWVideoModule.publishLocalAudioTrack(trackName);
}
/**
* Publish a local video track
+ * @param {string} trackName - Name of the track to publish
+ * @returns {Promise} - Promise that resolves to true if successful
*/
- publishLocalVideo() {
- TWVideoModule.publishLocalVideo();
+ publishLocalVideoTrack(trackName) {
+ return TWVideoModule.publishLocalVideoTrack(trackName);
}
/**
* Unpublish a local audio track
+ * @param {string} trackName - Name of the track to unpublish
+ * @returns {Promise} - Promise that resolves to true if successful
*/
- unpublishLocalAudio() {
- TWVideoModule.unpublishLocalAudio();
+ unpublishLocalAudioTrack(trackName) {
+ return TWVideoModule.unpublishLocalAudioTrack(trackName);
}
/**
* Unpublish a local video track
+ * @param {string} trackName - Name of the track to unpublish
+ * @returns {Promise} - Promise that resolves to true if successful
*/
- unpublishLocalVideo() {
- TWVideoModule.unpublishLocalVideo();
+ unpublishLocalVideoTrack(trackName) {
+ return TWVideoModule.unpublishLocalVideoTrack(trackName);
}
/**
- * SendString to datatrack
- * @param {String} message The message string to send
+ * Destroy a local track
+ * @param {string} trackName - Name of the track to destroy
+ * @returns {Promise} - Promise that resolves to true if successful
*/
- sendString(message) {
- TWVideoModule.sendString(message);
+ destroyLocalTrack(trackName) {
+ return TWVideoModule.destroyLocalTrack(trackName);
}
- _startLocalVideo() {
- TWVideoModule.startLocalVideo();
- }
-
- _stopLocalVideo() {
- TWVideoModule.stopLocalVideo();
+ /**
+ * Enable or disable a local track
+ * @param {string} trackName - Name of the track to enable/disable
+ * @param {boolean} enabled - Whether to enable or disable the track
+ * @returns {Promise} - Promise that resolves to true if successful
+ */
+ enableLocalTrack(trackName, enabled) {
+ return TWVideoModule.enableLocalTrack(trackName, enabled);
}
- _startLocalAudio() {
- TWVideoModule.startLocalAudio();
+ /**
+ * Get all local tracks
+ * @returns {Promise} - Promise that resolves to an array of track publications
+ */
+ getLocalTracks() {
+ return TWVideoModule.getLocalTracks();
}
- _stopLocalAudio() {
- TWVideoModule.stopLocalAudio();
+ /**
+ * SendString to datatrack
+ * @param {String} message The message string to send
+ */
+ sendString(message) {
+ TWVideoModule.sendString(message);
}
_unregisterEvents() {
diff --git a/src/TwilioVideoLocalView.android.js b/src/TwilioVideoLocalView.android.js
index 836f3536..69e03cd4 100644
--- a/src/TwilioVideoLocalView.android.js
+++ b/src/TwilioVideoLocalView.android.js
@@ -14,6 +14,14 @@ const propTypes = {
// Whether to apply Z ordering to this view. Setting this to true will cause
// this view to appear above other Twilio Video views.
applyZOrder: PropTypes.bool,
+ /**
+ * Indicate if video feed is enabled.
+ */
+ enabled: PropTypes.bool.isRequired,
+ /**
+ * Optional track name for multiple track support.
+ */
+ trackName: PropTypes.string,
/**
* How the video stream should be scaled to fit its
* container.
diff --git a/yarn.lock b/yarn.lock
index 74483fd9..217dba43 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -26,7 +26,7 @@
"@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3"
chokidar "^3.4.0"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@~7.10.4", "@babel/code-frame@7.10.4":
+"@babel/code-frame@7.10.4", "@babel/code-frame@~7.10.4":
version "7.10.4"
resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz"
integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
@@ -53,7 +53,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz"
integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==
-"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.14.0", "@babel/core@^7.20.0", "@babel/core@^7.23.9", "@babel/core@^7.4.0-0", "@babel/core@^7.7.5", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8":
+"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.20.0", "@babel/core@^7.7.5":
version "7.25.2"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz"
integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==
@@ -74,7 +74,7 @@
json5 "^2.2.3"
semver "^6.3.1"
-"@babel/generator@^7.12.11", "@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2":
+"@babel/generator@^7.12.11", "@babel/generator@^7.25.0", "@babel/generator@^7.25.6":
version "7.25.6"
resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz"
integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==
@@ -295,7 +295,7 @@
js-tokens "^4.0.0"
picocolors "^1.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6":
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6":
version "7.25.6"
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz"
integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
@@ -550,7 +550,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2":
+"@babel/plugin-syntax-jsx@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz"
integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==
@@ -613,7 +613,7 @@
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.20.0":
version "7.20.0"
resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz"
integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==
@@ -1079,32 +1079,12 @@
dependencies:
eslint-visitor-keys "^3.3.0"
-"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1":
+"@eslint-community/regexpp@^4.4.0":
version "4.11.1"
resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz"
integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==
-"@eslint/eslintrc@^2.1.4":
- version "2.1.4"
- resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz"
- integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
- dependencies:
- ajv "^6.12.4"
- debug "^4.3.2"
- espree "^9.6.0"
- globals "^13.19.0"
- ignore "^5.2.0"
- import-fresh "^3.2.1"
- js-yaml "^4.1.0"
- minimatch "^3.1.2"
- strip-json-comments "^3.1.1"
-
-"@eslint/js@8.57.1":
- version "8.57.1"
- resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz"
- integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
-
-"@expo/bunyan@^4.0.0", "@expo/bunyan@4.0.0":
+"@expo/bunyan@4.0.0", "@expo/bunyan@^4.0.0":
version "4.0.0"
resolved "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz"
integrity sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==
@@ -1189,7 +1169,7 @@
node-forge "^1.2.1"
nullthrows "^1.1.1"
-"@expo/config-plugins@~5.0.3", "@expo/config-plugins@5.0.4":
+"@expo/config-plugins@5.0.4", "@expo/config-plugins@~5.0.3":
version "5.0.4"
resolved "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-5.0.4.tgz"
integrity sha512-vzUcVpqOMs3h+hyRdhGwk+eGIOhXa5xYdd92yO17RMNHav3v/+ekMbs7XA2c3lepMO8Yd4/5hqmRw9ZTL6jGzg==
@@ -1241,7 +1221,7 @@
resolved "https://registry.npmjs.org/@expo/config-types/-/config-types-48.0.0.tgz"
integrity sha512-DwyV4jTy/+cLzXGAo1xftS6mVlSiLIWZjl9DjTCLPFVgNYQxnh7htPilRv4rBhiNs7KaznWqKU70+4zQoKVT9A==
-"@expo/config@~7.0.2", "@expo/config@7.0.3":
+"@expo/config@7.0.3", "@expo/config@~7.0.2":
version "7.0.3"
resolved "https://registry.npmjs.org/@expo/config/-/config-7.0.3.tgz"
integrity sha512-joVtB5o+NF40Tmsdp65UzryRtbnCuMbXkVO4wJnNJO4aaK0EYLdHCYSewORVqNcDfGN0LphQr8VTG2npbd9CJA==
@@ -1333,15 +1313,6 @@
semver "7.3.2"
tempy "0.3.0"
-"@expo/json-file@^8.2.35", "@expo/json-file@^8.2.37", "@expo/json-file@~8.2.37":
- version "8.2.37"
- resolved "https://registry.npmjs.org/@expo/json-file/-/json-file-8.2.37.tgz"
- integrity sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q==
- dependencies:
- "@babel/code-frame" "~7.10.4"
- json5 "^2.2.2"
- write-file-atomic "^2.3.0"
-
"@expo/json-file@8.2.36":
version "8.2.36"
resolved "https://registry.npmjs.org/@expo/json-file/-/json-file-8.2.36.tgz"
@@ -1351,6 +1322,15 @@
json5 "^1.0.1"
write-file-atomic "^2.3.0"
+"@expo/json-file@^8.2.35", "@expo/json-file@^8.2.37", "@expo/json-file@~8.2.37":
+ version "8.2.37"
+ resolved "https://registry.npmjs.org/@expo/json-file/-/json-file-8.2.37.tgz"
+ integrity sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q==
+ dependencies:
+ "@babel/code-frame" "~7.10.4"
+ json5 "^2.2.2"
+ write-file-atomic "^2.3.0"
+
"@expo/metro-config@~0.5.0", "@expo/metro-config@~0.5.1":
version "0.5.2"
resolved "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.5.2.tgz"
@@ -1372,7 +1352,7 @@
dependencies:
semver "^5.3.0"
-"@expo/osascript@^2.0.31", "@expo/osascript@2.0.33":
+"@expo/osascript@2.0.33", "@expo/osascript@^2.0.31":
version "2.0.33"
resolved "https://registry.npmjs.org/@expo/osascript/-/osascript-2.0.33.tgz"
integrity sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ==
@@ -1396,7 +1376,7 @@
split "^1.0.1"
sudo-prompt "9.1.1"
-"@expo/plist@^0.0.18", "@expo/plist@0.0.18":
+"@expo/plist@0.0.18", "@expo/plist@^0.0.18":
version "0.0.18"
resolved "https://registry.npmjs.org/@expo/plist/-/plist-0.0.18.tgz"
integrity sha512-+48gRqUiz65R21CZ/IXa7RNBXgAI/uPSdvJqoN9x1hfL44DNbUoWHgHiEXTx7XelcATpDwNTz6sHLfy0iNqf+w==
@@ -1448,7 +1428,7 @@
resolved "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz"
integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==
-"@expo/spawn-async@^1.5.0", "@expo/spawn-async@1.5.0":
+"@expo/spawn-async@1.5.0", "@expo/spawn-async@^1.5.0":
version "1.5.0"
resolved "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz"
integrity sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==
@@ -1480,25 +1460,6 @@
resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz"
integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==
-"@humanwhocodes/config-array@^0.13.0":
- version "0.13.0"
- resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz"
- integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==
- dependencies:
- "@humanwhocodes/object-schema" "^2.0.3"
- debug "^4.3.1"
- minimatch "^3.0.5"
-
-"@humanwhocodes/module-importer@^1.0.1":
- version "1.0.1"
- resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
- integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
-
-"@humanwhocodes/object-schema@^2.0.3":
- version "2.0.3"
- resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz"
- integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
-
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz"
@@ -1527,40 +1488,6 @@
jest-util "^29.7.0"
slash "^3.0.0"
-"@jest/core@^29.7.0":
- version "29.7.0"
- resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz"
- integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==
- dependencies:
- "@jest/console" "^29.7.0"
- "@jest/reporters" "^29.7.0"
- "@jest/test-result" "^29.7.0"
- "@jest/transform" "^29.7.0"
- "@jest/types" "^29.6.3"
- "@types/node" "*"
- ansi-escapes "^4.2.1"
- chalk "^4.0.0"
- ci-info "^3.2.0"
- exit "^0.1.2"
- graceful-fs "^4.2.9"
- jest-changed-files "^29.7.0"
- jest-config "^29.7.0"
- jest-haste-map "^29.7.0"
- jest-message-util "^29.7.0"
- jest-regex-util "^29.6.3"
- jest-resolve "^29.7.0"
- jest-resolve-dependencies "^29.7.0"
- jest-runner "^29.7.0"
- jest-runtime "^29.7.0"
- jest-snapshot "^29.7.0"
- jest-util "^29.7.0"
- jest-validate "^29.7.0"
- jest-watcher "^29.7.0"
- micromatch "^4.0.4"
- pretty-format "^29.7.0"
- slash "^3.0.0"
- strip-ansi "^6.0.0"
-
"@jest/create-cache-key-function@^29.2.1":
version "29.5.0"
resolved "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.5.0.tgz"
@@ -1568,7 +1495,7 @@
dependencies:
"@jest/types" "^29.5.0"
-"@jest/environment@^29.5.0", "@jest/environment@^29.7.0":
+"@jest/environment@^29.5.0":
version "29.7.0"
resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz"
integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==
@@ -1585,14 +1512,6 @@
dependencies:
jest-get-type "^29.6.3"
-"@jest/expect@^29.7.0":
- version "29.7.0"
- resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz"
- integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==
- dependencies:
- expect "^29.7.0"
- jest-snapshot "^29.7.0"
-
"@jest/fake-timers@^29.5.0", "@jest/fake-timers@^29.7.0":
version "29.7.0"
resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz"
@@ -1605,46 +1524,6 @@
jest-mock "^29.7.0"
jest-util "^29.7.0"
-"@jest/globals@^29.7.0":
- version "29.7.0"
- resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz"
- integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==
- dependencies:
- "@jest/environment" "^29.7.0"
- "@jest/expect" "^29.7.0"
- "@jest/types" "^29.6.3"
- jest-mock "^29.7.0"
-
-"@jest/reporters@^29.7.0":
- version "29.7.0"
- resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz"
- integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==
- dependencies:
- "@bcoe/v8-coverage" "^0.2.3"
- "@jest/console" "^29.7.0"
- "@jest/test-result" "^29.7.0"
- "@jest/transform" "^29.7.0"
- "@jest/types" "^29.6.3"
- "@jridgewell/trace-mapping" "^0.3.18"
- "@types/node" "*"
- chalk "^4.0.0"
- collect-v8-coverage "^1.0.0"
- exit "^0.1.2"
- glob "^7.1.3"
- graceful-fs "^4.2.9"
- istanbul-lib-coverage "^3.0.0"
- istanbul-lib-instrument "^6.0.0"
- istanbul-lib-report "^3.0.0"
- istanbul-lib-source-maps "^4.0.0"
- istanbul-reports "^3.1.3"
- jest-message-util "^29.7.0"
- jest-util "^29.7.0"
- jest-worker "^29.7.0"
- slash "^3.0.0"
- string-length "^4.0.1"
- strip-ansi "^6.0.0"
- v8-to-istanbul "^9.0.1"
-
"@jest/schemas@^29.4.3", "@jest/schemas@^29.6.3":
version "29.6.3"
resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz"
@@ -1652,15 +1531,6 @@
dependencies:
"@sinclair/typebox" "^0.27.8"
-"@jest/source-map@^29.6.3":
- version "29.6.3"
- resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz"
- integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==
- dependencies:
- "@jridgewell/trace-mapping" "^0.3.18"
- callsites "^3.0.0"
- graceful-fs "^4.2.9"
-
"@jest/test-result@^29.7.0":
version "29.7.0"
resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz"
@@ -1671,16 +1541,6 @@
"@types/istanbul-lib-coverage" "^2.0.0"
collect-v8-coverage "^1.0.0"
-"@jest/test-sequencer@^29.7.0":
- version "29.7.0"
- resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz"
- integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==
- dependencies:
- "@jest/test-result" "^29.7.0"
- graceful-fs "^4.2.9"
- jest-haste-map "^29.7.0"
- slash "^3.0.0"
-
"@jest/transform@^29.7.0":
version "29.7.0"
resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz"
@@ -1713,7 +1573,7 @@
"@types/yargs" "^15.0.0"
chalk "^4.0.0"
-"@jest/types@^29.0.0", "@jest/types@^29.5.0", "@jest/types@^29.6.3":
+"@jest/types@^29.5.0", "@jest/types@^29.6.3":
version "29.6.3"
resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz"
integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==
@@ -1778,12 +1638,12 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
-"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+"@nodelib/fs.walk@^1.2.3":
version "1.2.8"
resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
@@ -2068,7 +1928,7 @@
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.50.0":
+"@typescript-eslint/parser@^5.50.0":
version "5.55.0"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz"
integrity sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==
@@ -2136,12 +1996,7 @@
"@typescript-eslint/types" "5.55.0"
eslint-visitor-keys "^3.3.0"
-"@ungap/structured-clone@^1.2.0":
- version "1.2.0"
- resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz"
- integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
-
-"@urql/core@>=2.3.1", "@urql/core@2.3.6":
+"@urql/core@2.3.6", "@urql/core@>=2.3.1":
version "2.3.6"
resolved "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz"
integrity sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==
@@ -2183,17 +2038,12 @@ acorn-globals@^7.0.0:
acorn "^8.1.0"
acorn-walk "^8.0.2"
-acorn-jsx@^5.3.2:
- version "5.3.2"
- resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
- integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-
acorn-walk@^8.0.2:
version "8.2.0"
resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
-"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.1.0, acorn@^8.8.1, acorn@^8.9.0:
+acorn@^8.1.0, acorn@^8.8.1:
version "8.12.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz"
integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
@@ -2213,16 +2063,6 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^4.0.0"
-ajv@^6.12.4:
- version "6.12.6"
- resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
- integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
- dependencies:
- fast-deep-equal "^3.1.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
ajv@^8.11.0:
version "8.12.0"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz"
@@ -2252,14 +2092,7 @@ ansi-escapes@^3.1.0:
resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz"
integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
-ansi-escapes@^4.2.1:
- version "4.3.2"
- resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz"
- integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
- dependencies:
- type-fest "^0.21.3"
-
-ansi-escapes@^4.3.0:
+ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
version "4.3.2"
resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz"
integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
@@ -2312,14 +2145,7 @@ ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
-ansi-styles@^4.0.0:
- version "4.3.0"
- resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
- integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
- dependencies:
- color-convert "^2.0.1"
-
-ansi-styles@^4.1.0:
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
@@ -2331,7 +2157,7 @@ ansi-styles@^5.0.0:
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz"
integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
-ansi-wrap@^0.1.0, ansi-wrap@0.1.0:
+ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
version "0.1.0"
resolved "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz"
integrity sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==
@@ -2541,6 +2367,11 @@ assign-symbols@^1.0.0:
resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz"
integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
+ast-types@0.10.1:
+ version "0.10.1"
+ resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz"
+ integrity sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==
+
ast-types@^0.14.2:
version "0.14.2"
resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz"
@@ -2548,11 +2379,6 @@ ast-types@^0.14.2:
dependencies:
tslib "^2.0.1"
-ast-types@0.10.1:
- version "0.10.1"
- resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz"
- integrity sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==
-
async-done@^1.2.0, async-done@^1.2.2:
version "1.3.2"
resolved "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz"
@@ -2621,7 +2447,7 @@ babel-eslint@^7.2.3:
babel-types "^6.23.0"
babylon "^6.17.0"
-babel-jest@^29.0.0, babel-jest@^29.2.1, babel-jest@^29.7.0:
+babel-jest@^29.2.1:
version "29.7.0"
resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz"
integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==
@@ -2822,6 +2648,11 @@ balanced-match@^1.0.0:
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+base64-js@^1.2.3, base64-js@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
base@^0.11.1:
version "0.11.2"
resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz"
@@ -2835,11 +2666,6 @@ base@^0.11.1:
mixin-deep "^1.2.0"
pascalcase "^0.1.1"
-base64-js@^1.2.3, base64-js@^1.5.1:
- version "1.5.1"
- resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
- integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-
better-opn@~3.0.2:
version "3.0.2"
resolved "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz"
@@ -2904,13 +2730,6 @@ bplist-creator@0.1.0:
dependencies:
stream-buffers "2.2.x"
-bplist-parser@^0.3.1:
- version "0.3.2"
- resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz"
- integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==
- dependencies:
- big-integer "1.6.x"
-
bplist-parser@0.3.1:
version "0.3.1"
resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz"
@@ -2918,6 +2737,13 @@ bplist-parser@0.3.1:
dependencies:
big-integer "1.6.x"
+bplist-parser@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz"
+ integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==
+ dependencies:
+ big-integer "1.6.x"
+
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
@@ -2949,7 +2775,7 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
-browserslist@^4.21.5, browserslist@^4.23.1, "browserslist@>= 4.21.0":
+browserslist@^4.21.5, browserslist@^4.23.1:
version "4.24.0"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz"
integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==
@@ -3076,11 +2902,6 @@ call-bind@^1.0.0, call-bind@^1.0.2:
function-bind "^1.1.1"
get-intrinsic "^1.0.2"
-callsites@^3.0.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
- integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-
camelcase@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz"
@@ -3091,11 +2912,6 @@ camelcase@^5.3.1:
resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-camelcase@^6.2.0:
- version "6.3.0"
- resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz"
- integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-
caniuse-lite@^1.0.30001663:
version "1.0.30001666"
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz"
@@ -3112,16 +2928,7 @@ chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
-chalk@^2.0.1:
- version "2.4.2"
- resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
- integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
- dependencies:
- ansi-styles "^3.2.1"
- escape-string-regexp "^1.0.5"
- supports-color "^5.3.0"
-
-chalk@^2.4.2:
+chalk@^2.0.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -3171,7 +2978,7 @@ character-reference-invalid@^1.0.0:
resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz"
integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
-charenc@~0.0.1, charenc@0.0.2:
+charenc@0.0.2, charenc@~0.0.1:
version "0.0.2"
resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz"
integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
@@ -3220,11 +3027,6 @@ ci-info@^3.2.0, ci-info@^3.3.0:
resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz"
integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
-cjs-module-lexer@^1.0.0:
- version "1.4.1"
- resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz"
- integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==
-
class-utils@^0.3.5:
version "0.3.6"
resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz"
@@ -3270,15 +3072,6 @@ cliui@^7.0.2:
strip-ansi "^6.0.0"
wrap-ansi "^7.0.0"
-cliui@^8.0.1:
- version "8.0.1"
- resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz"
- integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
- dependencies:
- string-width "^4.2.0"
- strip-ansi "^6.0.1"
- wrap-ansi "^7.0.0"
-
clone-buffer@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz"
@@ -3308,11 +3101,6 @@ cloneable-readable@^1.0.0:
process-nextick-args "^2.0.0"
readable-stream "^2.3.5"
-co@^4.6.0:
- version "4.6.0"
- resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz"
- integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
-
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz"
@@ -3359,16 +3147,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
-color-name@~1.1.4:
- version "1.1.4"
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
color-support@^1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz"
@@ -3386,12 +3174,7 @@ command-exists@^1.2.4:
resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz"
integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
-commander@^2.19.0:
- version "2.20.3"
- resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
- integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-
-commander@^2.9.0:
+commander@^2.19.0, commander@^2.9.0:
version "2.20.3"
resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -3498,19 +3281,6 @@ core-util-is@~1.0.0:
resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
-create-jest@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz"
- integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==
- dependencies:
- "@jest/types" "^29.6.3"
- chalk "^4.0.0"
- exit "^0.1.2"
- graceful-fs "^4.2.9"
- jest-config "^29.7.0"
- jest-util "^29.7.0"
- prompts "^2.0.1"
-
cross-fetch@^3.1.5:
version "3.1.5"
resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz"
@@ -3538,25 +3308,7 @@ cross-spawn@^7.0.0:
shebang-command "^2.0.0"
which "^2.0.1"
-cross-spawn@^7.0.2:
- version "7.0.3"
- resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-cross-spawn@^7.0.3:
- version "7.0.3"
- resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-crypt@~0.0.1, crypt@0.0.2:
+crypt@0.0.2, crypt@~0.0.1:
version "0.0.2"
resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz"
integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
@@ -3593,7 +3345,7 @@ csstype@^3.0.2:
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz"
integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
-d@^1.0.1, d@1:
+d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz"
integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
@@ -3615,61 +3367,26 @@ data-urls@^3.0.2:
whatwg-mimetype "^3.0.0"
whatwg-url "^11.0.0"
-debug@^2.1.3:
- version "2.6.9"
- resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
-debug@^2.2.0:
- version "2.6.9"
- resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
-debug@^2.3.3:
- version "2.6.9"
- resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
-debug@^2.6.8:
+debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
-debug@^3.1.0:
- version "3.2.7"
- resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
- integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
- dependencies:
- ms "^2.1.1"
-
-debug@^3.2.7:
- version "3.2.7"
- resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
- integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
- dependencies:
- ms "^2.1.1"
-
-debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4:
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
-debug@2.6.9:
- version "2.6.9"
- resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+debug@^3.1.0, debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
dependencies:
- ms "2.0.0"
+ ms "^2.1.1"
decamelize@^1.1.1:
version "1.2.0"
@@ -3686,26 +3403,16 @@ decode-uri-component@^0.2.0:
resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz"
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
-dedent@^1.0.0:
- version "1.5.3"
- resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz"
- integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==
-
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
-deep-is@^0.1.3, deep-is@~0.1.3:
+deep-is@~0.1.3:
version "0.1.4"
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
-deepmerge@^4.2.2:
- version "4.3.1"
- resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"
- integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
-
default-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz"
@@ -3814,11 +3521,6 @@ detect-file@^1.0.0:
resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz"
integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==
-detect-newline@^3.0.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz"
- integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
-
diff-sequences@^29.6.3:
version "29.6.3"
resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz"
@@ -3865,7 +3567,7 @@ dom-serializer@0:
domelementtype "^2.0.1"
entities "^2.0.0"
-domelementtype@^1.3.0, domelementtype@1:
+domelementtype@1, domelementtype@^1.3.0:
version "1.3.1"
resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz"
integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
@@ -3977,7 +3679,7 @@ eol@^0.9.1:
resolved "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz"
integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==
-error-ex@^1.2.0, error-ex@^1.3.1:
+error-ex@^1.2.0:
version "1.3.2"
resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
@@ -4105,11 +3807,6 @@ escape-string-regexp@^2.0.0:
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz"
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
-escape-string-regexp@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
- integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-
escodegen@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz"
@@ -4239,14 +3936,6 @@ eslint-scope@^5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-eslint-scope@^7.2.2:
- version "7.2.2"
- resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz"
- integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
- dependencies:
- esrecurse "^4.3.0"
- estraverse "^5.2.0"
-
eslint-utils@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz"
@@ -4259,76 +3948,16 @@ eslint-visitor-keys@^1.1.0:
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
-eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+eslint-visitor-keys@^3.3.0:
version "3.4.3"
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
-eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@>=4.19.1, eslint@>=5.16.0, eslint@>=7.0.0, eslint@>=7.28.0, eslint@>=8.10:
- version "8.57.1"
- resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
- integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
- dependencies:
- "@eslint-community/eslint-utils" "^4.2.0"
- "@eslint-community/regexpp" "^4.6.1"
- "@eslint/eslintrc" "^2.1.4"
- "@eslint/js" "8.57.1"
- "@humanwhocodes/config-array" "^0.13.0"
- "@humanwhocodes/module-importer" "^1.0.1"
- "@nodelib/fs.walk" "^1.2.8"
- "@ungap/structured-clone" "^1.2.0"
- ajv "^6.12.4"
- chalk "^4.0.0"
- cross-spawn "^7.0.2"
- debug "^4.3.2"
- doctrine "^3.0.0"
- escape-string-regexp "^4.0.0"
- eslint-scope "^7.2.2"
- eslint-visitor-keys "^3.4.3"
- espree "^9.6.1"
- esquery "^1.4.2"
- esutils "^2.0.2"
- fast-deep-equal "^3.1.3"
- file-entry-cache "^6.0.1"
- find-up "^5.0.0"
- glob-parent "^6.0.2"
- globals "^13.19.0"
- graphemer "^1.4.0"
- ignore "^5.2.0"
- imurmurhash "^0.1.4"
- is-glob "^4.0.0"
- is-path-inside "^3.0.3"
- js-yaml "^4.1.0"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.4.1"
- lodash.merge "^4.6.2"
- minimatch "^3.1.2"
- natural-compare "^1.4.0"
- optionator "^0.9.3"
- strip-ansi "^6.0.1"
- text-table "^0.2.0"
-
-espree@^9.6.0, espree@^9.6.1:
- version "9.6.1"
- resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz"
- integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
- dependencies:
- acorn "^8.9.0"
- acorn-jsx "^5.3.2"
- eslint-visitor-keys "^3.4.1"
-
esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
version "4.0.1"
resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.4.2:
- version "1.6.0"
- resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"
- integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
- dependencies:
- estraverse "^5.1.0"
-
esrecurse@^4.3.0:
version "4.3.0"
resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
@@ -4341,17 +3970,7 @@ estraverse@^4.1.1:
resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-estraverse@^5.1.0:
- version "5.3.0"
- resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
- integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
-
-estraverse@^5.2.0:
- version "5.3.0"
- resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
- integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
-
-estraverse@^5.3.0:
+estraverse@^5.2.0, estraverse@^5.3.0:
version "5.3.0"
resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
@@ -4393,26 +4012,6 @@ execa@^1.0.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
-execa@^5.0.0:
- version "5.1.1"
- resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
- integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
- dependencies:
- cross-spawn "^7.0.3"
- get-stream "^6.0.0"
- human-signals "^2.1.0"
- is-stream "^2.0.0"
- merge-stream "^2.0.0"
- npm-run-path "^4.0.1"
- onetime "^5.1.2"
- signal-exit "^3.0.3"
- strip-final-newline "^2.0.0"
-
-exit@^0.1.2:
- version "0.1.2"
- resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
- integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
-
expand-brackets@^2.1.4:
version "2.1.4"
resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz"
@@ -4433,7 +4032,7 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
dependencies:
homedir-polyfill "^1.0.1"
-expect@^29.0.0, expect@^29.7.0:
+expect@^29.0.0:
version "29.7.0"
resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz"
integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==
@@ -4522,7 +4121,7 @@ expo-module-scripts@^3.0.7:
ts-jest "~29.0.4"
typescript "^4.9.4"
-expo-modules-autolinking@>=0.8.1, expo-modules-autolinking@1.0.2:
+expo-modules-autolinking@1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.0.2.tgz"
integrity sha512-skAUXERKw1gtSw8xsvft9DE0KVhBvw4dujAtgCZoG2l513fN7ds+B5+30ZVgZATMC+EjtlmjKXzhp5QS44DCFA==
@@ -4541,7 +4140,7 @@ expo-modules-core@1.1.1:
compare-versions "^3.4.0"
invariant "^2.2.4"
-expo@*, expo@^47.0.0:
+expo@^47.0.0:
version "47.0.14"
resolved "https://registry.npmjs.org/expo/-/expo-47.0.14.tgz"
integrity sha512-WA6BbLI00R9TweBHRVm+kAFoYqkYOK4oMizNV2CmpxEJaRm8J4R9KI2+WnfkYVPiW6dzDTUR4bG6yAwgzSowEA==
@@ -4612,17 +4211,7 @@ extglob@^2.0.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
-fancy-log@^1.2.0:
- version "1.3.3"
- resolved "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz"
- integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
- dependencies:
- ansi-gray "^0.1.1"
- color-support "^1.1.3"
- parse-node-version "^1.0.0"
- time-stamp "^1.0.0"
-
-fancy-log@^1.3.2:
+fancy-log@^1.2.0, fancy-log@^1.3.2:
version "1.3.3"
resolved "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz"
integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
@@ -4639,7 +4228,7 @@ fancy-log@^2.0.0:
dependencies:
color-support "^1.1.3"
-fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+fast-deep-equal@^3.1.1:
version "3.1.3"
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
@@ -4660,7 +4249,7 @@ fast-glob@^3.2.5, fast-glob@^3.2.9:
merge2 "^1.3.0"
micromatch "^4.0.4"
-fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x:
+fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
@@ -4670,7 +4259,7 @@ fast-levenshtein@^1.0.0:
resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz"
integrity sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==
-fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
+fast-levenshtein@~2.0.6:
version "2.0.6"
resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
@@ -4726,13 +4315,6 @@ fetch-retry@^4.1.1:
resolved "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz"
integrity sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==
-file-entry-cache@^6.0.1:
- version "6.0.1"
- resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
- integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
- dependencies:
- flat-cache "^3.0.4"
-
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz"
@@ -4791,14 +4373,6 @@ find-up@^3.0.0:
dependencies:
locate-path "^3.0.0"
-find-up@^4.0.0:
- version "4.1.0"
- resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
- integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
- dependencies:
- locate-path "^5.0.0"
- path-exists "^4.0.0"
-
find-up@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
@@ -4858,20 +4432,6 @@ flagged-respawn@^1.0.0:
resolved "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz"
integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
-flat-cache@^3.0.4:
- version "3.2.0"
- resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz"
- integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
- dependencies:
- flatted "^3.2.9"
- keyv "^4.5.3"
- rimraf "^3.0.2"
-
-flatted@^3.2.9:
- version "3.3.1"
- resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz"
- integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
-
flush-write-stream@^1.0.2:
version "1.1.1"
resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz"
@@ -4952,17 +4512,17 @@ fresh@0.5.2:
resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
-fs-extra@^9.0.0:
- version "9.1.0"
- resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
- integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+fs-extra@9.0.0:
+ version "9.0.0"
+ resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz"
+ integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==
dependencies:
at-least-node "^1.0.0"
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
- universalify "^2.0.0"
+ universalify "^1.0.0"
-fs-extra@^9.1.0:
+fs-extra@^9.0.0, fs-extra@^9.1.0:
version "9.1.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
@@ -4981,16 +4541,6 @@ fs-extra@~8.1.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
-fs-extra@9.0.0:
- version "9.0.0"
- resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz"
- integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==
- dependencies:
- at-least-node "^1.0.0"
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^1.0.0"
-
fs-minipass@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz"
@@ -5090,11 +4640,6 @@ get-stream@^4.0.0:
dependencies:
pump "^3.0.0"
-get-stream@^6.0.0:
- version "6.0.1"
- resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"
- integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
-
get-symbol-description@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz"
@@ -5128,13 +4673,6 @@ glob-parent@^5.1.2, glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
-glob-parent@^6.0.2:
- version "6.0.2"
- resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
- integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
- dependencies:
- is-glob "^4.0.3"
-
glob-stream@^6.1.0:
version "6.1.0"
resolved "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz"
@@ -5164,18 +4702,7 @@ glob-watcher@^5.0.3:
normalize-path "^3.0.0"
object.defaults "^1.1.0"
-glob@^6.0.1:
- version "6.0.4"
- resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz"
- integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==
- dependencies:
- inflight "^1.0.4"
- inherits "2"
- minimatch "2 || 3"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@7.1.6:
+glob@7.1.6, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.1.6"
resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -5187,19 +4714,18 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, gl
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.1.7:
- version "7.2.3"
- resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
- integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+glob@^6.0.1:
+ version "6.0.4"
+ resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz"
+ integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==
dependencies:
- fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
- minimatch "^3.1.1"
+ minimatch "2 || 3"
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.2.0:
+glob@^7.1.7, glob@^7.2.0:
version "7.2.3"
resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@@ -5236,13 +4762,6 @@ globals@^11.1.0:
resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^13.19.0:
- version "13.24.0"
- resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz"
- integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
- dependencies:
- type-fest "^0.20.2"
-
globals@^9.18.0:
version "9.18.0"
resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz"
@@ -5302,11 +4821,6 @@ grapheme-splitter@^1.0.4:
resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz"
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
-graphemer@^1.4.0:
- version "1.4.0"
- resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz"
- integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
-
graphql-tag@^2.10.1:
version "2.12.6"
resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz"
@@ -5314,7 +4828,7 @@ graphql-tag@^2.10.1:
dependencies:
tslib "^2.1.0"
-"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", graphql@15.8.0:
+graphql@15.8.0:
version "15.8.0"
resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz"
integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==
@@ -5580,11 +5094,6 @@ https-proxy-agent@^5.0.1:
agent-base "6"
debug "4"
-human-signals@^2.1.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
- integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
-
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
@@ -5604,22 +5113,6 @@ ignore@^5.1.1, ignore@^5.2.0:
resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz"
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
-import-fresh@^3.2.1:
- version "3.3.0"
- resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
- integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
- dependencies:
- parent-module "^1.0.0"
- resolve-from "^4.0.0"
-
-import-local@^3.0.2:
- version "3.2.0"
- resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz"
- integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==
- dependencies:
- pkg-dir "^4.2.0"
- resolve-cwd "^3.0.0"
-
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
@@ -5643,7 +5136,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4:
+inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -5785,7 +5278,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.9.0:
+is-core-module@^2.11.0, is-core-module@^2.9.0:
version "2.15.1"
resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz"
integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
@@ -5827,16 +5320,7 @@ is-descriptor@^0.1.0:
is-data-descriptor "^0.1.4"
kind-of "^5.0.0"
-is-descriptor@^1.0.0:
- version "1.0.2"
- resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz"
- integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
- dependencies:
- is-accessor-descriptor "^1.0.0"
- is-data-descriptor "^1.0.0"
- kind-of "^6.0.2"
-
-is-descriptor@^1.0.2:
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz"
integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
@@ -5884,11 +5368,6 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-is-generator-fn@^2.0.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz"
- integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
-
is-glob@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
@@ -5903,21 +5382,7 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
-is-glob@^4.0.0, is-glob@^4.0.3:
- version "4.0.3"
- resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
- integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-glob@^4.0.1:
- version "4.0.3"
- resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
- integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-glob@~4.0.1:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -5994,7 +5459,7 @@ is-path-inside@^1.0.0:
dependencies:
path-is-inside "^1.0.1"
-is-path-inside@^3.0.2, is-path-inside@^3.0.3:
+is-path-inside@^3.0.2:
version "3.0.3"
resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
@@ -6136,7 +5601,7 @@ is-wsl@^2.1.1, is-wsl@^2.2.0:
dependencies:
is-docker "^2.0.0"
-isarray@~1.0.0, isarray@1.0.0:
+isarray@1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
@@ -6174,17 +5639,6 @@ istanbul-lib-instrument@^5.0.4:
istanbul-lib-coverage "^3.2.0"
semver "^6.3.0"
-istanbul-lib-instrument@^6.0.0:
- version "6.0.3"
- resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz"
- integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==
- dependencies:
- "@babel/core" "^7.23.9"
- "@babel/parser" "^7.23.9"
- "@istanbuljs/schema" "^0.1.3"
- istanbul-lib-coverage "^3.2.0"
- semver "^7.5.4"
-
istanbul-lib-report@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz"
@@ -6194,16 +5648,7 @@ istanbul-lib-report@^3.0.0:
make-dir "^3.0.0"
supports-color "^7.1.0"
-istanbul-lib-source-maps@^4.0.0:
- version "4.0.1"
- resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz"
- integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
- dependencies:
- debug "^4.1.1"
- istanbul-lib-coverage "^3.0.0"
- source-map "^0.6.1"
-
-istanbul-reports@^3.1.3, istanbul-reports@^3.1.4:
+istanbul-reports@^3.1.4:
version "3.1.5"
resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz"
integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==
@@ -6211,86 +5656,6 @@ istanbul-reports@^3.1.3, istanbul-reports@^3.1.4:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
-jest-changed-files@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz"
- integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==
- dependencies:
- execa "^5.0.0"
- jest-util "^29.7.0"
- p-limit "^3.1.0"
-
-jest-circus@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz"
- integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==
- dependencies:
- "@jest/environment" "^29.7.0"
- "@jest/expect" "^29.7.0"
- "@jest/test-result" "^29.7.0"
- "@jest/types" "^29.6.3"
- "@types/node" "*"
- chalk "^4.0.0"
- co "^4.6.0"
- dedent "^1.0.0"
- is-generator-fn "^2.0.0"
- jest-each "^29.7.0"
- jest-matcher-utils "^29.7.0"
- jest-message-util "^29.7.0"
- jest-runtime "^29.7.0"
- jest-snapshot "^29.7.0"
- jest-util "^29.7.0"
- p-limit "^3.1.0"
- pretty-format "^29.7.0"
- pure-rand "^6.0.0"
- slash "^3.0.0"
- stack-utils "^2.0.3"
-
-jest-cli@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz"
- integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==
- dependencies:
- "@jest/core" "^29.7.0"
- "@jest/test-result" "^29.7.0"
- "@jest/types" "^29.6.3"
- chalk "^4.0.0"
- create-jest "^29.7.0"
- exit "^0.1.2"
- import-local "^3.0.2"
- jest-config "^29.7.0"
- jest-util "^29.7.0"
- jest-validate "^29.7.0"
- yargs "^17.3.1"
-
-jest-config@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz"
- integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==
- dependencies:
- "@babel/core" "^7.11.6"
- "@jest/test-sequencer" "^29.7.0"
- "@jest/types" "^29.6.3"
- babel-jest "^29.7.0"
- chalk "^4.0.0"
- ci-info "^3.2.0"
- deepmerge "^4.2.2"
- glob "^7.1.3"
- graceful-fs "^4.2.9"
- jest-circus "^29.7.0"
- jest-environment-node "^29.7.0"
- jest-get-type "^29.6.3"
- jest-regex-util "^29.6.3"
- jest-resolve "^29.7.0"
- jest-runner "^29.7.0"
- jest-util "^29.7.0"
- jest-validate "^29.7.0"
- micromatch "^4.0.4"
- parse-json "^5.2.0"
- pretty-format "^29.7.0"
- slash "^3.0.0"
- strip-json-comments "^3.1.1"
-
jest-diff@^29.7.0:
version "29.7.0"
resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz"
@@ -6301,24 +5666,6 @@ jest-diff@^29.7.0:
jest-get-type "^29.6.3"
pretty-format "^29.7.0"
-jest-docblock@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz"
- integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==
- dependencies:
- detect-newline "^3.0.0"
-
-jest-each@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz"
- integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==
- dependencies:
- "@jest/types" "^29.6.3"
- chalk "^4.0.0"
- jest-get-type "^29.6.3"
- jest-util "^29.7.0"
- pretty-format "^29.7.0"
-
jest-environment-jsdom@^29.2.1:
version "29.5.0"
resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz"
@@ -6333,18 +5680,6 @@ jest-environment-jsdom@^29.2.1:
jest-util "^29.5.0"
jsdom "^20.0.0"
-jest-environment-node@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz"
- integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==
- dependencies:
- "@jest/environment" "^29.7.0"
- "@jest/fake-timers" "^29.7.0"
- "@jest/types" "^29.6.3"
- "@types/node" "*"
- jest-mock "^29.7.0"
- jest-util "^29.7.0"
-
jest-expo@~48.0.0:
version "48.0.2"
resolved "https://registry.npmjs.org/jest-expo/-/jest-expo-48.0.2.tgz"
@@ -6385,14 +5720,6 @@ jest-haste-map@^29.7.0:
optionalDependencies:
fsevents "^2.3.2"
-jest-leak-detector@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz"
- integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==
- dependencies:
- jest-get-type "^29.6.3"
- pretty-format "^29.7.0"
-
jest-matcher-utils@^29.7.0:
version "29.7.0"
resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz"
@@ -6427,120 +5754,11 @@ jest-mock@^29.5.0, jest-mock@^29.7.0:
"@types/node" "*"
jest-util "^29.7.0"
-jest-pnp-resolver@^1.2.2:
- version "1.2.3"
- resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz"
- integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
-
jest-regex-util@^29.0.0, jest-regex-util@^29.6.3:
version "29.6.3"
resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz"
integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==
-jest-resolve-dependencies@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz"
- integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==
- dependencies:
- jest-regex-util "^29.6.3"
- jest-snapshot "^29.7.0"
-
-jest-resolve@*, jest-resolve@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz"
- integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==
- dependencies:
- chalk "^4.0.0"
- graceful-fs "^4.2.9"
- jest-haste-map "^29.7.0"
- jest-pnp-resolver "^1.2.2"
- jest-util "^29.7.0"
- jest-validate "^29.7.0"
- resolve "^1.20.0"
- resolve.exports "^2.0.0"
- slash "^3.0.0"
-
-jest-runner@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz"
- integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==
- dependencies:
- "@jest/console" "^29.7.0"
- "@jest/environment" "^29.7.0"
- "@jest/test-result" "^29.7.0"
- "@jest/transform" "^29.7.0"
- "@jest/types" "^29.6.3"
- "@types/node" "*"
- chalk "^4.0.0"
- emittery "^0.13.1"
- graceful-fs "^4.2.9"
- jest-docblock "^29.7.0"
- jest-environment-node "^29.7.0"
- jest-haste-map "^29.7.0"
- jest-leak-detector "^29.7.0"
- jest-message-util "^29.7.0"
- jest-resolve "^29.7.0"
- jest-runtime "^29.7.0"
- jest-util "^29.7.0"
- jest-watcher "^29.7.0"
- jest-worker "^29.7.0"
- p-limit "^3.1.0"
- source-map-support "0.5.13"
-
-jest-runtime@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz"
- integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==
- dependencies:
- "@jest/environment" "^29.7.0"
- "@jest/fake-timers" "^29.7.0"
- "@jest/globals" "^29.7.0"
- "@jest/source-map" "^29.6.3"
- "@jest/test-result" "^29.7.0"
- "@jest/transform" "^29.7.0"
- "@jest/types" "^29.6.3"
- "@types/node" "*"
- chalk "^4.0.0"
- cjs-module-lexer "^1.0.0"
- collect-v8-coverage "^1.0.0"
- glob "^7.1.3"
- graceful-fs "^4.2.9"
- jest-haste-map "^29.7.0"
- jest-message-util "^29.7.0"
- jest-mock "^29.7.0"
- jest-regex-util "^29.6.3"
- jest-resolve "^29.7.0"
- jest-snapshot "^29.7.0"
- jest-util "^29.7.0"
- slash "^3.0.0"
- strip-bom "^4.0.0"
-
-jest-snapshot@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz"
- integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==
- dependencies:
- "@babel/core" "^7.11.6"
- "@babel/generator" "^7.7.2"
- "@babel/plugin-syntax-jsx" "^7.7.2"
- "@babel/plugin-syntax-typescript" "^7.7.2"
- "@babel/types" "^7.3.3"
- "@jest/expect-utils" "^29.7.0"
- "@jest/transform" "^29.7.0"
- "@jest/types" "^29.6.3"
- babel-preset-current-node-syntax "^1.0.0"
- chalk "^4.0.0"
- expect "^29.7.0"
- graceful-fs "^4.2.9"
- jest-diff "^29.7.0"
- jest-get-type "^29.6.3"
- jest-matcher-utils "^29.7.0"
- jest-message-util "^29.7.0"
- jest-util "^29.7.0"
- natural-compare "^1.4.0"
- pretty-format "^29.7.0"
- semver "^7.5.3"
-
jest-util@^29.0.0, jest-util@^29.5.0, jest-util@^29.7.0:
version "29.7.0"
resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz"
@@ -6553,18 +5771,6 @@ jest-util@^29.0.0, jest-util@^29.5.0, jest-util@^29.7.0:
graceful-fs "^4.2.9"
picomatch "^2.2.3"
-jest-validate@^29.7.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz"
- integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==
- dependencies:
- "@jest/types" "^29.6.3"
- camelcase "^6.2.0"
- chalk "^4.0.0"
- jest-get-type "^29.6.3"
- leven "^3.1.0"
- pretty-format "^29.7.0"
-
jest-watch-select-projects@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz"
@@ -6587,7 +5793,7 @@ jest-watch-typeahead@2.2.1:
string-length "^5.0.1"
strip-ansi "^7.0.1"
-jest-watcher@^29.0.0, jest-watcher@^29.7.0:
+jest-watcher@^29.0.0:
version "29.7.0"
resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz"
integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==
@@ -6611,16 +5817,6 @@ jest-worker@^29.7.0:
merge-stream "^2.0.0"
supports-color "^8.0.0"
-"jest@^27.0.0 || ^28.0.0 || ^29.0.0", jest@^29.0.0:
- version "29.7.0"
- resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz"
- integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==
- dependencies:
- "@jest/core" "^29.7.0"
- "@jest/types" "^29.6.3"
- import-local "^3.0.2"
- jest-cli "^29.7.0"
-
jimp-compact@0.16.1:
version "0.16.1"
resolved "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz"
@@ -6698,16 +5894,6 @@ jsesc@~0.5.0:
resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
-json-buffer@3.0.1:
- version "3.0.1"
- resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
- integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
-
-json-parse-even-better-errors@^2.3.0:
- version "2.3.1"
- resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
- integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
-
json-schema-deref-sync@^0.13.0:
version "0.13.0"
resolved "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz"
@@ -6722,11 +5908,6 @@ json-schema-deref-sync@^0.13.0:
traverse "~0.6.6"
valid-url "~1.0.9"
-json-schema-traverse@^0.4.1:
- version "0.4.1"
- resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
- integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-
json-schema-traverse@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
@@ -6749,17 +5930,7 @@ json5@^1.0.1, json5@^1.0.2:
dependencies:
minimist "^1.2.0"
-json5@^2.1.0:
- version "2.2.3"
- resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
- integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
-
-json5@^2.2.2:
- version "2.2.3"
- resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
- integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
-
-json5@^2.2.3:
+json5@^2.1.0, json5@^2.2.2, json5@^2.2.3:
version "2.2.3"
resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
@@ -6793,28 +5964,7 @@ just-debounce@^1.0.0:
resolved "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz"
integrity sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==
-keyv@^4.5.3:
- version "4.5.4"
- resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
- integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
- dependencies:
- json-buffer "3.0.1"
-
-kind-of@^3.0.2:
- version "3.2.2"
- resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
- integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
- dependencies:
- is-buffer "^1.1.5"
-
-kind-of@^3.0.3:
- version "3.2.2"
- resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
- integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
- dependencies:
- is-buffer "^1.1.5"
-
-kind-of@^3.2.0:
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
@@ -6828,12 +5978,7 @@ kind-of@^4.0.0:
dependencies:
is-buffer "^1.1.5"
-kind-of@^5.0.0:
- version "5.1.0"
- resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz"
- integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-
-kind-of@^5.0.2:
+kind-of@^5.0.0, kind-of@^5.0.2:
version "5.1.0"
resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz"
integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
@@ -6877,19 +6022,6 @@ lead@^1.0.0:
dependencies:
flush-write-stream "^1.0.2"
-leven@^3.1.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz"
- integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
-
-levn@^0.4.1:
- version "0.4.1"
- resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
- integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
- dependencies:
- prelude-ls "^1.2.1"
- type-check "~0.4.0"
-
levn@~0.3.0:
version "0.3.0"
resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz"
@@ -6960,11 +6092,6 @@ lodash.memoize@4.x:
resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz"
integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
-lodash.merge@^4.6.2:
- version "4.6.2"
- resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
- integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-
lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
@@ -7198,26 +6325,7 @@ metro-react-native-babel-preset@0.73.7:
"@babel/template" "^7.0.0"
react-refresh "^0.4.0"
-micromatch@^3.0.4, micromatch@^3.1.10:
- version "3.1.10"
- resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz"
- integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
- dependencies:
- arr-diff "^4.0.0"
- array-unique "^0.3.2"
- braces "^2.3.1"
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- extglob "^2.0.4"
- fragment-cache "^0.2.1"
- kind-of "^6.0.2"
- nanomatch "^1.2.9"
- object.pick "^1.3.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.2"
-
-micromatch@^3.1.10, micromatch@^3.1.4:
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
version "3.1.10"
resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz"
integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
@@ -7256,32 +6364,27 @@ mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34:
dependencies:
mime-db "1.52.0"
-mime@^2.4.4:
- version "2.6.0"
- resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz"
- integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
-
mime@1.6.0:
version "1.6.0"
resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+mime@^2.4.4:
+ version "2.6.0"
+ resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz"
+ integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+
mimic-fn@^1.0.0:
version "1.2.0"
resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
-mimic-fn@^2.1.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
- integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-
min-indent@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz"
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
-minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, "minimatch@2 || 3":
+"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -7314,7 +6417,7 @@ minipass-pipeline@^1.2.2:
dependencies:
minipass "^3.0.0"
-minipass@^3.0.0, minipass@^3.1.1, minipass@3.1.6:
+minipass@3.1.6, minipass@^3.0.0, minipass@^3.1.1:
version "3.1.6"
resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz"
integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
@@ -7349,26 +6452,21 @@ mkdirp@^0.5.1, mkdirp@~0.5.1:
dependencies:
minimist "^1.2.6"
-mkdirp@^1.0.3:
- version "1.0.4"
- resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
- integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-
-mkdirp@^1.0.4:
+mkdirp@^1.0.3, mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-ms@^2.1.1, ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+ms@2.1.2, ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
ms@2.1.3:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
@@ -7422,12 +6520,7 @@ nanomatch@^1.2.9:
natural-compare-lite@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz"
- integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==
-
-natural-compare@^1.4.0:
- version "1.4.0"
- resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
- integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+ integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==
ncp@~2.0.0:
version "2.0.0"
@@ -7466,13 +6559,6 @@ node-dir@^0.1.10:
dependencies:
minimatch "^3.0.2"
-node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7:
- version "2.6.9"
- resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz"
- integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
- dependencies:
- whatwg-url "^5.0.0"
-
node-fetch@2.6.7:
version "2.6.7"
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz"
@@ -7480,6 +6566,13 @@ node-fetch@2.6.7:
dependencies:
whatwg-url "^5.0.0"
+node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7:
+ version "2.6.9"
+ resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz"
+ integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
+ dependencies:
+ whatwg-url "^5.0.0"
+
node-forge@^1.2.1, node-forge@^1.3.1:
version "1.3.1"
resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz"
@@ -7541,13 +6634,6 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
-npm-run-path@^4.0.1:
- version "4.0.1"
- resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
- integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
- dependencies:
- path-key "^3.0.0"
-
nullthrows@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz"
@@ -7672,13 +6758,6 @@ object.values@^1.1.6:
define-properties "^1.1.4"
es-abstract "^1.20.4"
-on-finished@~2.3.0:
- version "2.3.0"
- resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"
- integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==
- dependencies:
- ee-first "1.1.1"
-
on-finished@2.4.1:
version "2.4.1"
resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz"
@@ -7686,6 +6765,13 @@ on-finished@2.4.1:
dependencies:
ee-first "1.1.1"
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"
+ integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==
+ dependencies:
+ ee-first "1.1.1"
+
once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
@@ -7700,13 +6786,6 @@ onetime@^2.0.0:
dependencies:
mimic-fn "^1.0.0"
-onetime@^5.1.2:
- version "5.1.2"
- resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
- integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
- dependencies:
- mimic-fn "^2.1.0"
-
open@^8.0.4, open@^8.3.0:
version "8.4.2"
resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz"
@@ -7728,18 +6807,6 @@ optionator@^0.8.1:
type-check "~0.3.2"
word-wrap "~1.2.3"
-optionator@^0.9.3:
- version "0.9.4"
- resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
- integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
- dependencies:
- deep-is "^0.1.3"
- fast-levenshtein "^2.0.6"
- levn "^0.4.1"
- prelude-ls "^1.2.1"
- type-check "^0.4.0"
- word-wrap "^1.2.5"
-
ora@3.4.0:
version "3.4.0"
resolved "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz"
@@ -7789,21 +6856,14 @@ p-finally@^1.0.0:
resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz"
integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
-p-limit@^2.0.0:
- version "2.3.0"
- resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
- integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
- dependencies:
- p-try "^2.0.0"
-
-p-limit@^2.2.0:
+p-limit@^2.0.0, p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
dependencies:
p-try "^2.0.0"
-p-limit@^3.0.2, p-limit@^3.1.0:
+p-limit@^3.0.2:
version "3.1.0"
resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
@@ -7848,13 +6908,6 @@ p-try@^2.0.0:
resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
-parent-module@^1.0.0:
- version "1.0.1"
- resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
- integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
- dependencies:
- callsites "^3.0.0"
-
parse-entities@^1.1.0:
version "1.2.2"
resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz"
@@ -7883,16 +6936,6 @@ parse-json@^2.2.0:
dependencies:
error-ex "^1.2.0"
-parse-json@^5.2.0:
- version "5.2.0"
- resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
- integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- error-ex "^1.3.1"
- json-parse-even-better-errors "^2.3.0"
- lines-and-columns "^1.1.6"
-
parse-node-version@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz"
@@ -7977,7 +7020,7 @@ path-key@^2.0.0, path-key@^2.0.1:
resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz"
integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
-path-key@^3.0.0, path-key@^3.1.0:
+path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@@ -8055,13 +7098,6 @@ pirates@^4.0.1, pirates@^4.0.4:
resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz"
integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
-pkg-dir@^4.2.0:
- version "4.2.0"
- resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz"
- integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
- dependencies:
- find-up "^4.0.0"
-
pkg-up@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz"
@@ -8087,11 +7123,6 @@ posix-character-classes@^0.1.0:
resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz"
integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==
-prelude-ls@^1.2.1:
- version "1.2.1"
- resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
- integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"
@@ -8104,7 +7135,7 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
-prettier@^2.8.8, prettier@>=2.0.0, prettier@>=2.4:
+prettier@^2.8.8:
version "2.8.8"
resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
@@ -8174,7 +7205,7 @@ promise@^7.1.1:
dependencies:
asap "~2.0.3"
-prompts@^2.0.1, prompts@^2.2.1, prompts@^2.3.2:
+prompts@^2.2.1, prompts@^2.3.2:
version "2.4.2"
resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz"
integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
@@ -8182,16 +7213,7 @@ prompts@^2.0.1, prompts@^2.2.1, prompts@^2.3.2:
kleur "^3.0.3"
sisteransi "^1.0.5"
-prop-types@^15.5.10:
- version "15.8.1"
- resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
- integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
- dependencies:
- loose-envify "^1.4.0"
- object-assign "^4.1.1"
- react-is "^16.13.1"
-
-prop-types@^15.8.1:
+prop-types@^15.5.10, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -8235,11 +7257,6 @@ punycode@^2.1.0, punycode@^2.1.1:
resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz"
integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
-pure-rand@^6.0.0:
- version "6.1.0"
- resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz"
- integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==
-
qrcode-terminal@0.11.0:
version "0.11.0"
resolved "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz"
@@ -8356,7 +7373,7 @@ react-shallow-renderer@^16.15.0:
object-assign "^4.1.1"
react-is "^16.12.0 || ^17.0.0 || ^18.0.0"
-react-test-renderer@>=16.9.0, react-test-renderer@18.2.0:
+react-test-renderer@18.2.0:
version "18.2.0"
resolved "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz"
integrity sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==
@@ -8365,13 +7382,6 @@ react-test-renderer@>=16.9.0, react-test-renderer@18.2.0:
react-shallow-renderer "^16.15.0"
scheduler "^0.23.0"
-"react@^16.0.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, react@>=16.13.1, react@>=16.9.0:
- version "18.3.1"
- resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz"
- integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
- dependencies:
- loose-envify "^1.1.0"
-
read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz"
@@ -8572,7 +7582,7 @@ repeat-string@^1.5.4, repeat-string@^1.6.1:
resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
-replace-ext@^1.0.0, replace-ext@1.0.0:
+replace-ext@1.0.0, replace-ext@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz"
integrity sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==
@@ -8620,13 +7630,6 @@ reselect@^4.0.0:
resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz"
integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==
-resolve-cwd@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz"
- integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
- dependencies:
- resolve-from "^5.0.0"
-
resolve-dir@^1.0.0, resolve-dir@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz"
@@ -8635,11 +7638,6 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1:
expand-tilde "^2.0.0"
global-modules "^1.0.0"
-resolve-from@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
- integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-
resolve-from@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"
@@ -8657,11 +7655,6 @@ resolve-url@^0.2.1:
resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz"
integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
-resolve.exports@^2.0.0:
- version "2.0.2"
- resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz"
- integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==
-
resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0, resolve@~1.7.1:
version "1.7.1"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz"
@@ -8678,43 +7671,7 @@ resolve@^1.10.0:
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
-resolve@^1.10.1:
- version "1.22.1"
- resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
- integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
- dependencies:
- is-core-module "^2.9.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
-resolve@^1.13.1:
- version "1.22.1"
- resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
- integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
- dependencies:
- is-core-module "^2.9.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
-resolve@^1.14.2:
- version "1.22.1"
- resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
- integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
- dependencies:
- is-core-module "^2.9.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
-resolve@^1.20.0:
- version "1.22.8"
- resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
- integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
- dependencies:
- is-core-module "^2.13.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
-resolve@^1.22.1:
+resolve@^1.10.1, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.22.1:
version "1.22.1"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
@@ -8835,37 +7792,24 @@ semver-greatest-satisfied-range@^1.1.0:
dependencies:
sver-compat "^1.5.0"
-semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, "semver@2 || 3 || 4 || 5", semver@5.7.2:
+"semver@2 || 3 || 4 || 5", semver@5.7.2, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0:
version "5.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
-semver@^6.0.0:
- version "6.3.1"
- resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
- integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-
-semver@^6.1.0:
- version "6.3.1"
- resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
- integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-
-semver@^6.1.1:
- version "6.3.1"
- resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
- integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-
-semver@^6.1.2:
- version "6.3.1"
- resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
- integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+semver@7.3.2:
+ version "7.3.2"
+ resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz"
+ integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
-semver@^6.3.0:
- version "6.3.1"
- resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
- integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+semver@7.x, semver@^7.3.7:
+ version "7.3.8"
+ resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz"
+ integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
+ dependencies:
+ lru-cache "^6.0.0"
-semver@^6.3.1:
+semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1:
version "6.3.1"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
@@ -8877,35 +7821,6 @@ semver@^7.3.5:
dependencies:
lru-cache "^6.0.0"
-semver@^7.3.7:
- version "7.3.8"
- resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz"
- integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
- dependencies:
- lru-cache "^6.0.0"
-
-semver@^7.5.3:
- version "7.6.3"
- resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz"
- integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
-
-semver@^7.5.4:
- version "7.6.3"
- resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz"
- integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
-
-semver@7.3.2:
- version "7.3.2"
- resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz"
- integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
-
-semver@7.x:
- version "7.3.8"
- resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz"
- integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
- dependencies:
- lru-cache "^6.0.0"
-
send@^0.18.0:
version "0.18.0"
resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz"
@@ -8990,7 +7905,7 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
-signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
+signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.7:
version "3.0.7"
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
@@ -9070,14 +7985,6 @@ source-map-resolve@^0.5.0:
source-map-url "^0.4.0"
urix "^0.1.0"
-source-map-support@0.5.13:
- version "0.5.13"
- resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz"
- integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.0"
-
source-map-url@^0.4.0:
version "0.4.1"
resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz"
@@ -9088,7 +7995,7 @@ source-map@^0.5.6:
resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+source-map@^0.6.1, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -9175,16 +8082,16 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"
-statuses@~1.5.0:
- version "1.5.0"
- resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
- integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
-
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
+ integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
stream-buffers@2.2.x:
version "2.2.0"
resolved "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz"
@@ -9200,13 +8107,6 @@ stream-shift@^1.0.0:
resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz"
integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
string-length@^4.0.1:
version "4.0.2"
resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz"
@@ -9223,16 +8123,7 @@ string-length@^5.0.1:
char-regex "^2.0.0"
strip-ansi "^7.0.1"
-string-width@^1.0.1:
- version "1.0.2"
- resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz"
- integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==
- dependencies:
- code-point-at "^1.0.0"
- is-fullwidth-code-point "^1.0.0"
- strip-ansi "^3.0.0"
-
-string-width@^1.0.2:
+string-width@^1.0.1, string-width@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz"
integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==
@@ -9241,7 +8132,7 @@ string-width@^1.0.2:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
-string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+string-width@^4.1.0, string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -9291,6 +8182,13 @@ string.prototype.trimstart@^1.0.6:
define-properties "^1.1.4"
es-abstract "^1.20.4"
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
@@ -9305,14 +8203,7 @@ strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
-strip-ansi@^6.0.0:
- version "6.0.1"
- resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
- integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
- dependencies:
- ansi-regex "^5.0.1"
-
-strip-ansi@^6.0.1:
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -9338,21 +8229,11 @@ strip-bom@^3.0.0:
resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
-strip-bom@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz"
- integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
-
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz"
integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==
-strip-final-newline@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
- integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-
strip-indent@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz"
@@ -9360,11 +8241,6 @@ strip-indent@^3.0.0:
dependencies:
min-indent "^1.0.0"
-strip-json-comments@^3.1.1:
- version "3.1.1"
- resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
- integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
@@ -9394,16 +8270,16 @@ sucrase@^3.20.0:
pirates "^4.0.1"
ts-interface-checker "^0.1.9"
-sudo-prompt@^8.2.0:
- version "8.2.5"
- resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz"
- integrity sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==
-
sudo-prompt@9.1.1:
version "9.1.1"
resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz"
integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==
+sudo-prompt@^8.2.0:
+ version "8.2.5"
+ resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz"
+ integrity sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==
+
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
@@ -9416,14 +8292,7 @@ supports-color@^5.3.0:
dependencies:
has-flag "^3.0.0"
-supports-color@^7.0.0:
- version "7.2.0"
- resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
- integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
- dependencies:
- has-flag "^4.0.0"
-
-supports-color@^7.1.0:
+supports-color@^7.0.0, supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
@@ -9485,6 +8354,15 @@ temp-dir@^2.0.0:
resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz"
integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==
+tempy@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz"
+ integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==
+ dependencies:
+ temp-dir "^1.0.0"
+ type-fest "^0.3.1"
+ unique-string "^1.0.0"
+
tempy@^0.7.1:
version "0.7.1"
resolved "https://registry.npmjs.org/tempy/-/tempy-0.7.1.tgz"
@@ -9496,15 +8374,6 @@ tempy@^0.7.1:
type-fest "^0.16.0"
unique-string "^2.0.0"
-tempy@0.3.0:
- version "0.3.0"
- resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz"
- integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==
- dependencies:
- temp-dir "^1.0.0"
- type-fest "^0.3.1"
- unique-string "^1.0.0"
-
terminal-link@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz"
@@ -9541,11 +8410,6 @@ thenify-all@^1.0.0:
dependencies:
any-promise "^1.0.0"
-through@2:
- version "2.3.8"
- resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
- integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
-
through2-filter@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz"
@@ -9562,6 +8426,11 @@ through2@^2.0.0, through2@^2.0.3, through2@~2.0.0:
readable-stream "~2.3.6"
xtend "~4.0.1"
+through@2:
+ version "2.3.8"
+ resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
time-stamp@^1.0.0:
version "1.1.0"
resolved "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz"
@@ -9641,7 +8510,7 @@ toidentifier@1.0.1:
resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz"
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
-tough-cookie@^4.1.2, tough-cookie@4.1.4:
+tough-cookie@4.1.4, tough-cookie@^4.1.2:
version "4.1.4"
resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz"
integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
@@ -9729,13 +8598,6 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
-type-check@^0.4.0, type-check@~0.4.0:
- version "0.4.0"
- resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
- integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
- dependencies:
- prelude-ls "^1.2.1"
-
type-check@~0.3.2:
version "0.3.2"
resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz"
@@ -9758,11 +8620,6 @@ type-fest@^0.16.0:
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz"
integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==
-type-fest@^0.20.2:
- version "0.20.2"
- resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
- integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
-
type-fest@^0.21.3:
version "0.21.3"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
@@ -9810,7 +8667,7 @@ typedarray@^0.0.6:
resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
-typescript@^4.9.4, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.3:
+typescript@^4.9.4:
version "4.9.5"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz"
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
@@ -10006,7 +8863,7 @@ universalify@^2.0.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
-unpipe@~1.0.0, unpipe@1.0.0:
+unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
@@ -10087,17 +8944,12 @@ uuid@^7.0.3:
resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz"
integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
-uuid@^8.0.0:
- version "8.3.2"
- resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz"
- integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
-
-uuid@^8.3.2:
+uuid@^8.0.0, uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
-v8-to-istanbul@^9.0.0, v8-to-istanbul@^9.0.1:
+v8-to-istanbul@^9.0.0:
version "9.1.0"
resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz"
integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==
@@ -10444,7 +9296,7 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.9:
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz"
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
-yargs-parser@^21.0.1, yargs-parser@^21.1.1:
+yargs-parser@^21.0.1:
version "21.1.1"
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
@@ -10470,19 +9322,6 @@ yargs@^16.2.0:
y18n "^5.0.5"
yargs-parser "^20.2.2"
-yargs@^17.3.1:
- version "17.7.2"
- resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz"
- integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
- dependencies:
- cliui "^8.0.1"
- escalade "^3.1.1"
- get-caller-file "^2.0.5"
- require-directory "^2.1.1"
- string-width "^4.2.3"
- y18n "^5.0.5"
- yargs-parser "^21.1.1"
-
yargs@^7.1.0:
version "7.1.2"
resolved "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz"