diff --git a/.gitignore b/.gitignore index c7dfd0a..5a43e6a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ web-build/ # macOS .DS_Store +assets/licenses.json diff --git a/App.tsx b/App.tsx index 69b4738..fcb7b9c 100644 --- a/App.tsx +++ b/App.tsx @@ -21,14 +21,22 @@ import DarkModeContext from "./src/contexts/DarkModeContext"; import DarkTheme from "./src/themes/DarkTheme"; import DefaultTheme from "./src/themes/DefaultTheme"; import About from "./src/screens/About"; +import Dependencies from "./src/screens/Dependencies"; +import initDark from "./src/utils/darkStorage"; const Stack = createStackNavigator(); export default function App(): JSX.Element { const [fontsLoaded] = useFonts({ Inter_300Light, Inter_600SemiBold }); - const [dark, setDark] = useState(true); + const [dark, setDark] = useState(false); const [theme, setTheme] = useState(DarkTheme); + useEffect(() => { + (async function getDark(): Promise { + setDark(await initDark()); + })(); + }, []); + useEffect(() => { const newTheme = dark ? DarkTheme : DefaultTheme; setTheme(newTheme); @@ -48,6 +56,7 @@ export default function App(): JSX.Element { /> + diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..ecc7b43 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2021 RazerMoon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/app.json b/app.json index a19c154..041536b 100644 --- a/app.json +++ b/app.json @@ -8,7 +8,7 @@ "backgroundColor": "#181A20", "primaryColor": "#25A55F", "androidStatusBar": { - "backgroundColor": "#181A20" + "backgroundColor": "#25A55F" }, "androidNavigationBar": { "barStyle": "light-content" @@ -17,7 +17,7 @@ "splash": { "image": "./assets/splash.png", "resizeMode": "contain", - "backgroundColor": "#181A20" + "backgroundColor": "#25A55F" }, "updates": { "fallbackToCacheTimeout": 0 diff --git a/assets/avatar.png b/assets/avatar.png new file mode 100644 index 0000000..1e75af5 Binary files /dev/null and b/assets/avatar.png differ diff --git a/package.json b/package.json index f5216cc..8e4777d 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,7 @@ { + "name": "cao-points-app", + "author": "RazerMoon", + "License": "MIT", "main": "node_modules/expo/AppEntry.js", "scripts": { "start": "expo start", @@ -7,7 +10,8 @@ "web": "expo start --web", "eject": "expo eject", "lint": "eslint **/**/*.{ts,tsx}", - "lint:fix": "eslint **/**/*.{ts,tsx} --fix" + "lint:fix": "eslint **/**/*.{ts,tsx} --fix", + "generate-licenses": "npm-license-crawler -onlyDirectDependencies -json ./assets/licenses.json" }, "dependencies": { "@expo-google-fonts/inter": "^0.1.0", @@ -19,7 +23,7 @@ "expo": "~40.0.0", "expo-app-loading": "^1.0.1", "expo-font": "~8.4.0", - "expo-web-browser": "^8.6.0", + "expo-web-browser": "~8.6.0", "react": "16.13.1", "react-dom": "16.13.1", "react-native": "https://github.com/expo/react-native/archive/sdk-40.0.1.tar.gz", @@ -27,7 +31,8 @@ "react-native-paper": "^4.7.1", "react-native-reanimated": "~1.13.0", "react-native-safe-area-context": "3.1.9", - "react-native-screens": "~2.15.0" + "react-native-screens": "~2.15.0", + "return": "^1.0.0" }, "devDependencies": { "@types/react": "~16.9.35", @@ -45,6 +50,7 @@ "eslint-plugin-react-hooks": "^4.2.0", "expo-network": "^2.4.0", "expo-optimize": "^0.1.70", + "npm-license-crawler": "^0.2.1", "prettier": "^2.2.1", "react-native-web": "~0.13.12", "typescript": "~4.1.5" diff --git a/src/components/About/DependencyList.tsx b/src/components/About/DependencyList.tsx new file mode 100644 index 0000000..b5bcb5a --- /dev/null +++ b/src/components/About/DependencyList.tsx @@ -0,0 +1,81 @@ +import React from "react"; +import { List, Divider } from "react-native-paper"; + +import { openBrowserAsync } from "expo-web-browser"; +import { AboutProps as Props } from "../../utils/StackTypes"; + +const DependencyList = ({ + navigation, +}: Pick): JSX.Element => { + return ( + + + ( + + )} + onPress={() => openBrowserAsync("https://expo.io/")} + accessibilityComponentType="" + accessibilityTraits="" + /> + + ( + + )} + onPress={() => openBrowserAsync("https://reactnative.dev/")} + accessibilityComponentType="" + accessibilityTraits="" + /> + + ( + + )} + onPress={() => openBrowserAsync("https://reactnativepaper.com/")} + accessibilityComponentType="" + accessibilityTraits="" + /> + + ( + + )} + onPress={() => navigation.navigate("Dependencies")} + accessibilityComponentType="" + accessibilityTraits="" + /> + + + ); +}; + +export default DependencyList; diff --git a/src/components/DarkModeSwitch.tsx b/src/components/DarkModeSwitch.tsx index 268f264..ccb0206 100644 --- a/src/components/DarkModeSwitch.tsx +++ b/src/components/DarkModeSwitch.tsx @@ -1,14 +1,36 @@ import React, { useContext } from "react"; import { Switch } from "react-native-paper"; import DarkModeContext from "../contexts/DarkModeContext"; +import { storeDark } from "../utils/darkStorage"; -const DarkModeSwitch = (): JSX.Element => { +type Props = { + color: string; + // eslint-disable-next-line react/require-default-props + style?: + | { + marginRight: number; + marginVertical?: number | undefined; + } + | undefined; +}; + +const DarkModeSwitch = (props: Props): JSX.Element => { const { dark, setDark } = useContext(DarkModeContext); return ( setDark((prev) => !prev)} + {...props} + onValueChange={() => + setDark((prev) => { + try { + storeDark(!prev); + } catch (err) { + // + } + return !prev; + }) + } accessibilityComponentType="" accessibilityTraits="" /> diff --git a/src/components/Dependencies/LicenseList.tsx b/src/components/Dependencies/LicenseList.tsx new file mode 100644 index 0000000..b5501b4 --- /dev/null +++ b/src/components/Dependencies/LicenseList.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import { FlatList, FlatListProps } from "react-native"; +import { LicensesType } from "../../utils/getLicensesFromJSON"; + +// TODO: Add dark mode support +const LicenseList = ({ ...rest }: FlatListProps): JSX.Element => { + return ( + key} /> + ); +}; + +export default LicenseList; diff --git a/src/components/Dependencies/LicensesListItem.tsx b/src/components/Dependencies/LicensesListItem.tsx new file mode 100644 index 0000000..386af40 --- /dev/null +++ b/src/components/Dependencies/LicensesListItem.tsx @@ -0,0 +1,61 @@ +import React from "react"; + +import { Avatar, List } from "react-native-paper"; + +import { openBrowserAsync } from "expo-web-browser"; +import { StyleSheet } from "react-native"; +import { LicensesType } from "../../utils/getLicensesFromJSON"; + +type Props = Omit; + +const styles = StyleSheet.create({ + avatar: { + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 1, + shadowRadius: 2, + + elevation: 5, + }, +}); + +const LicensesListItem = ({ + image, + username, + name, + version, + repository, + licenses, +}: Props): JSX.Element => { + return ( + openBrowserAsync(repository)} + accessibilityComponentType="" + accessibilityTraits="" + left={(props) => ( + + )} + right={(props) => ( + + )} + /> + ); +}; + +export default LicensesListItem; diff --git a/src/components/Settings/Debug.tsx b/src/components/Settings/Debug.tsx new file mode 100644 index 0000000..b3ef348 --- /dev/null +++ b/src/components/Settings/Debug.tsx @@ -0,0 +1,96 @@ +import React, { useEffect, useState } from "react"; +import { Divider, List } from "react-native-paper"; + +import AsyncStorage from "@react-native-async-storage/async-storage"; + +export default function Debug(): JSX.Element { + const [allKeys, setAllKeys] = useState([]); + const [allStored, setAllStored] = useState>([ + ["", ""], + ]); + const [keysExpanded, setKeysExpanded] = useState(true); + const [bit, setBit] = useState(false); + + const forceUpdate = () => setBit((prev) => !prev); + + useEffect(() => { + (async function getKeys(): Promise { + setAllKeys(await AsyncStorage.getAllKeys()); + })(); + }, [bit]); + + useEffect(() => { + (async function getKeys(): Promise { + setAllStored(await AsyncStorage.multiGet(allKeys)); + })(); + }, [allKeys]); + + return ( + + + forceUpdate()} + left={(props) => } + accessibilityComponentType="" + accessibilityTraits="" + /> + + ( + + )} + onPress={() => setKeysExpanded((prev) => !prev)} + > + {allStored.map(([key, value]) => ( + <> + + } + right={(props) => ( + + )} + onPress={() => + AsyncStorage.removeItem(key).then(() => forceUpdate()) + } + accessibilityComponentType="" + accessibilityTraits="" + /> + + ))} + + + + AsyncStorage.setItem("@CAO_test", "value").then(() => forceUpdate()) + } + left={(props) => } + accessibilityComponentType="" + accessibilityTraits="" + /> + + + AsyncStorage.multiRemove(allKeys).then(() => forceUpdate()) + } + left={(props) => } + accessibilityComponentType="" + accessibilityTraits="" + /> + + + ); +} diff --git a/src/contexts/DarkModeContext.tsx b/src/contexts/DarkModeContext.tsx index 45cc40b..0d6e14d 100644 --- a/src/contexts/DarkModeContext.tsx +++ b/src/contexts/DarkModeContext.tsx @@ -4,9 +4,10 @@ const DarkModeContext = React.createContext<{ dark: boolean; setDark: React.Dispatch>; }>({ - dark: true, - // eslint-disable-next-line @typescript-eslint/no-empty-function - setDark: () => {}, + dark: false, + setDark: () => { + return null; + }, }); export default DarkModeContext; diff --git a/src/screens/About.tsx b/src/screens/About.tsx index 38ecf5a..e808b78 100644 --- a/src/screens/About.tsx +++ b/src/screens/About.tsx @@ -1,13 +1,72 @@ import React from "react"; -import { View } from "react-native"; -import { Text } from "react-native-paper"; +import { View, ScrollView } from "react-native"; +import { Subheading, Title, Paragraph, Avatar } from "react-native-paper"; -export default function About(): JSX.Element { +import { openBrowserAsync } from "expo-web-browser"; + +import { TouchableOpacity } from "react-native-gesture-handler"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import avatar from "../../assets/avatar.png"; + +import { AboutProps as Props } from "../utils/StackTypes"; +import DependencyList from "../components/About/DependencyList"; + +export default function About({ navigation }: Props): JSX.Element { return ( - - - Hello there - - + + + + openBrowserAsync("https://github.com/RazerMoon")} + style={{ marginBottom: 10 }} + > + + + Hi, I'm Peter! + + The creator of this app. + + + I created this app with the goal of helping out some of my fellow + Leaving Cert students who struggle to calculate their estimated CAO + points. Thank you for using it, I hope it helped you. + + + + + If you're wondering, this app was built using: + + + + + ); } diff --git a/src/screens/Dependencies.tsx b/src/screens/Dependencies.tsx new file mode 100644 index 0000000..95cec87 --- /dev/null +++ b/src/screens/Dependencies.tsx @@ -0,0 +1,25 @@ +import React from "react"; + +import { Divider } from "react-native-paper"; +import LicenseList from "../components/Dependencies/LicenseList"; +import getLicensesFromJSON from "../utils/getLicensesFromJSON"; + +// eslint-disable-next-line import/extensions +import licenses from "../../assets/licenses.json"; +import LicensesListItem from "../components/Dependencies/LicensesListItem"; + +export default function Dependencies(): JSX.Element { + return ( + ( + + )} + renderItem={({ item }) => } + /> + ); +} diff --git a/src/screens/Settings.tsx b/src/screens/Settings.tsx index 41c5cef..1caecfc 100644 --- a/src/screens/Settings.tsx +++ b/src/screens/Settings.tsx @@ -1,11 +1,15 @@ import React from "react"; import { ScrollView } from "react-native"; -import { IconButton, List } from "react-native-paper"; +import { IconButton, List, useTheme } from "react-native-paper"; import DarkModeSwitch from "../components/DarkModeSwitch"; +import Debug from "../components/Settings/Debug"; +import { CustomTheme } from "../themes/BrandTheme"; import { SettingsProps as Props } from "../utils/StackTypes"; export default function Settings({ navigation }: Props): JSX.Element { + const { colors } = useTheme() as CustomTheme; + React.useLayoutEffect(() => { navigation.setOptions({ headerRight: () => ( @@ -20,24 +24,23 @@ export default function Settings({ navigation }: Props): JSX.Element { }, [navigation]); return ( - - - - Appearance - + + } - left={() => } + right={(props) => ( + + )} + left={(props) => } /> - {/* */} + {__DEV__ && } ); } diff --git a/src/themes/BrandTheme.ts b/src/themes/BrandTheme.ts new file mode 100644 index 0000000..083c697 --- /dev/null +++ b/src/themes/BrandTheme.ts @@ -0,0 +1,21 @@ +import { Theme } from "react-native-paper/lib/typescript/types"; + +// const { colors } = useTheme() as CustomTheme; + +export type CustomColors = Theme["colors"] & { + primary: string; + lightprimary: string; +}; + +export type CustomTheme = Theme & { + colors: CustomColors; +}; + +const BrandTheme = { + colors: { + primary: "#25a55f", + lightprimary: "#2be07d", + }, +}; + +export default BrandTheme; diff --git a/src/themes/DarkTheme.ts b/src/themes/DarkTheme.ts index 8c68794..f584c91 100644 --- a/src/themes/DarkTheme.ts +++ b/src/themes/DarkTheme.ts @@ -1,13 +1,13 @@ import { DarkTheme as _DarkTheme } from "@react-navigation/native"; import { DarkTheme as _DarkThemePaper } from "react-native-paper"; +import BrandTheme from "./BrandTheme"; const DarkTheme = { - ..._DarkTheme, ..._DarkThemePaper, colors: { ..._DarkTheme.colors, ..._DarkThemePaper.colors, - primary: "#25A55F", + ...BrandTheme.colors, background: "#181A20", }, }; diff --git a/src/themes/DefaultTheme.ts b/src/themes/DefaultTheme.ts index 3a0c7cc..3174059 100644 --- a/src/themes/DefaultTheme.ts +++ b/src/themes/DefaultTheme.ts @@ -1,14 +1,16 @@ import { DefaultTheme as _DefaultTheme } from "@react-navigation/native"; import { DefaultTheme as _DefaultThemePaper } from "react-native-paper"; +import BrandTheme from "./BrandTheme"; + +// ? https://github.com/callstack/react-native-paper/blob/main/src/styles/DefaultTheme.tsx const DefaultTheme = { - ..._DefaultTheme, ..._DefaultThemePaper, colors: { ..._DefaultTheme.colors, ..._DefaultThemePaper.colors, - primary: "rgb(37, 165, 95)", - background: "rgb(249, 249, 249)", + ...BrandTheme.colors, + background: "#f9f9f9", }, }; diff --git a/src/utils/StackTypes.ts b/src/utils/StackTypes.ts index 2bf37e4..e37dc9f 100644 --- a/src/utils/StackTypes.ts +++ b/src/utils/StackTypes.ts @@ -4,8 +4,10 @@ type RootStackParamList = { Home: undefined; Settings: undefined; About: undefined; + Dependencies: undefined; Feed: { sort: "latest" | "top" } | undefined; }; export type HomeProps = StackScreenProps; export type SettingsProps = StackScreenProps; +export type AboutProps = StackScreenProps; diff --git a/src/utils/darkStorage.ts b/src/utils/darkStorage.ts new file mode 100644 index 0000000..2498b3a --- /dev/null +++ b/src/utils/darkStorage.ts @@ -0,0 +1,27 @@ +import AsyncStorage from "@react-native-async-storage/async-storage"; + +export async function getDark(): Promise { + return AsyncStorage.getItem("@CAO_dark"); +} + +export async function storeDark(value: boolean): Promise { + await AsyncStorage.setItem("@CAO_dark", String(value)); +} + +export default async function initDark(): Promise { + let final = false; + + try { + const dark = await getDark(); + + if (dark === null) { + await storeDark(false); + } else if (dark === "true" || dark === "false") { + final = dark === "true"; + } + } catch (error) { + // + } + + return final; +} diff --git a/src/utils/extractNameFromGithubUrl.ts b/src/utils/extractNameFromGithubUrl.ts new file mode 100644 index 0000000..29b4825 --- /dev/null +++ b/src/utils/extractNameFromGithubUrl.ts @@ -0,0 +1,14 @@ +export default function extractNameFromGithubUrl(url: string): string | null { + if (!url) { + return null; + } + + const reg = /((https?:\/\/)?(www\.)?github\.com\/)?(@|#!\/)?([A-Za-z0-9_]{1,15})(\/([-a-z]{1,20}))?/i; + const components = reg.exec(url); + + if (components && components.length > 5) { + return components[5]; + } + + return null; +} diff --git a/src/utils/getLicensesFromJSON.ts b/src/utils/getLicensesFromJSON.ts new file mode 100644 index 0000000..ff7d47c --- /dev/null +++ b/src/utils/getLicensesFromJSON.ts @@ -0,0 +1,64 @@ +// eslint-disable-next-line import/extensions +import extractNameFromGithubUrl from "./extractNameFromGithubUrl"; + +// * Used for parsing JSON License data generated by npm-license-crawler -onlyDirectDependencies + +// ! This type was just thrown togther +export type LicensesType = { + repository: string; + licenseUrl: string; + parents: string; + key: string; + name: string; + image: string | undefined; + userUrl: string | undefined; + username: string | null; + licenses: string; + version: string; +}; + +// ! It is not certain all these fields will be present +export type jsonData = { + licenses: string; + repository: string; + licenseUrl: string; + parents: string; +}; + +const getLicensesFromJSON = ( + jsonData: Record +): LicensesType[] => Object.entries(jsonData).map( + ([_key, value]) => { + const { licenses, ...license } = value; + + const key = _key.charAt(0) === "@" ? _key.substring(1) : _key; // Prevents bug on next line if package starts with @ + const [name, version] = key.split("@"); + + // ! It is assummed that the repository field is never undefined + let username = + extractNameFromGithubUrl(license.repository) || + extractNameFromGithubUrl(license.licenseUrl); + + let userUrl; + let image; + + if (username) { + username = username.charAt(0).toUpperCase() + username.slice(1); + image = `http://github.com/${username}.png`; + userUrl = `http://github.com/${username}`; + } + + return { + key, + name, + image, + userUrl, + username, + licenses, // Previously this used licenses.slice(0, 405), I don't exactly know why (Prevent overflow?) so I removed it. + version, + ...license, + }; + } + ); + +export default getLicensesFromJSON; diff --git a/tsconfig.json b/tsconfig.json index f52a6bf..1fa30a0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,7 @@ "noEmit": true, "skipLibCheck": true, "resolveJsonModule": true, - "strict": true + "strict": true, + "esModuleInterop": true } } diff --git a/yarn.lock b/yarn.lock index 10c8d32..32d377d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1649,6 +1649,11 @@ invariant "^2.2.4" lodash "^4.5.0" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -1741,6 +1746,11 @@ ansi-red@^0.1.1: dependencies: ansi-wrap "0.1.0" +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= + ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" @@ -1756,6 +1766,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1901,7 +1916,7 @@ array.prototype.flatmap@^1.2.3: es-abstract "^1.18.0-next.1" function-bind "^1.1.1" -asap@~2.0.3, asap@~2.0.6: +asap@^2.0.0, asap@~2.0.3, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -1926,7 +1941,7 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async@^2.4.0: +async@^2.4.0, async@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -2262,6 +2277,17 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" @@ -2606,6 +2632,11 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "2.1.2" +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2705,6 +2736,14 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +dezalgo@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= + dependencies: + asap "^2.0.0" + wrappy "1" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2873,7 +2912,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -3262,7 +3301,7 @@ expo-sqlite@~8.5.0: "@expo/websql" "^1.0.1" lodash "^4.17.15" -expo-web-browser@^8.6.0: +expo-web-browser@~8.6.0: version "8.6.0" resolved "https://registry.yarnpkg.com/expo-web-browser/-/expo-web-browser-8.6.0.tgz#121ad81b2597b8273739b630c278a6f6937b95ae" integrity sha512-VHFuBl0im00yEVbEzOZUrQVvq8uGhyU/4WivJkfLF4GA3Pj7CaG6PMo0+6YNzkzB1JoVx5AfuKgBbSuOuETP9Q== @@ -3704,6 +3743,16 @@ getenv@0.7.0: resolved "https://registry.yarnpkg.com/getenv/-/getenv-0.7.0.tgz#39b91838707e2086fd1cf6ef8777d1c93e14649e" integrity sha1-ObkYOHB+IIb9HPbvh3fRyT4UZJ4= +github-url-from-git@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" + integrity sha1-+YX+3MCpqledyI16/waNVcxiUaA= + +github-url-from-username-repo@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz#7dd79330d2abe69c10c2cef79714c97215791dfa" + integrity sha1-fdeTMNKr5pwQws73lxTJchV5Hfo= + glob-parent@^5.0.0, glob-parent@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" @@ -3723,6 +3772,17 @@ glob@7.1.6, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -3747,11 +3807,25 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +"graceful-fs@2 || 3": + version "3.0.12" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef" + integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg== + dependencies: + natives "^1.1.3" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= + dependencies: + ansi-regex "^0.2.0" + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -4336,6 +4410,16 @@ jetifier@^1.6.2: resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.6.tgz#fec8bff76121444c12dc38d2dad6767c421dab68" integrity sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ== +jju@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" + integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= + +jquery-extend@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/jquery-extend/-/jquery-extend-2.0.3.tgz#6815cdb01a866ddba30e6f4d0fc5fb6679272735" + integrity sha1-aBXNsBqGbdujDm9ND8X7ZnknJzU= + "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" @@ -4369,6 +4453,13 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-helpfulerror@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" + integrity sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= + dependencies: + jju "^1.1.0" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -4502,6 +4593,16 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +"license-checker@git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893": + version "1.0.0" + resolved "git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893" + dependencies: + chalk "~0.5.1" + mkdirp "^0.3.5" + nopt "^2.2.0" + read-installed "~3.1.3" + treeify "^1.0.1" + load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -5079,7 +5180,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -5099,6 +5200,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= + mkdirp@^0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -5153,6 +5259,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natives@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" + integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5211,11 +5322,44 @@ noop-fn@^1.0.0: resolved "https://registry.yarnpkg.com/noop-fn/-/noop-fn-1.0.0.tgz#5f33d47f13d2150df93e0cb036699e982f78ffbf" integrity sha1-XzPUfxPSFQ35PgywNmmemC94/78= +nopt-defaults@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/nopt-defaults/-/nopt-defaults-0.0.1.tgz#f150fcc8882309cbfb76187e12e9bcb20694558b" + integrity sha1-8VD8yIgjCcv7dhh+Eum8sgaUVYs= + +nopt-usage@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/nopt-usage/-/nopt-usage-0.1.0.tgz#b18b8c183e181047ca9e63b7cde7cfc702cca579" + integrity sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk= + +nopt@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-2.2.1.tgz#2aa09b7d1768487b3b89a9c5aa52335bff0baea7" + integrity sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc= + dependencies: + abbrev "1" + +nopt@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + normalize-css-color@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/normalize-css-color/-/normalize-css-color-1.0.2.tgz#02991e97cccec6623fe573afbbf0de6a1f3e9f8d" integrity sha1-Apkel8zOxmI/5XOvu/Deah8+n40= +normalize-package-data@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-1.0.3.tgz#8be955b8907af975f1a4584ea8bb9b41492312f5" + integrity sha1-i+lVuJB6+XXxpFhOqLubQUkjEvU= + dependencies: + github-url-from-git "^1.3.0" + github-url-from-username-repo "^1.0.0" + semver "2 || 3 || 4" + normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -5242,6 +5386,21 @@ normalize-url@^2.0.1: query-string "^5.0.1" sort-keys "^2.0.0" +npm-license-crawler@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/npm-license-crawler/-/npm-license-crawler-0.2.1.tgz#a76a82e0a0407e2032c03dc5b1d518cf9eac9e1d" + integrity sha512-CRchloUjZk/ZSAkb5JbCKNFojLWtbjxwsB7w48kauHXK+5bjby2HXFvGvicVx7uNBY6HBWEPw20qKc/4jlL+1Q== + dependencies: + async "^2.6.1" + chalk "^2.4.2" + jquery-extend "~2.0.3" + license-checker "git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893" + mkdirp "^0.5.1" + nopt "^3.0.6" + nopt-defaults "^0.0.1" + nopt-usage "^0.1.0" + treeify "^1.1.0" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -5914,6 +6073,31 @@ react@16.13.1: object-assign "^4.1.1" prop-types "^15.6.2" +read-installed@~3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-3.1.5.tgz#4ae36081afd3e2204dc2e279807aaa52c30c8c0c" + integrity sha1-SuNgga/T4iBNwuJ5gHqqUsMMjAw= + dependencies: + debuglog "^1.0.1" + read-package-json "1" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "2 || 3" + +read-package-json@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-1.3.3.tgz#ef79dfda46e165376ee8a57efbfedd4d1b029ba4" + integrity sha1-73nf2kbhZTdu6KV++/7dTRsCm6Q= + dependencies: + glob "^5.0.3" + json-parse-helpfulerror "^1.0.2" + normalize-package-data "^1.0.0" + optionalDependencies: + graceful-fs "2 || 3" + read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -5944,6 +6128,16 @@ readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readdir-scoped-modules@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" + integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -6094,6 +6288,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +return@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/return/-/return-1.0.0.tgz#f2a1644ea84898cd6b28583021c67853cff40b42" + integrity sha1-8qFkTqhImM1rKFgwIcZ4U8/0C0I= + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -6197,6 +6396,11 @@ scheduler@0.19.1, scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" +"semver@2 || 3 || 4": + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= + "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -6374,7 +6578,7 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slide@^1.1.5: +slide@^1.1.5, slide@~1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= @@ -6607,6 +6811,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= + dependencies: + ansi-regex "^0.2.1" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -6648,6 +6859,11 @@ sudo-prompt@^9.0.0: resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -6779,6 +6995,11 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +treeify@^1.0.1, treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + tsconfig-paths@^3.9.0: version "3.9.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" @@ -6999,6 +7220,11 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"