Commit 5eb5fc1d authored by Peter Skaar Nordby's avatar Peter Skaar Nordby
Browse files

Opprettet profilside med template for login

parents ea0e1421 70676df2
import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { StatusBar } from "expo-status-bar";
import React from "react";
import { SafeAreaProvider } from "react-native-safe-area-context";
import { Provider } from "react-redux";
import { persistStore } from "redux-persist";
import { PersistGate } from "redux-persist/integration/react";
import useCachedResources from './hooks/useCachedResources';
import useColorScheme from './hooks/useColorScheme';
import Navigation from './navigation';
import useCachedResources from "./hooks/useCachedResources";
import useColorScheme from "./hooks/useColorScheme";
import Navigation from "./navigation";
import configureStore from "./store";
// Setup Redux store
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const initialState = (window as any).initialReduxState;
const store = configureStore(initialState);
const persistor = persistStore(store);
export default function App() {
const isLoadingComplete = useCachedResources();
......@@ -15,8 +25,12 @@ export default function App() {
} else {
return (
<SafeAreaProvider>
<Navigation colorScheme={colorScheme} />
<StatusBar />
<Provider store={store}>
<PersistGate persistor={persistor}>
<Navigation colorScheme={colorScheme} />
<StatusBar />
</PersistGate>
</Provider>
</SafeAreaProvider>
);
}
......
export enum Genre {
ACTION = "Action",
COMEDY = "Comedy",
DRAMA = "Drama",
FANTASY = "Fantasy",
HORROR = "Horror",
MYSTERY = "Mystery",
ROMANCE = "Romance",
THRILLER = "Thriller",
WESTERN = "Western",
SCI_FI = "Science Fiction",
ADVENTURE = "Adventure",
}
export interface Pagination {
current: number;
pageSize: number;
total: number;
}
export interface Sort {
sortColumn: string;
sortOrder: SortOrder;
}
export enum SortOrder {
ASC = "asc",
DESC = "desc",
}
export interface Rating {
userId: string;
rating: number;
comment: string;
date: string;
username: string;
}
export interface MovieDetail {
id: string;
title: string;
year: number;
runtime: number;
plot: string;
poster: string;
avgRating: number;
genres: string[];
actors: string[];
ratings: Rating[];
}
......@@ -89,7 +89,21 @@ function BottomTabNavigator() {
component={Profile}
options={{
title: 'Profile',
tabBarIcon: ({ color }) => <TabBarIcon name="code" color={color} />,
tabBarIcon: ({ color }) => <TabBarIcon name="user" color={color} />,
headerRight: () => (
<Pressable
onPress={() => logout()}
style={({ pressed }) => ({
opacity: pressed ? 0.5 : 1,
})}>
<FontAwesome
name="sign-out"
size={25}
color={Colors[colorScheme].text}
style={{ marginRight: 15 }}
/>
</Pressable>
),
}}
/>
</BottomTab.Navigator>
......
import * as React from 'react';
import { StyleSheet } from 'react-native';
import { useSelector } from 'react-redux';
import Login from '../components/LoginComponent';
import ProfileInfo from '../components/ProfileInfo';
import { Text, View } from '../components/Themed';
import { AuthState } from '../store/ducks/auth/types';
import { ApplicationState } from '../store/interface';
const auth: AuthState = useSelector(({ auth }: ApplicationState) => auth);
export default function Profile() {
const auth: AuthState = useSelector(({ auth }: ApplicationState) => auth);
if (!auth.user) {
return (
<View style={styles.container}>
<Text style={styles.title}>Log in or sign up</Text>
<Login></Login>
</View>
);
}
return (
<View style={styles.container}>
<Text style={styles.title}>{user.username}</Text>
<Text style={styles.title}>{auth.user.username}</Text>
<View style={styles.separator} lightColor="#eee" darkColor="rgba(255,255,255,0.1)" />
<ProfileInfo user={user} />
<ProfileInfo user={auth.user} />
</View>
);
}
......
import * as React from 'react';
import { StyleSheet } from 'react-native';
import * as React from "react";
import { StyleSheet } from "react-native";
import ProfileInfo from '../components/ProfileInfo';
import { Text, View } from '../components/Themed';
import { RootTabScreenProps } from '../types';
export default function TabOneScreen({ navigation }: RootTabScreenProps<'TabOne'>) {
export default function TabOneScreen({
navigation,
}: RootTabScreenProps<"TabOne">) {
return (
<View style={styles.container}>
<Text style={styles.title}>Tab One</Text>
......@@ -17,16 +19,16 @@ export default function TabOneScreen({ navigation }: RootTabScreenProps<'TabOne'
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
alignItems: "center",
justifyContent: "center",
},
title: {
fontSize: 20,
fontWeight: 'bold',
fontWeight: "bold",
},
separator: {
marginVertical: 30,
height: 1,
width: '80%',
width: "80%",
},
});
import { all, call, fork, put, takeEvery } from 'redux-saga/effects';
import Swal from 'sweetalert2';
import { apiCaller } from '../../../utils';
import { ApolloClientAction } from '../../interface';
import { saveToken } from './helpers';
import { AuthActionTypes } from './types';
import { all, call, fork, put, takeEvery } from "redux-saga/effects";
import { apiCaller } from "../../../utils";
import { ApolloClientAction } from "../../interface";
import { saveToken } from "./helpers";
import { AuthActionTypes } from "./types";
function* handleSignIn(params: ApolloClientAction): Generator {
try {
const { login }: any = yield call(apiCaller, params.meta.query, params.payload);
const { login }: any = yield call(
apiCaller,
params.meta.query,
params.payload
);
yield saveToken(login.token);
yield put({ type: AuthActionTypes.SIGN_IN.SUCCESS, payload: login });
} catch (err) {
......@@ -20,7 +22,7 @@ function* handleSignIn(params: ApolloClientAction): Generator {
} else {
yield put({
type: AuthActionTypes.SIGN_IN.ERROR,
payload: 'An unknown error occured.',
payload: "An unknown error occured.",
});
}
}
......@@ -28,7 +30,11 @@ function* handleSignIn(params: ApolloClientAction): Generator {
function* handleSignUp(params: ApolloClientAction): Generator {
try {
const { signup }: any = yield call(apiCaller, params.meta.query, params.payload);
const { signup }: any = yield call(
apiCaller,
params.meta.query,
params.payload
);
yield saveToken(signup.token);
yield put({ type: AuthActionTypes.SIGN_UP.SUCCESS, payload: signup });
} catch (err) {
......@@ -40,7 +46,7 @@ function* handleSignUp(params: ApolloClientAction): Generator {
} else {
yield put({
type: AuthActionTypes.SIGN_UP.ERROR,
payload: 'An unknown error occured.',
payload: "An unknown error occured.",
});
}
}
......@@ -48,8 +54,15 @@ function* handleSignUp(params: ApolloClientAction): Generator {
function* handleGetRatings(params: ApolloClientAction): Generator {
try {
const { getUserRatings }: any = yield call(apiCaller, params.meta.query, params.payload);
yield put({ type: AuthActionTypes.GET_RATINGS.SUCCESS, payload: getUserRatings });
const { getUserRatings }: any = yield call(
apiCaller,
params.meta.query,
params.payload
);
yield put({
type: AuthActionTypes.GET_RATINGS.SUCCESS,
payload: getUserRatings,
});
} catch (err) {
if (err instanceof Error) {
yield put({
......@@ -59,7 +72,7 @@ function* handleGetRatings(params: ApolloClientAction): Generator {
} else {
yield put({
type: AuthActionTypes.GET_RATINGS.ERROR,
payload: 'An unknown error occured.',
payload: "An unknown error occured.",
});
}
}
......@@ -67,14 +80,15 @@ function* handleGetRatings(params: ApolloClientAction): Generator {
function* handleRateMovie(params: ApolloClientAction): Generator {
try {
const { giveRating }: any = yield call(apiCaller, params.meta.query, params.payload);
yield put({ type: AuthActionTypes.RATE_MOVIE.SUCCESS, payload: giveRating });
yield Swal.fire({
title: 'Thank you!',
text: 'Your rating is registered',
icon: 'success',
confirmButtonText: 'Ok',
}).then(() => window.location.reload());
const { giveRating }: any = yield call(
apiCaller,
params.meta.query,
params.payload
);
yield put({
type: AuthActionTypes.RATE_MOVIE.SUCCESS,
payload: giveRating,
});
} catch (err) {
if (err instanceof Error) {
yield put({
......@@ -84,15 +98,9 @@ function* handleRateMovie(params: ApolloClientAction): Generator {
} else {
yield put({
type: AuthActionTypes.RATE_MOVIE.ERROR,
payload: 'An unknown error occured.',
payload: "An unknown error occured.",
});
}
yield Swal.fire({
title: 'Something went wrong!',
text: 'Could not register your rating',
icon: 'error',
confirmButtonText: 'Ok',
});
}
}
......
import { Genre } from '../../../models/movieData.model';
import { generateAsyncAction } from '../../../utils';
import { BaseState, Entity } from '../../interface';
import { UserEntity } from '../auth/types';
import { Genre } from "../../../models/movieData.model";
import { generateAsyncAction } from "../../../utils";
import { BaseState, Entity } from "../../interface";
import { UserEntity } from "../auth/types";
export interface MovieInformation {
year: number;
......@@ -38,7 +38,7 @@ export type MovieRating = {
rating: number;
comment: string;
date: string;
user: Omit<UserEntity, 'email'>;
user: Omit<UserEntity, "email">;
};
export interface FullMovieEntity {
movie: ExtendedMovieEntity;
......@@ -51,9 +51,9 @@ export interface MovieState extends BaseState<MovieEntity> {
}
export const MovieActionTypes = {
FETCH: generateAsyncAction('@@movies.FETCH'),
FETCH_BY_ID: generateAsyncAction('@@movies.FETCH_BY_ID'),
CLEAR_MOVIE: '@@movies.CLEAR_MOVIE',
FETCH: generateAsyncAction("@@movies.FETCH"),
FETCH_BY_ID: generateAsyncAction("@@movies.FETCH_BY_ID"),
CLEAR_MOVIE: "@@movies.CLEAR_MOVIE",
};
export type FilterInterval<T> = {
......
import { ApolloClient, DocumentNode, InMemoryCache } from "@apollo/client";
const client = new ApolloClient({
uri: "http://it2810-05.idi.ntnu.no:5000/graphql",
cache: new InMemoryCache(),
});
export const apiCaller = (
query: DocumentNode,
variables: Record<string, unknown>
) => {
return client.mutate({ mutation: query, variables }).then((res) => res.data);
};
import { AsyncActionType } from "../store/interface";
/**
* Generates async states for redux actions
* @param name the name of the action
* @returns {AsyncActionType} aync action states
*/
export const generateAsyncAction = (name: string): AsyncActionType => ({
START: `${name}.START`,
SUCCESS: `${name}.SUCCESS`,
ERROR: `${name}.ERROR`,
});
export * from "./apiCaller";
export * from "./generateAsyncAction";
......@@ -59,6 +59,24 @@
lodash "^4.17.21"
resize-observer-polyfill "^1.5.0"
"@apollo/client@^3.4.17":
version "3.4.17"
resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.17.tgz#4972e19a49809e16d17c5adc67f45623a6dac135"
integrity sha512-MDt2rwMX1GqodiVEKJqmDmAz8xr0qJmq5PdWeIt0yDaT4GOkKYWZiWkyfhfv3raTk8PyJvbsNG9q2CqmUrlGfg==
dependencies:
"@graphql-typed-document-node/core" "^3.0.0"
"@wry/context" "^0.6.0"
"@wry/equality" "^0.5.0"
"@wry/trie" "^0.3.0"
graphql-tag "^2.12.3"
hoist-non-react-statics "^3.3.2"
optimism "^0.16.1"
prop-types "^15.7.2"
symbol-observable "^4.0.0"
ts-invariant "^0.9.0"
tslib "^2.3.0"
zen-observable-ts "~1.1.0"
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431"
......@@ -1313,6 +1331,11 @@
lodash.pick "^4.4.0"
lodash.template "^4.5.0"
"@graphql-typed-document-node/core@^3.0.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950"
integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==
"@hapi/hoek@^9.0.0":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17"
......@@ -1913,6 +1936,11 @@
dependencies:
"@types/istanbul-lib-report" "*"
"@types/js-cookie@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-3.0.0.tgz#6dcc3ab167251ace6964310789d8ea80f732a82c"
integrity sha512-GDVwSzwBm4OdQajFCit2UMxskZVcOhs/hYeOvzVW1R+iW6ZOVIBgD+RSrYCtPT0pNBnwNgRaoPPKfoXcwDo+hg==
"@types/node@*":
version "16.11.7"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42"
......@@ -1959,6 +1987,13 @@
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/redux-logger@^3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@types/redux-logger/-/redux-logger-3.0.9.tgz#9193b3d51bb6ab98d25514ba7764e4f98a64d3ec"
integrity sha512-cwYhVbYNgH01aepeMwhd0ABX6fhVB2rcQ9m80u8Fl50ZODhsZ8RhQArnLTkE7/Zrfq4Sz/taNoF7DQy9pCZSKg==
dependencies:
redux "^4.0.0"
"@types/scheduler@*":
version "0.16.2"
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
......@@ -1993,11 +2028,18 @@
dependencies:
"@types/yargs-parser" "*"
"@types/zen-observable@^0.8.0":
"@types/zen-observable@0.8.3", "@types/zen-observable@^0.8.0":
version "0.8.3"
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3"
integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==
"@wry/context@^0.6.0":
version "0.6.1"
resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2"
integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw==
dependencies:
tslib "^2.3.0"
"@wry/equality@^0.1.2":
version "0.1.11"
resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790"
......@@ -2005,6 +2047,20 @@
dependencies:
tslib "^1.9.3"
"@wry/equality@^0.5.0":
version "0.5.2"
resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.2.tgz#72c8a7a7d884dff30b612f4f8464eba26c080e73"
integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA==
dependencies:
tslib "^2.3.0"
"@wry/trie@^0.3.0":
version "0.3.1"
resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.1.tgz#2279b790f15032f8bcea7fc944d27988e5b3b139"
integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw==
dependencies:
tslib "^2.3.0"
"@xmldom/xmldom@~0.7.0":
version "0.7.5"
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz#09fa51e356d07d0be200642b0e4f91d8e6dd408d"
......@@ -3927,6 +3983,13 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6,
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
graphql-tag@^2.12.3:
version "2.12.6"
resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1"
integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==
dependencies:
tslib "^2.1.0"
graphql@^16.0.1:
version "16.0.1"
resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.0.1.tgz#93a13cd4e0e38ca8d0832e79614c8578bfd34f10"
......@@ -4885,6 +4948,11 @@ joi@^17.2.1:
"@sideway/formula" "^3.0.0"
"@sideway/pinpoint" "^2.0.0"
js-cookie@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414"
integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
......@@ -5035,6 +5103,11 @@ jsonify@~0.0.0:
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
jwt-decode@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59"
integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
......@@ -5980,6 +6053,14 @@ open@^6.2.0:
dependencies:
is-wsl "^1.1.0"
optimism@^0.16.1:
version "0.16.1"
resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d"
integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg==
dependencies:
"@wry/context" "^0.6.0"
"@wry/trie" "^0.3.0"
optionator@^0.8.1:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
......@@ -6691,6 +6772,11 @@ react-dom@17.0.1:
object-assign "^4.1.1"
scheduler "^0.20.1"
react-hook-form@^7.19.5:
version "7.19.5"
resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.19.5.tgz#cc6087419facf2fb57d47d5b0d4a8ca63201298f"
integrity sha512-+M9gd0nWWASuEitf5PQGOGNElnHknzY3rGISrPDXwsOmZb7c/jyvkRUqk4OJXaZit1ZwesSv+EysttdAeFEfmw==
react-is@^16.12.0, react-is@^16.13.0, react-is@^16.7.0, react-is@^16.8.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
......@@ -6885,6 +6971,11 @@ redux-logger@^3.0.6:
dependencies:
deep-diff "^0.3.5"
redux-persist@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8"
integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==
redux-saga@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.1.3.tgz#9f3e6aebd3c994bbc0f6901a625f9a42b51d1112"
......@@ -6892,6 +6983,11 @@ redux-saga@^1.1.3:
dependencies:
"@redux-saga/core" "^1.1.3"
redux-thunk@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.0.tgz#ac89e1d6b9bdb9ee49ce69a69071be41bbd82d67"
integrity sha512-/y6ZKQNU/0u8Bm7ROLq9Pt/7lU93cT0IucYMrubo89ENjxPa7i8pqLKu6V4X7/TvYovQ6x01unTeyeZ9lgXiTA==
redux@^4.0.0, redux@^4.0.4, redux@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104"
......@@ -7623,6 +7719,11 @@ symbol-observable@^1.0.2:
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
symbol-observable@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205"
integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==
symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
......@@ -7786,12 +7887,19 @@ ts-invariant@^0.4.0:
dependencies:
tslib "^1.9.3"
ts-invariant@^0.9.0:
version "0.9.3"
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.3.tgz#4b41e0a80c2530a56ce4b8fd4e14183aaac0efa8"
integrity sha512-HinBlTbFslQI0OHP07JLsSXPibSegec6r9ai5xxq/qHYCsIQbzpymLpDhAUsnXcSrDEcd0L62L8vsOEdzM0qlA==
dependencies:
tslib "^2.1.0"
tslib@^1.10.0, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.3:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==