├── .github └── cover.png ├── README.md ├── mobile ├── .expo-shared │ └── assets.json ├── .gitignore ├── App.tsx ├── app.json ├── assets │ ├── adaptive-icon.png │ ├── favicon.png │ ├── icon.png │ └── splash.png ├── babel.config.js ├── package-lock.json ├── package.json ├── src │ ├── @types │ │ ├── navigation.d.ts │ │ └── png.d.ts │ ├── assets │ │ ├── background-galaxy.png │ │ ├── background-galaxy@2x.png │ │ ├── background-galaxy@3x.png │ │ ├── games │ │ │ ├── game-1.png │ │ │ ├── game-2.png │ │ │ ├── game-3.png │ │ │ ├── game-4.png │ │ │ ├── game-5.png │ │ │ └── game-6.png │ │ ├── logo-nlw-esports.png │ │ ├── logo-nlw-esports@2x.png │ │ └── logo-nlw-esports@3x.png │ ├── components │ │ ├── Background │ │ │ ├── index.tsx │ │ │ └── styles.ts │ │ ├── DuoCard │ │ │ ├── index.tsx │ │ │ └── styles.ts │ │ ├── DuoInfo │ │ │ ├── index.tsx │ │ │ └── styles.ts │ │ ├── DuoMatch │ │ │ ├── index.tsx │ │ │ └── styles.ts │ │ ├── GameCard │ │ │ ├── index.tsx │ │ │ └── styles.ts │ │ ├── Heading │ │ │ ├── index.tsx │ │ │ └── styles.ts │ │ └── Loading │ │ │ ├── index.tsx │ │ │ └── styles.ts │ ├── routes │ │ ├── app.routes.tsx │ │ └── index.tsx │ ├── screens │ │ ├── Game │ │ │ ├── index.tsx │ │ │ └── styles.ts │ │ └── Home │ │ │ ├── index.tsx │ │ │ └── styles.ts │ ├── service │ │ ├── getPushNotificationToken.ts │ │ └── notificationConfigs.ts │ ├── theme │ │ └── index.ts │ └── utils │ │ └── games.ts └── tsconfig.json ├── server ├── .env ├── .gitignore ├── package-lock.json ├── package.json ├── prisma │ ├── migrations │ │ ├── 20220913170827_create_table_game │ │ │ └── migration.sql │ │ ├── 20220913171501_create_table_ads │ │ │ └── migration.sql │ │ └── migration_lock.toml │ └── schema.prisma ├── src │ ├── database │ │ └── db.sqlite │ ├── server.ts │ └── utils │ │ ├── convert-hour-string-to-minutes.ts │ │ └── convert-minutes-to-hour-string.ts └── tsconfig.json └── web ├── .gitignore ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.cjs ├── public ├── background-galaxy.png ├── game-1.png ├── game-2.png ├── game-3.png ├── game-4.png ├── game-5.png ├── game-6.png └── vite.svg ├── src ├── App.tsx ├── assets │ └── logo-nlw-esports.svg ├── components │ ├── CreateAdBanner.tsx │ ├── CreateAdModal.tsx │ ├── Form │ │ └── Input.tsx │ └── GameBanner.tsx ├── main.tsx ├── styles │ └── main.css └── vite-env.d.ts ├── tailwind.config.cjs ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.github/cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/.github/cover.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Aplicação web e mobile com back-end para encontrar parceiros(as) de gaming para jogar juntos o game preferido em comum. 2 | 3 | ![cover](.github/cover.png?style=flat) 4 | -------------------------------------------------------------------------------- /mobile/.expo-shared/assets.json: -------------------------------------------------------------------------------- 1 | { 2 | "12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true, 3 | "40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true 4 | } 5 | -------------------------------------------------------------------------------- /mobile/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .expo/ 3 | dist/ 4 | npm-debug.* 5 | *.jks 6 | *.p8 7 | *.p12 8 | *.key 9 | *.mobileprovision 10 | *.orig.* 11 | web-build/ 12 | 13 | # macOS 14 | .DS_Store 15 | -------------------------------------------------------------------------------- /mobile/App.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from "react"; 2 | import { StatusBar } from "react-native"; 3 | import { 4 | useFonts, 5 | Inter_400Regular, 6 | Inter_600SemiBold, 7 | Inter_700Bold, 8 | Inter_900Black, 9 | } from '@expo-google-fonts/inter' 10 | import { Subscription } from 'expo-modules-core'; 11 | import * as Notifications from 'expo-notifications'; 12 | 13 | import { Routes } from './src/routes'; 14 | import { Background } from "./src/components/Background"; 15 | import { Loading } from "./src/components/Loading"; 16 | 17 | import './src/service/notificationConfigs'; 18 | import { getPushNotificationToken } from "./src/service/getPushNotificationToken"; 19 | 20 | export default function App() { 21 | const getNotificationListener = useRef(); 22 | const responseNotificationListener = useRef(); 23 | 24 | useEffect(() => { 25 | getPushNotificationToken() 26 | }, []); 27 | 28 | useEffect(() => { 29 | getNotificationListener.current = Notifications.addNotificationReceivedListener(notification => { 30 | console.log(notification) 31 | }); 32 | 33 | responseNotificationListener.current = Notifications.addNotificationResponseReceivedListener(response => { 34 | console.log(response) 35 | }); 36 | 37 | return () => { 38 | if (getNotificationListener.current && responseNotificationListener.current) { 39 | Notifications.removeNotificationSubscription(getNotificationListener.current); 40 | Notifications.removeNotificationSubscription(responseNotificationListener.current); 41 | } 42 | } 43 | }, []); 44 | 45 | const [fontsLoaded] = useFonts({ 46 | Inter_400Regular, 47 | Inter_600SemiBold, 48 | Inter_700Bold, 49 | Inter_900Black, 50 | }); 51 | 52 | return ( 53 | 54 | 59 | 60 | {fontsLoaded ? : } 61 | 62 | ); 63 | } 64 | 65 | -------------------------------------------------------------------------------- /mobile/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "mobile", 4 | "slug": "mobile", 5 | "version": "1.0.0", 6 | "orientation": "portrait", 7 | "icon": "./assets/icon.png", 8 | "userInterfaceStyle": "light", 9 | "splash": { 10 | "image": "./assets/splash.png", 11 | "resizeMode": "contain", 12 | "backgroundColor": "#121214" 13 | }, 14 | "updates": { 15 | "fallbackToCacheTimeout": 0 16 | }, 17 | "assetBundlePatterns": [ 18 | "**/*" 19 | ], 20 | "ios": { 21 | "supportsTablet": true 22 | }, 23 | "android": { 24 | "adaptiveIcon": { 25 | "foregroundImage": "./assets/adaptive-icon.png", 26 | "backgroundColor": "#121214" 27 | } 28 | }, 29 | "web": { 30 | "favicon": "./assets/favicon.png" 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /mobile/assets/adaptive-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/assets/adaptive-icon.png -------------------------------------------------------------------------------- /mobile/assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/assets/favicon.png -------------------------------------------------------------------------------- /mobile/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/assets/icon.png -------------------------------------------------------------------------------- /mobile/assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/assets/splash.png -------------------------------------------------------------------------------- /mobile/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | presets: ['babel-preset-expo'], 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /mobile/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mobile", 3 | "version": "1.0.0", 4 | "main": "node_modules/expo/AppEntry.js", 5 | "scripts": { 6 | "start": "expo start", 7 | "android": "expo start --android", 8 | "ios": "expo start --ios", 9 | "web": "expo start --web" 10 | }, 11 | "dependencies": { 12 | "@expo-google-fonts/inter": "^0.2.2", 13 | "@react-navigation/native": "^6.0.12", 14 | "@react-navigation/native-stack": "^6.8.0", 15 | "expo": "~46.0.9", 16 | "expo-font": "~10.2.0", 17 | "expo-linear-gradient": "~11.4.0", 18 | "expo-status-bar": "~1.4.0", 19 | "phosphor-react-native": "^1.1.2", 20 | "react": "18.0.0", 21 | "react-dom": "18.0.0", 22 | "react-native": "0.69.5", 23 | "react-native-safe-area-context": "4.3.1", 24 | "react-native-screens": "~3.15.0", 25 | "react-native-web": "~0.18.7", 26 | "react-native-svg": "12.3.0", 27 | "expo-clipboard": "~3.1.0", 28 | "expo-notifications": "~0.16.1", 29 | "expo-modules-core": "~0.11.5" 30 | }, 31 | "devDependencies": { 32 | "@babel/core": "^7.12.9", 33 | "@types/react": "~18.0.14", 34 | "@types/react-native": "~0.69.1", 35 | "typescript": "~4.3.5" 36 | }, 37 | "private": true 38 | } 39 | -------------------------------------------------------------------------------- /mobile/src/@types/navigation.d.ts: -------------------------------------------------------------------------------- 1 | export interface GameParams { 2 | id: string; 3 | title: string; 4 | bannerUrl: string; 5 | } 6 | 7 | export declare global { 8 | namespace ReactNavigation { 9 | interface RootParamList { 10 | home: undefined; 11 | game: GameParams; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /mobile/src/@types/png.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.png'; 2 | -------------------------------------------------------------------------------- /mobile/src/assets/background-galaxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/background-galaxy.png -------------------------------------------------------------------------------- /mobile/src/assets/background-galaxy@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/background-galaxy@2x.png -------------------------------------------------------------------------------- /mobile/src/assets/background-galaxy@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/background-galaxy@3x.png -------------------------------------------------------------------------------- /mobile/src/assets/games/game-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/games/game-1.png -------------------------------------------------------------------------------- /mobile/src/assets/games/game-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/games/game-2.png -------------------------------------------------------------------------------- /mobile/src/assets/games/game-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/games/game-3.png -------------------------------------------------------------------------------- /mobile/src/assets/games/game-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/games/game-4.png -------------------------------------------------------------------------------- /mobile/src/assets/games/game-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/games/game-5.png -------------------------------------------------------------------------------- /mobile/src/assets/games/game-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/games/game-6.png -------------------------------------------------------------------------------- /mobile/src/assets/logo-nlw-esports.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/logo-nlw-esports.png -------------------------------------------------------------------------------- /mobile/src/assets/logo-nlw-esports@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/logo-nlw-esports@2x.png -------------------------------------------------------------------------------- /mobile/src/assets/logo-nlw-esports@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/mobile/src/assets/logo-nlw-esports@3x.png -------------------------------------------------------------------------------- /mobile/src/components/Background/index.tsx: -------------------------------------------------------------------------------- 1 | import { ImageBackground } from 'react-native'; 2 | 3 | import backgroundImg from '../../assets/background-galaxy.png'; 4 | 5 | import { styles } from './styles'; 6 | 7 | interface Props { 8 | children: React.ReactNode; 9 | } 10 | 11 | export function Background({ children }: Props) { 12 | return ( 13 | 18 | {children} 19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /mobile/src/components/Background/styles.ts: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | import { THEME } from "../../theme"; 3 | 4 | export const styles = StyleSheet.create({ 5 | container: { 6 | flex: 1, 7 | backgroundColor: THEME.COLORS.BACKGROUND_800, 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /mobile/src/components/DuoCard/index.tsx: -------------------------------------------------------------------------------- 1 | import { Text, TouchableOpacity, View } from 'react-native'; 2 | import { GameController } from "phosphor-react-native"; 3 | 4 | import { DuoInfo } from "../DuoInfo"; 5 | 6 | import { styles } from './styles'; 7 | import { THEME } from "../../theme"; 8 | 9 | export interface DuoCardProps { 10 | id: string; 11 | hourEnd: string; 12 | hourStart: string; 13 | name: string; 14 | useVoiceChannel: boolean; 15 | weekDays: string[]; 16 | yearsPlaying: number; 17 | } 18 | 19 | interface Props { 20 | data: DuoCardProps; 21 | onConnect: () => void; 22 | } 23 | 24 | export function DuoCard({ data, onConnect }: Props) { 25 | return ( 26 | 27 | 31 | 32 | 36 | 37 | 41 | 42 | 47 | 48 | 52 | 56 | 57 | 58 | Conectar 59 | 60 | 61 | 62 | ); 63 | } 64 | -------------------------------------------------------------------------------- /mobile/src/components/DuoCard/styles.ts: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | import { THEME } from "../../theme"; 3 | 4 | export const styles = StyleSheet.create({ 5 | container: { 6 | width: 200, 7 | backgroundColor: THEME.COLORS.SHAPE, 8 | borderRadius: 8, 9 | padding: 20, 10 | marginRight: 16, 11 | alignItems: "center", 12 | }, 13 | button: { 14 | width: '100%', 15 | height: 36, 16 | borderRadius: 6, 17 | backgroundColor: THEME.COLORS.PRIMARY, 18 | flexDirection: "row", 19 | alignItems: "center", 20 | justifyContent: "center", 21 | }, 22 | buttonTitle: { 23 | color: THEME.COLORS.TEXT, 24 | fontFamily: THEME.FONT_FAMILY.SEMI_BOLD, 25 | fontSize: THEME.FONT_SIZE.SM, 26 | marginLeft: 8 27 | } 28 | }) 29 | -------------------------------------------------------------------------------- /mobile/src/components/DuoInfo/index.tsx: -------------------------------------------------------------------------------- 1 | import { ColorValue, Text, View } from 'react-native'; 2 | import { THEME } from "../../theme"; 3 | 4 | import { styles } from './styles'; 5 | 6 | interface Props { 7 | label: string; 8 | value: string; 9 | colorValue?: ColorValue 10 | } 11 | 12 | export function DuoInfo({ label, value, colorValue = THEME.COLORS.TEXT }: Props) { 13 | return ( 14 | 15 | 16 | {label} 17 | 18 | 19 | 23 | {value} 24 | 25 | 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /mobile/src/components/DuoInfo/styles.ts: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | import { THEME } from "../../theme"; 3 | 4 | export const styles = StyleSheet.create({ 5 | container: { 6 | width: '100%', 7 | marginBottom: 16, 8 | }, 9 | label: { 10 | color: THEME.COLORS.CAPTION_300, 11 | fontSize: THEME.FONT_SIZE.SM, 12 | fontFamily: THEME.FONT_FAMILY.REGULAR, 13 | marginBottom: 4, 14 | }, 15 | value: { 16 | fontSize: THEME.FONT_SIZE.SM, 17 | fontFamily: THEME.FONT_FAMILY.BOLD, 18 | }, 19 | }) 20 | -------------------------------------------------------------------------------- /mobile/src/components/DuoMatch/index.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | import { Modal, ModalProps, Text, View, TouchableOpacity, Alert, ActivityIndicator } from 'react-native'; 3 | import { MaterialIcons } from '@expo/vector-icons'; 4 | import { CheckCircle } from "phosphor-react-native"; 5 | import * as Clipboard from 'expo-clipboard'; 6 | 7 | import { styles } from './styles'; 8 | import { THEME } from "../../theme"; 9 | import { Heading } from "../Heading"; 10 | 11 | interface Props extends ModalProps { 12 | discord: string; 13 | onClose: () => void; 14 | } 15 | 16 | export function DuoMatch({ discord, onClose, ...rest }: Props) { 17 | const [isCoping, setIsCoping] = useState(false); 18 | 19 | async function handleCopyDiscordToClipboard() { 20 | setIsCoping(true); 21 | await Clipboard.setStringAsync(discord); 22 | 23 | Alert.alert('Discord Copiado!', 'Usuário copiado para você colocar no Discord.'); 24 | setIsCoping(false); 25 | } 26 | 27 | return ( 28 | 34 | 35 | 36 | 40 | 45 | 46 | 47 | 52 | 53 | 58 | 59 | 60 | Adicione no Discord 61 | 62 | 63 | 68 | 69 | {isCoping ? : discord} 70 | 71 | 72 | 73 | 74 | 75 | ); 76 | } 77 | -------------------------------------------------------------------------------- /mobile/src/components/DuoMatch/styles.ts: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | import { THEME } from "../../theme"; 3 | 4 | export const styles = StyleSheet.create({ 5 | container: { 6 | flex: 1, 7 | justifyContent: "center", 8 | alignItems: "center", 9 | backgroundColor: THEME.COLORS.OVERLAY, 10 | }, 11 | content: { 12 | width: 311, 13 | backgroundColor: THEME.COLORS.SHAPE, 14 | borderRadius: 8, 15 | alignItems: "center", 16 | justifyContent: "center", 17 | }, 18 | closeIcon: { 19 | alignSelf: 'flex-end', 20 | margin: 16, 21 | }, 22 | label: { 23 | color: THEME.COLORS.TEXT, 24 | fontSize: THEME.FONT_SIZE.MD, 25 | fontFamily: THEME.FONT_FAMILY.SEMI_BOLD, 26 | marginTop: 24, 27 | marginBottom: 8, 28 | }, 29 | discordButton: { 30 | width: 231, 31 | height: 48, 32 | backgroundColor: THEME.COLORS.BACKGROUND_900, 33 | justifyContent: "center", 34 | alignItems: "center", 35 | borderRadius: 4, 36 | marginBottom: 32, 37 | }, 38 | discord: { 39 | color: THEME.COLORS.TEXT, 40 | fontSize: THEME.FONT_SIZE.MD, 41 | fontFamily: THEME.FONT_FAMILY.REGULAR, 42 | }, 43 | }); 44 | -------------------------------------------------------------------------------- /mobile/src/components/GameCard/index.tsx: -------------------------------------------------------------------------------- 1 | import { TouchableOpacity, TouchableOpacityProps, ImageBackground, ImageSourcePropType, Text } from 'react-native'; 2 | import { LinearGradient } from "expo-linear-gradient"; 3 | 4 | import { styles } from './styles'; 5 | import { THEME } from "../../theme"; 6 | 7 | export interface GameCardProps { 8 | id: string; 9 | title: string; 10 | _count: { 11 | ads: number; 12 | } 13 | bannerUrl: string; 14 | } 15 | 16 | interface Props extends TouchableOpacityProps { 17 | data: GameCardProps; 18 | } 19 | 20 | export function GameCard({ data, ...rest }: Props) { 21 | return ( 22 | 23 | 27 | 31 | 32 | {data.title} 33 | 34 | 35 | 36 | {data._count.ads} anúncios 37 | 38 | 39 | 40 | 41 | ); 42 | } 43 | -------------------------------------------------------------------------------- /mobile/src/components/GameCard/styles.ts: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | import { THEME } from "../../theme"; 3 | 4 | export const styles = StyleSheet.create({ 5 | container: { 6 | marginRight: 24, 7 | }, 8 | cover: { 9 | width: 240, 10 | height: 320, 11 | justifyContent: 'flex-end', 12 | borderRadius: 8, 13 | overflow: 'hidden', 14 | }, 15 | footer: { 16 | width: '100%', 17 | height: 120, 18 | padding: 16, 19 | justifyContent: 'flex-end', 20 | }, 21 | name: { 22 | color: THEME.COLORS.TEXT, 23 | fontSize: THEME.FONT_SIZE.MD, 24 | fontFamily: THEME.FONT_FAMILY.BOLD, 25 | }, 26 | ads: { 27 | color: THEME.COLORS.CAPTION_300, 28 | fontSize: THEME.FONT_SIZE.MD, 29 | fontFamily: THEME.FONT_FAMILY.REGULAR, 30 | } 31 | }); 32 | -------------------------------------------------------------------------------- /mobile/src/components/Heading/index.tsx: -------------------------------------------------------------------------------- 1 | import { View, Text, ViewProps } from 'react-native'; 2 | 3 | import { styles } from './styles'; 4 | 5 | interface Props extends ViewProps { 6 | title: string; 7 | subtitle: string; 8 | } 9 | 10 | export function Heading({ title, subtitle, ...rest}: Props) { 11 | return ( 12 | 13 | 14 | {title} 15 | 16 | 17 | 18 | {subtitle} 19 | 20 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /mobile/src/components/Heading/styles.ts: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | import { THEME } from "../../theme"; 3 | 4 | export const styles = StyleSheet.create({ 5 | container: { 6 | width: '100%', 7 | padding: 32, 8 | }, 9 | title: { 10 | color: THEME.COLORS.TEXT, 11 | fontSize: THEME.FONT_SIZE.LG, 12 | fontFamily: THEME.FONT_FAMILY.BLACK, 13 | }, 14 | subtitle: { 15 | color: THEME.COLORS.CAPTION_400, 16 | fontSize: THEME.FONT_SIZE.MD, 17 | fontFamily: THEME.FONT_FAMILY.REGULAR, 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /mobile/src/components/Loading/index.tsx: -------------------------------------------------------------------------------- 1 | import { View, ActivityIndicator } from 'react-native'; 2 | import { THEME } from "../../theme"; 3 | 4 | import { styles } from './styles'; 5 | 6 | export function Loading() { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /mobile/src/components/Loading/styles.ts: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | flex: 1, 6 | justifyContent: 'center', 7 | alignItems: 'center', 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /mobile/src/routes/app.routes.tsx: -------------------------------------------------------------------------------- 1 | import { createNativeStackNavigator } from '@react-navigation/native-stack'; 2 | 3 | import { Home } from "../screens/Home"; 4 | import { Game } from "../screens/Game"; 5 | 6 | const { Navigator, Screen } = createNativeStackNavigator(); 7 | 8 | export function AppRoutes() { 9 | return ( 10 | 13 | 17 | 18 | 22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /mobile/src/routes/index.tsx: -------------------------------------------------------------------------------- 1 | import { NavigationContainer } from "@react-navigation/native"; 2 | 3 | import { AppRoutes } from "./app.routes"; 4 | 5 | export function Routes() { 6 | return ( 7 | 8 | 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /mobile/src/screens/Game/index.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import { FlatList, Image, Text, TouchableOpacity, View } from "react-native"; 3 | import { SafeAreaView } from "react-native-safe-area-context"; 4 | import { useRoute, useNavigation } from "@react-navigation/native"; 5 | import { Entypo } from '@expo/vector-icons'; 6 | 7 | import logoImg from '../../assets/logo-nlw-esports.png'; 8 | 9 | import { THEME } from "../../theme"; 10 | import { styles } from './styles'; 11 | 12 | import { GameParams } from "../../@types/navigation"; 13 | 14 | import { Heading } from "../../components/Heading"; 15 | import { Background } from "../../components/Background"; 16 | import { DuoMatch } from "../../components/DuoMatch"; 17 | import { DuoCard, DuoCardProps } from "../../components/DuoCard"; 18 | 19 | export function Game() { 20 | const [duos, setDuos] = useState([]) 21 | const [discordDuoSelected, setDiscordDuoSelected] = useState(''); 22 | 23 | const navigation = useNavigation(); 24 | const router = useRoute(); 25 | const game = router.params as GameParams; 26 | 27 | function handleGoBack() { 28 | navigation.goBack(); 29 | } 30 | 31 | async function getDiscordUser(adsId: string) { 32 | fetch(`http://192.168.0.100:3333/ads/${adsId}/discord`) 33 | .then(response => response.json()) 34 | .then(data => setDiscordDuoSelected(data.discord)) 35 | } 36 | 37 | useEffect(() => { 38 | fetch(`http://192.168.0.100:3333/games/${game.id}/ads`) 39 | .then(response => response.json()) 40 | .then(data => setDuos(data)) 41 | }, []); 42 | 43 | return ( 44 | 45 | 46 | 47 | 48 | 53 | 54 | 55 | 59 | 60 | 61 | 62 | 63 | 68 | 69 | 73 | 74 | item.id} 77 | renderItem={({ item }) => ( 78 | getDiscordUser(item.id)} 81 | /> 82 | )} 83 | horizontal 84 | style={styles.containerList} 85 | contentContainerStyle={[duos.length > 0 ? styles.contentList : styles.emptyListContent ]} 86 | showsHorizontalScrollIndicator 87 | ListEmptyComponent={ 88 | 89 | Não há anúncios publicados ainda. 90 | 91 | } 92 | /> 93 | 94 | 0} 96 | discord={discordDuoSelected} 97 | onClose={() => setDiscordDuoSelected('')} 98 | /> 99 | 100 | 101 | ); 102 | } 103 | -------------------------------------------------------------------------------- /mobile/src/screens/Game/styles.ts: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | import { THEME } from "../../theme"; 3 | 4 | export const styles = StyleSheet.create({ 5 | container: { 6 | flex: 1, 7 | alignItems: "center", 8 | }, 9 | header: { 10 | width: '100%', 11 | flexDirection: 'row', 12 | alignItems: 'center', 13 | paddingHorizontal: 32, 14 | marginTop: 28, 15 | justifyContent: 'space-between', 16 | }, 17 | logo: { 18 | width: 72, 19 | height: 40, 20 | }, 21 | right: { 22 | width: 20, 23 | height: 20 24 | }, 25 | cover: { 26 | width: 311, 27 | height: 160, 28 | borderRadius: 8, 29 | marginTop: 32, 30 | }, 31 | containerList: { 32 | width: '100%', 33 | }, 34 | contentList: { 35 | paddingLeft: 32, 36 | paddingRight: 64, 37 | alignItems: 'flex-start' 38 | }, 39 | emptyListText: { 40 | color: THEME.COLORS.CAPTION_300, 41 | fontSize: THEME.FONT_SIZE.SM, 42 | fontFamily: THEME.FONT_FAMILY.REGULAR, 43 | }, 44 | emptyListContent: { 45 | flex: 1, 46 | justifyContent: 'center', 47 | alignItems: 'center', 48 | } 49 | }) 50 | -------------------------------------------------------------------------------- /mobile/src/screens/Home/index.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import { Image, FlatList } from 'react-native'; 3 | import { SafeAreaView } from "react-native-safe-area-context"; 4 | import { useNavigation } from "@react-navigation/native"; 5 | 6 | import logoImg from '../../assets/logo-nlw-esports.png'; 7 | 8 | import { GameCard, GameCardProps } from "../../components/GameCard"; 9 | import { Background } from "../../components/Background"; 10 | import { Heading } from "../../components/Heading"; 11 | 12 | import { styles } from './styles'; 13 | 14 | export function Home() { 15 | const [games, setGames] = useState([]) 16 | 17 | const navigation = useNavigation(); 18 | 19 | function handleOpenGaming({ id, title, bannerUrl }: GameCardProps) { 20 | navigation.navigate('game', { id, title, bannerUrl }); 21 | } 22 | 23 | useEffect(() => { 24 | fetch('http://192.168.0.100:3333/games') 25 | .then(response => response.json()) 26 | .then(data => setGames(data)) 27 | }, []); 28 | 29 | return ( 30 | 31 | 32 | 36 | 37 | 41 | 42 | item.id} 45 | renderItem={({ item }) => ( 46 | handleOpenGaming(item)} 49 | /> 50 | )} 51 | showsHorizontalScrollIndicator={false} 52 | horizontal 53 | contentContainerStyle={styles.contentList} 54 | /> 55 | 56 | 57 | ); 58 | } 59 | -------------------------------------------------------------------------------- /mobile/src/screens/Home/styles.ts: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | 3 | export const styles = StyleSheet.create({ 4 | container: { 5 | flex: 1, 6 | alignItems: 'center', 7 | }, 8 | logo: { 9 | width: 214, 10 | height: 120, 11 | marginTop: 74, 12 | marginBottom: 48, 13 | }, 14 | contentList: { 15 | paddingLeft: 32, 16 | paddingRight: 64, 17 | } 18 | }); 19 | -------------------------------------------------------------------------------- /mobile/src/service/getPushNotificationToken.ts: -------------------------------------------------------------------------------- 1 | import * as Notifications from 'expo-notifications'; 2 | 3 | export async function getPushNotificationToken() { 4 | const { granted } = await Notifications.getPermissionsAsync(); 5 | 6 | if (!granted) { 7 | await Notifications.requestPermissionsAsync(); 8 | } 9 | 10 | if (granted) { 11 | const pushToken = await Notifications.getExpoPushTokenAsync() 12 | 13 | console.log('NOTIFICATION TOKEN =>', pushToken.data) 14 | 15 | return pushToken.data; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /mobile/src/service/notificationConfigs.ts: -------------------------------------------------------------------------------- 1 | import * as Notifications from 'expo-notifications'; 2 | 3 | Notifications.setNotificationHandler({ 4 | handleNotification: async () => ({ 5 | shouldShowAlert: true, 6 | shouldPlaySound: true, 7 | shouldSetBadge: true, 8 | }), 9 | }) 10 | -------------------------------------------------------------------------------- /mobile/src/theme/index.ts: -------------------------------------------------------------------------------- 1 | export const THEME = { 2 | COLORS: { 3 | BACKGROUND_900: '#121214', 4 | BACKGROUND_800: '#18181B', 5 | 6 | TEXT: '#FFFFFF', 7 | 8 | CAPTION_500: '#71717A', 9 | CAPTION_400: '#A1A1AA', 10 | CAPTION_300: '#D4D4D8', 11 | 12 | SHAPE: '#2A2634', 13 | 14 | PRIMARY: '#8B5CF6', 15 | SUCCESS: '#34D399', 16 | ALERT: '#F87171', 17 | 18 | FOOTER: ['rgba(0,0,0,0)', 'rgba(0,0,0,0.9)'], 19 | OVERLAY: 'rgba(0,0,0,0.6)', 20 | }, 21 | 22 | FONT_FAMILY: { 23 | REGULAR: 'Inter_400Regular', 24 | SEMI_BOLD: 'Inter_600SemiBold', 25 | BOLD: 'Inter_700Bold', 26 | BLACK: 'Inter_900Black' 27 | }, 28 | 29 | FONT_SIZE: { 30 | SM: 14, 31 | MD: 16, 32 | LG: 24 33 | } 34 | }; -------------------------------------------------------------------------------- /mobile/src/utils/games.ts: -------------------------------------------------------------------------------- 1 | export const GAMES = [ 2 | { 3 | id: '1', 4 | name: 'League of Legends', 5 | ads: '4', 6 | cover: require('../assets/games/game-1.png') 7 | }, 8 | { 9 | id: '2', 10 | name: 'Dota 2', 11 | ads: '3', 12 | cover: require('../assets/games/game-2.png') 13 | }, 14 | { 15 | id: '3', 16 | name: 'CS-GO', 17 | ads: '2', 18 | cover: require('../assets/games/game-3.png') 19 | }, 20 | { 21 | id: '4', 22 | name: 'Apex', 23 | ads: '3', 24 | cover: require('../assets/games/game-4.png') 25 | }, 26 | { 27 | id: '5', 28 | name: 'Fortnite', 29 | ads: '5', 30 | cover: require('../assets/games/game-5.png') 31 | }, 32 | { 33 | id: '6', 34 | name: 'World of Warcraft', 35 | ads: '2', 36 | cover: require('../assets/games/game-6.png') 37 | }, 38 | ]; -------------------------------------------------------------------------------- /mobile/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "expo/tsconfig.base", 3 | "compilerOptions": { 4 | "strict": true 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /server/.env: -------------------------------------------------------------------------------- 1 | # Environment variables declared in this file are automatically made available to Prisma. 2 | # See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema 3 | 4 | # Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. 5 | # See the documentation for all the connection string options: https://pris.ly/d/connection-strings 6 | 7 | DATABASE_URL="file:../src/database/db.sqlite" 8 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@prisma/client": "^4.3.1", 13 | "cors": "^2.8.5", 14 | "express": "^4.18.1" 15 | }, 16 | "devDependencies": { 17 | "@types/cors": "^2.8.12", 18 | "@types/express": "^4.17.13", 19 | "prisma": "^4.3.1", 20 | "ts-node-dev": "^2.0.0", 21 | "typescript": "^4.8.3" 22 | } 23 | }, 24 | "node_modules/@cspotcode/source-map-support": { 25 | "version": "0.8.1", 26 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 27 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 28 | "dev": true, 29 | "dependencies": { 30 | "@jridgewell/trace-mapping": "0.3.9" 31 | }, 32 | "engines": { 33 | "node": ">=12" 34 | } 35 | }, 36 | "node_modules/@jridgewell/resolve-uri": { 37 | "version": "3.1.0", 38 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 39 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 40 | "dev": true, 41 | "engines": { 42 | "node": ">=6.0.0" 43 | } 44 | }, 45 | "node_modules/@jridgewell/sourcemap-codec": { 46 | "version": "1.4.14", 47 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 48 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 49 | "dev": true 50 | }, 51 | "node_modules/@jridgewell/trace-mapping": { 52 | "version": "0.3.9", 53 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 54 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 55 | "dev": true, 56 | "dependencies": { 57 | "@jridgewell/resolve-uri": "^3.0.3", 58 | "@jridgewell/sourcemap-codec": "^1.4.10" 59 | } 60 | }, 61 | "node_modules/@prisma/client": { 62 | "version": "4.3.1", 63 | "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.3.1.tgz", 64 | "integrity": "sha512-FA0/d1VMJNWqzU7WVWTNWJ+lGOLR9JUBnF73GdIPAEVo/6dWk4gHx0EmgeU+SMv4MZoxgOeTBJF2azhg7x0hMw==", 65 | "hasInstallScript": true, 66 | "dependencies": { 67 | "@prisma/engines-version": "4.3.0-32.c875e43600dfe042452e0b868f7a48b817b9640b" 68 | }, 69 | "engines": { 70 | "node": ">=14.17" 71 | }, 72 | "peerDependencies": { 73 | "prisma": "*" 74 | }, 75 | "peerDependenciesMeta": { 76 | "prisma": { 77 | "optional": true 78 | } 79 | } 80 | }, 81 | "node_modules/@prisma/engines": { 82 | "version": "4.3.1", 83 | "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.3.1.tgz", 84 | "integrity": "sha512-4JF/uMaEDAPdcdZNOrnzE3BvrbGpjgV0FcPT3EVoi6I86fWkloqqxBt+KcK/+fIRR0Pxj66uGR9wVH8U1Y13JA==", 85 | "devOptional": true, 86 | "hasInstallScript": true 87 | }, 88 | "node_modules/@prisma/engines-version": { 89 | "version": "4.3.0-32.c875e43600dfe042452e0b868f7a48b817b9640b", 90 | "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.3.0-32.c875e43600dfe042452e0b868f7a48b817b9640b.tgz", 91 | "integrity": "sha512-8yWpXkQRmiSfsi2Wb/ZS5D3RFbeu/btL9Pm/gdF4phB0Lo5KGsDFMxFMgaD64mwED2nHc8ZaEJg/+4Jymb9Znw==" 92 | }, 93 | "node_modules/@tsconfig/node10": { 94 | "version": "1.0.9", 95 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 96 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 97 | "dev": true 98 | }, 99 | "node_modules/@tsconfig/node12": { 100 | "version": "1.0.11", 101 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 102 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 103 | "dev": true 104 | }, 105 | "node_modules/@tsconfig/node14": { 106 | "version": "1.0.3", 107 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 108 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 109 | "dev": true 110 | }, 111 | "node_modules/@tsconfig/node16": { 112 | "version": "1.0.3", 113 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", 114 | "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", 115 | "dev": true 116 | }, 117 | "node_modules/@types/body-parser": { 118 | "version": "1.19.2", 119 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 120 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 121 | "dev": true, 122 | "dependencies": { 123 | "@types/connect": "*", 124 | "@types/node": "*" 125 | } 126 | }, 127 | "node_modules/@types/connect": { 128 | "version": "3.4.35", 129 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 130 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 131 | "dev": true, 132 | "dependencies": { 133 | "@types/node": "*" 134 | } 135 | }, 136 | "node_modules/@types/cors": { 137 | "version": "2.8.12", 138 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", 139 | "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", 140 | "dev": true 141 | }, 142 | "node_modules/@types/express": { 143 | "version": "4.17.13", 144 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", 145 | "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", 146 | "dev": true, 147 | "dependencies": { 148 | "@types/body-parser": "*", 149 | "@types/express-serve-static-core": "^4.17.18", 150 | "@types/qs": "*", 151 | "@types/serve-static": "*" 152 | } 153 | }, 154 | "node_modules/@types/express-serve-static-core": { 155 | "version": "4.17.30", 156 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", 157 | "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", 158 | "dev": true, 159 | "dependencies": { 160 | "@types/node": "*", 161 | "@types/qs": "*", 162 | "@types/range-parser": "*" 163 | } 164 | }, 165 | "node_modules/@types/mime": { 166 | "version": "3.0.1", 167 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", 168 | "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", 169 | "dev": true 170 | }, 171 | "node_modules/@types/node": { 172 | "version": "18.7.16", 173 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", 174 | "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==", 175 | "dev": true 176 | }, 177 | "node_modules/@types/qs": { 178 | "version": "6.9.7", 179 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 180 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", 181 | "dev": true 182 | }, 183 | "node_modules/@types/range-parser": { 184 | "version": "1.2.4", 185 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 186 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", 187 | "dev": true 188 | }, 189 | "node_modules/@types/serve-static": { 190 | "version": "1.15.0", 191 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", 192 | "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", 193 | "dev": true, 194 | "dependencies": { 195 | "@types/mime": "*", 196 | "@types/node": "*" 197 | } 198 | }, 199 | "node_modules/@types/strip-bom": { 200 | "version": "3.0.0", 201 | "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", 202 | "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", 203 | "dev": true 204 | }, 205 | "node_modules/@types/strip-json-comments": { 206 | "version": "0.0.30", 207 | "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", 208 | "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", 209 | "dev": true 210 | }, 211 | "node_modules/accepts": { 212 | "version": "1.3.8", 213 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 214 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 215 | "dependencies": { 216 | "mime-types": "~2.1.34", 217 | "negotiator": "0.6.3" 218 | }, 219 | "engines": { 220 | "node": ">= 0.6" 221 | } 222 | }, 223 | "node_modules/acorn": { 224 | "version": "8.8.0", 225 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", 226 | "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", 227 | "dev": true, 228 | "bin": { 229 | "acorn": "bin/acorn" 230 | }, 231 | "engines": { 232 | "node": ">=0.4.0" 233 | } 234 | }, 235 | "node_modules/acorn-walk": { 236 | "version": "8.2.0", 237 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 238 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 239 | "dev": true, 240 | "engines": { 241 | "node": ">=0.4.0" 242 | } 243 | }, 244 | "node_modules/anymatch": { 245 | "version": "3.1.2", 246 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 247 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 248 | "dev": true, 249 | "dependencies": { 250 | "normalize-path": "^3.0.0", 251 | "picomatch": "^2.0.4" 252 | }, 253 | "engines": { 254 | "node": ">= 8" 255 | } 256 | }, 257 | "node_modules/arg": { 258 | "version": "4.1.3", 259 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 260 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 261 | "dev": true 262 | }, 263 | "node_modules/array-flatten": { 264 | "version": "1.1.1", 265 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 266 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 267 | }, 268 | "node_modules/balanced-match": { 269 | "version": "1.0.2", 270 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 271 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 272 | "dev": true 273 | }, 274 | "node_modules/binary-extensions": { 275 | "version": "2.2.0", 276 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 277 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 278 | "dev": true, 279 | "engines": { 280 | "node": ">=8" 281 | } 282 | }, 283 | "node_modules/body-parser": { 284 | "version": "1.20.0", 285 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 286 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 287 | "dependencies": { 288 | "bytes": "3.1.2", 289 | "content-type": "~1.0.4", 290 | "debug": "2.6.9", 291 | "depd": "2.0.0", 292 | "destroy": "1.2.0", 293 | "http-errors": "2.0.0", 294 | "iconv-lite": "0.4.24", 295 | "on-finished": "2.4.1", 296 | "qs": "6.10.3", 297 | "raw-body": "2.5.1", 298 | "type-is": "~1.6.18", 299 | "unpipe": "1.0.0" 300 | }, 301 | "engines": { 302 | "node": ">= 0.8", 303 | "npm": "1.2.8000 || >= 1.4.16" 304 | } 305 | }, 306 | "node_modules/brace-expansion": { 307 | "version": "1.1.11", 308 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 309 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 310 | "dev": true, 311 | "dependencies": { 312 | "balanced-match": "^1.0.0", 313 | "concat-map": "0.0.1" 314 | } 315 | }, 316 | "node_modules/braces": { 317 | "version": "3.0.2", 318 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 319 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 320 | "dev": true, 321 | "dependencies": { 322 | "fill-range": "^7.0.1" 323 | }, 324 | "engines": { 325 | "node": ">=8" 326 | } 327 | }, 328 | "node_modules/buffer-from": { 329 | "version": "1.1.2", 330 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 331 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 332 | "dev": true 333 | }, 334 | "node_modules/bytes": { 335 | "version": "3.1.2", 336 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 337 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 338 | "engines": { 339 | "node": ">= 0.8" 340 | } 341 | }, 342 | "node_modules/call-bind": { 343 | "version": "1.0.2", 344 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 345 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 346 | "dependencies": { 347 | "function-bind": "^1.1.1", 348 | "get-intrinsic": "^1.0.2" 349 | }, 350 | "funding": { 351 | "url": "https://github.com/sponsors/ljharb" 352 | } 353 | }, 354 | "node_modules/chokidar": { 355 | "version": "3.5.3", 356 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 357 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 358 | "dev": true, 359 | "funding": [ 360 | { 361 | "type": "individual", 362 | "url": "https://paulmillr.com/funding/" 363 | } 364 | ], 365 | "dependencies": { 366 | "anymatch": "~3.1.2", 367 | "braces": "~3.0.2", 368 | "glob-parent": "~5.1.2", 369 | "is-binary-path": "~2.1.0", 370 | "is-glob": "~4.0.1", 371 | "normalize-path": "~3.0.0", 372 | "readdirp": "~3.6.0" 373 | }, 374 | "engines": { 375 | "node": ">= 8.10.0" 376 | }, 377 | "optionalDependencies": { 378 | "fsevents": "~2.3.2" 379 | } 380 | }, 381 | "node_modules/concat-map": { 382 | "version": "0.0.1", 383 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 384 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 385 | "dev": true 386 | }, 387 | "node_modules/content-disposition": { 388 | "version": "0.5.4", 389 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 390 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 391 | "dependencies": { 392 | "safe-buffer": "5.2.1" 393 | }, 394 | "engines": { 395 | "node": ">= 0.6" 396 | } 397 | }, 398 | "node_modules/content-type": { 399 | "version": "1.0.4", 400 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 401 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 402 | "engines": { 403 | "node": ">= 0.6" 404 | } 405 | }, 406 | "node_modules/cookie": { 407 | "version": "0.5.0", 408 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 409 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 410 | "engines": { 411 | "node": ">= 0.6" 412 | } 413 | }, 414 | "node_modules/cookie-signature": { 415 | "version": "1.0.6", 416 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 417 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 418 | }, 419 | "node_modules/cors": { 420 | "version": "2.8.5", 421 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 422 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 423 | "dependencies": { 424 | "object-assign": "^4", 425 | "vary": "^1" 426 | }, 427 | "engines": { 428 | "node": ">= 0.10" 429 | } 430 | }, 431 | "node_modules/create-require": { 432 | "version": "1.1.1", 433 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 434 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 435 | "dev": true 436 | }, 437 | "node_modules/debug": { 438 | "version": "2.6.9", 439 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 440 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 441 | "dependencies": { 442 | "ms": "2.0.0" 443 | } 444 | }, 445 | "node_modules/depd": { 446 | "version": "2.0.0", 447 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 448 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 449 | "engines": { 450 | "node": ">= 0.8" 451 | } 452 | }, 453 | "node_modules/destroy": { 454 | "version": "1.2.0", 455 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 456 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 457 | "engines": { 458 | "node": ">= 0.8", 459 | "npm": "1.2.8000 || >= 1.4.16" 460 | } 461 | }, 462 | "node_modules/diff": { 463 | "version": "4.0.2", 464 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 465 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 466 | "dev": true, 467 | "engines": { 468 | "node": ">=0.3.1" 469 | } 470 | }, 471 | "node_modules/dynamic-dedupe": { 472 | "version": "0.3.0", 473 | "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", 474 | "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", 475 | "dev": true, 476 | "dependencies": { 477 | "xtend": "^4.0.0" 478 | } 479 | }, 480 | "node_modules/ee-first": { 481 | "version": "1.1.1", 482 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 483 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 484 | }, 485 | "node_modules/encodeurl": { 486 | "version": "1.0.2", 487 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 488 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 489 | "engines": { 490 | "node": ">= 0.8" 491 | } 492 | }, 493 | "node_modules/escape-html": { 494 | "version": "1.0.3", 495 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 496 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 497 | }, 498 | "node_modules/etag": { 499 | "version": "1.8.1", 500 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 501 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 502 | "engines": { 503 | "node": ">= 0.6" 504 | } 505 | }, 506 | "node_modules/express": { 507 | "version": "4.18.1", 508 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 509 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 510 | "dependencies": { 511 | "accepts": "~1.3.8", 512 | "array-flatten": "1.1.1", 513 | "body-parser": "1.20.0", 514 | "content-disposition": "0.5.4", 515 | "content-type": "~1.0.4", 516 | "cookie": "0.5.0", 517 | "cookie-signature": "1.0.6", 518 | "debug": "2.6.9", 519 | "depd": "2.0.0", 520 | "encodeurl": "~1.0.2", 521 | "escape-html": "~1.0.3", 522 | "etag": "~1.8.1", 523 | "finalhandler": "1.2.0", 524 | "fresh": "0.5.2", 525 | "http-errors": "2.0.0", 526 | "merge-descriptors": "1.0.1", 527 | "methods": "~1.1.2", 528 | "on-finished": "2.4.1", 529 | "parseurl": "~1.3.3", 530 | "path-to-regexp": "0.1.7", 531 | "proxy-addr": "~2.0.7", 532 | "qs": "6.10.3", 533 | "range-parser": "~1.2.1", 534 | "safe-buffer": "5.2.1", 535 | "send": "0.18.0", 536 | "serve-static": "1.15.0", 537 | "setprototypeof": "1.2.0", 538 | "statuses": "2.0.1", 539 | "type-is": "~1.6.18", 540 | "utils-merge": "1.0.1", 541 | "vary": "~1.1.2" 542 | }, 543 | "engines": { 544 | "node": ">= 0.10.0" 545 | } 546 | }, 547 | "node_modules/fill-range": { 548 | "version": "7.0.1", 549 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 550 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 551 | "dev": true, 552 | "dependencies": { 553 | "to-regex-range": "^5.0.1" 554 | }, 555 | "engines": { 556 | "node": ">=8" 557 | } 558 | }, 559 | "node_modules/finalhandler": { 560 | "version": "1.2.0", 561 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 562 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 563 | "dependencies": { 564 | "debug": "2.6.9", 565 | "encodeurl": "~1.0.2", 566 | "escape-html": "~1.0.3", 567 | "on-finished": "2.4.1", 568 | "parseurl": "~1.3.3", 569 | "statuses": "2.0.1", 570 | "unpipe": "~1.0.0" 571 | }, 572 | "engines": { 573 | "node": ">= 0.8" 574 | } 575 | }, 576 | "node_modules/forwarded": { 577 | "version": "0.2.0", 578 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 579 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 580 | "engines": { 581 | "node": ">= 0.6" 582 | } 583 | }, 584 | "node_modules/fresh": { 585 | "version": "0.5.2", 586 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 587 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 588 | "engines": { 589 | "node": ">= 0.6" 590 | } 591 | }, 592 | "node_modules/fs.realpath": { 593 | "version": "1.0.0", 594 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 595 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 596 | "dev": true 597 | }, 598 | "node_modules/fsevents": { 599 | "version": "2.3.2", 600 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 601 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 602 | "dev": true, 603 | "hasInstallScript": true, 604 | "optional": true, 605 | "os": [ 606 | "darwin" 607 | ], 608 | "engines": { 609 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 610 | } 611 | }, 612 | "node_modules/function-bind": { 613 | "version": "1.1.1", 614 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 615 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 616 | }, 617 | "node_modules/get-intrinsic": { 618 | "version": "1.1.2", 619 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 620 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 621 | "dependencies": { 622 | "function-bind": "^1.1.1", 623 | "has": "^1.0.3", 624 | "has-symbols": "^1.0.3" 625 | }, 626 | "funding": { 627 | "url": "https://github.com/sponsors/ljharb" 628 | } 629 | }, 630 | "node_modules/glob": { 631 | "version": "7.2.3", 632 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 633 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 634 | "dev": true, 635 | "dependencies": { 636 | "fs.realpath": "^1.0.0", 637 | "inflight": "^1.0.4", 638 | "inherits": "2", 639 | "minimatch": "^3.1.1", 640 | "once": "^1.3.0", 641 | "path-is-absolute": "^1.0.0" 642 | }, 643 | "engines": { 644 | "node": "*" 645 | }, 646 | "funding": { 647 | "url": "https://github.com/sponsors/isaacs" 648 | } 649 | }, 650 | "node_modules/glob-parent": { 651 | "version": "5.1.2", 652 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 653 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 654 | "dev": true, 655 | "dependencies": { 656 | "is-glob": "^4.0.1" 657 | }, 658 | "engines": { 659 | "node": ">= 6" 660 | } 661 | }, 662 | "node_modules/has": { 663 | "version": "1.0.3", 664 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 665 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 666 | "dependencies": { 667 | "function-bind": "^1.1.1" 668 | }, 669 | "engines": { 670 | "node": ">= 0.4.0" 671 | } 672 | }, 673 | "node_modules/has-symbols": { 674 | "version": "1.0.3", 675 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 676 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 677 | "engines": { 678 | "node": ">= 0.4" 679 | }, 680 | "funding": { 681 | "url": "https://github.com/sponsors/ljharb" 682 | } 683 | }, 684 | "node_modules/http-errors": { 685 | "version": "2.0.0", 686 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 687 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 688 | "dependencies": { 689 | "depd": "2.0.0", 690 | "inherits": "2.0.4", 691 | "setprototypeof": "1.2.0", 692 | "statuses": "2.0.1", 693 | "toidentifier": "1.0.1" 694 | }, 695 | "engines": { 696 | "node": ">= 0.8" 697 | } 698 | }, 699 | "node_modules/iconv-lite": { 700 | "version": "0.4.24", 701 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 702 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 703 | "dependencies": { 704 | "safer-buffer": ">= 2.1.2 < 3" 705 | }, 706 | "engines": { 707 | "node": ">=0.10.0" 708 | } 709 | }, 710 | "node_modules/inflight": { 711 | "version": "1.0.6", 712 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 713 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 714 | "dev": true, 715 | "dependencies": { 716 | "once": "^1.3.0", 717 | "wrappy": "1" 718 | } 719 | }, 720 | "node_modules/inherits": { 721 | "version": "2.0.4", 722 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 723 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 724 | }, 725 | "node_modules/ipaddr.js": { 726 | "version": "1.9.1", 727 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 728 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 729 | "engines": { 730 | "node": ">= 0.10" 731 | } 732 | }, 733 | "node_modules/is-binary-path": { 734 | "version": "2.1.0", 735 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 736 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 737 | "dev": true, 738 | "dependencies": { 739 | "binary-extensions": "^2.0.0" 740 | }, 741 | "engines": { 742 | "node": ">=8" 743 | } 744 | }, 745 | "node_modules/is-core-module": { 746 | "version": "2.10.0", 747 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 748 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 749 | "dev": true, 750 | "dependencies": { 751 | "has": "^1.0.3" 752 | }, 753 | "funding": { 754 | "url": "https://github.com/sponsors/ljharb" 755 | } 756 | }, 757 | "node_modules/is-extglob": { 758 | "version": "2.1.1", 759 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 760 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 761 | "dev": true, 762 | "engines": { 763 | "node": ">=0.10.0" 764 | } 765 | }, 766 | "node_modules/is-glob": { 767 | "version": "4.0.3", 768 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 769 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 770 | "dev": true, 771 | "dependencies": { 772 | "is-extglob": "^2.1.1" 773 | }, 774 | "engines": { 775 | "node": ">=0.10.0" 776 | } 777 | }, 778 | "node_modules/is-number": { 779 | "version": "7.0.0", 780 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 781 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 782 | "dev": true, 783 | "engines": { 784 | "node": ">=0.12.0" 785 | } 786 | }, 787 | "node_modules/make-error": { 788 | "version": "1.3.6", 789 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 790 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 791 | "dev": true 792 | }, 793 | "node_modules/media-typer": { 794 | "version": "0.3.0", 795 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 796 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 797 | "engines": { 798 | "node": ">= 0.6" 799 | } 800 | }, 801 | "node_modules/merge-descriptors": { 802 | "version": "1.0.1", 803 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 804 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 805 | }, 806 | "node_modules/methods": { 807 | "version": "1.1.2", 808 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 809 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 810 | "engines": { 811 | "node": ">= 0.6" 812 | } 813 | }, 814 | "node_modules/mime": { 815 | "version": "1.6.0", 816 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 817 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 818 | "bin": { 819 | "mime": "cli.js" 820 | }, 821 | "engines": { 822 | "node": ">=4" 823 | } 824 | }, 825 | "node_modules/mime-db": { 826 | "version": "1.52.0", 827 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 828 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 829 | "engines": { 830 | "node": ">= 0.6" 831 | } 832 | }, 833 | "node_modules/mime-types": { 834 | "version": "2.1.35", 835 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 836 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 837 | "dependencies": { 838 | "mime-db": "1.52.0" 839 | }, 840 | "engines": { 841 | "node": ">= 0.6" 842 | } 843 | }, 844 | "node_modules/minimatch": { 845 | "version": "3.1.2", 846 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 847 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 848 | "dev": true, 849 | "dependencies": { 850 | "brace-expansion": "^1.1.7" 851 | }, 852 | "engines": { 853 | "node": "*" 854 | } 855 | }, 856 | "node_modules/minimist": { 857 | "version": "1.2.6", 858 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 859 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 860 | "dev": true 861 | }, 862 | "node_modules/mkdirp": { 863 | "version": "1.0.4", 864 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 865 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 866 | "dev": true, 867 | "bin": { 868 | "mkdirp": "bin/cmd.js" 869 | }, 870 | "engines": { 871 | "node": ">=10" 872 | } 873 | }, 874 | "node_modules/ms": { 875 | "version": "2.0.0", 876 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 877 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 878 | }, 879 | "node_modules/negotiator": { 880 | "version": "0.6.3", 881 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 882 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 883 | "engines": { 884 | "node": ">= 0.6" 885 | } 886 | }, 887 | "node_modules/normalize-path": { 888 | "version": "3.0.0", 889 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 890 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 891 | "dev": true, 892 | "engines": { 893 | "node": ">=0.10.0" 894 | } 895 | }, 896 | "node_modules/object-assign": { 897 | "version": "4.1.1", 898 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 899 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 900 | "engines": { 901 | "node": ">=0.10.0" 902 | } 903 | }, 904 | "node_modules/object-inspect": { 905 | "version": "1.12.2", 906 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 907 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 908 | "funding": { 909 | "url": "https://github.com/sponsors/ljharb" 910 | } 911 | }, 912 | "node_modules/on-finished": { 913 | "version": "2.4.1", 914 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 915 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 916 | "dependencies": { 917 | "ee-first": "1.1.1" 918 | }, 919 | "engines": { 920 | "node": ">= 0.8" 921 | } 922 | }, 923 | "node_modules/once": { 924 | "version": "1.4.0", 925 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 926 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 927 | "dev": true, 928 | "dependencies": { 929 | "wrappy": "1" 930 | } 931 | }, 932 | "node_modules/parseurl": { 933 | "version": "1.3.3", 934 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 935 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 936 | "engines": { 937 | "node": ">= 0.8" 938 | } 939 | }, 940 | "node_modules/path-is-absolute": { 941 | "version": "1.0.1", 942 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 943 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 944 | "dev": true, 945 | "engines": { 946 | "node": ">=0.10.0" 947 | } 948 | }, 949 | "node_modules/path-parse": { 950 | "version": "1.0.7", 951 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 952 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 953 | "dev": true 954 | }, 955 | "node_modules/path-to-regexp": { 956 | "version": "0.1.7", 957 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 958 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 959 | }, 960 | "node_modules/picomatch": { 961 | "version": "2.3.1", 962 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 963 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 964 | "dev": true, 965 | "engines": { 966 | "node": ">=8.6" 967 | }, 968 | "funding": { 969 | "url": "https://github.com/sponsors/jonschlinkert" 970 | } 971 | }, 972 | "node_modules/prisma": { 973 | "version": "4.3.1", 974 | "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.3.1.tgz", 975 | "integrity": "sha512-90xo06wtqil76Xsi3mNpc4Js3SdDRR5g4qb9h+4VWY4Y8iImJY6xc3PX+C9xxTSt1lr0Q89A0MLkJjd8ax6KiQ==", 976 | "devOptional": true, 977 | "hasInstallScript": true, 978 | "dependencies": { 979 | "@prisma/engines": "4.3.1" 980 | }, 981 | "bin": { 982 | "prisma": "build/index.js", 983 | "prisma2": "build/index.js" 984 | }, 985 | "engines": { 986 | "node": ">=14.17" 987 | } 988 | }, 989 | "node_modules/proxy-addr": { 990 | "version": "2.0.7", 991 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 992 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 993 | "dependencies": { 994 | "forwarded": "0.2.0", 995 | "ipaddr.js": "1.9.1" 996 | }, 997 | "engines": { 998 | "node": ">= 0.10" 999 | } 1000 | }, 1001 | "node_modules/qs": { 1002 | "version": "6.10.3", 1003 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 1004 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 1005 | "dependencies": { 1006 | "side-channel": "^1.0.4" 1007 | }, 1008 | "engines": { 1009 | "node": ">=0.6" 1010 | }, 1011 | "funding": { 1012 | "url": "https://github.com/sponsors/ljharb" 1013 | } 1014 | }, 1015 | "node_modules/range-parser": { 1016 | "version": "1.2.1", 1017 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1018 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1019 | "engines": { 1020 | "node": ">= 0.6" 1021 | } 1022 | }, 1023 | "node_modules/raw-body": { 1024 | "version": "2.5.1", 1025 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1026 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1027 | "dependencies": { 1028 | "bytes": "3.1.2", 1029 | "http-errors": "2.0.0", 1030 | "iconv-lite": "0.4.24", 1031 | "unpipe": "1.0.0" 1032 | }, 1033 | "engines": { 1034 | "node": ">= 0.8" 1035 | } 1036 | }, 1037 | "node_modules/readdirp": { 1038 | "version": "3.6.0", 1039 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1040 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1041 | "dev": true, 1042 | "dependencies": { 1043 | "picomatch": "^2.2.1" 1044 | }, 1045 | "engines": { 1046 | "node": ">=8.10.0" 1047 | } 1048 | }, 1049 | "node_modules/resolve": { 1050 | "version": "1.22.1", 1051 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1052 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1053 | "dev": true, 1054 | "dependencies": { 1055 | "is-core-module": "^2.9.0", 1056 | "path-parse": "^1.0.7", 1057 | "supports-preserve-symlinks-flag": "^1.0.0" 1058 | }, 1059 | "bin": { 1060 | "resolve": "bin/resolve" 1061 | }, 1062 | "funding": { 1063 | "url": "https://github.com/sponsors/ljharb" 1064 | } 1065 | }, 1066 | "node_modules/rimraf": { 1067 | "version": "2.7.1", 1068 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1069 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1070 | "dev": true, 1071 | "dependencies": { 1072 | "glob": "^7.1.3" 1073 | }, 1074 | "bin": { 1075 | "rimraf": "bin.js" 1076 | } 1077 | }, 1078 | "node_modules/safe-buffer": { 1079 | "version": "5.2.1", 1080 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1081 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1082 | "funding": [ 1083 | { 1084 | "type": "github", 1085 | "url": "https://github.com/sponsors/feross" 1086 | }, 1087 | { 1088 | "type": "patreon", 1089 | "url": "https://www.patreon.com/feross" 1090 | }, 1091 | { 1092 | "type": "consulting", 1093 | "url": "https://feross.org/support" 1094 | } 1095 | ] 1096 | }, 1097 | "node_modules/safer-buffer": { 1098 | "version": "2.1.2", 1099 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1100 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1101 | }, 1102 | "node_modules/send": { 1103 | "version": "0.18.0", 1104 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1105 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1106 | "dependencies": { 1107 | "debug": "2.6.9", 1108 | "depd": "2.0.0", 1109 | "destroy": "1.2.0", 1110 | "encodeurl": "~1.0.2", 1111 | "escape-html": "~1.0.3", 1112 | "etag": "~1.8.1", 1113 | "fresh": "0.5.2", 1114 | "http-errors": "2.0.0", 1115 | "mime": "1.6.0", 1116 | "ms": "2.1.3", 1117 | "on-finished": "2.4.1", 1118 | "range-parser": "~1.2.1", 1119 | "statuses": "2.0.1" 1120 | }, 1121 | "engines": { 1122 | "node": ">= 0.8.0" 1123 | } 1124 | }, 1125 | "node_modules/send/node_modules/ms": { 1126 | "version": "2.1.3", 1127 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1128 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1129 | }, 1130 | "node_modules/serve-static": { 1131 | "version": "1.15.0", 1132 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1133 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1134 | "dependencies": { 1135 | "encodeurl": "~1.0.2", 1136 | "escape-html": "~1.0.3", 1137 | "parseurl": "~1.3.3", 1138 | "send": "0.18.0" 1139 | }, 1140 | "engines": { 1141 | "node": ">= 0.8.0" 1142 | } 1143 | }, 1144 | "node_modules/setprototypeof": { 1145 | "version": "1.2.0", 1146 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1147 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1148 | }, 1149 | "node_modules/side-channel": { 1150 | "version": "1.0.4", 1151 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1152 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1153 | "dependencies": { 1154 | "call-bind": "^1.0.0", 1155 | "get-intrinsic": "^1.0.2", 1156 | "object-inspect": "^1.9.0" 1157 | }, 1158 | "funding": { 1159 | "url": "https://github.com/sponsors/ljharb" 1160 | } 1161 | }, 1162 | "node_modules/source-map": { 1163 | "version": "0.6.1", 1164 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1165 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1166 | "dev": true, 1167 | "engines": { 1168 | "node": ">=0.10.0" 1169 | } 1170 | }, 1171 | "node_modules/source-map-support": { 1172 | "version": "0.5.21", 1173 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1174 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1175 | "dev": true, 1176 | "dependencies": { 1177 | "buffer-from": "^1.0.0", 1178 | "source-map": "^0.6.0" 1179 | } 1180 | }, 1181 | "node_modules/statuses": { 1182 | "version": "2.0.1", 1183 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1184 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1185 | "engines": { 1186 | "node": ">= 0.8" 1187 | } 1188 | }, 1189 | "node_modules/strip-bom": { 1190 | "version": "3.0.0", 1191 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1192 | "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 1193 | "dev": true, 1194 | "engines": { 1195 | "node": ">=4" 1196 | } 1197 | }, 1198 | "node_modules/strip-json-comments": { 1199 | "version": "2.0.1", 1200 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1201 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 1202 | "dev": true, 1203 | "engines": { 1204 | "node": ">=0.10.0" 1205 | } 1206 | }, 1207 | "node_modules/supports-preserve-symlinks-flag": { 1208 | "version": "1.0.0", 1209 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1210 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1211 | "dev": true, 1212 | "engines": { 1213 | "node": ">= 0.4" 1214 | }, 1215 | "funding": { 1216 | "url": "https://github.com/sponsors/ljharb" 1217 | } 1218 | }, 1219 | "node_modules/to-regex-range": { 1220 | "version": "5.0.1", 1221 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1222 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1223 | "dev": true, 1224 | "dependencies": { 1225 | "is-number": "^7.0.0" 1226 | }, 1227 | "engines": { 1228 | "node": ">=8.0" 1229 | } 1230 | }, 1231 | "node_modules/toidentifier": { 1232 | "version": "1.0.1", 1233 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1234 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1235 | "engines": { 1236 | "node": ">=0.6" 1237 | } 1238 | }, 1239 | "node_modules/tree-kill": { 1240 | "version": "1.2.2", 1241 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 1242 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 1243 | "dev": true, 1244 | "bin": { 1245 | "tree-kill": "cli.js" 1246 | } 1247 | }, 1248 | "node_modules/ts-node": { 1249 | "version": "10.9.1", 1250 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 1251 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 1252 | "dev": true, 1253 | "dependencies": { 1254 | "@cspotcode/source-map-support": "^0.8.0", 1255 | "@tsconfig/node10": "^1.0.7", 1256 | "@tsconfig/node12": "^1.0.7", 1257 | "@tsconfig/node14": "^1.0.0", 1258 | "@tsconfig/node16": "^1.0.2", 1259 | "acorn": "^8.4.1", 1260 | "acorn-walk": "^8.1.1", 1261 | "arg": "^4.1.0", 1262 | "create-require": "^1.1.0", 1263 | "diff": "^4.0.1", 1264 | "make-error": "^1.1.1", 1265 | "v8-compile-cache-lib": "^3.0.1", 1266 | "yn": "3.1.1" 1267 | }, 1268 | "bin": { 1269 | "ts-node": "dist/bin.js", 1270 | "ts-node-cwd": "dist/bin-cwd.js", 1271 | "ts-node-esm": "dist/bin-esm.js", 1272 | "ts-node-script": "dist/bin-script.js", 1273 | "ts-node-transpile-only": "dist/bin-transpile.js", 1274 | "ts-script": "dist/bin-script-deprecated.js" 1275 | }, 1276 | "peerDependencies": { 1277 | "@swc/core": ">=1.2.50", 1278 | "@swc/wasm": ">=1.2.50", 1279 | "@types/node": "*", 1280 | "typescript": ">=2.7" 1281 | }, 1282 | "peerDependenciesMeta": { 1283 | "@swc/core": { 1284 | "optional": true 1285 | }, 1286 | "@swc/wasm": { 1287 | "optional": true 1288 | } 1289 | } 1290 | }, 1291 | "node_modules/ts-node-dev": { 1292 | "version": "2.0.0", 1293 | "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", 1294 | "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", 1295 | "dev": true, 1296 | "dependencies": { 1297 | "chokidar": "^3.5.1", 1298 | "dynamic-dedupe": "^0.3.0", 1299 | "minimist": "^1.2.6", 1300 | "mkdirp": "^1.0.4", 1301 | "resolve": "^1.0.0", 1302 | "rimraf": "^2.6.1", 1303 | "source-map-support": "^0.5.12", 1304 | "tree-kill": "^1.2.2", 1305 | "ts-node": "^10.4.0", 1306 | "tsconfig": "^7.0.0" 1307 | }, 1308 | "bin": { 1309 | "ts-node-dev": "lib/bin.js", 1310 | "tsnd": "lib/bin.js" 1311 | }, 1312 | "engines": { 1313 | "node": ">=0.8.0" 1314 | }, 1315 | "peerDependencies": { 1316 | "node-notifier": "*", 1317 | "typescript": "*" 1318 | }, 1319 | "peerDependenciesMeta": { 1320 | "node-notifier": { 1321 | "optional": true 1322 | } 1323 | } 1324 | }, 1325 | "node_modules/tsconfig": { 1326 | "version": "7.0.0", 1327 | "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", 1328 | "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", 1329 | "dev": true, 1330 | "dependencies": { 1331 | "@types/strip-bom": "^3.0.0", 1332 | "@types/strip-json-comments": "0.0.30", 1333 | "strip-bom": "^3.0.0", 1334 | "strip-json-comments": "^2.0.0" 1335 | } 1336 | }, 1337 | "node_modules/type-is": { 1338 | "version": "1.6.18", 1339 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1340 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1341 | "dependencies": { 1342 | "media-typer": "0.3.0", 1343 | "mime-types": "~2.1.24" 1344 | }, 1345 | "engines": { 1346 | "node": ">= 0.6" 1347 | } 1348 | }, 1349 | "node_modules/typescript": { 1350 | "version": "4.8.3", 1351 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", 1352 | "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", 1353 | "dev": true, 1354 | "bin": { 1355 | "tsc": "bin/tsc", 1356 | "tsserver": "bin/tsserver" 1357 | }, 1358 | "engines": { 1359 | "node": ">=4.2.0" 1360 | } 1361 | }, 1362 | "node_modules/unpipe": { 1363 | "version": "1.0.0", 1364 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1365 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1366 | "engines": { 1367 | "node": ">= 0.8" 1368 | } 1369 | }, 1370 | "node_modules/utils-merge": { 1371 | "version": "1.0.1", 1372 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1373 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1374 | "engines": { 1375 | "node": ">= 0.4.0" 1376 | } 1377 | }, 1378 | "node_modules/v8-compile-cache-lib": { 1379 | "version": "3.0.1", 1380 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1381 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 1382 | "dev": true 1383 | }, 1384 | "node_modules/vary": { 1385 | "version": "1.1.2", 1386 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1387 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1388 | "engines": { 1389 | "node": ">= 0.8" 1390 | } 1391 | }, 1392 | "node_modules/wrappy": { 1393 | "version": "1.0.2", 1394 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1395 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1396 | "dev": true 1397 | }, 1398 | "node_modules/xtend": { 1399 | "version": "4.0.2", 1400 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1401 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1402 | "dev": true, 1403 | "engines": { 1404 | "node": ">=0.4" 1405 | } 1406 | }, 1407 | "node_modules/yn": { 1408 | "version": "3.1.1", 1409 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1410 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1411 | "dev": true, 1412 | "engines": { 1413 | "node": ">=6" 1414 | } 1415 | } 1416 | }, 1417 | "dependencies": { 1418 | "@cspotcode/source-map-support": { 1419 | "version": "0.8.1", 1420 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 1421 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 1422 | "dev": true, 1423 | "requires": { 1424 | "@jridgewell/trace-mapping": "0.3.9" 1425 | } 1426 | }, 1427 | "@jridgewell/resolve-uri": { 1428 | "version": "3.1.0", 1429 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 1430 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 1431 | "dev": true 1432 | }, 1433 | "@jridgewell/sourcemap-codec": { 1434 | "version": "1.4.14", 1435 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 1436 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 1437 | "dev": true 1438 | }, 1439 | "@jridgewell/trace-mapping": { 1440 | "version": "0.3.9", 1441 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 1442 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 1443 | "dev": true, 1444 | "requires": { 1445 | "@jridgewell/resolve-uri": "^3.0.3", 1446 | "@jridgewell/sourcemap-codec": "^1.4.10" 1447 | } 1448 | }, 1449 | "@prisma/client": { 1450 | "version": "4.3.1", 1451 | "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.3.1.tgz", 1452 | "integrity": "sha512-FA0/d1VMJNWqzU7WVWTNWJ+lGOLR9JUBnF73GdIPAEVo/6dWk4gHx0EmgeU+SMv4MZoxgOeTBJF2azhg7x0hMw==", 1453 | "requires": { 1454 | "@prisma/engines-version": "4.3.0-32.c875e43600dfe042452e0b868f7a48b817b9640b" 1455 | } 1456 | }, 1457 | "@prisma/engines": { 1458 | "version": "4.3.1", 1459 | "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.3.1.tgz", 1460 | "integrity": "sha512-4JF/uMaEDAPdcdZNOrnzE3BvrbGpjgV0FcPT3EVoi6I86fWkloqqxBt+KcK/+fIRR0Pxj66uGR9wVH8U1Y13JA==", 1461 | "devOptional": true 1462 | }, 1463 | "@prisma/engines-version": { 1464 | "version": "4.3.0-32.c875e43600dfe042452e0b868f7a48b817b9640b", 1465 | "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.3.0-32.c875e43600dfe042452e0b868f7a48b817b9640b.tgz", 1466 | "integrity": "sha512-8yWpXkQRmiSfsi2Wb/ZS5D3RFbeu/btL9Pm/gdF4phB0Lo5KGsDFMxFMgaD64mwED2nHc8ZaEJg/+4Jymb9Znw==" 1467 | }, 1468 | "@tsconfig/node10": { 1469 | "version": "1.0.9", 1470 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 1471 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 1472 | "dev": true 1473 | }, 1474 | "@tsconfig/node12": { 1475 | "version": "1.0.11", 1476 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 1477 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 1478 | "dev": true 1479 | }, 1480 | "@tsconfig/node14": { 1481 | "version": "1.0.3", 1482 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 1483 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 1484 | "dev": true 1485 | }, 1486 | "@tsconfig/node16": { 1487 | "version": "1.0.3", 1488 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", 1489 | "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", 1490 | "dev": true 1491 | }, 1492 | "@types/body-parser": { 1493 | "version": "1.19.2", 1494 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 1495 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 1496 | "dev": true, 1497 | "requires": { 1498 | "@types/connect": "*", 1499 | "@types/node": "*" 1500 | } 1501 | }, 1502 | "@types/connect": { 1503 | "version": "3.4.35", 1504 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 1505 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 1506 | "dev": true, 1507 | "requires": { 1508 | "@types/node": "*" 1509 | } 1510 | }, 1511 | "@types/cors": { 1512 | "version": "2.8.12", 1513 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", 1514 | "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", 1515 | "dev": true 1516 | }, 1517 | "@types/express": { 1518 | "version": "4.17.13", 1519 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", 1520 | "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", 1521 | "dev": true, 1522 | "requires": { 1523 | "@types/body-parser": "*", 1524 | "@types/express-serve-static-core": "^4.17.18", 1525 | "@types/qs": "*", 1526 | "@types/serve-static": "*" 1527 | } 1528 | }, 1529 | "@types/express-serve-static-core": { 1530 | "version": "4.17.30", 1531 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", 1532 | "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", 1533 | "dev": true, 1534 | "requires": { 1535 | "@types/node": "*", 1536 | "@types/qs": "*", 1537 | "@types/range-parser": "*" 1538 | } 1539 | }, 1540 | "@types/mime": { 1541 | "version": "3.0.1", 1542 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", 1543 | "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", 1544 | "dev": true 1545 | }, 1546 | "@types/node": { 1547 | "version": "18.7.16", 1548 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", 1549 | "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==", 1550 | "dev": true 1551 | }, 1552 | "@types/qs": { 1553 | "version": "6.9.7", 1554 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 1555 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", 1556 | "dev": true 1557 | }, 1558 | "@types/range-parser": { 1559 | "version": "1.2.4", 1560 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 1561 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", 1562 | "dev": true 1563 | }, 1564 | "@types/serve-static": { 1565 | "version": "1.15.0", 1566 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", 1567 | "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", 1568 | "dev": true, 1569 | "requires": { 1570 | "@types/mime": "*", 1571 | "@types/node": "*" 1572 | } 1573 | }, 1574 | "@types/strip-bom": { 1575 | "version": "3.0.0", 1576 | "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", 1577 | "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", 1578 | "dev": true 1579 | }, 1580 | "@types/strip-json-comments": { 1581 | "version": "0.0.30", 1582 | "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", 1583 | "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", 1584 | "dev": true 1585 | }, 1586 | "accepts": { 1587 | "version": "1.3.8", 1588 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1589 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1590 | "requires": { 1591 | "mime-types": "~2.1.34", 1592 | "negotiator": "0.6.3" 1593 | } 1594 | }, 1595 | "acorn": { 1596 | "version": "8.8.0", 1597 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", 1598 | "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", 1599 | "dev": true 1600 | }, 1601 | "acorn-walk": { 1602 | "version": "8.2.0", 1603 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 1604 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 1605 | "dev": true 1606 | }, 1607 | "anymatch": { 1608 | "version": "3.1.2", 1609 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1610 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1611 | "dev": true, 1612 | "requires": { 1613 | "normalize-path": "^3.0.0", 1614 | "picomatch": "^2.0.4" 1615 | } 1616 | }, 1617 | "arg": { 1618 | "version": "4.1.3", 1619 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 1620 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 1621 | "dev": true 1622 | }, 1623 | "array-flatten": { 1624 | "version": "1.1.1", 1625 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1626 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 1627 | }, 1628 | "balanced-match": { 1629 | "version": "1.0.2", 1630 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1631 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1632 | "dev": true 1633 | }, 1634 | "binary-extensions": { 1635 | "version": "2.2.0", 1636 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1637 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1638 | "dev": true 1639 | }, 1640 | "body-parser": { 1641 | "version": "1.20.0", 1642 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 1643 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 1644 | "requires": { 1645 | "bytes": "3.1.2", 1646 | "content-type": "~1.0.4", 1647 | "debug": "2.6.9", 1648 | "depd": "2.0.0", 1649 | "destroy": "1.2.0", 1650 | "http-errors": "2.0.0", 1651 | "iconv-lite": "0.4.24", 1652 | "on-finished": "2.4.1", 1653 | "qs": "6.10.3", 1654 | "raw-body": "2.5.1", 1655 | "type-is": "~1.6.18", 1656 | "unpipe": "1.0.0" 1657 | } 1658 | }, 1659 | "brace-expansion": { 1660 | "version": "1.1.11", 1661 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1662 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1663 | "dev": true, 1664 | "requires": { 1665 | "balanced-match": "^1.0.0", 1666 | "concat-map": "0.0.1" 1667 | } 1668 | }, 1669 | "braces": { 1670 | "version": "3.0.2", 1671 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1672 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1673 | "dev": true, 1674 | "requires": { 1675 | "fill-range": "^7.0.1" 1676 | } 1677 | }, 1678 | "buffer-from": { 1679 | "version": "1.1.2", 1680 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1681 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1682 | "dev": true 1683 | }, 1684 | "bytes": { 1685 | "version": "3.1.2", 1686 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1687 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 1688 | }, 1689 | "call-bind": { 1690 | "version": "1.0.2", 1691 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1692 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1693 | "requires": { 1694 | "function-bind": "^1.1.1", 1695 | "get-intrinsic": "^1.0.2" 1696 | } 1697 | }, 1698 | "chokidar": { 1699 | "version": "3.5.3", 1700 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1701 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1702 | "dev": true, 1703 | "requires": { 1704 | "anymatch": "~3.1.2", 1705 | "braces": "~3.0.2", 1706 | "fsevents": "~2.3.2", 1707 | "glob-parent": "~5.1.2", 1708 | "is-binary-path": "~2.1.0", 1709 | "is-glob": "~4.0.1", 1710 | "normalize-path": "~3.0.0", 1711 | "readdirp": "~3.6.0" 1712 | } 1713 | }, 1714 | "concat-map": { 1715 | "version": "0.0.1", 1716 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1717 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1718 | "dev": true 1719 | }, 1720 | "content-disposition": { 1721 | "version": "0.5.4", 1722 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 1723 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 1724 | "requires": { 1725 | "safe-buffer": "5.2.1" 1726 | } 1727 | }, 1728 | "content-type": { 1729 | "version": "1.0.4", 1730 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 1731 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 1732 | }, 1733 | "cookie": { 1734 | "version": "0.5.0", 1735 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 1736 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 1737 | }, 1738 | "cookie-signature": { 1739 | "version": "1.0.6", 1740 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1741 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 1742 | }, 1743 | "cors": { 1744 | "version": "2.8.5", 1745 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1746 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1747 | "requires": { 1748 | "object-assign": "^4", 1749 | "vary": "^1" 1750 | } 1751 | }, 1752 | "create-require": { 1753 | "version": "1.1.1", 1754 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 1755 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 1756 | "dev": true 1757 | }, 1758 | "debug": { 1759 | "version": "2.6.9", 1760 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1761 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1762 | "requires": { 1763 | "ms": "2.0.0" 1764 | } 1765 | }, 1766 | "depd": { 1767 | "version": "2.0.0", 1768 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1769 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 1770 | }, 1771 | "destroy": { 1772 | "version": "1.2.0", 1773 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 1774 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 1775 | }, 1776 | "diff": { 1777 | "version": "4.0.2", 1778 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1779 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1780 | "dev": true 1781 | }, 1782 | "dynamic-dedupe": { 1783 | "version": "0.3.0", 1784 | "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", 1785 | "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", 1786 | "dev": true, 1787 | "requires": { 1788 | "xtend": "^4.0.0" 1789 | } 1790 | }, 1791 | "ee-first": { 1792 | "version": "1.1.1", 1793 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1794 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 1795 | }, 1796 | "encodeurl": { 1797 | "version": "1.0.2", 1798 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1799 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 1800 | }, 1801 | "escape-html": { 1802 | "version": "1.0.3", 1803 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1804 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1805 | }, 1806 | "etag": { 1807 | "version": "1.8.1", 1808 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1809 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1810 | }, 1811 | "express": { 1812 | "version": "4.18.1", 1813 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 1814 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 1815 | "requires": { 1816 | "accepts": "~1.3.8", 1817 | "array-flatten": "1.1.1", 1818 | "body-parser": "1.20.0", 1819 | "content-disposition": "0.5.4", 1820 | "content-type": "~1.0.4", 1821 | "cookie": "0.5.0", 1822 | "cookie-signature": "1.0.6", 1823 | "debug": "2.6.9", 1824 | "depd": "2.0.0", 1825 | "encodeurl": "~1.0.2", 1826 | "escape-html": "~1.0.3", 1827 | "etag": "~1.8.1", 1828 | "finalhandler": "1.2.0", 1829 | "fresh": "0.5.2", 1830 | "http-errors": "2.0.0", 1831 | "merge-descriptors": "1.0.1", 1832 | "methods": "~1.1.2", 1833 | "on-finished": "2.4.1", 1834 | "parseurl": "~1.3.3", 1835 | "path-to-regexp": "0.1.7", 1836 | "proxy-addr": "~2.0.7", 1837 | "qs": "6.10.3", 1838 | "range-parser": "~1.2.1", 1839 | "safe-buffer": "5.2.1", 1840 | "send": "0.18.0", 1841 | "serve-static": "1.15.0", 1842 | "setprototypeof": "1.2.0", 1843 | "statuses": "2.0.1", 1844 | "type-is": "~1.6.18", 1845 | "utils-merge": "1.0.1", 1846 | "vary": "~1.1.2" 1847 | } 1848 | }, 1849 | "fill-range": { 1850 | "version": "7.0.1", 1851 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1852 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1853 | "dev": true, 1854 | "requires": { 1855 | "to-regex-range": "^5.0.1" 1856 | } 1857 | }, 1858 | "finalhandler": { 1859 | "version": "1.2.0", 1860 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1861 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1862 | "requires": { 1863 | "debug": "2.6.9", 1864 | "encodeurl": "~1.0.2", 1865 | "escape-html": "~1.0.3", 1866 | "on-finished": "2.4.1", 1867 | "parseurl": "~1.3.3", 1868 | "statuses": "2.0.1", 1869 | "unpipe": "~1.0.0" 1870 | } 1871 | }, 1872 | "forwarded": { 1873 | "version": "0.2.0", 1874 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1875 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1876 | }, 1877 | "fresh": { 1878 | "version": "0.5.2", 1879 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1880 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1881 | }, 1882 | "fs.realpath": { 1883 | "version": "1.0.0", 1884 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1885 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1886 | "dev": true 1887 | }, 1888 | "fsevents": { 1889 | "version": "2.3.2", 1890 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1891 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1892 | "dev": true, 1893 | "optional": true 1894 | }, 1895 | "function-bind": { 1896 | "version": "1.1.1", 1897 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1898 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1899 | }, 1900 | "get-intrinsic": { 1901 | "version": "1.1.2", 1902 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 1903 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 1904 | "requires": { 1905 | "function-bind": "^1.1.1", 1906 | "has": "^1.0.3", 1907 | "has-symbols": "^1.0.3" 1908 | } 1909 | }, 1910 | "glob": { 1911 | "version": "7.2.3", 1912 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1913 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1914 | "dev": true, 1915 | "requires": { 1916 | "fs.realpath": "^1.0.0", 1917 | "inflight": "^1.0.4", 1918 | "inherits": "2", 1919 | "minimatch": "^3.1.1", 1920 | "once": "^1.3.0", 1921 | "path-is-absolute": "^1.0.0" 1922 | } 1923 | }, 1924 | "glob-parent": { 1925 | "version": "5.1.2", 1926 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1927 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1928 | "dev": true, 1929 | "requires": { 1930 | "is-glob": "^4.0.1" 1931 | } 1932 | }, 1933 | "has": { 1934 | "version": "1.0.3", 1935 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1936 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1937 | "requires": { 1938 | "function-bind": "^1.1.1" 1939 | } 1940 | }, 1941 | "has-symbols": { 1942 | "version": "1.0.3", 1943 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1944 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1945 | }, 1946 | "http-errors": { 1947 | "version": "2.0.0", 1948 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1949 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1950 | "requires": { 1951 | "depd": "2.0.0", 1952 | "inherits": "2.0.4", 1953 | "setprototypeof": "1.2.0", 1954 | "statuses": "2.0.1", 1955 | "toidentifier": "1.0.1" 1956 | } 1957 | }, 1958 | "iconv-lite": { 1959 | "version": "0.4.24", 1960 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1961 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1962 | "requires": { 1963 | "safer-buffer": ">= 2.1.2 < 3" 1964 | } 1965 | }, 1966 | "inflight": { 1967 | "version": "1.0.6", 1968 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1969 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1970 | "dev": true, 1971 | "requires": { 1972 | "once": "^1.3.0", 1973 | "wrappy": "1" 1974 | } 1975 | }, 1976 | "inherits": { 1977 | "version": "2.0.4", 1978 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1979 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1980 | }, 1981 | "ipaddr.js": { 1982 | "version": "1.9.1", 1983 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1984 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1985 | }, 1986 | "is-binary-path": { 1987 | "version": "2.1.0", 1988 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1989 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1990 | "dev": true, 1991 | "requires": { 1992 | "binary-extensions": "^2.0.0" 1993 | } 1994 | }, 1995 | "is-core-module": { 1996 | "version": "2.10.0", 1997 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 1998 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 1999 | "dev": true, 2000 | "requires": { 2001 | "has": "^1.0.3" 2002 | } 2003 | }, 2004 | "is-extglob": { 2005 | "version": "2.1.1", 2006 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2007 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2008 | "dev": true 2009 | }, 2010 | "is-glob": { 2011 | "version": "4.0.3", 2012 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2013 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2014 | "dev": true, 2015 | "requires": { 2016 | "is-extglob": "^2.1.1" 2017 | } 2018 | }, 2019 | "is-number": { 2020 | "version": "7.0.0", 2021 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2022 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2023 | "dev": true 2024 | }, 2025 | "make-error": { 2026 | "version": "1.3.6", 2027 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 2028 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 2029 | "dev": true 2030 | }, 2031 | "media-typer": { 2032 | "version": "0.3.0", 2033 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2034 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 2035 | }, 2036 | "merge-descriptors": { 2037 | "version": "1.0.1", 2038 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2039 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 2040 | }, 2041 | "methods": { 2042 | "version": "1.1.2", 2043 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2044 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 2045 | }, 2046 | "mime": { 2047 | "version": "1.6.0", 2048 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2049 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 2050 | }, 2051 | "mime-db": { 2052 | "version": "1.52.0", 2053 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2054 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 2055 | }, 2056 | "mime-types": { 2057 | "version": "2.1.35", 2058 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2059 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2060 | "requires": { 2061 | "mime-db": "1.52.0" 2062 | } 2063 | }, 2064 | "minimatch": { 2065 | "version": "3.1.2", 2066 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2067 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2068 | "dev": true, 2069 | "requires": { 2070 | "brace-expansion": "^1.1.7" 2071 | } 2072 | }, 2073 | "minimist": { 2074 | "version": "1.2.6", 2075 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 2076 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 2077 | "dev": true 2078 | }, 2079 | "mkdirp": { 2080 | "version": "1.0.4", 2081 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 2082 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 2083 | "dev": true 2084 | }, 2085 | "ms": { 2086 | "version": "2.0.0", 2087 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2088 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 2089 | }, 2090 | "negotiator": { 2091 | "version": "0.6.3", 2092 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 2093 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 2094 | }, 2095 | "normalize-path": { 2096 | "version": "3.0.0", 2097 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2098 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2099 | "dev": true 2100 | }, 2101 | "object-assign": { 2102 | "version": "4.1.1", 2103 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2104 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 2105 | }, 2106 | "object-inspect": { 2107 | "version": "1.12.2", 2108 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 2109 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 2110 | }, 2111 | "on-finished": { 2112 | "version": "2.4.1", 2113 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 2114 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 2115 | "requires": { 2116 | "ee-first": "1.1.1" 2117 | } 2118 | }, 2119 | "once": { 2120 | "version": "1.4.0", 2121 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2122 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2123 | "dev": true, 2124 | "requires": { 2125 | "wrappy": "1" 2126 | } 2127 | }, 2128 | "parseurl": { 2129 | "version": "1.3.3", 2130 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2131 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2132 | }, 2133 | "path-is-absolute": { 2134 | "version": "1.0.1", 2135 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2136 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2137 | "dev": true 2138 | }, 2139 | "path-parse": { 2140 | "version": "1.0.7", 2141 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2142 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2143 | "dev": true 2144 | }, 2145 | "path-to-regexp": { 2146 | "version": "0.1.7", 2147 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2148 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 2149 | }, 2150 | "picomatch": { 2151 | "version": "2.3.1", 2152 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2153 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2154 | "dev": true 2155 | }, 2156 | "prisma": { 2157 | "version": "4.3.1", 2158 | "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.3.1.tgz", 2159 | "integrity": "sha512-90xo06wtqil76Xsi3mNpc4Js3SdDRR5g4qb9h+4VWY4Y8iImJY6xc3PX+C9xxTSt1lr0Q89A0MLkJjd8ax6KiQ==", 2160 | "devOptional": true, 2161 | "requires": { 2162 | "@prisma/engines": "4.3.1" 2163 | } 2164 | }, 2165 | "proxy-addr": { 2166 | "version": "2.0.7", 2167 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2168 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2169 | "requires": { 2170 | "forwarded": "0.2.0", 2171 | "ipaddr.js": "1.9.1" 2172 | } 2173 | }, 2174 | "qs": { 2175 | "version": "6.10.3", 2176 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 2177 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 2178 | "requires": { 2179 | "side-channel": "^1.0.4" 2180 | } 2181 | }, 2182 | "range-parser": { 2183 | "version": "1.2.1", 2184 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2185 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2186 | }, 2187 | "raw-body": { 2188 | "version": "2.5.1", 2189 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 2190 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 2191 | "requires": { 2192 | "bytes": "3.1.2", 2193 | "http-errors": "2.0.0", 2194 | "iconv-lite": "0.4.24", 2195 | "unpipe": "1.0.0" 2196 | } 2197 | }, 2198 | "readdirp": { 2199 | "version": "3.6.0", 2200 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2201 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2202 | "dev": true, 2203 | "requires": { 2204 | "picomatch": "^2.2.1" 2205 | } 2206 | }, 2207 | "resolve": { 2208 | "version": "1.22.1", 2209 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 2210 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 2211 | "dev": true, 2212 | "requires": { 2213 | "is-core-module": "^2.9.0", 2214 | "path-parse": "^1.0.7", 2215 | "supports-preserve-symlinks-flag": "^1.0.0" 2216 | } 2217 | }, 2218 | "rimraf": { 2219 | "version": "2.7.1", 2220 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 2221 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 2222 | "dev": true, 2223 | "requires": { 2224 | "glob": "^7.1.3" 2225 | } 2226 | }, 2227 | "safe-buffer": { 2228 | "version": "5.2.1", 2229 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2230 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2231 | }, 2232 | "safer-buffer": { 2233 | "version": "2.1.2", 2234 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2235 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2236 | }, 2237 | "send": { 2238 | "version": "0.18.0", 2239 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 2240 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 2241 | "requires": { 2242 | "debug": "2.6.9", 2243 | "depd": "2.0.0", 2244 | "destroy": "1.2.0", 2245 | "encodeurl": "~1.0.2", 2246 | "escape-html": "~1.0.3", 2247 | "etag": "~1.8.1", 2248 | "fresh": "0.5.2", 2249 | "http-errors": "2.0.0", 2250 | "mime": "1.6.0", 2251 | "ms": "2.1.3", 2252 | "on-finished": "2.4.1", 2253 | "range-parser": "~1.2.1", 2254 | "statuses": "2.0.1" 2255 | }, 2256 | "dependencies": { 2257 | "ms": { 2258 | "version": "2.1.3", 2259 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2260 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2261 | } 2262 | } 2263 | }, 2264 | "serve-static": { 2265 | "version": "1.15.0", 2266 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 2267 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 2268 | "requires": { 2269 | "encodeurl": "~1.0.2", 2270 | "escape-html": "~1.0.3", 2271 | "parseurl": "~1.3.3", 2272 | "send": "0.18.0" 2273 | } 2274 | }, 2275 | "setprototypeof": { 2276 | "version": "1.2.0", 2277 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2278 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 2279 | }, 2280 | "side-channel": { 2281 | "version": "1.0.4", 2282 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2283 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2284 | "requires": { 2285 | "call-bind": "^1.0.0", 2286 | "get-intrinsic": "^1.0.2", 2287 | "object-inspect": "^1.9.0" 2288 | } 2289 | }, 2290 | "source-map": { 2291 | "version": "0.6.1", 2292 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2293 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2294 | "dev": true 2295 | }, 2296 | "source-map-support": { 2297 | "version": "0.5.21", 2298 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2299 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2300 | "dev": true, 2301 | "requires": { 2302 | "buffer-from": "^1.0.0", 2303 | "source-map": "^0.6.0" 2304 | } 2305 | }, 2306 | "statuses": { 2307 | "version": "2.0.1", 2308 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2309 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 2310 | }, 2311 | "strip-bom": { 2312 | "version": "3.0.0", 2313 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2314 | "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 2315 | "dev": true 2316 | }, 2317 | "strip-json-comments": { 2318 | "version": "2.0.1", 2319 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2320 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 2321 | "dev": true 2322 | }, 2323 | "supports-preserve-symlinks-flag": { 2324 | "version": "1.0.0", 2325 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2326 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2327 | "dev": true 2328 | }, 2329 | "to-regex-range": { 2330 | "version": "5.0.1", 2331 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2332 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2333 | "dev": true, 2334 | "requires": { 2335 | "is-number": "^7.0.0" 2336 | } 2337 | }, 2338 | "toidentifier": { 2339 | "version": "1.0.1", 2340 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2341 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 2342 | }, 2343 | "tree-kill": { 2344 | "version": "1.2.2", 2345 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 2346 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 2347 | "dev": true 2348 | }, 2349 | "ts-node": { 2350 | "version": "10.9.1", 2351 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 2352 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 2353 | "dev": true, 2354 | "requires": { 2355 | "@cspotcode/source-map-support": "^0.8.0", 2356 | "@tsconfig/node10": "^1.0.7", 2357 | "@tsconfig/node12": "^1.0.7", 2358 | "@tsconfig/node14": "^1.0.0", 2359 | "@tsconfig/node16": "^1.0.2", 2360 | "acorn": "^8.4.1", 2361 | "acorn-walk": "^8.1.1", 2362 | "arg": "^4.1.0", 2363 | "create-require": "^1.1.0", 2364 | "diff": "^4.0.1", 2365 | "make-error": "^1.1.1", 2366 | "v8-compile-cache-lib": "^3.0.1", 2367 | "yn": "3.1.1" 2368 | } 2369 | }, 2370 | "ts-node-dev": { 2371 | "version": "2.0.0", 2372 | "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", 2373 | "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", 2374 | "dev": true, 2375 | "requires": { 2376 | "chokidar": "^3.5.1", 2377 | "dynamic-dedupe": "^0.3.0", 2378 | "minimist": "^1.2.6", 2379 | "mkdirp": "^1.0.4", 2380 | "resolve": "^1.0.0", 2381 | "rimraf": "^2.6.1", 2382 | "source-map-support": "^0.5.12", 2383 | "tree-kill": "^1.2.2", 2384 | "ts-node": "^10.4.0", 2385 | "tsconfig": "^7.0.0" 2386 | } 2387 | }, 2388 | "tsconfig": { 2389 | "version": "7.0.0", 2390 | "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", 2391 | "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", 2392 | "dev": true, 2393 | "requires": { 2394 | "@types/strip-bom": "^3.0.0", 2395 | "@types/strip-json-comments": "0.0.30", 2396 | "strip-bom": "^3.0.0", 2397 | "strip-json-comments": "^2.0.0" 2398 | } 2399 | }, 2400 | "type-is": { 2401 | "version": "1.6.18", 2402 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2403 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2404 | "requires": { 2405 | "media-typer": "0.3.0", 2406 | "mime-types": "~2.1.24" 2407 | } 2408 | }, 2409 | "typescript": { 2410 | "version": "4.8.3", 2411 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", 2412 | "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", 2413 | "dev": true 2414 | }, 2415 | "unpipe": { 2416 | "version": "1.0.0", 2417 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2418 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 2419 | }, 2420 | "utils-merge": { 2421 | "version": "1.0.1", 2422 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2423 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 2424 | }, 2425 | "v8-compile-cache-lib": { 2426 | "version": "3.0.1", 2427 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2428 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2429 | "dev": true 2430 | }, 2431 | "vary": { 2432 | "version": "1.1.2", 2433 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2434 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 2435 | }, 2436 | "wrappy": { 2437 | "version": "1.0.2", 2438 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2439 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2440 | "dev": true 2441 | }, 2442 | "xtend": { 2443 | "version": "4.0.2", 2444 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2445 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2446 | "dev": true 2447 | }, 2448 | "yn": { 2449 | "version": "3.1.1", 2450 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2451 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2452 | "dev": true 2453 | } 2454 | } 2455 | } 2456 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "tsc", 8 | "dev": "tsnd --exit-child src/server.ts" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@prisma/client": "^4.3.1", 15 | "cors": "^2.8.5", 16 | "express": "^4.18.1" 17 | }, 18 | "devDependencies": { 19 | "@types/cors": "^2.8.12", 20 | "@types/express": "^4.17.13", 21 | "prisma": "^4.3.1", 22 | "ts-node-dev": "^2.0.0", 23 | "typescript": "^4.8.3" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /server/prisma/migrations/20220913170827_create_table_game/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "Game" ( 3 | "id" TEXT NOT NULL PRIMARY KEY, 4 | "title" TEXT NOT NULL, 5 | "bannerUrl" TEXT NOT NULL 6 | ); 7 | -------------------------------------------------------------------------------- /server/prisma/migrations/20220913171501_create_table_ads/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "Ad" ( 3 | "id" TEXT NOT NULL PRIMARY KEY, 4 | "gameId" TEXT NOT NULL, 5 | "name" TEXT NOT NULL, 6 | "yearsPlaying" INTEGER NOT NULL, 7 | "discord" TEXT NOT NULL, 8 | "weekDays" TEXT NOT NULL, 9 | "hourStart" INTEGER NOT NULL, 10 | "hourEnd" INTEGER NOT NULL, 11 | "useVoiceChannel" BOOLEAN NOT NULL, 12 | "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, 13 | CONSTRAINT "Ad_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game" ("id") ON DELETE RESTRICT ON UPDATE CASCADE 14 | ); 15 | -------------------------------------------------------------------------------- /server/prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "sqlite" -------------------------------------------------------------------------------- /server/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | generator client { 2 | provider = "prisma-client-js" 3 | } 4 | 5 | datasource db { 6 | provider = "sqlite" 7 | url = env("DATABASE_URL") 8 | } 9 | 10 | model Game { 11 | id String @id @default(uuid()) 12 | title String 13 | bannerUrl String 14 | 15 | ads Ad[] 16 | } 17 | 18 | model Ad { 19 | id String @id @default(uuid()) 20 | gameId String 21 | name String 22 | yearsPlaying Int 23 | discord String 24 | weekDays String 25 | hourStart Int 26 | hourEnd Int 27 | useVoiceChannel Boolean 28 | createdAt DateTime @default(now()) 29 | 30 | game Game @relation(fields: [gameId], references: [id]) 31 | } 32 | -------------------------------------------------------------------------------- /server/src/database/db.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/server/src/database/db.sqlite -------------------------------------------------------------------------------- /server/src/server.ts: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import cors from 'cors'; 3 | 4 | import { PrismaClient } from '@prisma/client'; 5 | import { convertHourStringToMinutes } from "./utils/convert-hour-string-to-minutes"; 6 | import { convertMinutesToHourString } from "./utils/convert-minutes-to-hour-string"; 7 | 8 | const app = express(); 9 | 10 | app.use(express.json()); 11 | app.use(cors()); 12 | 13 | const prisma = new PrismaClient({ 14 | log: ['query'], 15 | }); 16 | 17 | app.get('/games', async (request, response) => { 18 | const games = await prisma.game.findMany({ 19 | include: { 20 | _count: { 21 | select: { 22 | ads: true, 23 | } 24 | } 25 | } 26 | }); 27 | 28 | return response.json(games); 29 | }); 30 | 31 | app.post('/games/:id/ads', async (request, response) => { 32 | const gameId = request.params.id; 33 | const body: any = request.body; 34 | 35 | const ad = await prisma.ad.create({ 36 | data: { 37 | gameId, 38 | name: body.name, 39 | yearsPlaying: body.yearsPlaying, 40 | discord: body.discord, 41 | weekDays: body.weekDays.join(','), 42 | hourStart: convertHourStringToMinutes(body.hourStart), 43 | hourEnd: convertHourStringToMinutes(body.hourEnd), 44 | useVoiceChannel: body.useVoiceChannel, 45 | }, 46 | }) 47 | 48 | return response.status(201).json(ad); 49 | }); 50 | 51 | app.get('/games/:id/ads', async (request, response) => { 52 | const gameId = request.params.id; 53 | 54 | const ads = await prisma.ad.findMany({ 55 | select: { 56 | id: true, 57 | name: true, 58 | weekDays: true, 59 | useVoiceChannel: true, 60 | yearsPlaying: true, 61 | hourStart: true, 62 | hourEnd: true, 63 | }, 64 | where: { 65 | gameId, 66 | }, 67 | orderBy: { 68 | createdAt: 'desc' 69 | } 70 | }) 71 | 72 | return response.json(ads.map(ad => { 73 | return { 74 | ...ad, 75 | weekDays: ad.weekDays.split(','), 76 | hourStart: convertMinutesToHourString(ad.hourStart), 77 | hourEnd: convertMinutesToHourString(ad.hourEnd), 78 | } 79 | })); 80 | }); 81 | 82 | app.get('/ads/:id/discord', async (request, response) => { 83 | const adId = request.params.id; 84 | 85 | const ad = await prisma.ad.findUniqueOrThrow({ 86 | select: { 87 | discord: true, 88 | }, 89 | where: { 90 | id: adId, 91 | } 92 | }); 93 | 94 | return response.json({ 95 | discord: ad.discord, 96 | }) 97 | }); 98 | 99 | app.listen(3333); 100 | -------------------------------------------------------------------------------- /server/src/utils/convert-hour-string-to-minutes.ts: -------------------------------------------------------------------------------- 1 | export function convertHourStringToMinutes(hourString: string) { 2 | const [hour, minutes] = hourString.split(':').map(Number); 3 | 4 | const minutesAmount = hour * 60 + minutes; 5 | 6 | return minutesAmount; 7 | } 8 | -------------------------------------------------------------------------------- /server/src/utils/convert-minutes-to-hour-string.ts: -------------------------------------------------------------------------------- 1 | export function convertMinutesToHourString(minutesAmount: number) { 2 | const hour = Math.floor(minutesAmount / 60); 3 | const minutes = minutesAmount % 60; 4 | 5 | return `${String(hour).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`; 6 | } 7 | -------------------------------------------------------------------------------- /server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "CommonJS", /* Specify what module code is generated. */ 29 | "rootDir": "./src", /* Specify the root folder within your source files. */ 30 | "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "resolveJsonModule": true, /* Enable importing .json files. */ 39 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 40 | 41 | /* JavaScript Support */ 42 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 43 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 44 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 45 | 46 | /* Emit */ 47 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 48 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 49 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 50 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 51 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 52 | "outDir": "./build", /* Specify an output folder for all emitted files. */ 53 | // "removeComments": true, /* Disable emitting comments. */ 54 | // "noEmit": true, /* Disable emitting files from a compilation. */ 55 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 56 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 57 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 58 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 59 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 60 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 61 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 62 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 63 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 64 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 65 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 66 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 67 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 68 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 69 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 70 | 71 | /* Interop Constraints */ 72 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 73 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 74 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 75 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 76 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 77 | 78 | /* Type Checking */ 79 | "strict": true, /* Enable all strict type-checking options. */ 80 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 81 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 82 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 83 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 84 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 85 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 86 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 87 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 88 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 89 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 90 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 91 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 92 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 93 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 94 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 95 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 96 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 97 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 98 | 99 | /* Completeness */ 100 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 101 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | NLW eSports 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "@radix-ui/react-checkbox": "^1.0.0", 13 | "@radix-ui/react-dialog": "^1.0.0", 14 | "@radix-ui/react-toggle-group": "^1.0.0", 15 | "axios": "^0.27.2", 16 | "phosphor-react": "^1.4.1", 17 | "react": "^18.2.0", 18 | "react-dom": "^18.2.0" 19 | }, 20 | "devDependencies": { 21 | "@types/react": "^18.0.17", 22 | "@types/react-dom": "^18.0.6", 23 | "@vitejs/plugin-react": "^2.1.0", 24 | "autoprefixer": "^10.4.8", 25 | "postcss": "^8.4.16", 26 | "tailwindcss": "^3.1.8", 27 | "typescript": "^4.6.4", 28 | "vite": "^3.1.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /web/postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /web/public/background-galaxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/web/public/background-galaxy.png -------------------------------------------------------------------------------- /web/public/game-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/web/public/game-1.png -------------------------------------------------------------------------------- /web/public/game-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/web/public/game-2.png -------------------------------------------------------------------------------- /web/public/game-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/web/public/game-3.png -------------------------------------------------------------------------------- /web/public/game-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/web/public/game-4.png -------------------------------------------------------------------------------- /web/public/game-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/web/public/game-5.png -------------------------------------------------------------------------------- /web/public/game-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orodrigogo/nlw-esports-ignite/5552503beb28d444f4b7c8a6b87bfc236b4e6bd4/web/public/game-6.png -------------------------------------------------------------------------------- /web/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import * as Dialog from '@radix-ui/react-dialog'; 3 | import { CreateAdBanner } from "./components/CreateAdBanner"; 4 | import { GameBanner } from "./components/GameBanner"; 5 | 6 | import './styles/main.css'; 7 | 8 | import logoImg from './assets/logo-nlw-esports.svg'; 9 | import { CreateAdModal } from "./components/CreateAdModal"; 10 | import axios from "axios"; 11 | 12 | 13 | interface Game { 14 | id: string; 15 | title: string; 16 | bannerUrl: string; 17 | _count: { 18 | ads: number; 19 | } 20 | } 21 | 22 | function App() { 23 | const [games, setGames] = useState([]); 24 | 25 | useEffect(() => { 26 | axios('http://localhost:3333/games').then(response => { 27 | setGames(response.data); 28 | }); 29 | }, []); 30 | 31 | return ( 32 |
33 | 34 | 35 |

36 | Seu duo está aqui. 37 |

38 | 39 |
40 | {games.map(game => { 41 | return ( 42 | 48 | ) 49 | })} 50 |
51 | 52 | 53 | 54 | 55 | 56 | 57 |
58 | ) 59 | } 60 | 61 | export default App 62 | -------------------------------------------------------------------------------- /web/src/assets/logo-nlw-esports.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /web/src/components/CreateAdBanner.tsx: -------------------------------------------------------------------------------- 1 | import { MagnifyingGlassPlus } from "phosphor-react"; 2 | import * as Dialog from '@radix-ui/react-dialog'; 3 | 4 | export function CreateAdBanner() { 5 | return ( 6 |
7 |
8 |
9 | Não encontrou seu duo? 10 | Publique um anúncio para encontrar novos players! 11 |
12 | 13 | 14 | 15 | Publicar anúncio 16 | 17 |
18 |
19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /web/src/components/CreateAdModal.tsx: -------------------------------------------------------------------------------- 1 | import { Check, GameController } from "phosphor-react"; 2 | 3 | import * as Dialog from '@radix-ui/react-dialog'; 4 | import * as Checkbox from '@radix-ui/react-checkbox'; 5 | import * as ToggleGroup from '@radix-ui/react-toggle-group'; 6 | 7 | import { Input } from "./Form/Input"; 8 | import { FormEvent, useEffect, useState } from "react"; 9 | import axios from "axios"; 10 | 11 | interface Game { 12 | id: string; 13 | title: string; 14 | } 15 | 16 | export function CreateAdModal() { 17 | const [games, setGames] = useState([]); 18 | const [weekDays, setWeekDays] = useState([]); 19 | const [useVoiceChannel, setUseVoiceChannel] = useState(false); 20 | 21 | useEffect(() => { 22 | axios('http://localhost:3333/games').then(response => { 23 | setGames(response.data); 24 | }); 25 | }, []); 26 | 27 | async function handleCreateAd(event: FormEvent) { 28 | event.preventDefault() 29 | 30 | const formData = new FormData(event.target as HTMLFormElement); 31 | const data = Object.fromEntries(formData); 32 | 33 | if (!data.name) { 34 | return; 35 | } 36 | 37 | try { 38 | const response = await axios.post(`http://localhost:3333/games/${data.game}/ads`, { 39 | name: data.name, 40 | yearsPlaying: Number(data.yearsPlaying), 41 | discord: data.discord, 42 | weekDays: weekDays.map(Number), 43 | hourStart: data.hourStart, 44 | hourEnd: data.hourEnd, 45 | useVoiceChannel: useVoiceChannel, 46 | }); 47 | 48 | alert('Anúncio criado com sucesso!'); 49 | } catch (err) { 50 | console.log(err); 51 | alert('Erro ao criar anúncio!'); 52 | } 53 | } 54 | 55 | return ( 56 | 57 | 58 | 59 | 60 | Publique um anúncio 61 | 62 |
63 |
64 | 65 | 77 |
78 | 79 |
80 | 81 | 82 |
83 | 84 |
85 |
86 | 87 | 88 |
89 |
90 | 91 | 92 |
93 |
94 | 95 |
96 |
97 | 98 | 99 | 105 | 110 | D 111 | 112 | 117 | S 118 | 119 | 124 | T 125 | 126 | 131 | Q 132 | 133 | 138 | Q 139 | 140 | 145 | S 146 | 147 | 152 | S 153 | 154 | 155 |
156 |
157 | 158 |
159 | 160 | 161 |
162 |
163 |
164 | 165 | 183 | 184 |
185 | 189 | Cancelar 190 | 191 | 198 |
199 |
200 |
201 |
202 | ); 203 | } 204 | -------------------------------------------------------------------------------- /web/src/components/Form/Input.tsx: -------------------------------------------------------------------------------- 1 | import { InputHTMLAttributes } from "react"; 2 | 3 | interface InputProps extends InputHTMLAttributes {} 4 | 5 | export function Input(props: InputProps) { 6 | return ( 7 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /web/src/components/GameBanner.tsx: -------------------------------------------------------------------------------- 1 | interface GameBannerProps { 2 | bannerUrl: string; 3 | title: string; 4 | adsCount: number; 5 | } 6 | 7 | export function GameBanner(props: GameBannerProps) { 8 | return ( 9 | 10 | 11 | 12 |
13 | {props.title} 14 | {props.adsCount} anúncio(s) 15 |
16 |
17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /web/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App' 4 | 5 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( 6 | 7 | 8 | 9 | ) 10 | -------------------------------------------------------------------------------- /web/src/styles/main.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /web/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /web/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | './src/**/*.tsx', 5 | './index.html' 6 | ], 7 | theme: { 8 | fontFamily: { 9 | sans: ['Inter', 'sans-serif'], 10 | }, 11 | 12 | extend: { 13 | backgroundImage: { 14 | galaxy: "url('/background-galaxy.png')", 15 | 'nlw-gradient': 'linear-gradient(89.86deg, #9572FC 27.08%, #43E7AD 33.94%, #E1D55D 40.57%)', 16 | 'game-gradient': 'linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 67.08%)' 17 | }, 18 | }, 19 | }, 20 | plugins: [], 21 | } 22 | -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } 22 | -------------------------------------------------------------------------------- /web/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /web/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()] 7 | }) 8 | --------------------------------------------------------------------------------