diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..94624ff0 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,36 @@ +.dccache +node_modules/ +coverage/ +android/ +jest-coverage/ +.nyc_output/ +junit.xml +.idea/ +.husky/ +.github/ +License.md +src-tauri/ + +.expo/ +dist/ +.env +npm-debug.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision +*.orig.* +web-build/ + +# playwright +/test-results/ +/playwright-report/ + +# macOS +.DS_Store + +.vercel + +# eslint specific +package.json \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..c15aaa26 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,16 @@ +module.exports = { + extends: [ + "universe", + "universe/native", + "universe/web", + "universe/shared/typescript-analysis", + ], + overrides: [ + { + files: ["*.ts", "*.tsx", "*.d.ts"], + parserOptions: { + project: "./tsconfig.json", + }, + }, + ], +}; diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index f53658e1..415149a4 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -41,10 +41,12 @@ jobs: steps: - name: 🏗 Setup repo uses: actions/checkout@v3 + - name: install dependencies + run: npm i - name: Prettier Check - run: | - npm i prettier@2.8.8 - npx prettier --check . + run: npx prettier --check . + - name: eslint check + run: npx eslint . --max-warnings=0 app_preview_dev: if: ${{ contains(fromJSON('["pull_request"]'), github.event_name)}} diff --git a/.gitignore b/.gitignore index 40a14977..a2336286 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .dccache node_modules/ coverage/ +android/ jest-coverage/ .nyc_output/ junit.xml diff --git a/.prettierignore b/.prettierignore index 812dd1a2..a3efc6d4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,27 +1,4 @@ - -node_modules/ -coverage/ -jest-coverage/ -.nyc_output/ -junit.xml -.idea/ -.husky/ +# extends from .gitignore .github/ License.md - -.expo/ -dist/ -.env -npm-debug.* -*.jks -*.p8 -*.p12 -*.key -*.mobileprovision -*.orig.* -web-build/ - -# macOS -.DS_Store - -.vercel +src-tauri/ \ No newline at end of file diff --git a/app/Api/Drills.ts b/app/Api/Drills.ts index 391f8638..8f3bf721 100644 --- a/app/Api/Drills.ts +++ b/app/Api/Drills.ts @@ -1,6 +1,6 @@ -import { calculateNotes, sudokuStrategy, sudokuStrategyArray } from "sudokuru"; -import { puzzle } from "./Puzzle.Types"; -import { drill } from "./Puzzle.Types"; +import { calculateNotes, sudokuStrategy } from "sudokuru"; + +import { puzzle, drill } from "./Puzzle.Types"; import { returnLocalDrillGame } from "../Functions/LocalDatabase"; /** @@ -13,9 +13,9 @@ export class Drills { * @returns a drill object corresponding to the drill type being requested. */ public static async getGame(strategy: sudokuStrategy): Promise { - let data: puzzle = returnLocalDrillGame(strategy); - let boardString: string = data.puzzle; - let notes: string = calculateNotes(boardString); + const data: puzzle = returnLocalDrillGame(strategy); + const boardString: string = data.puzzle; + const notes: string = calculateNotes(boardString); return { puzzleCurrentState: boardString, puzzleCurrentNotesState: notes, diff --git a/app/Api/Lessons.ts b/app/Api/Lessons.ts index 8304aa0c..7d486799 100644 --- a/app/Api/Lessons.ts +++ b/app/Api/Lessons.ts @@ -1,5 +1,3 @@ -import { sudokuStrategy } from "sudokuru"; - export interface lessonOfflineMode { mode: getLessonMode.Offline; } @@ -22,12 +20,12 @@ export class Lessons { * @returns string array of strategy names that getSteps can be called with */ public static async getStrategies( - args: lessonOfflineMode | lessonOnlineMode + args: lessonOfflineMode | lessonOnlineMode, ): Promise { if (args.mode === getLessonMode.Online) { const response: Response = await fetch( "https://sudokuru.s3.amazonaws.com/Lessons/strategies.json", - { cache: "no-cache" } + { cache: "no-cache" }, ); const json = await response.json(); return json; @@ -52,12 +50,12 @@ export class Lessons { */ public static async getSteps( strategy: string, - args: lessonOfflineMode | lessonOnlineMode + args: lessonOfflineMode | lessonOnlineMode, ): Promise { if (args.mode === getLessonMode.Online) { const response: Response = await fetch( "https://sudokuru.s3.amazonaws.com/Lessons/" + strategy + ".json", - { cache: "no-cache" } + { cache: "no-cache" }, ); const json = await response.json(); return json; @@ -249,22 +247,22 @@ export class Lessons { public static async getTutorial(): Promise { const sudoku_101: Response = await fetch( "https://sudokuru.s3.amazonaws.com/Lessons/SUDOKU_101.json", - { cache: "no-cache" } + { cache: "no-cache" }, ); const lesson1 = await sudoku_101.json(); const amend_notes: Response = await fetch( "https://sudokuru.s3.amazonaws.com/Lessons/AMEND_NOTES.json", - { cache: "no-cache" } + { cache: "no-cache" }, ); const lesson2 = await amend_notes.json(); const naked_single = await fetch( "https://sudokuru.s3.amazonaws.com/Lessons/NAKED_SINGLE.json", - { cache: "no-cache" } + { cache: "no-cache" }, ); const lesson3 = await naked_single.json(); const simplify_notes = await fetch( "https://sudokuru.s3.amazonaws.com/Lessons/SIMPLIFY_NOTES.json", - { cache: "no-cache" } + { cache: "no-cache" }, ); const lesson4 = await simplify_notes.json(); const tutorial = lesson1.concat(lesson2, lesson3, lesson4); diff --git a/app/Api/Profile.ts b/app/Api/Profile.ts index ca4094e7..2187a915 100644 --- a/app/Api/Profile.ts +++ b/app/Api/Profile.ts @@ -3,9 +3,9 @@ import { getKeyJSON, storeData } from "../Functions/AsyncStorage"; export class Profile { public static async getProfile(): Promise { - let value = await getKeyJSON("profile"); + const value = await getKeyJSON("profile"); if (value == null) { - let profile: profile = { + const profile: profile = { theme: true, highlightBox: true, highlightColumn: true, @@ -23,7 +23,7 @@ export class Profile { } public static async setProfileValue(profileValue: string) { - let value: profile = await this.getProfile(); + const value: profile = await this.getProfile(); if (profileValue === "theme") { value.theme = !value.theme; } else if (profileValue === "highlightBox") { diff --git a/app/Api/Puzzles.ts b/app/Api/Puzzles.ts index a1529cb9..819de181 100644 --- a/app/Api/Puzzles.ts +++ b/app/Api/Puzzles.ts @@ -1,15 +1,7 @@ -import { sudokuStrategyArray } from "sudokuru"; -import { gameResults, puzzle, statistics } from "./Puzzle.Types"; -import { activeGame } from "./Puzzle.Types"; -import { - GameDifficulty, - GameDifficultyScore, - GameStatistics, - SudokuObjectProps, - returnLocalGame, -} from "../Functions/LocalDatabase"; -import { getKeyJSON, removeData, storeData } from "../Functions/AsyncStorage"; +import { puzzle, statistics } from "./Puzzle.Types"; import { Statistics } from "./Statistics"; +import { getKeyJSON, removeData, storeData } from "../Functions/AsyncStorage"; +import { SudokuObjectProps, returnLocalGame } from "../Functions/LocalDatabase"; // Random games to be used by getRandomGame for landing page const DEMO_RANDOM_GAMES: puzzle[][] = [ @@ -225,13 +217,13 @@ export class Puzzles { numHintsUsed: number, numWrongCellsPlayed: number, time: number, - score: number + score: number, ) { // remove the game from storage await removeData("active_game"); // Create or update user's statistics - let statistics: statistics = await Statistics.getStatistics(); + const statistics: statistics = await Statistics.getStatistics(); statistics.totalScore += score; if ( @@ -245,7 +237,7 @@ export class Puzzles { statistics.numHintsUsed += numHintsUsed; statistics.numWrongCellsPlayed += numWrongCellsPlayed; statistics.averageSolveTime = Math.round( - statistics.totalSolveTime / statistics.numGamesPlayed + statistics.totalSolveTime / statistics.numGamesPlayed, ); Statistics.saveStatisitics(statistics); diff --git a/app/Api/Statistics.ts b/app/Api/Statistics.ts index 17c9f6e2..a18a085c 100644 --- a/app/Api/Statistics.ts +++ b/app/Api/Statistics.ts @@ -7,7 +7,8 @@ export class Statistics { * @returns promise of puzzle JSON object */ public static async getLearnedLessons(): Promise { - let value = await getKeyJSON("learned_lessons"); + const value = await getKeyJSON("learned_lessons"); + // eslint-disable-next-line eqeqeq if (value == undefined) { return JSON.parse(JSON.stringify(["NONE"])); } else { @@ -22,7 +23,7 @@ export class Statistics { public static async saveLearnedLessons(learnedLessons: string[]) { // Removing NONE placeholder value if user has learned a lesson if (learnedLessons.includes("NONE") && learnedLessons.length > 1) { - let index = learnedLessons.indexOf("NONE"); + const index = learnedLessons.indexOf("NONE"); if (index !== -1) { learnedLessons.splice(index, 1); } @@ -34,9 +35,9 @@ export class Statistics { * returns all statistics objects for given user */ public static async getStatistics(): Promise { - let value = await getKeyJSON("statistics"); + const value = await getKeyJSON("statistics"); if (value == null) { - let statistics: statistics = { + const statistics: statistics = { totalScore: 0, numGamesPlayed: 0, fastestSolveTime: 0, diff --git a/app/App.tsx b/app/App.tsx index 44be110b..ae172174 100644 --- a/app/App.tsx +++ b/app/App.tsx @@ -1,12 +1,13 @@ import "@expo/metro-runtime"; // web fast refresh for development import "react-native-gesture-handler"; // This needs to be at top to work +import { NavigationContainer } from "@react-navigation/native"; +import { registerRootComponent } from "expo"; import * as React from "react"; -import { PreferencesContext } from "./Contexts/PreferencesContext"; import { Provider as PaperProvider } from "react-native-paper"; -import { NavigationContainer } from "@react-navigation/native"; + import InitializeContext from "./Contexts/InitializeContext"; +import { PreferencesContext } from "./Contexts/PreferencesContext"; import DrawerNavigator from "./Navigation/DrawerNavigator"; -import { registerRootComponent } from "expo"; function App() { const { theme, preferences } = InitializeContext(); diff --git a/app/Components/Header.tsx b/app/Components/Header.tsx index 72cddf5f..8a7bb480 100644 --- a/app/Components/Header.tsx +++ b/app/Components/Header.tsx @@ -1,11 +1,12 @@ +import { useNavigation } from "@react-navigation/native"; import React from "react"; -import ProfileButton from "./Profile/ProfileButton"; -import StatisticsButton from "./Statistics/StatisticsButton"; import { Image, Pressable, View } from "react-native"; +import { IconButton } from "react-native-paper"; + import HomeButton from "./Home/HomeButton"; -import { useNavigation } from "@react-navigation/native"; +import ProfileButton from "./Profile/ProfileButton"; +import StatisticsButton from "./Statistics/StatisticsButton"; import { PreferencesContext } from "../Contexts/PreferencesContext"; -import { IconButton } from "react-native-paper"; const Header = () => { const navigation: any = useNavigation(); @@ -16,7 +17,7 @@ const Header = () => { const DARK_LOGO = require("../../.assets/goldLogoText.png"); const LIGHT_LOGO = require("../../.assets/darkBlueLogoText.png"); - let logoUrl = isThemeDark ? DARK_LOGO : LIGHT_LOGO; + const logoUrl = isThemeDark ? DARK_LOGO : LIGHT_LOGO; return ( { * If we are on the Landing page, Logo will not navigate to the Landing page * If we are on any other page, Logo will navigate to the Landing page */ - isCurrentPage == "Landing" ? ( + isCurrentPage === "Landing" ? ( { justifyContent: "flex-end", }} > - {isCurrentPage == "No" ? ( + {isCurrentPage === "No" ? ( <> - ) : isCurrentPage == "Statistics" ? ( + ) : isCurrentPage === "Statistics" ? ( ) : ( )} - {isCurrentPage == "No" ? ( + {isCurrentPage === "No" ? ( <> - ) : isCurrentPage == "Profile" ? ( + ) : isCurrentPage === "Profile" ? ( ) : ( diff --git a/app/Components/Home/DrillPanel.tsx b/app/Components/Home/DrillPanel.tsx index 66ab1f0f..0eb3f22d 100644 --- a/app/Components/Home/DrillPanel.tsx +++ b/app/Components/Home/DrillPanel.tsx @@ -10,6 +10,7 @@ import { Text, } from "react-native-paper"; import { sudokuStrategyArray } from "sudokuru"; + import { CARD_IMAGE_HEIGHT, CARD_IMAGE_WIDTH, @@ -19,14 +20,14 @@ import { difficulty, getDifficultyColor, } from "./Cards"; -import { toTitle } from "../Sudoku Board/sudoku"; import { getKeyJSON, removeData, storeData, } from "../../Functions/AsyncStorage"; +import { toTitle } from "../Sudoku Board/sudoku"; -let drillStrategies: sudokuStrategyArray = [ +const drillStrategies: sudokuStrategyArray = [ "NAKED_SINGLE", "NAKED_PAIR", "NAKED_TRIPLET", @@ -39,7 +40,7 @@ let drillStrategies: sudokuStrategyArray = [ "POINTING_TRIPLET", ]; -let drillImages: ImageURISource[] = [ +const drillImages: ImageURISource[] = [ require("./../../../.assets/CardImages/NAKED_SINGLE.png"), require("./../../../.assets/CardImages/NAKED_PAIR.png"), require("./../../../.assets/CardImages/NAKED_TRIPLET.png"), @@ -65,20 +66,21 @@ const DrillPanel = (props: any) => { async function showTutorialIfNotDismissed() { await getKeyJSON("dismissDrillTutorial").then((dismiss: any) => { + // eslint-disable-next-line eqeqeq if (dismiss == undefined) { showDialog(); } }); } - let drillButtonArray = []; + const drillButtonArray = []; let subArray = []; - let columnCount: number = calculateCardsPerRow( + const columnCount: number = calculateCardsPerRow( props.width, - drillStrategies.length + drillStrategies.length, ); for (let i = 0; i < drillStrategies.length; i++) { - let img: ImageURISource = drillImages[i]; + const img: ImageURISource = drillImages[i]; let difficulty: difficulty; switch (drillStrategies[i]) { case "NAKED_SINGLE": @@ -98,7 +100,7 @@ const DrillPanel = (props: any) => { difficulty = "Very Hard"; break; } - let difficultyColor: string = getDifficultyColor(difficulty); + const difficultyColor: string = getDifficultyColor(difficulty); subArray.push( { /> - + , ); // Add row diff --git a/app/Components/Home/HomeButton.tsx b/app/Components/Home/HomeButton.tsx index 3072bb57..c6d1eef6 100644 --- a/app/Components/Home/HomeButton.tsx +++ b/app/Components/Home/HomeButton.tsx @@ -1,6 +1,7 @@ -import { IconButton, useTheme } from "react-native-paper"; import { useNavigation } from "@react-navigation/native"; import React from "react"; +import { IconButton } from "react-native-paper"; + import { PreferencesContext } from "../../Contexts/PreferencesContext"; const HomeButton = () => { @@ -10,7 +11,7 @@ const HomeButton = () => { return ( { updateCurrentPage("Landing"); diff --git a/app/Components/Home/LessonPanel.tsx b/app/Components/Home/LessonPanel.tsx index b09f991f..59ff833e 100644 --- a/app/Components/Home/LessonPanel.tsx +++ b/app/Components/Home/LessonPanel.tsx @@ -1,19 +1,11 @@ +import { useFocusEffect } from "@react-navigation/core"; +import { useNavigation } from "@react-navigation/native"; +import { rgba } from "polished"; import React, { useState } from "react"; import { ImageURISource, Image, TouchableOpacity, View } from "react-native"; +import Alert from "react-native-awesome-alerts"; import { ActivityIndicator, Text, Card, useTheme } from "react-native-paper"; -import { PreferencesContext } from "../../Contexts/PreferencesContext"; -import { useFocusEffect } from "@react-navigation/core"; -import { - formatOneLessonName, - getLockedLessons, -} from "../../Functions/learnedLessons"; -import { - Lessons, - getLessonMode, - lessonOfflineMode, - lessonOnlineMode, -} from "../../Api/Lessons"; -import { useNavigation } from "@react-navigation/native"; + import { CARD_IMAGE_HEIGHT, CARD_IMAGE_WIDTH, @@ -23,10 +15,19 @@ import { difficulty, getDifficultyColor, } from "./Cards"; -import Alert from "react-native-awesome-alerts"; -import { rgba } from "polished"; +import { + Lessons, + getLessonMode, + lessonOfflineMode, + lessonOnlineMode, +} from "../../Api/Lessons"; +import { PreferencesContext } from "../../Contexts/PreferencesContext"; +import { + formatOneLessonName, + getLockedLessons, +} from "../../Functions/learnedLessons"; -let lessonImages: ImageURISource[] = [ +const lessonImages: ImageURISource[] = [ require("../../../.assets/CardImages/SUDOKU_101.png"), require("./../../../.assets/CardImages/AMEND_NOTES.png"), require("./../../../.assets/CardImages/NAKED_SINGLE.png"), @@ -37,7 +38,7 @@ let lessonImages: ImageURISource[] = [ require("./../../../.assets/CardImages/POINTING_PAIR.png"), ]; -let learnedLessonImages: ImageURISource[] = [ +const learnedLessonImages: ImageURISource[] = [ require("./../../../.assets/CardImages/Learned/SUDOKU_101.png"), require("./../../../.assets/CardImages/Learned/AMEND_NOTES.png"), require("./../../../.assets/CardImages/Learned/NAKED_SINGLE.png"), @@ -48,7 +49,7 @@ let learnedLessonImages: ImageURISource[] = [ require("./../../../.assets/CardImages/Learned/POINTING_SET.png"), ]; -let lockedLessonImages: ImageURISource[] = [ +const lockedLessonImages: ImageURISource[] = [ require("./../../../.assets/CardImages/Locked/SUDOKU_101.png"), require("./../../../.assets/CardImages/Locked/AMEND_NOTES.png"), require("./../../../.assets/CardImages/Locked/NAKED_SINGLE.png"), @@ -75,8 +76,8 @@ const LessonPanel = (props: any) => { const [lockedLesson, setLockedLesson] = useState(-1); // setting lesson mode to offline - let LESSON_MODE = getLessonMode.Offline; - let getlessonArgs: lessonOfflineMode | lessonOnlineMode = { + const LESSON_MODE = getLessonMode.Offline; + const getlessonArgs: lessonOfflineMode | lessonOnlineMode = { mode: LESSON_MODE, }; @@ -86,21 +87,20 @@ const LessonPanel = (props: any) => { setAvailableLessons(result); setIsLoading(false); }); - }, []) + }, []), ); if (isLoading) { - return ; + return ; } else { // dynamically render in lesson buttons based on criteria - let lessonButtonArray = []; - let lockedLessons = getLockedLessons(learnedLessons, availableLessons); - let NUM_LESSONS_PER_ROW = 2; + const lessonButtonArray = []; + const lockedLessons = getLockedLessons(learnedLessons, availableLessons); let subArray = []; - let columnCount: number = calculateCardsPerRow( + const columnCount: number = calculateCardsPerRow( props.width, - availableLessons.length + availableLessons.length, ); for (let i = 0; i < availableLessons.length; i++) { let img: ImageURISource; @@ -136,7 +136,7 @@ const LessonPanel = (props: any) => { difficulty = "Very Hard"; break; } - let difficultyColor: string = getDifficultyColor(difficulty); + const difficultyColor: string = getDifficultyColor(difficulty); subArray.push( { {formatOneLessonName(availableLessons[i])} { /> - + , ); // Add row @@ -218,12 +218,12 @@ const LessonPanel = (props: any) => { alertContainerStyle={{ backgroundColor: rgba(theme.colors.background, 0.3), }} - showCancelButton={true} - showConfirmButton={true} + showCancelButton + showConfirmButton closeOnTouchOutside={false} closeOnHardwareBackPress={false} - cancelText={"No"} - confirmText={"Yes"} + cancelText="No" + confirmText="Yes" confirmButtonColor={theme.colors.primary} onCancelPressed={() => { hideLockedWarning(); diff --git a/app/Components/Home/NavigationButton.tsx b/app/Components/Home/NavigationButton.tsx index c8b633c6..71dfa273 100644 --- a/app/Components/Home/NavigationButton.tsx +++ b/app/Components/Home/NavigationButton.tsx @@ -1,12 +1,8 @@ +import { useNavigation } from "@react-navigation/native"; import React from "react"; -import { - Pressable, - Image, - ImageURISource, - useWindowDimensions, -} from "react-native"; +import { Pressable, Image, ImageURISource } from "react-native"; import { Surface, useTheme } from "react-native-paper"; -import { useNavigation } from "@react-navigation/native"; + import { PreferencesContext } from "../../Contexts/PreferencesContext"; import { useNewWindowDimensions } from "../../Functions/WindowDimensions"; diff --git a/app/Components/NavigationSideBar.tsx b/app/Components/NavigationSideBar.tsx index e979482d..2789a741 100644 --- a/app/Components/NavigationSideBar.tsx +++ b/app/Components/NavigationSideBar.tsx @@ -1,6 +1,7 @@ -import React from "react"; import { useNavigation } from "@react-navigation/native"; +import React from "react"; import { Drawer } from "react-native-paper"; + import { PreferencesContext } from "../Contexts/PreferencesContext"; const NavigationSideBar = (props: any) => { @@ -12,7 +13,7 @@ const NavigationSideBar = (props: any) => { return ( { }} /> { }} /> { }} /> { }} /> { }} /> { @@ -21,14 +22,14 @@ const PreferencesToggles = () => { Theme Highlight Peers { /> Highlight Box Highlight Row Highlight Column { @@ -10,7 +11,7 @@ const ProfileButton = () => { return ( { updateCurrentPage("Profile"); diff --git a/app/Components/Statistics/Statistic.tsx b/app/Components/Statistics/Statistic.tsx index 30ceabb5..7ec5e761 100644 --- a/app/Components/Statistics/Statistic.tsx +++ b/app/Components/Statistics/Statistic.tsx @@ -1,6 +1,6 @@ import React from "react"; -import { Text } from "react-native-paper"; import { View, useWindowDimensions } from "react-native"; +import { Text } from "react-native-paper"; export interface StatisticProps { statisticName: string; diff --git a/app/Components/Statistics/StatisticsButton.tsx b/app/Components/Statistics/StatisticsButton.tsx index 6711586c..5646a414 100644 --- a/app/Components/Statistics/StatisticsButton.tsx +++ b/app/Components/Statistics/StatisticsButton.tsx @@ -1,6 +1,7 @@ -import { IconButton } from "react-native-paper"; -import React from "react"; import { useNavigation } from "@react-navigation/native"; +import React from "react"; +import { IconButton } from "react-native-paper"; + import { PreferencesContext } from "../../Contexts/PreferencesContext"; const StatisticsButton = () => { @@ -10,7 +11,7 @@ const StatisticsButton = () => { return ( { updateCurrentPage("Statistics"); diff --git a/app/Components/Statistics/TotalStatistics.tsx b/app/Components/Statistics/TotalStatistics.tsx index fce1dc49..741f94f1 100644 --- a/app/Components/Statistics/TotalStatistics.tsx +++ b/app/Components/Statistics/TotalStatistics.tsx @@ -1,6 +1,6 @@ -import { View } from "react-native"; +import { View, useWindowDimensions } from "react-native"; import { Text, useTheme } from "react-native-paper"; -import { useWindowDimensions } from "react-native"; + import Statistic from "./Statistic"; import { formatTime } from "../Sudoku Board/Functions/BoardFunctions"; diff --git a/app/Components/Sudoku Board/Components/ActionRow.tsx b/app/Components/Sudoku Board/Components/ActionRow.tsx index d58707bb..f436b84b 100644 --- a/app/Components/Sudoku Board/Components/ActionRow.tsx +++ b/app/Components/Sudoku Board/Components/ActionRow.tsx @@ -1,8 +1,9 @@ -import { getCellSize } from "../Functions/BoardFunctions"; -import { useTheme } from "react-native-paper"; -import { Platform, Pressable, View } from "react-native"; import { MaterialCommunityIcons } from "@expo/vector-icons"; import React from "react"; +import { Platform, Pressable, View } from "react-native"; +import { useTheme } from "react-native-paper"; + +import { useCellSize } from "../Functions/BoardFunctions"; interface ActionRowProps { isEraseButtonDisabled: boolean; @@ -22,11 +23,11 @@ const ActionRow = (props: ActionRowProps) => { toggleNoteMode, eraseSelected, } = props; - const cellSize = getCellSize(); + const cellSize = useCellSize(); const theme = useTheme(); - const sizeConst = Platform.OS == "web" ? 1.5 : 1; - let fallbackHeight = 30; + const sizeConst = Platform.OS === "web" ? 1.5 : 1; + const fallbackHeight = 30; return ( { { {inNoteMode ? ( // note mode on @@ -77,7 +78,7 @@ const ActionRow = (props: ActionRowProps) => { { c, r, } = props; - const cellSize = getCellSize(); + const cellSize = useCellSize(); const getNoteContents = (noteIndex: number) => { if (entry.includes(noteIndex)) { - let styleVal = { + const styleVal = { fontSize: cellSize ? cellSize / 4.5 : fallbackHeight / 4, fontFamily: "Inter_200ExtraLight", }; @@ -49,7 +50,7 @@ const Cell = (props: RenderCellProps) => { }; const getCellContents = () => { - var contents = ""; + let contents = ""; if (type === "note") { contents += "notes:"; for (let i = 1; i <= 9; i++) { @@ -114,40 +115,40 @@ const Cell = (props: RenderCellProps) => { }} > - + {getNoteContents(1)} - + {getNoteContents(2)} - + {getNoteContents(3)} - + {getNoteContents(4)} - + {getNoteContents(5)} - + {getNoteContents(6)} - + {getNoteContents(7)} - + {getNoteContents(8)} - + {getNoteContents(9)} - ) : entry != 0 ? ( + ) : entry !== 0 ? ( { const size = useWindowDimensions(); const reSize = Math.min(size.width, size.height); - const theme = useTheme(); const navigation: any = useNavigation(); return ( diff --git a/app/Components/Sudoku Board/Components/HeaderRow.tsx b/app/Components/Sudoku Board/Components/HeaderRow.tsx index 1ef0c331..91cd6fa6 100644 --- a/app/Components/Sudoku Board/Components/HeaderRow.tsx +++ b/app/Components/Sudoku Board/Components/HeaderRow.tsx @@ -2,11 +2,12 @@ import { useNavigation, useFocusEffect } from "@react-navigation/native"; import React from "react"; import { View } from "react-native"; import { useTheme, Text } from "react-native-paper"; -import { SudokuObjectProps } from "../../../Functions/LocalDatabase"; -import { getCellSize, saveGame, formatTime } from "../Functions/BoardFunctions"; + import PauseButton from "./PauseButton"; +import { SudokuObjectProps } from "../../../Functions/LocalDatabase"; +import { useCellSize, saveGame, formatTime } from "../Functions/BoardFunctions"; -let fallbackHeight = 30; +const fallbackHeight = 30; interface HeaderRowProps { sudokuBoard: SudokuObjectProps; @@ -17,14 +18,14 @@ const HeaderRow = (props: HeaderRowProps) => { const { sudokuBoard, setSudokuBoard } = props; const currentTime = sudokuBoard.statistics.time; - const cellSize = getCellSize(); + const cellSize = useCellSize(); const navigation = useNavigation(); const theme = useTheme(); useFocusEffect( React.useCallback(() => { - let interval = setInterval(() => { + const interval = setInterval(() => { sudokuBoard.statistics.time = sudokuBoard.statistics.time + 1; setSudokuBoard((prevState: SudokuObjectProps) => ({ ...prevState, @@ -32,7 +33,7 @@ const HeaderRow = (props: HeaderRowProps) => { })); }, 1000); return () => clearInterval(interval); - }, [sudokuBoard.statistics.time]) + }, [sudokuBoard.statistics.time]), ); const handlePause = () => { diff --git a/app/Components/Sudoku Board/Components/NumberControl.tsx b/app/Components/Sudoku Board/Components/NumberControl.tsx index d6349ea4..03d82490 100644 --- a/app/Components/Sudoku Board/Components/NumberControl.tsx +++ b/app/Components/Sudoku Board/Components/NumberControl.tsx @@ -1,10 +1,11 @@ -import { useTheme } from "react-native-paper"; +import React from "react"; import { Pressable, Text, View } from "react-native"; +import { useTheme } from "react-native-paper"; + +import { useCellSize } from "../Functions/BoardFunctions"; import { range } from "../sudoku"; -import React from "react"; -import { getCellSize } from "../Functions/BoardFunctions"; -let fallbackHeight = 30; +const fallbackHeight = 30; // todo rewrite @@ -15,7 +16,7 @@ interface NumberControlProps { const NumberControl = (props: NumberControlProps) => { const { areNumberButtonsDisabled: prefilled, updateEntry } = props; - const cellSize = getCellSize(); + const cellSize = useCellSize(); const theme = useTheme(); return ( void; isPaused: boolean; @@ -10,8 +11,8 @@ interface PauseButtonProps { const PauseButton = (props: PauseButtonProps) => { const { handlePause, isPaused } = props; - const cellSize = getCellSize(); - const sizeConst = Platform.OS == "web" ? 1.5 : 1; + const cellSize = useCellSize(); + const sizeConst = Platform.OS === "web" ? 1.5 : 1; const theme = useTheme(); return ( diff --git a/app/Components/Sudoku Board/Components/Puzzle.tsx b/app/Components/Sudoku Board/Components/Puzzle.tsx index a2d475c4..ef3a92f6 100644 --- a/app/Components/Sudoku Board/Components/Puzzle.tsx +++ b/app/Components/Sudoku Board/Components/Puzzle.tsx @@ -1,12 +1,13 @@ -import { View } from "react-native"; import React from "react"; +import { View } from "react-native"; + import { CellProps, SudokuObjectProps } from "../../../Functions/LocalDatabase"; interface PuzzleProps { renderCell: ( cell: CellProps, r: number, - c: number + c: number, ) => JSX.Element | undefined; sudokuBoard: SudokuObjectProps; } diff --git a/app/Components/Sudoku Board/Functions/BoardFunctions.ts b/app/Components/Sudoku Board/Functions/BoardFunctions.ts index 1e0e16c8..13bd4348 100644 --- a/app/Components/Sudoku Board/Functions/BoardFunctions.ts +++ b/app/Components/Sudoku Board/Functions/BoardFunctions.ts @@ -1,4 +1,5 @@ import { useWindowDimensions } from "react-native"; + import { Puzzles } from "../../../Api/Puzzles"; import { GameDifficulty, @@ -14,18 +15,18 @@ import { * This function retrieves the user's device size and calculates the cell size * board has width and height dimensions of 1 x 1.44444 */ -export function getCellSize(): number { +export function useCellSize(): number { const size = useWindowDimensions(); return Math.min(size.width * 1.44444, size.height) / 15; } -export function getBoardSize(): number { - return getCellSize() * 9; +export function useBoardSize(): number { + return useCellSize() * 9; } export const isValueCorrect = ( solution: number, - inputValue: number + inputValue: number, ): boolean => { return solution === inputValue; }; @@ -42,21 +43,21 @@ export const formatTime = (inputSeconds: number) => { const paddedHours = hours > 0 ? (hours < 10 ? "0" : "") + hours + ":" - : hours == 0 && days != 0 - ? "00:" - : ""; + : hours === 0 && days !== 0 + ? "00:" + : ""; const paddedMinutes = minutes > 0 ? (minutes < 10 ? "0" : "") + minutes + ":" - : minutes == 0 && hours != 0 - ? "00:" - : ""; + : minutes === 0 && hours !== 0 + ? "00:" + : ""; const paddedSeconds = seconds > 0 ? (seconds < 10 ? "0" : "") + seconds - : seconds == 0 && minutes != 0 - ? "00" - : "0"; + : seconds === 0 && minutes !== 0 + ? "00" + : "0"; // Return formatted string return `${paddedDays}${paddedHours}${paddedMinutes}${paddedSeconds}`; @@ -83,14 +84,14 @@ export function finishGame( difficulty: GameDifficulty, numHintsUsed: number, numWrongCellsPlayed: number, - time: number + time: number, ): number { // calculate score const score = calculateGameScore( numHintsUsed, numWrongCellsPlayed, time, - difficulty + difficulty, ); // removes game from localstorage and updates statistics page @@ -110,13 +111,13 @@ function calculateGameScore( numHintsUsed: number, numWrongCellsPlayed: number, time: number, - difficulty: GameDifficulty + difficulty: GameDifficulty, ): number { const difficultyScore: GameDifficultyScore = calculateDifficultyScore(difficulty); const hintAndIncorrectCellsScore: number = calculateHintAndIncorrectCellScore( numWrongCellsPlayed, - numHintsUsed + numHintsUsed, ); const timeScore: number = calculateTimeScore(time); return difficultyScore + hintAndIncorrectCellsScore + timeScore; @@ -128,7 +129,7 @@ function calculateGameScore( * @returns A number representing the difficulty score from the puzzle, which represents 30% of the total score */ function calculateDifficultyScore( - difficulty: GameDifficulty + difficulty: GameDifficulty, ): GameDifficultyScore { if (difficulty === "easy") { return 10; @@ -150,7 +151,7 @@ function calculateDifficultyScore( */ function calculateHintAndIncorrectCellScore( numWrongCellsPlayed: number, - numHintsUsed: number + numHintsUsed: number, ): number { // hints and incorrect cell placements are weighted equally const totalScrewups = numWrongCellsPlayed + numHintsUsed; diff --git a/app/Components/Sudoku Board/Functions/Group.ts b/app/Components/Sudoku Board/Functions/Group.ts index 60bd0fc1..8d0fe67c 100644 --- a/app/Components/Sudoku Board/Functions/Group.ts +++ b/app/Components/Sudoku Board/Functions/Group.ts @@ -9,7 +9,9 @@ export default class Group { private mode: string; constructor() { - this.row = this.col = this.box = -1; + this.row = -1; + this.col = -1; + this.box = -1; this.values = []; this.mode = ""; } @@ -79,14 +81,14 @@ export default class Group { * Returns the legacy SudokuBoard format of the group */ public getGroup(): any { - let group: any = []; - if (this.row != -1) { + const group: any = []; + if (this.row !== -1) { group.push({ type: "row", index: this.row }); } - if (this.col != -1) { + if (this.col !== -1) { group.push({ type: "col", index: this.col }); } - if (this.box != -1) { + if (this.box !== -1) { group.push({ type: "box", index: this.box }); } return group; @@ -102,7 +104,7 @@ export default class Group { /** * Returns the legacy SudokuBoard format for removals */ - public getRemoval(): Object { + public getRemoval(): object { return { mode: this.mode, position: [this.row, this.col], @@ -113,7 +115,7 @@ export default class Group { /** * Returns the legacy SudokuBoard format for placements */ - public getPlacement(): Object { + public getPlacement(): object { return { mode: this.mode, position: [this.row, this.col], diff --git a/app/Components/Sudoku Board/Functions/Hint.ts b/app/Components/Sudoku Board/Functions/Hint.ts index 1c625dd5..3e807ec4 100644 --- a/app/Components/Sudoku Board/Functions/Hint.ts +++ b/app/Components/Sudoku Board/Functions/Hint.ts @@ -43,7 +43,7 @@ export default class Hint { */ public addCauses(step: number, causes: number[][]): void { for (let i: number = 0; i < causes.length; i++) { - let tempGroup: Group = new Group(); + const tempGroup: Group = new Group(); tempGroup.setRow(causes[i][0]); tempGroup.setCol(causes[i][1]); this.causes[step].push(tempGroup); @@ -61,9 +61,9 @@ export default class Hint { step: number, position: number[], values: number[], - mode: string + mode: string, ): void { - let tempGroup: Group = new Group(); + const tempGroup: Group = new Group(); tempGroup.setRow(position[0]); tempGroup.setCol(position[1]); tempGroup.setValues(values); @@ -78,7 +78,7 @@ export default class Hint { * @param mode - mode of the placement */ public addPlacement(position: number[], value: number, mode: string): void { - let tempGroup: Group = new Group(); + const tempGroup: Group = new Group(); tempGroup.setRow(position[0]); tempGroup.setCol(position[1]); tempGroup.setValues([value]); @@ -91,13 +91,13 @@ export default class Hint { */ public adjustForPointingSet(): void { // Get box involved in pointing set - let box: number = this.groups[1][0].getBox(); + const box: number = this.groups[1][0].getBox(); // Determine if row or column is involved in pointing set - let row: number = this.groups[0][0].getRow(); - let col: number = this.groups[0][0].getCol(); - let isRow: boolean = row !== -1; + const row: number = this.groups[0][0].getRow(); + const col: number = this.groups[0][0].getCol(); + const isRow: boolean = row !== -1; // Create row or column group - let temp: Group = new Group(); + const temp: Group = new Group(); if (isRow) { temp.setRow(row); } else { @@ -119,7 +119,7 @@ export default class Hint { * Returns the hint steps using legacy SudokuBoard format */ public getHintSteps(): any[] { - let hintSteps: any[] = []; + const hintSteps: any[] = []; for (let step: number = 0; step < this.stepCount; step++) { hintSteps.push({}); if (this.groups[step].length > 0) { @@ -141,7 +141,7 @@ export default class Hint { removal++ ) { hintSteps[step].removals.push( - this.removals[step][removal].getRemoval() + this.removals[step][removal].getRemoval(), ); } } diff --git a/app/Components/Sudoku Board/Functions/HintsParsing.ts b/app/Components/Sudoku Board/Functions/HintsParsing.ts index 76da9752..e9a50123 100644 --- a/app/Components/Sudoku Board/Functions/HintsParsing.ts +++ b/app/Components/Sudoku Board/Functions/HintsParsing.ts @@ -1,5 +1,5 @@ -import Hint from "./Hint"; import Group from "./Group"; +import Hint from "./Hint"; /** * Given the x and y coordinates of a cell, returns the index of the box the cell is in @@ -25,11 +25,11 @@ function highlightGroup( index: number, row: number, col: number, - box: number + box: number, ): boolean { - if (groupType == "row" && index == row) return true; - if (groupType == "col" && index == col) return true; - if (groupType == "box" && index == box) return true; + if (groupType === "row" && index === row) return true; + if (groupType === "col" && index === col) return true; + if (groupType === "box" && index === box) return true; return false; } @@ -42,7 +42,7 @@ function highlightGroup( export function highlightGroups( currentHint: any, row: number, - col: number + col: number, ): boolean { if (currentHint.groups) { // group highlighting @@ -54,7 +54,7 @@ export function highlightGroups( currentHint.groups[i].index, row, col, - getBoxIndexFromXY(col, row) + getBoxIndexFromXY(col, row), ) ) { return true; @@ -74,13 +74,13 @@ export function highlightGroups( export function highlightCauses( currentHint: any, row: number, - col: number + col: number, ): boolean { - if (currentHint && currentHint.causes) { + if (currentHint?.causes) { for (let i = 0; i < currentHint.causes.length; i++) { - let currentCause_x = currentHint.causes[i][0]; - let currentCause_y = currentHint.causes[i][1]; - if (currentCause_x == col && currentCause_y == row) { + const currentCause_x = currentHint.causes[i][0]; + const currentCause_y = currentHint.causes[i][1]; + if (currentCause_x === col && currentCause_y === row) { return true; } } @@ -99,15 +99,15 @@ export function setRemovalHighlights( isRemovalHighlight: boolean[], currentHint: any, row: number, - col: number + col: number, ): void { if (currentHint.removals) { for (let i = 0; i < currentHint.removals.length; i++) { - let currentRemoval = currentHint.removals[i]; - let currentRemoval_x = currentRemoval.position[0]; - let currentRemoval_y = currentRemoval.position[1]; - if (currentRemoval_x == col && currentRemoval_y == row) { - if (currentRemoval.mode == "highlight") { + const currentRemoval = currentHint.removals[i]; + const currentRemoval_x = currentRemoval.position[0]; + const currentRemoval_y = currentRemoval.position[1]; + if (currentRemoval_x === col && currentRemoval_y === row) { + if (currentRemoval.mode === "highlight") { for (let j = 0; j < currentRemoval.values.length; j++) { isRemovalHighlight[currentRemoval.values[j] - 1] = true; } @@ -115,7 +115,6 @@ export function setRemovalHighlights( } } } - return; } /** @@ -129,19 +128,18 @@ export function setPlacementHighlights( isPlacementHighlight: boolean[], currentHint: any, row: any, - col: any + col: any, ): void { if (currentHint.placements) { - let currentPlacement = currentHint.placements; - let currentPlacement_x = currentPlacement.position[0]; - let currentPlacement_y = currentPlacement.position[1]; - if (currentPlacement_x == col && currentPlacement_y == row) { - if (currentPlacement.mode == "highlight") { + const currentPlacement = currentHint.placements; + const currentPlacement_x = currentPlacement.position[0]; + const currentPlacement_y = currentPlacement.position[1]; + if (currentPlacement_x === col && currentPlacement_y === row) { + if (currentPlacement.mode === "highlight") { isPlacementHighlight[currentPlacement.value - 1] = true; } } } - return; } /** @@ -153,9 +151,9 @@ export function setPlacementHighlights( export function addGroupToHint( hint: Hint, hintStepNumber: number, - group: any[] + group: any[], ): void { - let tempGroup: Group = new Group(); + const tempGroup: Group = new Group(); for (let i: number = 0; i < group.length; i++) { if (group[i].type === "row") { tempGroup.setRow(group[i].index); @@ -166,7 +164,6 @@ export function addGroupToHint( } } hint.addGroup(hintStepNumber, tempGroup); - return; } /** @@ -221,12 +218,12 @@ export function getHintObject( groups: any[], causes: number[][], removals: any[], - placement: any + placement: any, ): Hint { - let steps: number = getStepCount(strategy); - let removalModes: string[] = getRemovalModes(strategy); - let placementModes: string[] = getPlacementModes(strategy); - let hint: Hint = new Hint(steps); + const steps: number = getStepCount(strategy); + const removalModes: string[] = getRemovalModes(strategy); + const placementModes: string[] = getPlacementModes(strategy); + const hint: Hint = new Hint(steps); for (let step: number = 0; step < steps; step++) { addGroupToHint(hint, step, groups); hint.addCauses(step, causes); @@ -235,14 +232,14 @@ export function getHintObject( step, removals[removal].position, removals[removal].values, - removalModes[step] + removalModes[step], ); } if (placement.length > 0) { hint.addPlacement( placement[0].position, placement[0].value, - placementModes[step] + placementModes[step], ); } } diff --git a/app/Components/Sudoku Board/Functions/generateGame.ts b/app/Components/Sudoku Board/Functions/generateGame.ts index c47dc3a8..a5c4297f 100644 --- a/app/Components/Sudoku Board/Functions/generateGame.ts +++ b/app/Components/Sudoku Board/Functions/generateGame.ts @@ -5,11 +5,11 @@ import { SudokuBoardProps } from "../SudokuBoard"; export async function generateGame(props: SudokuBoardProps) { let gameData = null; - if (props.action == "StartGame") { + if (props.action === "StartGame") { gameData = await Puzzles.startGame().then((game: SudokuObjectProps) => { return game; }); - } else if (props.action == "ResumeGame") { + } else if (props.action === "ResumeGame") { gameData = await Puzzles.getGame().then((game: SudokuObjectProps[]) => { // If game object is not returned, you get redirected to Main Page if (game == null) { diff --git a/app/Components/Sudoku Board/SudokuBoard.tsx b/app/Components/Sudoku Board/SudokuBoard.tsx index f1ef9f59..598d3550 100644 --- a/app/Components/Sudoku Board/SudokuBoard.tsx +++ b/app/Components/Sudoku Board/SudokuBoard.tsx @@ -1,22 +1,26 @@ import React, { useEffect, useState } from "react"; import { View } from "react-native"; -import { finishGame, saveGame } from "./Functions/BoardFunctions"; +import { ActivityIndicator } from "react-native-paper"; + +import ActionRow from "./Components/ActionRow"; +import Cell from "./Components/Cell"; +import EndGameModal from "./Components/EndGameModal"; +import HeaderRow from "./Components/HeaderRow"; +import NumberControl from "./Components/NumberControl"; +import Puzzle from "./Components/Puzzle"; +import { + finishGame, + saveGame, + isValueCorrect, +} from "./Functions/BoardFunctions"; +import { generateGame } from "./Functions/generateGame"; import { isCurrentCellAndSelectedCellInSameBox, isCurrentCellAndSelectedCellInSameColumn, isCurrentCellAndSelectedCellInSameRow, } from "./sudoku"; -import { ActivityIndicator } from "react-native-paper"; -import NumberControl from "./Components/NumberControl"; -import { isValueCorrect } from "./Functions/BoardFunctions"; -import Cell from "./Components/Cell"; -import ActionRow from "./Components/ActionRow"; -import { generateGame } from "./Functions/generateGame"; -import Puzzle from "./Components/Puzzle"; -import { CellProps, SudokuObjectProps } from "../../Functions/LocalDatabase"; import { PreferencesContext } from "../../Contexts/PreferencesContext"; -import HeaderRow from "./Components/HeaderRow"; -import EndGameModal from "./Components/EndGameModal"; +import { CellProps, SudokuObjectProps } from "../../Functions/LocalDatabase"; export interface SudokuBoardProps { action: "StartGame" | "ResumeGame"; @@ -28,6 +32,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { useEffect(() => { generateGame(props).then((game) => { + // eslint-disable-next-line eqeqeq if (game == null) { return; } @@ -35,9 +40,16 @@ const SudokuBoard = (props: SudokuBoardProps) => { }); }, []); + const { + isHighlightIdenticalValues, + isHighlightBox, + isHighlightRow, + isHighlightColumn, + } = React.useContext(PreferencesContext); + // if we are loading then we return the loading icon if (sudokuBoard == null) { - return ; + return ; } // Render EndGame screen when game has ended @@ -122,7 +134,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { (currentEntry === inputValue || isValueCorrect( sudokuBoard.puzzleSolution[r][c], - currentEntry as number + currentEntry as number, )) ) { return; @@ -142,7 +154,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { // Storing old value in actionHistory sudokuBoard.actionHistory.push({ cell: { entry: currentEntry, type: currentType } as CellProps, // annoying typescript casting workaround - cellLocation: { c: c, r: r }, + cellLocation: { c, r }, }); // Saving current game status @@ -153,7 +165,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { sudokuBoard.statistics.difficulty, sudokuBoard.statistics.numHintsUsed, sudokuBoard.statistics.numWrongCellsPlayed, - sudokuBoard.statistics.time + sudokuBoard.statistics.time, ); sudokuBoard.statistics.score = score; setSudokuBoard({ @@ -210,7 +222,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { const currentEntryCopy = JSON.parse(JSON.stringify(currentEntry)); if (currentEntryCopy.includes(inputValue)) { newCellEntry = currentEntryCopy.filter( - (note: number) => note != inputValue + (note: number) => note !== inputValue, ); } else { currentEntryCopy.push(inputValue); @@ -234,7 +246,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { } const isValueCorrectResult = isValueCorrect( sudokuBoard.puzzleSolution[r][c], - sudokuBoard.puzzle[r][c].entry as number + sudokuBoard.puzzle[r][c].entry as number, ); if (isValueCorrectResult === false) { return false; @@ -262,7 +274,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { } else { setSudokuBoard({ ...sudokuBoard, - selectedCell: { r: r, c: c }, + selectedCell: { r, c }, }); } }; @@ -275,7 +287,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { * @returns True if the value in a cell is incorrect, False otherwise */ const isConflict = (r: number, c: number, cell: CellProps): boolean => { - if (cell.type == "note" || cell.entry == 0) { + if (cell.type === "note" || cell.entry === 0) { return false; } return !( @@ -286,16 +298,10 @@ const SudokuBoard = (props: SudokuBoardProps) => { const renderCell = (cell: CellProps, r: number, c: number) => { // row and column values are incorrect here. // console.log("RENDER CELL", c, "COLUMN", r, "ROW", cell) - const { - isHighlightIdenticalValues, - isHighlightBox, - isHighlightRow, - isHighlightColumn, - } = React.useContext(PreferencesContext); - - let selected = sudokuBoard.selectedCell; + + const selected = sudokuBoard.selectedCell; let isSelected = false; - let conflict = isConflict(r, c, cell); + const conflict = isConflict(r, c, cell); let peer = false; let box = false; let row = false; @@ -303,12 +309,9 @@ const SudokuBoard = (props: SudokuBoardProps) => { let sameValue = false; if (selected != null) { isSelected = c === selected.c && r === selected.r; - box = isCurrentCellAndSelectedCellInSameBox({ r: r, c: c }, selected); - row = isCurrentCellAndSelectedCellInSameRow({ r: r, c: c }, selected); - column = isCurrentCellAndSelectedCellInSameColumn( - { r: r, c: c }, - selected - ); + box = isCurrentCellAndSelectedCellInSameBox({ r, c }, selected); + row = isCurrentCellAndSelectedCellInSameRow({ r, c }, selected); + column = isCurrentCellAndSelectedCellInSameColumn({ r, c }, selected); peer = !conflict && ((box && isHighlightBox) || @@ -320,12 +323,12 @@ const SudokuBoard = (props: SudokuBoardProps) => { return; } const selectedEntry = currentSelectedCell.entry; - let currentEntry = cell.entry; + const currentEntry = cell.entry; sameValue = !conflict && isHighlightIdenticalValues && selectedEntry === currentEntry && - currentEntry != 0; + currentEntry !== 0; } return ( @@ -371,9 +374,9 @@ const SudokuBoard = (props: SudokuBoardProps) => { updateCellEntry(parseInt(inputValue, 10)); } if ( - inputValue == "Delete" || - inputValue == "Backspace" || - inputValue == "0" + inputValue === "Delete" || + inputValue === "Backspace" || + inputValue === "0" ) eraseSelected(); }; @@ -400,7 +403,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { sudokuBoard.puzzleSolution[sudokuBoard.selectedCell!.r][ sudokuBoard.selectedCell!.c ], - currentSelectedCell.entry + currentSelectedCell.entry, ); } return ( @@ -413,11 +416,11 @@ const SudokuBoard = (props: SudokuBoardProps) => { const renderActions = () => { const inNoteMode = sudokuBoard.inNoteMode; - let currentSelectedCell: CellProps | null = getCurrentSelectedCell(); + const currentSelectedCell: CellProps | null = getCurrentSelectedCell(); let isEraseButtonDisabled = sudokuBoard.selectedCell == null; const isUndoButtonDisabled = sudokuBoard.actionHistory == null || - sudokuBoard.actionHistory.length == 0; + sudokuBoard.actionHistory.length === 0; if (currentSelectedCell != null) { const isCellGiven = currentSelectedCell.type === "given"; const isCellEmpty = @@ -428,7 +431,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { sudokuBoard.puzzleSolution[sudokuBoard.selectedCell!.r][ sudokuBoard.selectedCell!.c ], - currentSelectedCell.entry + currentSelectedCell.entry, ); // disable erase button if value === 0 or is given if (isCellGiven || isCellEmpty || isCellCorrect) { @@ -450,7 +453,7 @@ const SudokuBoard = (props: SudokuBoardProps) => { return ( { (props: any) => { return setCurrentPage(props); }, - [isCurrentPage] + [isCurrentPage], ); const updateLearnedLessons = React.useCallback( (props: any) => { return setLearnedLessons(props); }, - [learnedLessons] + [learnedLessons], ); const toggleHighlightIdenticalValues = React.useCallback(() => { @@ -99,7 +100,7 @@ const InitializeContext = () => { isHighlightRow, toggleHighlightColumn, isHighlightColumn, - ] + ], ); return { diff --git a/app/Functions/AsyncStorage.ts b/app/Functions/AsyncStorage.ts index 7fe4be2f..374efd9e 100644 --- a/app/Functions/AsyncStorage.ts +++ b/app/Functions/AsyncStorage.ts @@ -19,7 +19,7 @@ export const storeData = async (key: string, value: any) => { */ export const getKeyString = async (key: string) => { try { - let value = await AsyncStorage.getItem(key); + const value = await AsyncStorage.getItem(key); if (value !== null) { return value; } @@ -34,7 +34,7 @@ export const getKeyString = async (key: string) => { */ export const getKeyJSON = async (key: string) => { try { - let value = await AsyncStorage.getItem(key); + const value = await AsyncStorage.getItem(key); if (value !== null) { return JSON.parse(value); } diff --git a/app/Functions/LocalDatabase.ts b/app/Functions/LocalDatabase.ts index 6bbfea1e..6f3f1a26 100644 --- a/app/Functions/LocalDatabase.ts +++ b/app/Functions/LocalDatabase.ts @@ -1,4 +1,5 @@ import { sudokuStrategy } from "sudokuru"; + import { puzzle } from "../Api/Puzzle.Types"; /** @@ -80,7 +81,7 @@ export interface GameAction { // todo remove erase, and just use 0 value to signify erase // then can remove ActionType as a type needed -type ActionType = "note" | "value"; +// type ActionType = "note" | "value"; export interface CellLocation { r: number; @@ -115,17 +116,17 @@ export interface CellWithNotes { export type CellType = "note" | "value" | "given"; // This will be exported from Sudokuru package -interface Hint { - hint: { - strategy: any; - cause: any; - groups: any; - placements: any; - removals: any; - info: string; - action: string; - }; -} +// interface Hint { +// hint: { +// strategy: any; +// cause: any; +// groups: any; +// placements: any; +// removals: any; +// info: string; +// action: string; +// }; +// } const NAKED_SINGLE_DRILL_GAMES: SudokuObjectProps[] = [ { diff --git a/app/Functions/WindowDimensions.ts b/app/Functions/WindowDimensions.ts index 688dd01a..61f87e99 100644 --- a/app/Functions/WindowDimensions.ts +++ b/app/Functions/WindowDimensions.ts @@ -1,5 +1,5 @@ -import { ScaledSize, useWindowDimensions } from "react-native"; import { useHeaderHeight } from "@react-navigation/elements"; +import { ScaledSize, useWindowDimensions } from "react-native"; export const useMinWindowDimensions = (): number => { const size = useWindowDimensions(); diff --git a/app/Functions/learnedLessons.ts b/app/Functions/learnedLessons.ts index d2720ede..db54b526 100644 --- a/app/Functions/learnedLessons.ts +++ b/app/Functions/learnedLessons.ts @@ -3,7 +3,7 @@ */ export const formatLessonNameArray = (learnedLessons: string[]) => { if (!learnedLessons) return "Loading..."; - let formattedLessonArray = []; + const formattedLessonArray = []; for (let i = 0; i < learnedLessons.length; i++) { formattedLessonArray.push(formatOneLessonName(learnedLessons[i])); } @@ -25,7 +25,7 @@ export const formatOneLessonName = (lessonName: string) => { */ export const getOneLessonPartialName = ( lessonName: string, - wordIndex: number + wordIndex: number, ) => { const words = lessonName.toLowerCase().replaceAll("_", " ").split(" "); words[wordIndex] = @@ -38,9 +38,9 @@ export const getOneLessonPartialName = ( */ export const getLockedLessons = ( learnedLessons: string[], - avaliableLessons: string[] + avaliableLessons: string[], ): string[] => { - let unLearnedLessons = arrayDifference(learnedLessons, avaliableLessons); + const unLearnedLessons = arrayDifference(learnedLessons, avaliableLessons); // There are no locked lessons if unLearnedLessons has 1 or 0 elements if (unLearnedLessons.length <= 1) { @@ -57,38 +57,38 @@ export const getLockedLessons = ( // https://stackoverflow.com/questions/1187518/how-to-get-the-difference-between-two-arrays-in-javascript export const arrayDifference = ( learnedLessons: string[], - avaliableLessons: string[] + avaliableLessons: string[], ) => { return avaliableLessons.filter((x) => !learnedLessons.includes(x)); }; export const convertLessonsToStrategies = (learnedLessons: string[]) => { if (learnedLessons.includes("NAKED_SET")) { - let index = learnedLessons.indexOf("NAKED_SET"); + const index = learnedLessons.indexOf("NAKED_SET"); learnedLessons.splice(index, 1); learnedLessons.push("NAKED_PAIR", "NAKED_TRIPLET", "NAKED_QUADRUPLET"); } if (learnedLessons.includes("HIDDEN_SET")) { - let index = learnedLessons.indexOf("HIDDEN_SET"); + const index = learnedLessons.indexOf("HIDDEN_SET"); learnedLessons.splice(index, 1); learnedLessons.push("HIDDEN_PAIR", "HIDDEN_TRIPLET", "HIDDEN_QUADRUPLET"); } if (learnedLessons.includes("POINTING_SET")) { - let index = learnedLessons.indexOf("POINTING_SET"); + const index = learnedLessons.indexOf("POINTING_SET"); learnedLessons.splice(index, 1); learnedLessons.push("POINTING_PAIR", "POINTING_TRIPLET"); } if (learnedLessons.includes("SUDOKU_101")) { - let index = learnedLessons.indexOf("SUDOKU_101"); + const index = learnedLessons.indexOf("SUDOKU_101"); learnedLessons.splice(index, 1); } if (learnedLessons.includes("AMEND_NOTES")) { - let index = learnedLessons.indexOf("AMEND_NOTES"); + const index = learnedLessons.indexOf("AMEND_NOTES"); learnedLessons.splice(index, 1); } if (learnedLessons.includes("SIMPLIFY_NOTES")) { - let index = learnedLessons.indexOf("SIMPLIFY_NOTES"); + const index = learnedLessons.indexOf("SIMPLIFY_NOTES"); learnedLessons.splice(index, 1); } return learnedLessons; diff --git a/app/Navigation/DrawerNavigator.tsx b/app/Navigation/DrawerNavigator.tsx index e9446469..f0ef655d 100644 --- a/app/Navigation/DrawerNavigator.tsx +++ b/app/Navigation/DrawerNavigator.tsx @@ -1,21 +1,20 @@ -import * as React from "react"; import { createDrawerNavigator } from "@react-navigation/drawer"; +import * as React from "react"; +import { useTheme } from "react-native-paper"; + +import ContactStackNavigator from "./StackNavigators/ContactStackNavigator"; +import DrillStackNavigator from "./StackNavigators/DrillStackNavigator"; import LandingStackNavigator from "./StackNavigators/LandingStackNavigator"; import LearnStackNavigator from "./StackNavigators/LearnStackNavigator"; -import DrillStackNavigator from "./StackNavigators/DrillStackNavigator"; import PlayStackNavigator from "./StackNavigators/PlayStackNavigator"; +import ProfileStackNavigator from "./StackNavigators/ProfileStackNavigator"; +import StatisticsStackNavigator from "./StackNavigators/StatisticsStackNavigator"; import Header from "../Components/Header"; -import { useWindowDimensions } from "react-native"; import NavigationSideBar from "../Components/NavigationSideBar"; -import StatisticsStackNavigator from "./StackNavigators/StatisticsStackNavigator"; -import ProfileStackNavigator from "./StackNavigators/ProfileStackNavigator"; -import { useTheme } from "react-native-paper"; -import ContactStackNavigator from "./StackNavigators/ContactStackNavigator"; const Drawer = createDrawerNavigator(); const DrawerNavigator = () => { - const size = useWindowDimensions(); const theme = useTheme(); return ( diff --git a/app/Navigation/StackNavigators/ContactStackNavigator.tsx b/app/Navigation/StackNavigators/ContactStackNavigator.tsx index a6e1eb33..6ce2ee7e 100644 --- a/app/Navigation/StackNavigators/ContactStackNavigator.tsx +++ b/app/Navigation/StackNavigators/ContactStackNavigator.tsx @@ -1,5 +1,6 @@ -import React from "react"; import { createStackNavigator } from "@react-navigation/stack"; +import React from "react"; + import ContactPage from "../../Pages/ContactPage"; const Stack = createStackNavigator(); diff --git a/app/Navigation/StackNavigators/DrillStackNavigator.tsx b/app/Navigation/StackNavigators/DrillStackNavigator.tsx index 0facf7ee..84674964 100644 --- a/app/Navigation/StackNavigators/DrillStackNavigator.tsx +++ b/app/Navigation/StackNavigators/DrillStackNavigator.tsx @@ -1,7 +1,8 @@ -import React from "react"; import { createStackNavigator } from "@react-navigation/stack"; -import DrillPage from "../../Pages/DrillPage"; +import React from "react"; + import DrillGame from "../../Pages/DrillGame"; +import DrillPage from "../../Pages/DrillPage"; const Stack = createStackNavigator(); diff --git a/app/Navigation/StackNavigators/LandingStackNavigator.tsx b/app/Navigation/StackNavigators/LandingStackNavigator.tsx index 2a2c70c2..0d6b46b8 100644 --- a/app/Navigation/StackNavigators/LandingStackNavigator.tsx +++ b/app/Navigation/StackNavigators/LandingStackNavigator.tsx @@ -1,8 +1,7 @@ -import React from "react"; import { createStackNavigator } from "@react-navigation/stack"; +import React from "react"; + import LandingPage from "../../Pages/LandingPage"; -import StatisticsPage from "../../Pages/StatisticsPage"; -import ProfilePage from "../../Pages/ProfilePage"; const Stack = createStackNavigator(); diff --git a/app/Navigation/StackNavigators/LearnStackNavigator.tsx b/app/Navigation/StackNavigators/LearnStackNavigator.tsx index a8b42dce..12e35a95 100644 --- a/app/Navigation/StackNavigators/LearnStackNavigator.tsx +++ b/app/Navigation/StackNavigators/LearnStackNavigator.tsx @@ -1,5 +1,6 @@ -import React from "react"; import { createStackNavigator } from "@react-navigation/stack"; +import React from "react"; + import LearnPage from "../../Pages/LearnPage"; import Lesson from "../../Pages/Lesson"; diff --git a/app/Navigation/StackNavigators/PlayStackNavigator.tsx b/app/Navigation/StackNavigators/PlayStackNavigator.tsx index 57e872f5..45b6ec46 100644 --- a/app/Navigation/StackNavigators/PlayStackNavigator.tsx +++ b/app/Navigation/StackNavigators/PlayStackNavigator.tsx @@ -1,5 +1,6 @@ -import React from "react"; import { createStackNavigator } from "@react-navigation/stack"; +import React from "react"; + import PlayPage from "../../Pages/PlayPage"; import SudokuPage from "../../Pages/SudokuPage"; diff --git a/app/Navigation/StackNavigators/ProfileStackNavigator.tsx b/app/Navigation/StackNavigators/ProfileStackNavigator.tsx index 4e44c9eb..771e417a 100644 --- a/app/Navigation/StackNavigators/ProfileStackNavigator.tsx +++ b/app/Navigation/StackNavigators/ProfileStackNavigator.tsx @@ -1,5 +1,6 @@ -import React from "react"; import { createStackNavigator } from "@react-navigation/stack"; +import React from "react"; + import ProfilePage from "../../Pages/ProfilePage"; const Stack = createStackNavigator(); diff --git a/app/Navigation/StackNavigators/StatisticsStackNavigator.tsx b/app/Navigation/StackNavigators/StatisticsStackNavigator.tsx index 04252ef6..c419b724 100644 --- a/app/Navigation/StackNavigators/StatisticsStackNavigator.tsx +++ b/app/Navigation/StackNavigators/StatisticsStackNavigator.tsx @@ -1,5 +1,6 @@ -import React from "react"; import { createStackNavigator } from "@react-navigation/stack"; +import React from "react"; + import StatisticsPage from "../../Pages/StatisticsPage"; const Stack = createStackNavigator(); diff --git a/app/Pages/DrillGame.tsx b/app/Pages/DrillGame.tsx index fb02b57b..3c79d877 100644 --- a/app/Pages/DrillGame.tsx +++ b/app/Pages/DrillGame.tsx @@ -1,17 +1,18 @@ +// import { useNavigation } from "@react-navigation/native"; +import { StatusBar } from "expo-status-bar"; import React from "react"; import { StyleSheet, View } from "react-native"; -import SudokuBoard from "../Components/Sudoku Board/SudokuBoard"; -import { StatusBar } from "expo-status-bar"; import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; -import { useNavigation } from "@react-navigation/native"; + +// import SudokuBoard from "../Components/Sudoku Board/SudokuBoard"; const Drill = (props: any) => { - let strategy = props.route.params - ? props.route.params.params - : "no props.route.params in DrillPage"; + // let strategy = props.route.params + // ? props.route.params.params + // : "no props.route.params in DrillPage"; - strategy = [strategy]; - const navigation: any = useNavigation(); + // strategy = [strategy]; + // const navigation: any = useNavigation(); return ( diff --git a/app/Pages/DrillPage.tsx b/app/Pages/DrillPage.tsx index fe4ed2d9..0c768b8d 100644 --- a/app/Pages/DrillPage.tsx +++ b/app/Pages/DrillPage.tsx @@ -1,16 +1,14 @@ +import { rgba } from "polished"; import React, { useState } from "react"; import { View, Pressable, ScrollView } from "react-native"; +import Alert from "react-native-awesome-alerts"; import { Text, useTheme } from "react-native-paper"; -import { useNavigation } from "@react-navigation/native"; import { SafeAreaView } from "react-native-safe-area-context"; -import Alert from "react-native-awesome-alerts"; -import { rgba } from "polished"; + import DrillPanel from "../Components/Home/DrillPanel"; import { useNewWindowDimensions } from "../Functions/WindowDimensions"; const DrillPage = () => { - const navigation: any = useNavigation(); - const theme = useTheme(); const windowSize = useNewWindowDimensions(); @@ -86,10 +84,10 @@ const DrillPage = () => { alertContainerStyle={{ backgroundColor: rgba(theme.colors.background, 0.3), }} - showConfirmButton={true} + showConfirmButton closeOnTouchOutside={false} closeOnHardwareBackPress={false} - confirmText={"OK"} + confirmText="OK" confirmButtonColor={theme.colors.primary} onConfirmPressed={() => { hideDrillHelp(); diff --git a/app/Pages/LandingPage.tsx b/app/Pages/LandingPage.tsx index e89a9544..485a7102 100644 --- a/app/Pages/LandingPage.tsx +++ b/app/Pages/LandingPage.tsx @@ -1,6 +1,3 @@ -import React from "react"; -import { View } from "react-native"; -import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; import { Inter_100Thin, Inter_200ExtraLight, @@ -10,11 +7,15 @@ import { Inter_700Bold, useFonts, } from "@expo-google-fonts/inter"; +import React from "react"; +import { View } from "react-native"; +import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; + +import NavigationButton from "../Components/Home/NavigationButton"; import { useMinWindowDimensions, useNewWindowDimensions, } from "../Functions/WindowDimensions"; -import NavigationButton from "../Components/Home/NavigationButton"; // Example of how to use PressableStates // https://github.com/necolas/react-native-web/issues/1708 @@ -27,7 +28,7 @@ const LandingPage = () => { const START_LESSONS_LOGO = require("../../.assets/startLessonsLogo.png"); const START_DRILLS_LOGO = require("../../.assets/startDrillsLogo.png"); - let [fontsLoaded] = useFonts({ + const [fontsLoaded] = useFonts({ Inter_100Thin, Inter_200ExtraLight, Inter_300Light, diff --git a/app/Pages/LearnPage.tsx b/app/Pages/LearnPage.tsx index 616869f1..239a66a8 100644 --- a/app/Pages/LearnPage.tsx +++ b/app/Pages/LearnPage.tsx @@ -1,13 +1,14 @@ +import { useFocusEffect } from "@react-navigation/core"; +import { rgba } from "polished"; import React, { useCallback, useContext, useState } from "react"; import { View, Pressable, ScrollView } from "react-native"; -import { Text, useTheme, ActivityIndicator } from "react-native-paper"; -import { useFocusEffect } from "@react-navigation/core"; -import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; import Alert from "react-native-awesome-alerts"; -import { PreferencesContext } from "../Contexts/PreferencesContext"; -import LessonPanel from "../Components/Home/LessonPanel"; -import { rgba } from "polished"; +import { Text, useTheme, ActivityIndicator } from "react-native-paper"; +import { SafeAreaView } from "react-native-safe-area-context"; + import { Statistics } from "../Api/Statistics"; +import LessonPanel from "../Components/Home/LessonPanel"; +import { PreferencesContext } from "../Contexts/PreferencesContext"; import { useNewWindowDimensions } from "../Functions/WindowDimensions"; const LearnPage = () => { @@ -31,7 +32,7 @@ const LearnPage = () => { await Statistics.getLearnedLessons().then((lessons: any) => { if (lessons !== null) { // prevent the infinite loop - if (learnedLessons != lessons && !areLessonsLoaded) { + if (learnedLessons !== lessons && !areLessonsLoaded) { updateLearnedLessons(lessons); } @@ -43,7 +44,7 @@ const LearnPage = () => { }); } getUserLearnedLessons(); - }, [learnedLessons]) + }, [learnedLessons]), ); return ( @@ -96,10 +97,7 @@ const LearnPage = () => { {areLessonsLoaded ? ( ) : ( - + )} @@ -116,10 +114,10 @@ const LearnPage = () => { alertContainerStyle={{ backgroundColor: rgba(theme.colors.background, 0.3), }} - showConfirmButton={true} + showConfirmButton closeOnTouchOutside={false} closeOnHardwareBackPress={false} - confirmText={"OK"} + confirmText="OK" confirmButtonColor={theme.colors.primary} onConfirmPressed={() => { hideLearnHelp(); diff --git a/app/Pages/Lesson.tsx b/app/Pages/Lesson.tsx index b3683d10..4ec94266 100644 --- a/app/Pages/Lesson.tsx +++ b/app/Pages/Lesson.tsx @@ -1,3 +1,6 @@ +import { MaterialCommunityIcons } from "@expo/vector-icons"; +import { useFocusEffect } from "@react-navigation/core"; +import { useNavigation } from "@react-navigation/native"; import React from "react"; import { View, @@ -6,13 +9,10 @@ import { Pressable, ScrollView, } from "react-native"; -import { Text, useTheme, Button, Card } from "react-native-paper"; -import { useNavigation } from "@react-navigation/native"; -import { MaterialCommunityIcons } from "@expo/vector-icons"; import Alert from "react-native-awesome-alerts"; +import { Text, useTheme, Button, Card } from "react-native-paper"; import { SafeAreaView } from "react-native-safe-area-context"; -import { useFocusEffect } from "@react-navigation/core"; -import { PreferencesContext } from "../Contexts/PreferencesContext"; + import { Lessons, getLessonMode, @@ -22,10 +22,11 @@ import { import { Statistics } from "../Api/Statistics"; import { CARD_PADDING } from "../Components/Home/Cards"; import { toTitle } from "../Components/Sudoku Board/sudoku"; +import { PreferencesContext } from "../Contexts/PreferencesContext"; const Lesson = (props: { route: { params: { params: any } } }) => { //Brings in name of strategy from carousel - let name = props.route.params + const name = props.route.params ? props.route.params.params : "no props.route.params in LessonPage"; @@ -44,15 +45,11 @@ const Lesson = (props: { route: { params: { params: any } } }) => { const theme = useTheme(); - let title = toTitle(name); - - if (Lessons == null) { - return; - } + const title = toTitle(name); // setting lesson mode to offline - let LESSON_MODE = getLessonMode.Offline; - let getlessonArgs: lessonOfflineMode | lessonOnlineMode = { + const LESSON_MODE = getLessonMode.Offline; + const getlessonArgs: lessonOfflineMode | lessonOnlineMode = { mode: LESSON_MODE, }; @@ -60,12 +57,19 @@ const Lesson = (props: { route: { params: { params: any } } }) => { // This useFocusEffect stores the steps in state when page is loaded in. useFocusEffect( React.useCallback(() => { + if (Lessons == null) { + return; + } Lessons.getSteps(name, getlessonArgs).then((result: any) => { setSteps(result); }); - }, []) + }, []), ); + if (Lessons == null) { + return; + } + async function saveUserLearnedLessons(learnedLessons: string[]) { await Statistics.saveLearnedLessons(learnedLessons).then((res: any) => { if (res) { @@ -86,7 +90,7 @@ const Lesson = (props: { route: { params: { params: any } } }) => { }; // Create lesson content cards - let cards = []; + const cards = []; for (let i: number = 0; i < steps.length; i++) { cards.push( { {steps[i][0]} - + , ); } @@ -179,10 +183,10 @@ const Lesson = (props: { route: { params: { params: any } } }) => { " strategy" } messageStyle={{ maxWidth: 500 }} - showConfirmButton={true} + showConfirmButton closeOnTouchOutside={false} closeOnHardwareBackPress={false} - confirmText={"OK"} + confirmText="OK" confirmButtonColor={theme.colors.primary} onConfirmPressed={() => { hideLearnHelp(); diff --git a/app/Pages/PlayPage.tsx b/app/Pages/PlayPage.tsx index 39a71e2d..231d83cb 100644 --- a/app/Pages/PlayPage.tsx +++ b/app/Pages/PlayPage.tsx @@ -1,30 +1,31 @@ +import { useFocusEffect, useNavigation } from "@react-navigation/native"; +import { rgba } from "polished"; import React from "react"; import { View, Pressable } from "react-native"; +import Alert from "react-native-awesome-alerts"; import { Text, useTheme, Button } from "react-native-paper"; -import { useFocusEffect, useNavigation } from "@react-navigation/native"; import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; -import Alert from "react-native-awesome-alerts"; -import { rgba } from "polished"; +// import { sudokuStrategyArray } from "sudokuru"; + +import { Puzzles } from "../Api/Puzzles"; +import { SudokuObjectProps } from "../Functions/LocalDatabase"; import { useMinWindowDimensions, useNewWindowDimensions, } from "../Functions/WindowDimensions"; -import { Puzzles } from "../Api/Puzzles"; -import { sudokuStrategyArray } from "sudokuru"; -import { SudokuObjectProps } from "../Functions/LocalDatabase"; -let strategies: sudokuStrategyArray = [ - "AMEND_NOTES", - "SIMPLIFY_NOTES", - "NAKED_SINGLE", - "NAKED_PAIR", - "NAKED_TRIPLET", - "NAKED_QUADRUPLET", - "HIDDEN_SINGLE", - "HIDDEN_PAIR", - "HIDDEN_TRIPLET", - "HIDDEN_QUADRUPLET", -]; +// const strategies: sudokuStrategyArray = [ +// "AMEND_NOTES", +// "SIMPLIFY_NOTES", +// "NAKED_SINGLE", +// "NAKED_PAIR", +// "NAKED_TRIPLET", +// "NAKED_QUADRUPLET", +// "HIDDEN_SINGLE", +// "HIDDEN_PAIR", +// "HIDDEN_TRIPLET", +// "HIDDEN_QUADRUPLET", +// ]; const PlayPage = () => { const navigation: any = useNavigation(); @@ -48,7 +49,7 @@ const PlayPage = () => { }); } grabCurrentGame(); - }, []) + }, []), ); const [playHelpVisible, setPlayHelpVisible] = React.useState(false); @@ -149,10 +150,10 @@ const PlayPage = () => { alertContainerStyle={{ backgroundColor: rgba(theme.colors.background, 0.3), }} - showConfirmButton={true} + showConfirmButton closeOnTouchOutside={false} closeOnHardwareBackPress={false} - confirmText={"OK"} + confirmText="OK" confirmButtonColor={theme.colors.primary} onConfirmPressed={() => { hidePlayHelp(); diff --git a/app/Pages/ProfilePage.tsx b/app/Pages/ProfilePage.tsx index b6b47a57..d37f20ef 100644 --- a/app/Pages/ProfilePage.tsx +++ b/app/Pages/ProfilePage.tsx @@ -1,7 +1,8 @@ import React from "react"; import { useWindowDimensions, View, ScrollView } from "react-native"; -import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; import { Switch, Text, useTheme } from "react-native-paper"; +import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; + import { PreferencesContext } from "../Contexts/PreferencesContext"; import { formatLessonNameArray } from "../Functions/learnedLessons"; @@ -75,7 +76,7 @@ const ProfilePage = () => { }} > { }} > { }} > { }} > { }} > { const theme = useTheme(); - const navigation: any = useNavigation(); - - const size = useWindowDimensions(); - const reSize = Math.min(size.width, size.height); - const { updateLearnedLessons, learnedLessons } = - React.useContext(PreferencesContext); + const { updateLearnedLessons } = React.useContext(PreferencesContext); const [isLoading, setLoading] = React.useState(true); const [totalStatistics, setTotalStatistics] = React.useState( @@ -33,7 +27,7 @@ const StatisticsPage = () => { numHintsUsed: 0, numWrongCellsPlayed: 0, totalSolveTime: 0, - } + }, ); const [warningVisible, setWarningVisible] = React.useState(false); @@ -60,14 +54,14 @@ const StatisticsPage = () => { useFocusEffect( React.useCallback(() => { getUserStatistics(); - }, []) + }, []), ); if (isLoading) { return ( - + ); @@ -111,12 +105,12 @@ const StatisticsPage = () => { alertContainerStyle={{ backgroundColor: rgba(theme.colors.background, 0.3), }} - showConfirmButton={true} - showCancelButton={true} - closeOnTouchOutside={true} - closeOnHardwareBackPress={true} - confirmText={"Delete"} - cancelText={"Cancel"} + showConfirmButton + showCancelButton + closeOnTouchOutside + closeOnHardwareBackPress + confirmText="Delete" + cancelText="Cancel" confirmButtonColor="red" cancelButtonColor={theme.colors.primary} onConfirmPressed={() => { diff --git a/app/Pages/SudokuPage.tsx b/app/Pages/SudokuPage.tsx index 63feb84d..b6bb4c60 100644 --- a/app/Pages/SudokuPage.tsx +++ b/app/Pages/SudokuPage.tsx @@ -1,25 +1,26 @@ -import React from "react"; -import SudokuBoard from "../Components/Sudoku Board/SudokuBoard"; import { StatusBar } from "expo-status-bar"; +import React from "react"; import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; -import { sudokuStrategyArray } from "sudokuru"; +// import { sudokuStrategyArray } from "sudokuru"; + +import SudokuBoard from "../Components/Sudoku Board/SudokuBoard"; // startGame - https://www.npmjs.com/package/sudokuru#:~:text=sudokuru.Puzzles%3B-,Puzzles.startGame(),-Description%3A%20Returns%20puzzle -let strategies: sudokuStrategyArray = [ - "AMEND_NOTES", - "SIMPLIFY_NOTES", - "NAKED_SINGLE", - "NAKED_PAIR", - "NAKED_TRIPLET", - "NAKED_QUADRUPLET", - "HIDDEN_SINGLE", - "HIDDEN_PAIR", - "HIDDEN_TRIPLET", - "HIDDEN_QUADRUPLET", - "POINTING_PAIR", - "POINTING_TRIPLET", -]; +// const strategies: sudokuStrategyArray = [ +// "AMEND_NOTES", +// "SIMPLIFY_NOTES", +// "NAKED_SINGLE", +// "NAKED_PAIR", +// "NAKED_TRIPLET", +// "NAKED_QUADRUPLET", +// "HIDDEN_SINGLE", +// "HIDDEN_PAIR", +// "HIDDEN_TRIPLET", +// "HIDDEN_QUADRUPLET", +// "POINTING_PAIR", +// "POINTING_TRIPLET", +// ]; const SudokuPage = ({ route }: any) => { const { action } = route.params; diff --git a/app/Styling/HighlightColors.ts b/app/Styling/HighlightColors.ts index 4e13ed57..cd5d6d0d 100644 --- a/app/Styling/HighlightColors.ts +++ b/app/Styling/HighlightColors.ts @@ -23,7 +23,7 @@ export const PURPLE_COLOR = "#025E73"; // from https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb function hexToRGB(hex: string) { - var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return result ? { r: parseInt(result[1], 16), diff --git a/app/Styling/ThemeColors.tsx b/app/Styling/ThemeColors.tsx index 25b6bd94..b36b0d53 100644 --- a/app/Styling/ThemeColors.tsx +++ b/app/Styling/ThemeColors.tsx @@ -1,9 +1,9 @@ -import { MD3DarkTheme, MD3LightTheme } from "react-native-paper"; import { DarkTheme as NavigationDarkTheme, DefaultTheme as NavigationDefaultTheme, } from "@react-navigation/native"; import merge from "deepmerge"; +import { MD3DarkTheme, MD3LightTheme } from "react-native-paper"; const dTheme = { ...MD3DarkTheme, // or MD3DarkTheme diff --git a/babel.config.js b/babel.config.js index 1a3e9a78..057d6f38 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,7 +1,7 @@ module.exports = function (api) { api.cache(true); - let plugins = []; + const plugins = []; if (process.env["ENV"] === "development") { plugins.push("istanbul"); @@ -9,6 +9,6 @@ module.exports = function (api) { return { presets: ["babel-preset-expo"], - plugins: plugins, + plugins, }; }; diff --git a/cypress/e2e/amendNotes.cy.ts b/cypress/e2e/amendNotes.cy.ts index 4efb48de..c5450cc3 100644 --- a/cypress/e2e/amendNotes.cy.ts +++ b/cypress/e2e/amendNotes.cy.ts @@ -17,11 +17,11 @@ describe("Amend notes strategy", () => { beforeEach(() => { window.localStorage.setItem( "learned_lessons", - LOCAL_STORAGE_ALL_LEARNED_LESSONS + LOCAL_STORAGE_ALL_LEARNED_LESSONS, ); window.localStorage.setItem( "active_game", - '[{"puzzle":"003070040006002301089000000000107080517000006000400000271009005095000000000020000","puzzleSolution":"123675948456982371789314562964157283517238496832496157271849635395761824648523719","moves":[{"puzzleCurrentState":"003070040006002301089000000000107080517000006000400000271009005095000000000020000","puzzleCurrentNotesState":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE","NAKED_PAIR"],"difficulty":348,"drillStrategies":["NAKED_SINGLE","POINTING_PAIR","POINTING_TRIPLET"],"currentTime":374,"numWrongCellsPlayed":235}]' + '[{"puzzle":"003070040006002301089000000000107080517000006000400000271009005095000000000020000","puzzleSolution":"123675948456982371789314562964157283517238496832496157271849635395761824648523719","moves":[{"puzzleCurrentState":"003070040006002301089000000000107080517000006000400000271009005095000000000020000","puzzleCurrentNotesState":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE","NAKED_PAIR"],"difficulty":348,"drillStrategies":["NAKED_SINGLE","POINTING_PAIR","POINTING_TRIPLET"],"currentTime":374,"numWrongCellsPlayed":235}]', ); cy.visit(""); cy.get(OPEN_DRAWER_NAVIGATION).click(); @@ -37,7 +37,7 @@ describe("Amend notes strategy", () => { 0, 0, 0, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(0, 0, [2, 4, 7]); cy.Group_Should_Only_Have_Indexes_Selected(1, 0, [4, 6]); @@ -48,7 +48,7 @@ describe("Amend notes strategy", () => { 0, 0, 0, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(0, 0, [2, 4, 7]); cy.Group_Should_Only_Have_Indexes_Selected(1, 0, [4, 6]); @@ -59,7 +59,7 @@ describe("Amend notes strategy", () => { -1, -1, -1, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); }); }); diff --git a/cypress/e2e/drills.cy.ts b/cypress/e2e/drills.cy.ts index 5ae4ba11..8e91a307 100644 --- a/cypress/e2e/drills.cy.ts +++ b/cypress/e2e/drills.cy.ts @@ -15,7 +15,7 @@ describe("naked single drills", () => { beforeEach(() => { window.localStorage.setItem( "learned_lessons", - LOCAL_STORAGE_ALL_LEARNED_LESSONS + LOCAL_STORAGE_ALL_LEARNED_LESSONS, ); window.localStorage.setItem("dismissDrillTutorial", "true"); cy.visit(""); diff --git a/cypress/e2e/hiddenSingle.cy.ts b/cypress/e2e/hiddenSingle.cy.ts index a5e3de43..4969435a 100644 --- a/cypress/e2e/hiddenSingle.cy.ts +++ b/cypress/e2e/hiddenSingle.cy.ts @@ -18,11 +18,11 @@ describe("Hidden single strategy", () => { beforeEach(() => { window.localStorage.setItem( "learned_lessons", - LOCAL_STORAGE_ALL_LEARNED_LESSONS + LOCAL_STORAGE_ALL_LEARNED_LESSONS, ); window.localStorage.setItem( "active_game", - '[{"puzzle":"103000900006000001009300024000006040060007813817005002090000430000009080000020000","puzzleSolution":"123574968456982371789361524932816745564297813817435692291658437375149286648723159","moves":[{"puzzleCurrentState":"103000900006000001009300024000006040060297813817435692090000430000009080000020000","puzzleCurrentNotesState":"000000000010110100000010100011010001000110000000000000010011100011111100001111100010110110010110110000010110011010000000000000000000000000000000011110100001110110000000000000000000000000000010010000000110000000000000110010010110110000100110010000011110000010111000000000100000010000000000000000000100011110100011100100011110000111110000110110100011110100000010000000000000000000100011110100111100000000000010100010010100010100000010000000000000000000000000000100000010000000000101100010000000000001010100000010100000010100000000000000000000000000000110010100100010100000011100000010100000000000000000000000000000000000000000000000000000000000011100000011110000000000000000000000010100000000000000000000000011100000011100000011101"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE"],"difficulty":64,"drillStrategies":["NAKED_SINGLE","POINTING_TRIPLET","HIDDEN_QUADRUPLET"],"numWrongCellsPlayed":0,"numHintsUsed":95,"currentTime":1182}]' + '[{"puzzle":"103000900006000001009300024000006040060007813817005002090000430000009080000020000","puzzleSolution":"123574968456982371789361524932816745564297813817435692291658437375149286648723159","moves":[{"puzzleCurrentState":"103000900006000001009300024000006040060297813817435692090000430000009080000020000","puzzleCurrentNotesState":"000000000010110100000010100011010001000110000000000000010011100011111100001111100010110110010110110000010110011010000000000000000000000000000000011110100001110110000000000000000000000000000010010000000110000000000000110010010110110000100110010000011110000010111000000000100000010000000000000000000100011110100011100100011110000111110000110110100011110100000010000000000000000000100011110100111100000000000010100010010100010100000010000000000000000000000000000100000010000000000101100010000000000001010100000010100000010100000000000000000000000000000110010100100010100000011100000010100000000000000000000000000000000000000000000000000000000000011100000011110000000000000000000000010100000000000000000000000011100000011100000011101"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE"],"difficulty":64,"drillStrategies":["NAKED_SINGLE","POINTING_TRIPLET","HIDDEN_QUADRUPLET"],"numWrongCellsPlayed":0,"numHintsUsed":95,"currentTime":1182}]', ); cy.visit(""); cy.get(OPEN_DRAWER_NAVIGATION).click(); @@ -38,7 +38,7 @@ describe("Hidden single strategy", () => { -1, 0, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(1, 0, [1, 2, 4, 6, 7, 8]); cy.Cell_Should_Have_Notes_With_Colors(3, 0, "2359", "235", ""); @@ -47,7 +47,7 @@ describe("Hidden single strategy", () => { -1, 0, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(1, 0, [1, 2, 4, 6, 7, 8]); cy.get(CELL_WITH_NOTES(3, 0, "9")).should("exist"); @@ -56,7 +56,7 @@ describe("Hidden single strategy", () => { -1, -1, -1, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); }); }); diff --git a/cypress/e2e/lessons.cy.ts b/cypress/e2e/lessons.cy.ts index 58518434..2718baa4 100644 --- a/cypress/e2e/lessons.cy.ts +++ b/cypress/e2e/lessons.cy.ts @@ -16,7 +16,7 @@ describe("Sudoku lesson page functions", () => { beforeEach(() => { window.localStorage.setItem( "learned_lessons", - LOCAL_STORAGE_SOME_LEARNED_LESSONS + LOCAL_STORAGE_SOME_LEARNED_LESSONS, ); cy.visit(""); cy.get(OPEN_DRAWER_NAVIGATION).click(); @@ -51,7 +51,7 @@ describe("Sudoku lesson page functions", () => { cy.get("[data-testid=difficulty]").should( "have.css", "color", - VERY_EASY_COLOR_RGB + VERY_EASY_COLOR_RGB, ); }); } @@ -61,7 +61,7 @@ describe("Sudoku lesson page functions", () => { cy.get("[data-testid=difficulty]").should( "have.css", "color", - VERY_EASY_COLOR_RGB + VERY_EASY_COLOR_RGB, ); }); // Easy Locked Card @@ -70,7 +70,7 @@ describe("Sudoku lesson page functions", () => { cy.get("[data-testid=difficulty]").should( "have.css", "color", - EASY_COLOR_RGB + EASY_COLOR_RGB, ); }); // Intermediate Locked Card @@ -79,7 +79,7 @@ describe("Sudoku lesson page functions", () => { cy.get("[data-testid=difficulty]").should( "have.css", "color", - INTERMEDIATE_COLOR_RGB + INTERMEDIATE_COLOR_RGB, ); }); // Hard Locked Card @@ -88,7 +88,7 @@ describe("Sudoku lesson page functions", () => { cy.get("[data-testid=difficulty]").should( "have.css", "color", - HARD_COLOR_RGB + HARD_COLOR_RGB, ); }); // Very Hard Locked Card @@ -97,7 +97,7 @@ describe("Sudoku lesson page functions", () => { cy.get("[data-testid=difficulty]").should( "have.css", "color", - VERY_HARD_COLOR_RGB + VERY_HARD_COLOR_RGB, ); }); }); @@ -107,7 +107,7 @@ describe("Sudoku lesson page functions", () => { cy.contains("You have selected a lesson that is locked."); cy.contains("div", /^No$/).click(); cy.contains("You have selected a lesson that is locked.").should( - "not.exist" + "not.exist", ); }); diff --git a/cypress/e2e/nakedPair.cy.ts b/cypress/e2e/nakedPair.cy.ts index a488643b..52c6f43a 100644 --- a/cypress/e2e/nakedPair.cy.ts +++ b/cypress/e2e/nakedPair.cy.ts @@ -18,7 +18,7 @@ describe("Naked pair strategy", () => { window.localStorage.setItem("learned_lessons", '["NAKED_PAIR"]'); window.localStorage.setItem( "active_game", - '[{"puzzle":"930040506000098071000000490009800000002019000380400609827134965193000004564982137","puzzleSolution":"938741526456298371271365498619853742742619853385427619827134965193576284564982137","moves":[{"puzzleCurrentState":"930040506000098071000000490009800000002019000380400609827134965193000004564982137","puzzleCurrentNotesState":"000000000010101000010001100000101100000101100000000000000000000000000000000000000000000000000110000100010100100110100000110100000000000000000000000000000000000000100000010000011000100011010000000000000000000100010000000000000000000000000000000010000100011011000011011100000000000001011100000000000000000000000011100000000000000000000000000000010011100010011100000000000010010100000000000000011100000000000100000100000000000101011100001011100000000000000010100000000000000011100000000000000000000011000000000000000011000100001000110000000000000000000010000010000000000010000010000000000000000000110110000000110010110010000000000000010000010000000000000000000000000000011000010011000000001000010000000000000000000000000000000000000"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE","NAKED_PAIR"],"difficulty":348,"drillStrategies":["NAKED_SINGLE","POINTING_PAIR","POINTING_TRIPLET"],"currentTime":17,"numWrongCellsPlayed":0,"numHintsUsed":97}]' + '[{"puzzle":"930040506000098071000000490009800000002019000380400609827134965193000004564982137","puzzleSolution":"938741526456298371271365498619853742742619853385427619827134965193576284564982137","moves":[{"puzzleCurrentState":"930040506000098071000000490009800000002019000380400609827134965193000004564982137","puzzleCurrentNotesState":"000000000010101000010001100000101100000101100000000000000000000000000000000000000000000000000110000100010100100110100000110100000000000000000000000000000000000000100000010000011000100011010000000000000000000100010000000000000000000000000000000010000100011011000011011100000000000001011100000000000000000000000011100000000000000000000000000000010011100010011100000000000010010100000000000000011100000000000100000100000000000101011100001011100000000000000010100000000000000011100000000000000000000011000000000000000011000100001000110000000000000000000010000010000000000010000010000000000000000000110110000000110010110010000000000000010000010000000000000000000000000000011000010011000000001000010000000000000000000000000000000000000"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE","NAKED_PAIR"],"difficulty":348,"drillStrategies":["NAKED_SINGLE","POINTING_PAIR","POINTING_TRIPLET"],"currentTime":17,"numWrongCellsPlayed":0,"numHintsUsed":97}]', ); cy.visit(""); cy.get(OPEN_DRAWER_NAVIGATION).click(); @@ -34,7 +34,7 @@ describe("Naked pair strategy", () => { -1, 7, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(1, 7, [0, 7]); cy.Cell_Should_Have_Notes_With_Colors(3, 7, "1245", "2", ""); @@ -45,7 +45,7 @@ describe("Naked pair strategy", () => { -1, 7, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(1, 7, [0, 7]); cy.get(CELL_WITH_NOTES(3, 7, "145")).should("exist"); @@ -56,7 +56,7 @@ describe("Naked pair strategy", () => { -1, -1, -1, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); }); }); diff --git a/cypress/e2e/nakedSingle.cy.ts b/cypress/e2e/nakedSingle.cy.ts index ae601c93..d28ba74c 100644 --- a/cypress/e2e/nakedSingle.cy.ts +++ b/cypress/e2e/nakedSingle.cy.ts @@ -18,11 +18,11 @@ describe("Naked single strategy", () => { beforeEach(() => { window.localStorage.setItem( "learned_lessons", - LOCAL_STORAGE_ALL_LEARNED_LESSONS + LOCAL_STORAGE_ALL_LEARNED_LESSONS, ); window.localStorage.setItem( "active_game", - '[{"puzzle":"103000900006000001009300024000006040060007813817005002090000430000009080000020000","puzzleSolution":"123574968456982371789361524932816745564297813817435692291658437375149286648723159","moves":[{"puzzleCurrentState":"103000900006000001009300024000006040060007813817005692090000430000009080000020000","puzzleCurrentNotesState":"000000000010110100000010100011010001010110001000000000010011100011111100001111100010110110010110110000010110011010000000000000000000000000000000011110100001110110000000000000000000000000000010010000010110000000000000110010010110110000100110010010111110010110111000000000110000011010100001000100000100011110100111100100111110000111110000110111100011110101000011000100001001100000100011110101111100000000000010100010010100010100000010000000000000000000000000000100000010000000000101100010000000000001010100000010100000010100000000000000000000000000000110010100100010100000011100000010100000000000000000000000000000000000000000000000000000000000011100000011110000000000000000000000010100000000000000000000000011100000011100000011101"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE"],"difficulty":64,"drillStrategies":["NAKED_SINGLE","POINTING_TRIPLET","HIDDEN_QUADRUPLET"],"numWrongCellsPlayed":0,"numHintsUsed":73,"currentTime":1158}]' + '[{"puzzle":"103000900006000001009300024000006040060007813817005002090000430000009080000020000","puzzleSolution":"123574968456982371789361524932816745564297813817435692291658437375149286648723159","moves":[{"puzzleCurrentState":"103000900006000001009300024000006040060007813817005692090000430000009080000020000","puzzleCurrentNotesState":"000000000010110100000010100011010001010110001000000000010011100011111100001111100010110110010110110000010110011010000000000000000000000000000000011110100001110110000000000000000000000000000010010000010110000000000000110010010110110000100110010010111110010110111000000000110000011010100001000100000100011110100111100100111110000111110000110111100011110101000011000100001001100000100011110101111100000000000010100010010100010100000010000000000000000000000000000100000010000000000101100010000000000001010100000010100000010100000000000000000000000000000110010100100010100000011100000010100000000000000000000000000000000000000000000000000000000000011100000011110000000000000000000000010100000000000000000000000011100000011100000011101"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE"],"difficulty":64,"drillStrategies":["NAKED_SINGLE","POINTING_TRIPLET","HIDDEN_QUADRUPLET"],"numWrongCellsPlayed":0,"numHintsUsed":73,"currentTime":1158}]', ); cy.visit(""); cy.get(OPEN_DRAWER_NAVIGATION).click(); @@ -38,14 +38,14 @@ describe("Naked single strategy", () => { 5, -1, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Have_Given_Indexes_Color_A_Rest_B( 0, 5, [3], NOT_HIGHLIGHTED_COLOR_RGB, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Cell_Should_Have_Notes_With_Colors(5, 3, "4", "", "4"); cy.get(HINT_RIGHT_ARROW).click(); @@ -54,21 +54,21 @@ describe("Naked single strategy", () => { 5, -1, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Have_Given_Indexes_Color_A_Rest_B( 0, 5, [3], NOT_HIGHLIGHTED_COLOR_RGB, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.get(HINT_CHECK_MARK).click(); cy.Board_Should_Have_Color_Except_For_Groups( -1, -1, -1, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); }); }); diff --git a/cypress/e2e/pointingPair.cy.ts b/cypress/e2e/pointingPair.cy.ts index 3f34c7ce..05677245 100644 --- a/cypress/e2e/pointingPair.cy.ts +++ b/cypress/e2e/pointingPair.cy.ts @@ -18,7 +18,7 @@ describe("Pointing pair strategy", () => { window.localStorage.setItem("learned_lessons", '["POINTING_PAIR"]'); window.localStorage.setItem( "active_game", - '[{"puzzle":"123458976400397821789162453007080160000503798090070340000705209512000607970000504","puzzleSolution":"123458976456397821789162453237984165641523798895671342364715289512849637978236514","moves":[{"puzzleCurrentState":"123458976400397821789162453007080160000503798090070340000705209512000607970000504","puzzleCurrentNotesState":"000000000000000000000000000011000000010001000010001010001001010000000000000000000000000000000011000000000000001110000000101000000000000001101000000000000000000000000000000000011000000000000000000000100101000100011010000101010000000000000001010000000000000000000000000000010000001000000000010001000000000000000000011010001010000000000000000000000000000000000000110100000000000000101100000001100000111000000000000000000000000000000000000100001000000000100001000000000000000100001100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000010001000010101000010000000000000000000000000000010010000000000000010010000000000000000000000000000000"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE"],"difficulty":112,"drillStrategies":["NAKED_SINGLE","POINTING_PAIR","POINTING_TRIPLET"],"currentTime":10,"numHintsUsed":31,"numWrongCellsPlayed":0}]' + '[{"puzzle":"123458976400397821789162453007080160000503798090070340000705209512000607970000504","puzzleSolution":"123458976456397821789162453237984165641523798895671342364715289512849637978236514","moves":[{"puzzleCurrentState":"123458976400397821789162453007080160000503798090070340000705209512000607970000504","puzzleCurrentNotesState":"000000000000000000000000000011000000010001000010001010001001010000000000000000000000000000000011000000000000001110000000101000000000000001101000000000000000000000000000000000011000000000000000000000100101000100011010000101010000000000000001010000000000000000000000000000010000001000000000010001000000000000000000011010001010000000000000000000000000000000000000110100000000000000101100000001100000111000000000000000000000000000000000000100001000000000100001000000000000000100001100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000010001000010101000010000000000000000000000000000010010000000000000010010000000000000000000000000000000"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE"],"difficulty":112,"drillStrategies":["NAKED_SINGLE","POINTING_PAIR","POINTING_TRIPLET"],"currentTime":10,"numHintsUsed":31,"numWrongCellsPlayed":0}]', ); cy.visit(""); cy.get(OPEN_DRAWER_NAVIGATION).click(); @@ -34,7 +34,7 @@ describe("Pointing pair strategy", () => { -1, -1, 6, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(2, 6, [0, 1]); cy.get(HINT_RIGHT_ARROW).click(); @@ -42,7 +42,7 @@ describe("Pointing pair strategy", () => { 6, -1, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(0, 6, [0, 1]); cy.Cell_Should_Have_Notes_With_Colors(6, 4, "134", "3", ""); @@ -52,7 +52,7 @@ describe("Pointing pair strategy", () => { 6, -1, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(0, 6, [0, 1]); cy.get(CELL_WITH_NOTES(6, 4, "14")).should("exist"); @@ -62,7 +62,7 @@ describe("Pointing pair strategy", () => { -1, -1, -1, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); }); }); diff --git a/cypress/e2e/profile.cy.ts b/cypress/e2e/profile.cy.ts index 7c2a19ee..da1782b2 100644 --- a/cypress/e2e/profile.cy.ts +++ b/cypress/e2e/profile.cy.ts @@ -29,7 +29,7 @@ describe("Profile Tests", () => { beforeEach(() => { window.localStorage.setItem( "active_game", - '[{"variant":"classic","version":"1.0.0","selectedCell":null,"puzzle":[[{"type":"value","entry":1},{"type":"value","entry":2},{"type":"given","entry":3},{"type":"value","entry":4},{"type":"given","entry":5},{"type":"value","entry":8},{"type":"value","entry":9},{"type":"given","entry":7},{"type":"value","entry":6}],[{"type":"value","entry":4},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":3},{"type":"value","entry":9},{"type":"given","entry":7},{"type":"given","entry":8},{"type":"value","entry":2},{"type":"given","entry":1}],[{"type":"value","entry":7},{"type":"given","entry":8},{"type":"given","entry":9},{"type":"value","entry":1},{"type":"value","entry":6},{"type":"value","entry":2},{"type":"value","entry":4},{"type":"value","entry":5},{"type":"value","entry":3}],[{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":7},{"type":"value","entry":0},{"type":"value","entry":8},{"type":"value","entry":0},{"type":"value","entry":1},{"type":"given","entry":6},{"type":"value","entry":0}],[{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":5},{"type":"value","entry":0},{"type":"value","entry":3},{"type":"value","entry":7},{"type":"value","entry":9},{"type":"given","entry":8}],[{"type":"value","entry":0},{"type":"value","entry":9},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":7},{"type":"value","entry":0},{"type":"value","entry":3},{"type":"value","entry":4},{"type":"value","entry":0}],[{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":7},{"type":"value","entry":0},{"type":"given","entry":5},{"type":"value","entry":2},{"type":"value","entry":0},{"type":"given","entry":9}],[{"type":"value","entry":5},{"type":"given","entry":1},{"type":"given","entry":2},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":6},{"type":"value","entry":0},{"type":"value","entry":7}],[{"type":"value","entry":9},{"type":"value","entry":7},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":5},{"type":"value","entry":0},{"type":"value","entry":4}]],"puzzleSolution":[[1,2,3,4,5,8,9,7,6],[4,5,6,3,9,7,8,2,1],[7,8,9,1,6,2,4,5,3],[2,3,7,9,8,4,1,6,5],[6,4,1,5,2,3,7,9,8],[8,9,5,6,7,1,3,4,2],[3,6,4,7,1,5,2,8,9],[5,1,2,8,4,9,6,3,7],[9,7,8,2,3,6,5,1,4]],"statistics":{"difficulty":"easy","internalDifficulty":348,"numHintsUsed":0,"numWrongCellsPlayed":235,"score":0,"time":374},"inNoteMode":false,"actionHistory":[]}]' + '[{"variant":"classic","version":"1.0.0","selectedCell":null,"puzzle":[[{"type":"value","entry":1},{"type":"value","entry":2},{"type":"given","entry":3},{"type":"value","entry":4},{"type":"given","entry":5},{"type":"value","entry":8},{"type":"value","entry":9},{"type":"given","entry":7},{"type":"value","entry":6}],[{"type":"value","entry":4},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":3},{"type":"value","entry":9},{"type":"given","entry":7},{"type":"given","entry":8},{"type":"value","entry":2},{"type":"given","entry":1}],[{"type":"value","entry":7},{"type":"given","entry":8},{"type":"given","entry":9},{"type":"value","entry":1},{"type":"value","entry":6},{"type":"value","entry":2},{"type":"value","entry":4},{"type":"value","entry":5},{"type":"value","entry":3}],[{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":7},{"type":"value","entry":0},{"type":"value","entry":8},{"type":"value","entry":0},{"type":"value","entry":1},{"type":"given","entry":6},{"type":"value","entry":0}],[{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":5},{"type":"value","entry":0},{"type":"value","entry":3},{"type":"value","entry":7},{"type":"value","entry":9},{"type":"given","entry":8}],[{"type":"value","entry":0},{"type":"value","entry":9},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":7},{"type":"value","entry":0},{"type":"value","entry":3},{"type":"value","entry":4},{"type":"value","entry":0}],[{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":7},{"type":"value","entry":0},{"type":"given","entry":5},{"type":"value","entry":2},{"type":"value","entry":0},{"type":"given","entry":9}],[{"type":"value","entry":5},{"type":"given","entry":1},{"type":"given","entry":2},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":6},{"type":"value","entry":0},{"type":"value","entry":7}],[{"type":"value","entry":9},{"type":"value","entry":7},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":0},{"type":"value","entry":5},{"type":"value","entry":0},{"type":"value","entry":4}]],"puzzleSolution":[[1,2,3,4,5,8,9,7,6],[4,5,6,3,9,7,8,2,1],[7,8,9,1,6,2,4,5,3],[2,3,7,9,8,4,1,6,5],[6,4,1,5,2,3,7,9,8],[8,9,5,6,7,1,3,4,2],[3,6,4,7,1,5,2,8,9],[5,1,2,8,4,9,6,3,7],[9,7,8,2,3,6,5,1,4]],"statistics":{"difficulty":"easy","internalDifficulty":348,"numHintsUsed":0,"numWrongCellsPlayed":235,"score":0,"time":374},"inNoteMode":false,"actionHistory":[]}]', ); cy.visit(""); cy.get(VIEW_PROFILE_PAGE_BUTTON).click(); @@ -114,7 +114,7 @@ describe("Profile Tests", () => { 1, 1, -1, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Cell_Should_Have_Color(0, 0, NOT_HIGHLIGHTED_COLOR_RGB); }); @@ -132,7 +132,7 @@ describe("Profile Tests", () => { 1, 1, 0, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Cell_Should_Have_Color(0, 0, PEER_SELECTED_COLOR_RGB); }); @@ -156,7 +156,7 @@ describe("Profile Tests", () => { -1, 1, 0, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); }); @@ -173,7 +173,7 @@ describe("Profile Tests", () => { 1, 1, 0, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Cell_Should_Have_Color(1, 3, PEER_SELECTED_COLOR_RGB); }); @@ -197,7 +197,7 @@ describe("Profile Tests", () => { 1, -1, 0, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); }); @@ -214,7 +214,7 @@ describe("Profile Tests", () => { 1, 1, 0, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Cell_Should_Have_Color(3, 1, PEER_SELECTED_COLOR_RGB); }); diff --git a/cypress/e2e/puzzles.cy.ts b/cypress/e2e/puzzles.cy.ts index b1534c26..77e89969 100644 --- a/cypress/e2e/puzzles.cy.ts +++ b/cypress/e2e/puzzles.cy.ts @@ -49,7 +49,7 @@ describe("Sudoku play component functions", () => { beforeEach(() => { window.localStorage.setItem( "learned_lessons", - LOCAL_STORAGE_ALL_LEARNED_LESSONS + LOCAL_STORAGE_ALL_LEARNED_LESSONS, ); window.localStorage.setItem("active_game", ACTIVE_GAME); cy.visit(""); @@ -74,7 +74,7 @@ describe("Sudoku play component functions", () => { cy.Cell_Should_Have_Color( row, column, - NOT_SELECTED_CONFLICT_COLOR_RGB + NOT_SELECTED_CONFLICT_COLOR_RGB, ); } else if (row === 7 && column === 7) { cy.Cell_Should_Have_Color(row, column, SELECTED_COLOR_RGB); @@ -116,11 +116,11 @@ describe("Sudoku play component functions", () => { cy.Cell_Should_Have_Color( row, column, - NOT_SELECTED_CONFLICT_COLOR_RGB + NOT_SELECTED_CONFLICT_COLOR_RGB, ); } else if (row === 7 && column === 7) { cy.Cell_Should_Have_Color(row, column, SELECTED_CONFLICT_COLOR_RGB); - } else if (row === 7 || column == 7 || (row > 5 && column > 5)) { + } else if (row === 7 || column === 7 || (row > 5 && column > 5)) { cy.Cell_Should_Have_Color(row, column, PEER_SELECTED_COLOR_RGB); } else { cy.Cell_Should_Have_Color(row, column, NOT_HIGHLIGHTED_COLOR_RGB); @@ -142,7 +142,7 @@ describe("Sudoku play component functions", () => { cy.get(CELL(7, 7)).trigger("click").type(i.toString()); cy.get(CELL_WITH_VALUE(7, 7, i)).should("exist"); }); - } + }, ); } @@ -159,7 +159,7 @@ describe("Sudoku play component functions", () => { cy.get(NUMBER_BUTTON(i)).click(); cy.get(CELL_WITH_VALUE(7, 7, i)).should("exist"); }); - } + }, ); } @@ -172,7 +172,7 @@ describe("Sudoku play component functions", () => { cy.get(CELL(7, 7)).trigger("click").type(i.toString()); cy.get(CELL_WITH_NOTES(7, 7, i.toString())).should("exist"); }); - } + }, ); } @@ -190,7 +190,7 @@ describe("Sudoku play component functions", () => { cy.get(NUMBER_BUTTON(i)).click(); cy.get(CELL_WITH_NOTES(7, 7, i.toString())).should("exist"); }); - } + }, ); } @@ -205,7 +205,7 @@ describe("Sudoku play component functions", () => { cy.Cell_Should_Have_Color( row, column, - NOT_SELECTED_CONFLICT_COLOR_RGB + NOT_SELECTED_CONFLICT_COLOR_RGB, ); } else { cy.Cell_Should_Have_Color(row, column, NOT_HIGHLIGHTED_COLOR_RGB); diff --git a/cypress/e2e/simplifyNotes.cy.ts b/cypress/e2e/simplifyNotes.cy.ts index 316ba825..2aa355f8 100644 --- a/cypress/e2e/simplifyNotes.cy.ts +++ b/cypress/e2e/simplifyNotes.cy.ts @@ -18,11 +18,11 @@ describe("Simplify notes strategy", () => { beforeEach(() => { window.localStorage.setItem( "learned_lessons", - LOCAL_STORAGE_ALL_LEARNED_LESSONS + LOCAL_STORAGE_ALL_LEARNED_LESSONS, ); window.localStorage.setItem( "active_game", - '[{"puzzle":"103000900006000001009300024000006040060007813817005002090000430000009080000020000","puzzleSolution":"123574968456982371789361524932816745564297813817435692291658437375149286648723159","moves":[{"puzzleCurrentState":"103000900006000001009300024000006040060007813817005692090000430000009080000020000","puzzleCurrentNotesState":"000000000010110100000010100011010001010110001000000000010011100011111100001111100010110110010110110000010110011010000000000000000000000000000000011110100001110110000000000000000000000000000010010000010110000000000000110010010110110000100110010010111110010110111000000000110000011010100001000100001100011110100111100100111110000111110000110111100011110101000011000100001001100000100011110101111100000000000010100010010100010100000010000000000000000000000000000100000010000000000101100010000000000001010100000010100000010100000000000000000000000000000110010100100010100000011100000010100000000000000000000000000000000000000000000000000000000000011101000011110000000000000000000000010101000000000000000000000011100000011100000011101"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE"],"difficulty":64,"drillStrategies":["NAKED_SINGLE","POINTING_TRIPLET","HIDDEN_QUADRUPLET"],"numWrongCellsPlayed":0,"numHintsUsed":68,"currentTime":1154}]' + '[{"puzzle":"103000900006000001009300024000006040060007813817005002090000430000009080000020000","puzzleSolution":"123574968456982371789361524932816745564297813817435692291658437375149286648723159","moves":[{"puzzleCurrentState":"103000900006000001009300024000006040060007813817005692090000430000009080000020000","puzzleCurrentNotesState":"000000000010110100000010100011010001010110001000000000010011100011111100001111100010110110010110110000010110011010000000000000000000000000000000011110100001110110000000000000000000000000000010010000010110000000000000110010010110110000100110010010111110010110111000000000110000011010100001000100001100011110100111100100111110000111110000110111100011110101000011000100001001100000100011110101111100000000000010100010010100010100000010000000000000000000000000000100000010000000000101100010000000000001010100000010100000010100000000000000000000000000000110010100100010100000011100000010100000000000000000000000000000000000000000000000000000000000011101000011110000000000000000000000010101000000000000000000000011100000011100000011101"}],"strategies":["NAKED_SINGLE","HIDDEN_SINGLE"],"difficulty":64,"drillStrategies":["NAKED_SINGLE","POINTING_TRIPLET","HIDDEN_QUADRUPLET"],"numWrongCellsPlayed":0,"numHintsUsed":68,"currentTime":1154}]', ); cy.visit(""); cy.get(OPEN_DRAWER_NAVIGATION).click(); @@ -38,7 +38,7 @@ describe("Simplify notes strategy", () => { 5, -1, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(0, 5, [7]); cy.Cell_Should_Have_Notes_With_Colors(5, 3, "49", "9", ""); @@ -50,7 +50,7 @@ describe("Simplify notes strategy", () => { -1, 7, -1, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(1, 7, [5]); cy.Cell_Should_Have_Notes_With_Colors(8, 7, "5679", "9", ""); @@ -62,7 +62,7 @@ describe("Simplify notes strategy", () => { -1, -1, 5, - HINT_NOT_HIGHLIGHTED_COLOR_RGB + HINT_NOT_HIGHLIGHTED_COLOR_RGB, ); cy.Group_Should_Only_Have_Indexes_Selected(2, 5, [7]); cy.Cell_Should_Have_Notes_With_Colors(3, 8, "579", "9", ""); @@ -73,7 +73,7 @@ describe("Simplify notes strategy", () => { -1, -1, -1, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); }); }); diff --git a/cypress/global/testIds.ts b/cypress/global/testIds.ts index 80d97a99..9c2640a5 100644 --- a/cypress/global/testIds.ts +++ b/cypress/global/testIds.ts @@ -78,7 +78,7 @@ export function CELL(row: number, column: number): string { export function CELL_WITH_VALUE( row: number, column: number, - value: number + value: number, ): string { return "[data-testid=cellr" + row + "c" + column + "value\\:" + value + "]"; } @@ -86,7 +86,7 @@ export function CELL_WITH_VALUE( export function CELL_WITH_NOTES( row: number, column: number, - notes: string + notes: string, ): string { return "[data-testid=cellr" + row + "c" + column + "notes\\:" + notes + "]"; } diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 6e85fd27..18c39736 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -5,7 +5,6 @@ import { PLACE_NOTE_TEXT_COLOR_RGB, REMOVE_NOTE_TEXT_COLOR_RGB, } from "../../app/Styling/HighlightColors"; - import { CELL_WITH_NOTES, DRILL_DRAWER_BUTTON, @@ -19,7 +18,7 @@ Cypress.Commands.add("Start_Naked_Single_Drill", () => { }); Cypress.Commands.add("Get_Cell_IDs", (boardType) => { - let cellIds: string[][] = new Array(9); + const cellIds: string[][] = new Array(9); for (let i = 0; i < 9; i++) { cellIds[i] = new Array(9); } @@ -44,7 +43,7 @@ Cypress.Commands.add("Get_Cell_Notes", (cellId) => { if (!cellId.includes("notes:")) { return cy.wrap(null); } - let notesIndex = cellId.indexOf("notes:"); + const notesIndex = cellId.indexOf("notes:"); return cy.wrap(cellId.substring(notesIndex + 6)); }); @@ -52,7 +51,7 @@ Cypress.Commands.add("Cell_Should_Have_Color", (row, column, color) => { cy.get("[data-testid^=cellr" + row + "c" + column + "]").should( "have.css", "background-color", - color + color, ); }); @@ -70,7 +69,7 @@ Cypress.Commands.add( } } } - } + }, ); Cypress.Commands.add("Get_Box_Index_From_Cell_Coords", (row, column) => { @@ -105,7 +104,7 @@ Cypress.Commands.add( cy.Cell_Should_Have_Color(row, col, selected ? colorA : colorB); } } - } + }, ); Cypress.Commands.add( @@ -116,9 +115,9 @@ Cypress.Commands.add( index, selectedIndexes, HINT_SELECTED_COLOR_RGB, - NOT_HIGHLIGHTED_COLOR_RGB + NOT_HIGHLIGHTED_COLOR_RGB, ); - } + }, ); Cypress.Commands.add( @@ -138,5 +137,5 @@ Cypress.Commands.add( .should("have.css", "color", color); } }); - } + }, ); diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts index e236df0e..eed8a2f7 100644 --- a/cypress/support/e2e.ts +++ b/cypress/support/e2e.ts @@ -21,6 +21,7 @@ import "./commands"; // require('./commands') // Ignore all uncaught exceptions, this is temporary +// eslint-disable-next-line node/handle-callback-err Cypress.on("uncaught:exception", (err, runnable) => { // returning false here prevents Cypress from // failing the test diff --git a/cypress/support/index.ts b/cypress/support/index.ts index eaa01aa4..614de37d 100644 --- a/cypress/support/index.ts +++ b/cypress/support/index.ts @@ -34,7 +34,7 @@ declare global { Cell_Should_Have_Color( row: number, column: number, - color: string + color: string, ): Chainable>; /** @@ -49,7 +49,7 @@ declare global { row: number, column: number, box: number, - color: string + color: string, ): Chainable>; /** @@ -61,7 +61,7 @@ declare global { */ Get_Box_Index_From_Cell_Coords( row: number, - column: number + column: number, ): Chainable; /** @@ -78,7 +78,7 @@ declare global { index: number, selectedIndexes: number[], colorA: string, - colorB: string + colorB: string, ): Chainable>; /** @@ -91,7 +91,7 @@ declare global { Group_Should_Only_Have_Indexes_Selected( groupType: number, index: number, - selectedIndexes: number[] + selectedIndexes: number[], ): Chainable>; /** @@ -108,7 +108,7 @@ declare global { column: number, notes: string, noteRemoveColored: string, - notePlaceColored: string + notePlaceColored: string, ): Chainable>; } } diff --git a/e2e/web/.eslintrc.js b/e2e/web/.eslintrc.js new file mode 100644 index 00000000..5c3c24dd --- /dev/null +++ b/e2e/web/.eslintrc.js @@ -0,0 +1,19 @@ +module.exports = { + extends: [ + "universe", + "universe/shared/typescript-analysis", + "plugin:playwright/recommended", + ], + rules: { + "playwright/expect-expect": "off", + "playwright/no-conditional-in-test": "off", + }, + overrides: [ + { + files: ["*.ts", "*.tsx", "*.d.ts"], + parserOptions: { + project: "./tsconfig.json", + }, + }, + ], +}; diff --git a/e2e/web/components/sudoku-board.component.ts b/e2e/web/components/sudoku-board.component.ts index 31504269..818350d5 100644 --- a/e2e/web/components/sudoku-board.component.ts +++ b/e2e/web/components/sudoku-board.component.ts @@ -19,7 +19,7 @@ export class SudokuBoardComponent { page: Page, numNumPads?: number, numRows?: number, - numColumns?: number + numColumns?: number, ) { this.page = page; @@ -56,13 +56,13 @@ export class SudokuBoardComponent { async cellHasValue(row: number, column: number, value: string) { await expect( - this.page.getByTestId(`cellr${row}c${column}value:${value}`) + this.page.getByTestId(`cellr${row}c${column}value:${value}`), ).toBeInViewport({ ratio: 1 }); } async cellHasNotes(row: number, column: number, notes: string) { await expect( - this.page.getByTestId(`cellr${row}c${column}notes:${notes}`) + this.page.getByTestId(`cellr${row}c${column}notes:${notes}`), ).toBeInViewport({ ratio: 1 }); } diff --git a/e2e/web/fixture.ts b/e2e/web/fixture.ts index ca4f539b..e4f555f1 100644 --- a/e2e/web/fixture.ts +++ b/e2e/web/fixture.ts @@ -1,11 +1,13 @@ import { Page, test as base } from "@playwright/test"; + +import { SudokuBoardComponent } from "./components/sudoku-board.component"; import { HomePage } from "./page/home.page"; import { PlayPage } from "./page/play.page"; -import { SudokuBoardComponent } from "./components/sudoku-board.component"; // Declare the types of your fixtures. type MyFixtures = { page: Page; + resumeGame: Page; }; // Extend base test by providing "todoPage" and "settingsPage". @@ -15,11 +17,8 @@ export const test = base.extend({ await page.goto(""); await use(page); }, -}); - -// Loads a game from local storage and navigates to resume the game. -export const resumeGame = base.extend({ - page: async ({ page }, use) => { + // Loads a game from local storage and navigates to resume the game. + resumeGame: async ({ page }, use) => { await page.goto(""); await page.evaluate(() => { const ACTIVE_GAME = diff --git a/e2e/web/page/home.page.ts b/e2e/web/page/home.page.ts index 50d8c5f1..40be1112 100644 --- a/e2e/web/page/home.page.ts +++ b/e2e/web/page/home.page.ts @@ -1,4 +1,5 @@ import { Locator, Page, expect } from "@playwright/test"; + import { HeaderComponent } from "../components/header.component"; export class HomePage { diff --git a/e2e/web/specs/navigation.spec.ts b/e2e/web/specs/navigation.spec.ts index 6284c1af..a43d6784 100644 --- a/e2e/web/specs/navigation.spec.ts +++ b/e2e/web/specs/navigation.spec.ts @@ -1,12 +1,11 @@ -import { LearnPage } from "./../page/learn.page"; -import { HomePage } from "./../page/home.page"; -import { expect } from "@playwright/test"; -import { test } from "../fixture"; -import { HeaderComponent } from "../components/header.component"; import { DrillPage } from "./../page/drill.page"; +import { HomePage } from "./../page/home.page"; +import { LearnPage } from "./../page/learn.page"; import { PlayPage } from "./../page/play.page"; -import { StatisticsPage } from "../page/statistics.page"; +import { HeaderComponent } from "../components/header.component"; +import { test } from "../fixture"; import { ProfilePage } from "../page/profile.page"; +import { StatisticsPage } from "../page/statistics.page"; test.describe("home page", () => { test("start lessons button", async ({ page }) => { @@ -65,11 +64,11 @@ test.describe("home page", () => { await homePage.homePageIsRendered(); }); - test("sidebar learn button", async ({ page }) => {}); + // test("sidebar learn button", async ({ page }) => {}); - test("sidebar drill button", async ({ page }) => {}); + // test("sidebar drill button", async ({ page }) => {}); - test("sidebar play button", async ({ page }) => {}); + // test("sidebar play button", async ({ page }) => {}); - test("sidebar contact button", async ({ page }) => {}); + // test("sidebar contact button", async ({ page }) => {}); }); diff --git a/e2e/web/specs/play-sudoku.spec.ts b/e2e/web/specs/play-sudoku.spec.ts index af7a6ed1..51be3a21 100644 --- a/e2e/web/specs/play-sudoku.spec.ts +++ b/e2e/web/specs/play-sudoku.spec.ts @@ -1,7 +1,5 @@ -import { resumeGame } from "../fixture"; import { expect } from "@playwright/test"; -import { PlayPage } from "../page/play.page"; -import { SudokuBoardComponent } from "../components/sudoku-board.component"; + import { IDENTICAL_VALUE_COLOR_RGB, NOT_HIGHLIGHTED_COLOR_RGB, @@ -12,336 +10,304 @@ import { } from "../../../app/Styling/HighlightColors"; import { EndGameModalComponent } from "../components/end-game-modal.component"; import { HeaderComponent } from "../components/header.component"; +import { SudokuBoardComponent } from "../components/sudoku-board.component"; +import { test } from "../fixture"; +import { PlayPage } from "../page/play.page"; import { StatisticsPage } from "../page/statistics.page"; -resumeGame.describe("pause", () => { - resumeGame("pause button", async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); +test.describe("pause", () => { + test("pause button", async ({ resumeGame }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); await sudokuBoard.pause.click(); - const playPage = new PlayPage(page); + const playPage = new PlayPage(resumeGame); await playPage.playPageIsRendered(); }); }); -resumeGame.describe("board highlighting", () => { - resumeGame( - "highlighting should render correctly when a cell is selected", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cellHasColor(7, 6, NOT_SELECTED_CONFLICT_COLOR_RGB); - await sudokuBoard.cellHasColor(7, 7, NOT_HIGHLIGHTED_COLOR_RGB); - await sudokuBoard.cell[7][7].click(); - for (let row = 0; row < 9; row++) { - for (let column = 0; column < 9; column++) { - if (row === 7 && column === 6) { - await sudokuBoard.cellHasColor( - row, - column, - NOT_SELECTED_CONFLICT_COLOR_RGB - ); - } else if (row === 7 && column === 7) { - await sudokuBoard.cellHasColor(row, column, SELECTED_COLOR_RGB); - } else if (row === 7) { - await sudokuBoard.cellHasColor( - row, - column, - PEER_SELECTED_COLOR_RGB - ); - } else if (column === 7 && row !== 7) { - await sudokuBoard.cellHasColor( - row, - column, - PEER_SELECTED_COLOR_RGB - ); - } else if (row > 5 && column > 5) { - await sudokuBoard.cellHasColor( - row, - column, - PEER_SELECTED_COLOR_RGB - ); - } else { - await sudokuBoard.cellHasColor( - row, - column, - NOT_HIGHLIGHTED_COLOR_RGB - ); - } +test.describe("board highlighting", () => { + test("highlighting should render correctly when a cell is selected", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cellHasColor(7, 6, NOT_SELECTED_CONFLICT_COLOR_RGB); + await sudokuBoard.cellHasColor(7, 7, NOT_HIGHLIGHTED_COLOR_RGB); + await sudokuBoard.cell[7][7].click(); + for (let row = 0; row < 9; row++) { + for (let column = 0; column < 9; column++) { + if (row === 7 && column === 6) { + await sudokuBoard.cellHasColor( + row, + column, + NOT_SELECTED_CONFLICT_COLOR_RGB, + ); + } else if (row === 7 && column === 7) { + await sudokuBoard.cellHasColor(row, column, SELECTED_COLOR_RGB); + } else if (row === 7) { + await sudokuBoard.cellHasColor(row, column, PEER_SELECTED_COLOR_RGB); + } else if (column === 7 && row !== 7) { + await sudokuBoard.cellHasColor(row, column, PEER_SELECTED_COLOR_RGB); + } else if (row > 5 && column > 5) { + await sudokuBoard.cellHasColor(row, column, PEER_SELECTED_COLOR_RGB); + } else { + await sudokuBoard.cellHasColor( + row, + column, + NOT_HIGHLIGHTED_COLOR_RGB, + ); } } } - ); + }); // TODO: Add test: Board Highlighting should render correctly when cell is unselected - resumeGame( - "Board Highlighting should render correctly when cell value is entered", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.cell[7][7].press("1"); - for (let row = 0; row < 9; row++) { - for (let column = 0; column < 9; column++) { - if ( - (row === 0 && column === 0) || - (row === 1 && column === 8) || - (row === 2 && column === 4) || - (row === 3 && column === 3) || - (row === 4 && column === 1) || - (row === 5 && column === 6) || - (row === 6 && column === 2) || - (row === 7 && column === 5) || - (row === 8 && column === 7) - ) { - await sudokuBoard.cellHasColor( - row, - column, - IDENTICAL_VALUE_COLOR_RGB - ); - } else if (row === 7 && column === 6) { - await sudokuBoard.cellHasColor( - row, - column, - NOT_SELECTED_CONFLICT_COLOR_RGB - ); - } else if (row === 7 && column === 7) { - await sudokuBoard.cellHasColor( - row, - column, - SELECTED_CONFLICT_COLOR_RGB - ); - } else if (row === 7 || column == 7 || (row > 5 && column > 5)) { - await sudokuBoard.cellHasColor( - row, - column, - PEER_SELECTED_COLOR_RGB - ); - } else { - await sudokuBoard.cellHasColor( - row, - column, - NOT_HIGHLIGHTED_COLOR_RGB - ); - } + test("Board Highlighting should render correctly when cell value is entered", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.cell[7][7].press("1"); + for (let row = 0; row < 9; row++) { + for (let column = 0; column < 9; column++) { + if ( + (row === 0 && column === 0) || + (row === 1 && column === 8) || + (row === 2 && column === 4) || + (row === 3 && column === 3) || + (row === 4 && column === 1) || + (row === 5 && column === 6) || + (row === 6 && column === 2) || + (row === 7 && column === 5) || + (row === 8 && column === 7) + ) { + await sudokuBoard.cellHasColor( + row, + column, + IDENTICAL_VALUE_COLOR_RGB, + ); + } else if (row === 7 && column === 6) { + await sudokuBoard.cellHasColor( + row, + column, + NOT_SELECTED_CONFLICT_COLOR_RGB, + ); + } else if (row === 7 && column === 7) { + await sudokuBoard.cellHasColor( + row, + column, + SELECTED_CONFLICT_COLOR_RGB, + ); + } else if (row === 7 || column === 7 || (row > 5 && column > 5)) { + await sudokuBoard.cellHasColor(row, column, PEER_SELECTED_COLOR_RGB); + } else { + await sudokuBoard.cellHasColor( + row, + column, + NOT_HIGHLIGHTED_COLOR_RGB, + ); } } } - ); + }); // TODO: Add test: Board Highlighting should render correctly when undo button is entered - resumeGame( - "Selecting invalid cell should update highlighting of cell correctly", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][6].click(); - await sudokuBoard.cellHasColor(7, 6, SELECTED_CONFLICT_COLOR_RGB); - } - ); + test("Selecting invalid cell should update highlighting of cell correctly", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][6].click(); + await sudokuBoard.cellHasColor(7, 6, SELECTED_CONFLICT_COLOR_RGB); + }); }); -resumeGame.describe("typing", () => { +test.describe("typing", () => { for (let i = 1; i <= 9; i++) { - resumeGame( - `typing ${i} should fill cell with correct number`, - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.cell[7][7].press(i.toString()); - await sudokuBoard.cellHasValue(7, 7, i.toString()); - } - ); + test(`typing ${i} should fill cell with correct number`, async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.cell[7][7].press(i.toString()); + await sudokuBoard.cellHasValue(7, 7, i.toString()); + }); } for (let i = 1; i <= 9; i++) { - resumeGame( - `typing ${i} should fill cell with correct note`, - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.note.click(); - await sudokuBoard.cell[7][7].press(i.toString()); - await sudokuBoard.cellHasNotes(7, 7, i.toString()); - } - ); + test(`typing ${i} should fill cell with correct note`, async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.note.click(); + await sudokuBoard.cell[7][7].press(i.toString()); + await sudokuBoard.cellHasNotes(7, 7, i.toString()); + }); } }); -resumeGame.describe("numpad", () => { +test.describe("numpad", () => { for (let i = 1; i <= 9; i++) { - resumeGame( - `clicking numpad ${i} should fill cell with correct number`, - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.numPad[i - 1].click(); - await sudokuBoard.cellHasValue(7, 7, i.toString()); - } - ); + test(`clicking numpad ${i} should fill cell with correct number`, async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.numPad[i - 1].click(); + await sudokuBoard.cellHasValue(7, 7, i.toString()); + }); } for (let i = 1; i <= 9; i++) { - resumeGame( - `clicking numpad ${i} should fill cell with correct note`, - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.note.click(); - await sudokuBoard.numPad[i - 1].click(); - await sudokuBoard.cellHasNotes(7, 7, i.toString()); - } - ); + test(`clicking numpad ${i} should fill cell with correct note`, async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.note.click(); + await sudokuBoard.numPad[i - 1].click(); + await sudokuBoard.cellHasNotes(7, 7, i.toString()); + }); } }); -resumeGame.describe("undo", () => { - resumeGame( - "Undo button should remove value entered on previous move from keypad", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.cell[7][7].press("1"); - await sudokuBoard.cellHasValue(7, 7, "1"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasValue(7, 7, "0"); - } - ); +test.describe("undo", () => { + test("Undo button should remove value entered on previous move from keypad", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.cell[7][7].press("1"); + await sudokuBoard.cellHasValue(7, 7, "1"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasValue(7, 7, "0"); + }); - resumeGame( - "Undo button should remove value entered on previous move from numpad", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.numPad[0].click(); - await sudokuBoard.cellHasValue(7, 7, "1"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasValue(7, 7, "0"); - } - ); + test("Undo button should remove value entered on previous move from numpad", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.numPad[0].click(); + await sudokuBoard.cellHasValue(7, 7, "1"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasValue(7, 7, "0"); + }); - resumeGame( - "Undo button should replace value erased on previous move from erase button", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][6].click(); - await sudokuBoard.erase.click(); - await sudokuBoard.cellHasValue(7, 6, "0"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasValue(7, 6, "1"); - } - ); + test("Undo button should replace value erased on previous move from erase button", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][6].click(); + await sudokuBoard.erase.click(); + await sudokuBoard.cellHasValue(7, 6, "0"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasValue(7, 6, "1"); + }); - resumeGame( - "Undo button should replace notes erased on previous move from erase button", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][8].click(); - await sudokuBoard.erase.click(); - await sudokuBoard.cellHasValue(7, 8, "0"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasNotes(7, 8, "45"); - } - ); + test("Undo button should replace notes erased on previous move from erase button", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][8].click(); + await sudokuBoard.erase.click(); + await sudokuBoard.cellHasValue(7, 8, "0"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasNotes(7, 8, "45"); + }); - resumeGame( - "Undo button should replace value overridden on previous move with keypad", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][6].click(); - await sudokuBoard.cell[7][6].press("2"); - await sudokuBoard.cellHasValue(7, 6, "2"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasValue(7, 6, "1"); - } - ); + test("Undo button should replace value overridden on previous move with keypad", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][6].click(); + await sudokuBoard.cell[7][6].press("2"); + await sudokuBoard.cellHasValue(7, 6, "2"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasValue(7, 6, "1"); + }); - resumeGame( - "Undo button should replace value overridden on previous move with numpad", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][6].click(); - await sudokuBoard.numPad[1].click(); - await sudokuBoard.cellHasValue(7, 6, "2"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasValue(7, 6, "1"); - } - ); + test("Undo button should replace value overridden on previous move with numpad", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][6].click(); + await sudokuBoard.numPad[1].click(); + await sudokuBoard.cellHasValue(7, 6, "2"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasValue(7, 6, "1"); + }); - resumeGame( - "Undo button should remove note entered on previous move with keypad", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.note.click(); - await sudokuBoard.cell[7][7].press("1"); - await sudokuBoard.cellHasNotes(7, 7, "1"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasValue(7, 7, "0"); - } - ); + test("Undo button should remove note entered on previous move with keypad", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.note.click(); + await sudokuBoard.cell[7][7].press("1"); + await sudokuBoard.cellHasNotes(7, 7, "1"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasValue(7, 7, "0"); + }); - resumeGame( - "Undo button should remove note entered on previous move with numpad", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.note.click(); - await sudokuBoard.numPad[0].click(); - await sudokuBoard.cellHasNotes(7, 7, "1"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasValue(7, 7, "0"); - } - ); + test("Undo button should remove note entered on previous move with numpad", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.note.click(); + await sudokuBoard.numPad[0].click(); + await sudokuBoard.cellHasNotes(7, 7, "1"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasValue(7, 7, "0"); + }); - resumeGame( - "Undo button should replace note removed on previous move with keypad", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][8].click(); - await sudokuBoard.note.click(); - await sudokuBoard.cell[7][8].press("5"); - await sudokuBoard.cellHasNotes(7, 8, "4"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasNotes(7, 8, "45"); - } - ); + test("Undo button should replace note removed on previous move with keypad", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][8].click(); + await sudokuBoard.note.click(); + await sudokuBoard.cell[7][8].press("5"); + await sudokuBoard.cellHasNotes(7, 8, "4"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasNotes(7, 8, "45"); + }); - resumeGame( - "Undo button should replace note removed on previous move with numpad", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][8].click(); - await sudokuBoard.note.click(); - await sudokuBoard.numPad[4].click(); - await sudokuBoard.cellHasNotes(7, 8, "4"); - await sudokuBoard.undo.click(); - await sudokuBoard.cellHasNotes(7, 8, "45"); - } - ); + test("Undo button should replace note removed on previous move with numpad", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][8].click(); + await sudokuBoard.note.click(); + await sudokuBoard.numPad[4].click(); + await sudokuBoard.cellHasNotes(7, 8, "4"); + await sudokuBoard.undo.click(); + await sudokuBoard.cellHasNotes(7, 8, "45"); + }); }); -resumeGame.describe("erase", () => { - resumeGame( - "Erase button should be disabled if a cell with a given is selected", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cellHasValue(0, 2, "3"); - await sudokuBoard.cell[0][2].click(); - await sudokuBoard.eraseButtonIsDisabled(); - } - ); +test.describe("erase", () => { + test("Erase button should be disabled if a cell with a given is selected", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cellHasValue(0, 2, "3"); + await sudokuBoard.cell[0][2].click(); + await sudokuBoard.eraseButtonIsDisabled(); + }); - resumeGame( - "Erase button should be disabled if a cell with a correct value is selected", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cellHasValue(0, 0, "1"); - await sudokuBoard.cell[0][0].click(); - await sudokuBoard.eraseButtonIsDisabled(); - } - ); + test("Erase button should be disabled if a cell with a correct value is selected", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cellHasValue(0, 0, "1"); + await sudokuBoard.cell[0][0].click(); + await sudokuBoard.eraseButtonIsDisabled(); + }); - resumeGame("Erasing an incorrect value should succeed", async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); + test("Erasing an incorrect value should succeed", async ({ resumeGame }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); await sudokuBoard.cell[7][6].click(); await sudokuBoard.erase.click(); await sudokuBoard.cellHasValue(7, 6, "0"); @@ -351,91 +317,88 @@ resumeGame.describe("erase", () => { // TODO add test: Should solve game with multiple action types // TODO add test: Completing multiple games should display correct statistics -resumeGame.describe("complete game", () => { - resumeGame( - "Completing a game and clicking 'Start New Game' should take you to the play game page", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][6].click(); - await sudokuBoard.cell[7][6].press("8"); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.numPad[2 - 1].click(); - await sudokuBoard.cell[7][8].click(); - await sudokuBoard.cell[7][8].press("4"); - const endGameModal = new EndGameModalComponent(page); - await endGameModal.endGameModalIsRendered(); - await endGameModal.newGame.click(); - const playPage = new PlayPage(page); - await playPage.playPageIsRendered(); - } - ); +test.describe("complete game", () => { + test("Completing a game and clicking 'Start New Game' should take you to the play game page", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][6].click(); + await sudokuBoard.cell[7][6].press("8"); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.numPad[2 - 1].click(); + await sudokuBoard.cell[7][8].click(); + await sudokuBoard.cell[7][8].press("4"); + const endGameModal = new EndGameModalComponent(resumeGame); + await endGameModal.endGameModalIsRendered(); + await endGameModal.newGame.click(); + const playPage = new PlayPage(resumeGame); + await playPage.playPageIsRendered(); + }); - resumeGame( - "Completing a game should display correct game results", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][6].click(); - await sudokuBoard.cell[7][6].press("8"); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.numPad[2 - 1].click(); - await sudokuBoard.cell[7][8].click(); - await sudokuBoard.cell[7][8].press("4"); - const endGameModal = new EndGameModalComponent(page); - await expect(endGameModal.page.getByText("Score: 34")).toBeInViewport({ - ratio: 1, - }); - await expect( - endGameModal.page.getByText("Time Spent: 06:1") - ).toBeInViewport({ ratio: 1 }); - await expect( - endGameModal.page.getByText("Number of Hints Used: 0") - ).toBeInViewport({ ratio: 1 }); - await expect( - endGameModal.page.getByText("Mistakes Made: 235") - ).toBeInViewport({ ratio: 1 }); - await expect( - endGameModal.page.getByText("Difficulty: easy") - ).toBeInViewport({ ratio: 1 }); - } - ); + test("Completing a game should display correct game results", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][6].click(); + await sudokuBoard.cell[7][6].press("8"); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.numPad[2 - 1].click(); + await sudokuBoard.cell[7][8].click(); + await sudokuBoard.cell[7][8].press("4"); + const endGameModal = new EndGameModalComponent(resumeGame); + await expect(endGameModal.page.getByText("Score: 34")).toBeInViewport({ + ratio: 1, + }); + await expect( + endGameModal.page.getByText("Time Spent: 06:1"), + ).toBeInViewport({ ratio: 1 }); + await expect( + endGameModal.page.getByText("Number of Hints Used: 0"), + ).toBeInViewport({ ratio: 1 }); + await expect( + endGameModal.page.getByText("Mistakes Made: 235"), + ).toBeInViewport({ ratio: 1 }); + await expect( + endGameModal.page.getByText("Difficulty: easy"), + ).toBeInViewport({ ratio: 1 }); + }); - resumeGame( - "Completing a game should display correct statistics", - async ({ page }) => { - const sudokuBoard = new SudokuBoardComponent(page); - await sudokuBoard.cell[7][6].click(); - await sudokuBoard.cell[7][6].press("8"); - await sudokuBoard.cell[7][7].click(); - await sudokuBoard.numPad[2 - 1].click(); - await sudokuBoard.cell[7][8].click(); - await sudokuBoard.cell[7][8].press("4"); - const endGameModal = new EndGameModalComponent(page); - await endGameModal.newGame.click(); - const header = new HeaderComponent(page); - await header.statistics.last().click(); // todo: stop using last (fix infinite stack) - const statistics = new StatisticsPage(page); - await statistics.statisticsPageIsRendered(); - await expect(statistics.page.getByText("Total Score: 34")).toBeInViewport( - { ratio: 1 } - ); - await expect(statistics.page.getByText("Games Played: 1")).toBeInViewport( - { ratio: 1 } - ); - await expect( - statistics.page.getByText("Fastest Solve Time: 06:1") - ).toBeInViewport({ ratio: 1 }); - await expect( - statistics.page.getByText("Average Solve Time: 06:1") - ).toBeInViewport({ ratio: 1 }); - await expect( - statistics.page.getByText("Total Solve Time: 06:1") - ).toBeInViewport({ ratio: 1 }); - await expect( - statistics.page.getByText("Total Hints Used: 0") - ).toBeInViewport({ ratio: 1 }); - await expect( - statistics.page.getByText("Total Mistakes Made: 235") - ).toBeInViewport({ ratio: 1 }); - } - ); + test("Completing a game should display correct statistics", async ({ + resumeGame, + }) => { + const sudokuBoard = new SudokuBoardComponent(resumeGame); + await sudokuBoard.cell[7][6].click(); + await sudokuBoard.cell[7][6].press("8"); + await sudokuBoard.cell[7][7].click(); + await sudokuBoard.numPad[2 - 1].click(); + await sudokuBoard.cell[7][8].click(); + await sudokuBoard.cell[7][8].press("4"); + const endGameModal = new EndGameModalComponent(resumeGame); + await endGameModal.newGame.click(); + const header = new HeaderComponent(resumeGame); + await header.statistics.last().click(); // todo: stop using last (fix infinite stack) + const statistics = new StatisticsPage(resumeGame); + await statistics.statisticsPageIsRendered(); + await expect(statistics.page.getByText("Total Score: 34")).toBeInViewport({ + ratio: 1, + }); + await expect(statistics.page.getByText("Games Played: 1")).toBeInViewport({ + ratio: 1, + }); + await expect( + statistics.page.getByText("Fastest Solve Time: 06:1"), + ).toBeInViewport({ ratio: 1 }); + await expect( + statistics.page.getByText("Average Solve Time: 06:1"), + ).toBeInViewport({ ratio: 1 }); + await expect( + statistics.page.getByText("Total Solve Time: 06:1"), + ).toBeInViewport({ ratio: 1 }); + await expect( + statistics.page.getByText("Total Hints Used: 0"), + ).toBeInViewport({ ratio: 1 }); + await expect( + statistics.page.getByText("Total Mistakes Made: 235"), + ).toBeInViewport({ ratio: 1 }); + }); }); diff --git a/package-lock.json b/package-lock.json index e25570f2..37c7ea5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,16 +44,28 @@ "cross-env": "^7.0.3", "cypress": "^13.6.4", "dotenv-safe": "^9.0.0", + "eslint": "8.57.0", + "eslint-config-universe": "12.0.0", + "eslint-plugin-playwright": "^1.5.2", "expo-doctor": "^1.4.0", "husky": "^8.0.3", "lint-staged": "^14.0.1", "metro": "~0.80.4", - "prettier": "2.8.8", + "prettier": "3.2.5", "snyk": "^1.1259.0", "typescript": "^5.3.0", "vercel": "^28.18.1" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -2817,6 +2829,126 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@expo-google-fonts/inter": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@expo-google-fonts/inter/-/inter-0.2.3.tgz", @@ -3602,6 +3734,39 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, "node_modules/@isaacs/ttlcache": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", @@ -4022,6 +4187,18 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@playwright/test": { "version": "1.41.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.2.tgz", @@ -6819,9 +6996,15 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/keyv": { @@ -6900,6 +7083,12 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, "node_modules/@types/sinonjs__fake-timers": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", @@ -6946,6 +7135,292 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@urql/core": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz", @@ -7941,9 +8416,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -8227,11 +8702,46 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -8240,6 +8750,146 @@ "node": ">=8" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -8321,6 +8971,21 @@ "node": ">= 4.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -9069,12 +9734,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10696,6 +11367,57 @@ "node": ">= 6" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dayjs": { "version": "1.11.9", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", @@ -10881,17 +11603,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -11111,6 +11835,18 @@ "node": ">=8" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -11350,6 +12086,115 @@ "node": ">= 0.8" } }, + "node_modules/es-abstract": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.0.tgz", + "integrity": "sha512-vmuE7Uoevk2xkwu5Gwa7RfJk/ebVV6xRv7KuZNbUglmJHhWPMbLL20ztreVpBbdxBZijETx3Aml3NssX4SFMvQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.0", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", @@ -11357,6 +12202,46 @@ "dev": true, "peer": true }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -11771,6 +12656,467 @@ "node": ">=0.10.0" } }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-universe": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-universe/-/eslint-config-universe-12.0.0.tgz", + "integrity": "sha512-78UxGByheyDNL1RhszWYeDzWiBaUtLnFSeI20pJI89IXa9OAEZQHzG/iBFpMeaCs7Hqyg0wYJcuCbCx535wB7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0" + }, + "peerDependencies": { + "eslint": ">=8.10", + "prettier": ">=3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-playwright": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-1.5.2.tgz", + "integrity": "sha512-TMzLrLGQMccngU8GogtzIc9u5RzXGnfsQEUjLfEfshINuVR2fS4SHfDtU7xYP90Vwm5vflHECf610KTdGvO53w==", + "dev": true, + "dependencies": { + "globals": "^13.23.0" + }, + "engines": { + "node": ">=16.6.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0", + "eslint-plugin-jest": ">=25" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-playwright/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-playwright/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -11785,6 +13131,278 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -11797,12 +13415,32 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -11815,7 +13453,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "peer": true, "engines": { "node": ">=4.0" } @@ -12455,6 +14092,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -12593,6 +14236,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -12703,6 +14358,41 @@ "micromatch": "^4.0.2" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, "node_modules/flow-enums-runtime": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", @@ -12721,6 +14411,15 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==" }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -12977,6 +14676,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -13035,15 +14761,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13076,6 +14806,23 @@ "node": ">=6" } }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-uri": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", @@ -13307,7 +15054,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -13345,6 +15091,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/graphql": { "version": "15.8.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", @@ -13384,15 +15136,13 @@ "gunzip-maybe": "bin.js" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { @@ -13404,21 +15154,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -13437,6 +15186,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -13481,9 +15245,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -13984,6 +15748,20 @@ "node": ">=6" } }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -14037,11 +15815,54 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -14054,11 +15875,39 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -14072,11 +15921,41 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "dependencies": { - "has": "^1.0.3" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14128,6 +16007,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -14136,6 +16027,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -14201,6 +16107,30 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -14209,6 +16139,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -14253,6 +16198,49 @@ "@types/estree": "*" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -14261,6 +16249,51 @@ "node": ">=0.10.0" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -14289,6 +16322,46 @@ "node": ">=0.10.0" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -14592,6 +16665,19 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", @@ -14960,6 +17046,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -15017,10 +17109,25 @@ "verror": "1.10.0" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -15828,6 +17935,12 @@ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -17806,6 +19919,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -18225,9 +20344,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -18241,6 +20360,98 @@ "node": ">= 0.4" } }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -18500,6 +20711,27 @@ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", "dev": true }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-entities": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", @@ -18911,6 +21143,15 @@ "node": ">=10" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.35", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", @@ -19085,20 +21326,32 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -19965,6 +22218,27 @@ "node": ">=0.10.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -19994,6 +22268,36 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -20395,6 +22699,30 @@ "node": ">=6" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -20420,6 +22748,23 @@ "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", "optional": true }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -20607,6 +22952,37 @@ "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -21137,6 +23513,71 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/stringify-entities": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", @@ -21315,6 +23756,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -21759,6 +24216,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -21838,9 +24307,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -21903,6 +24372,79 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -21949,6 +24491,21 @@ "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==", "dev": true }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -23131,11 +25688,96 @@ "which": "bin/which" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -23514,6 +26156,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -25342,6 +27990,83 @@ "dev": true, "optional": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, "@expo-google-fonts/inter": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@expo-google-fonts/inter/-/inter-0.2.3.tgz", @@ -25995,6 +28720,29 @@ "@hapi/hoek": "^9.0.0" } }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, "@isaacs/ttlcache": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", @@ -26315,6 +29063,12 @@ "json-parse-even-better-errors": "^2.3.1" } }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, "@playwright/test": { "version": "1.41.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.2.tgz", @@ -28316,9 +31070,15 @@ } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/keyv": { @@ -28397,6 +31157,12 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, "@types/sinonjs__fake-timers": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", @@ -28443,6 +31209,179 @@ "@types/node": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "dependencies": { + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "@urql/core": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz", @@ -29188,9 +32127,9 @@ } }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" }, "acorn-import-assertions": { "version": "1.9.0", @@ -29401,16 +32340,143 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, + "array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -29477,6 +32543,15 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -30033,12 +33108,15 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "caller-callsite": { @@ -31200,6 +34278,39 @@ "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", "dev": true }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, "dayjs": { "version": "1.11.9", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", @@ -31330,14 +34441,13 @@ "dev": true }, "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" } }, "define-lazy-prop": { @@ -31497,6 +34607,15 @@ "path-type": "^4.0.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -31704,6 +34823,100 @@ "escape-html": "~1.0.3" } }, + "es-abstract": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.0.tgz", + "integrity": "sha512-vmuE7Uoevk2xkwu5Gwa7RfJk/ebVV6xRv7KuZNbUglmJHhWPMbLL20ztreVpBbdxBZijETx3Aml3NssX4SFMvQ==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.0", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + } + }, "es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", @@ -31711,6 +34924,37 @@ "dev": true, "peer": true }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -31922,6 +35166,491 @@ } } }, + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "requires": {} + }, + "eslint-config-universe": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-universe/-/eslint-config-universe-12.0.0.tgz", + "integrity": "sha512-78UxGByheyDNL1RhszWYeDzWiBaUtLnFSeI20pJI89IXa9OAEZQHzG/iBFpMeaCs7Hqyg0wYJcuCbCx535wB7A==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-playwright": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-1.5.2.tgz", + "integrity": "sha512-TMzLrLGQMccngU8GogtzIc9u5RzXGnfsQEUjLfEfshINuVR2fS4SHfDtU7xYP90Vwm5vflHECf610KTdGvO53w==", + "dev": true, + "requires": { + "globals": "^13.23.0" + }, + "dependencies": { + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + } + }, + "eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dev": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "requires": {} + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -31933,17 +35662,67 @@ "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "peer": true, "requires": { "estraverse": "^5.2.0" }, @@ -31952,8 +35731,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true + "dev": true } } }, @@ -32466,6 +36244,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -32578,6 +36362,15 @@ "escape-string-regexp": "^1.0.5" } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -32666,6 +36459,34 @@ "micromatch": "^4.0.2" } }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, "flow-enums-runtime": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", @@ -32681,6 +36502,15 @@ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -32868,6 +36698,24 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -32916,10 +36764,11 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", @@ -32945,6 +36794,17 @@ "pump": "^3.0.0" } }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + } + }, "get-uri": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", @@ -33118,7 +36978,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "requires": { "get-intrinsic": "^1.1.3" } @@ -33147,6 +37006,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "graphql": { "version": "15.8.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", @@ -33174,13 +37039,11 @@ "through2": "^2.0.3" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true }, "has-flag": { "version": "3.0.0", @@ -33188,24 +37051,32 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "requires": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -33237,9 +37108,9 @@ } }, "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "requires": { "function-bind": "^1.1.2" } @@ -33616,6 +37487,17 @@ "ipaddr.js": "^1.9.0" } }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -33655,11 +37537,39 @@ "is-decimal": "^2.0.0" } }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -33669,11 +37579,27 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, "is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -33684,11 +37610,29 @@ } }, "is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "requires": { + "hasown": "^2.0.0" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, "requires": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" } }, "is-decimal": { @@ -33718,11 +37662,29 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==" }, + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -33766,11 +37728,32 @@ "is-glob": "^2.0.0" } }, + "is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -33803,11 +37786,63 @@ "@types/estree": "*" } }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -33827,6 +37862,31 @@ "is-invalid-path": "^0.1.0" } }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -34054,6 +38114,19 @@ "istanbul-lib-report": "^3.0.0" } }, + "iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "requires": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", @@ -34361,6 +38434,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -34406,10 +38485,22 @@ "verror": "1.10.0" } }, + "jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + } + }, "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -34896,6 +38987,12 @@ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -36296,6 +40393,12 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -36603,9 +40706,9 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "object-keys": { "version": "1.1.1", @@ -36613,6 +40716,74 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "requires": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, + "object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "requires": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -36808,6 +40979,23 @@ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-entities": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", @@ -37116,6 +41304,12 @@ "@babel/runtime": "^7.17.8" } }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "postcss": { "version": "8.4.35", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", @@ -37217,11 +41411,20 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -37898,6 +42101,21 @@ } } }, + "reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -37924,6 +42142,24 @@ "@babel/runtime": "^7.8.4" } }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -38240,6 +42476,26 @@ "mri": "^1.1.0" } }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -38251,6 +42507,17 @@ "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", "optional": true }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -38409,6 +42676,31 @@ "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", "dev": true }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -38819,6 +43111,56 @@ } } }, + "string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, "stringify-entities": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", @@ -38954,6 +43296,16 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "requires": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + } + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -39289,6 +43641,13 @@ "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", "dev": true }, + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -39343,9 +43702,9 @@ } }, "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "tunnel-agent": { "version": "0.6.0", @@ -39390,6 +43749,58 @@ "mime-types": "~2.1.24" } }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -39416,6 +43827,18 @@ "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==", "dev": true }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -40150,11 +44573,77 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "requires": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "requires": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", diff --git a/package.json b/package.json index d5089258..a69bee9a 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "build:metro-web": "npx expo export --platform web", "preview:vercel": "vercel --name sudokuru-dev --yes", "prettier": "npx prettier --write .", + "eslint": "npx eslint . --fix", "open:cypress": "npx cypress open", "test:cypress": "npx cypress run --config video=false,screenshotOnRunFailure=false", "tauri": "tauri", @@ -26,7 +27,10 @@ "snyk:code": "npx snyk code test --org=sudokuru" }, "lint-staged": { - "**/*": "npx prettier --write --ignore-unknown" + "**/*": [ + "npx prettier --write --ignore-unknown", + "npm run eslint" + ] }, "dependencies": { "@expo-google-fonts/inter": "^0.2.3", @@ -53,23 +57,26 @@ "sudokuru": "2.1.0" }, "devDependencies": { - "dotenv-safe": "^9.0.0", "@babel/core": "^7.20.0", - "@playwright/test": "^1.41.2", - "@types/dotenv-safe": "^8.1.5", - "@types/node": "^20.11.17", "@cypress/code-coverage": "^3.11.0", "@expo/metro-config": "^0.17.4", + "@playwright/test": "^1.41.2", "@tauri-apps/cli": "^1.5.5", + "@types/dotenv-safe": "^8.1.5", + "@types/node": "^20.11.17", "@types/react": "~18.2.45", "babel-plugin-istanbul": "^6.1.1", "cross-env": "^7.0.3", "cypress": "^13.6.4", + "dotenv-safe": "^9.0.0", + "eslint": "8.57.0", + "eslint-config-universe": "12.0.0", + "eslint-plugin-playwright": "^1.5.2", "expo-doctor": "^1.4.0", "husky": "^8.0.3", "lint-staged": "^14.0.1", "metro": "~0.80.4", - "prettier": "2.8.8", + "prettier": "3.2.5", "snyk": "^1.1259.0", "typescript": "^5.3.0", "vercel": "^28.18.1"