├── .github └── FUNDING.yml ├── src ├── interfaces │ ├── index.ts │ └── interfaces.ts ├── vite-env.d.ts ├── hooks │ ├── index.ts │ ├── useCountUp.ts │ ├── useCountDown.ts │ ├── useTimer.ts │ └── useStopwatch.ts ├── helpers │ ├── index.ts │ ├── addLeadingZero.ts │ ├── parseTime.ts │ ├── useCounter.ts │ ├── useInternalTimer.ts │ └── useInternalStopwatch.ts ├── main.tsx └── App.tsx ├── tsconfig.node.json ├── .npmignore ├── index.html ├── .gitignore ├── CONTRIBUTING.md ├── tsconfig.json ├── .eslintrc.cjs ├── vite.config.ts ├── LICENSE ├── package.json ├── vite.config.ts.timestamp-1692018226773-58641b11ebb79.mjs ├── CODE_OF_CONDUCT.md ├── README.md └── pnpm-lock.yaml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: dlcastillop 2 | -------------------------------------------------------------------------------- /src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./interfaces"; 2 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./useCountUp"; 2 | export * from "./useCountDown"; 3 | export * from "./useStopwatch"; 4 | export * from "./useTimer"; 5 | -------------------------------------------------------------------------------- /src/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./addLeadingZero"; 2 | export * from "./useInternalStopwatch"; 3 | export * from "./useInternalTimer"; 4 | export * from "./useCounter"; 5 | export * from "./parseTime"; 6 | -------------------------------------------------------------------------------- /src/helpers/addLeadingZero.ts: -------------------------------------------------------------------------------- 1 | export const addLeadingZero = (digit: number): string => { 2 | let timeStr = ""; 3 | 4 | digit % 10 === digit ? (timeStr += `0${digit}`) : (timeStr += `${digit}`); 5 | 6 | return timeStr; 7 | }; 8 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App.tsx"; 4 | 5 | ReactDOM.createRoot(document.getElementById("root")!).render( 6 | 7 | 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist-ssr 12 | *.local 13 | 14 | # Editor directories and files 15 | .vscode/* 16 | !.vscode/extensions.json 17 | .idea 18 | .DS_Store 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Final Countdown JS 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /src/hooks/useCountUp.ts: -------------------------------------------------------------------------------- 1 | import { BaseCounter, BaseCounterOptions } from "../interfaces"; 2 | import { useCounter } from "../helpers"; 3 | 4 | export const useCountUp = ( 5 | min: number, 6 | max: number, 7 | options?: BaseCounterOptions 8 | ): BaseCounter => 9 | useCounter(min, max, true, { 10 | startPaused: options?.startPaused, 11 | onFinish: options?.onFinish, 12 | }); 13 | -------------------------------------------------------------------------------- /src/hooks/useCountDown.ts: -------------------------------------------------------------------------------- 1 | import { BaseCounter, BaseCounterOptions } from "../interfaces"; 2 | import { useCounter } from "../helpers"; 3 | 4 | export const useCountDown = ( 5 | min: number, 6 | max: number, 7 | options?: BaseCounterOptions 8 | ): BaseCounter => 9 | useCounter(min, max, false, { 10 | startPaused: options?.startPaused, 11 | onFinish: options?.onFinish, 12 | }); 13 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Thanks for your interest in contributing to Final Countdown! Please take a moment to review this document **before submitting a pull request**. 4 | 5 | ## Pull requests 6 | 7 | **Please ask first before starting work on any new features** 8 | 9 | It's never a fun experience to have your pull request declined after investing a lot of time and effort into a new feature. To avoid this from happening, we request that contributors create [a feature request](https://github.com/dlcastillop/final-countdown-js/discussions/new?category=ideas) to first discuss any significant new ideas. 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | 3 | module.exports = { 4 | root: true, 5 | env: { browser: true, es2020: true }, 6 | extends: [ 7 | 'eslint:recommended', 8 | 'plugin:@typescript-eslint/recommended', 9 | 'plugin:@typescript-eslint/recommended-requiring-type-checking', 10 | 'plugin:react-hooks/recommended', 11 | ], 12 | parser: '@typescript-eslint/parser', 13 | parserOptions: { 14 | ecmaVersion: 'latest', 15 | sourceType: 'module', 16 | project: true, 17 | tsconfigRootDir: __dirname, 18 | }, 19 | plugins: ['react-refresh'], 20 | rules: { 21 | 'react-refresh/only-export-components': [ 22 | 'warn', 23 | { allowConstantExport: true }, 24 | ], 25 | '@typescript-eslint/no-non-null-assertion': 'off', 26 | }, 27 | } 28 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from "@vitejs/plugin-react"; 2 | import path from "node:path"; 3 | import { defineConfig } from "vite"; 4 | import dts from "vite-plugin-dts"; 5 | 6 | export default defineConfig({ 7 | plugins: [ 8 | react(), 9 | dts({ 10 | insertTypesEntry: true, 11 | }), 12 | ], 13 | build: { 14 | lib: { 15 | entry: path.resolve(__dirname, "src/hooks/index.ts"), 16 | name: "final-countdown-js", 17 | formats: ["es", "umd"], 18 | fileName: (format) => `final-countdown-js.${format}.js`, 19 | }, 20 | rollupOptions: { 21 | external: ["react", "react-dom", "styled-components"], 22 | output: { 23 | globals: { 24 | react: "React", 25 | "react-dom": "ReactDOM", 26 | "styled-components": "styled", 27 | }, 28 | }, 29 | }, 30 | }, 31 | }); 32 | -------------------------------------------------------------------------------- /src/interfaces/interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface BaseCounterOptions { 2 | startPaused?: boolean; 3 | onFinish?: () => void; 4 | } 5 | 6 | export interface TimerOptions extends BaseCounterOptions { 7 | separator?: string; 8 | } 9 | 10 | export interface StopwatchOptions extends TimerOptions { 11 | endTime?: string; 12 | } 13 | 14 | export type Zero = { 15 | withLeadingZero: string; 16 | withoutLeadingZero: string; 17 | }; 18 | 19 | export interface BaseCounterStatus { 20 | currentDays: number; 21 | currentHours: number; 22 | currentMinutes: number; 23 | currentSeconds: number; 24 | elapsedSeconds: number; 25 | remainingSeconds: number; 26 | } 27 | 28 | export interface BaseCounter { 29 | current: Zero; 30 | isPaused: boolean; 31 | isOver: boolean; 32 | pause: () => void; 33 | play: () => void; 34 | reset: () => void; 35 | togglePause: () => void; 36 | } 37 | 38 | export interface InternalCounter extends BaseCounter, BaseCounterStatus {} 39 | -------------------------------------------------------------------------------- /src/hooks/useTimer.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BaseCounter, 3 | BaseCounterStatus, 4 | Zero, 5 | TimerOptions, 6 | } from "../interfaces"; 7 | import { useInternalStopwatch, useInternalTimer } from "../helpers"; 8 | 9 | interface Timer extends BaseCounter, BaseCounterStatus { 10 | elapsedTime: Zero; 11 | } 12 | 13 | export const useTimer = (startTime: string, options?: TimerOptions): Timer => { 14 | const timer = useInternalTimer(startTime, { ...options }); 15 | const stopwatch = useInternalStopwatch({ ...options, endTime: startTime }); 16 | 17 | return { 18 | ...timer, 19 | elapsedTime: { 20 | withLeadingZero: stopwatch.current.withLeadingZero, 21 | withoutLeadingZero: stopwatch.current.withoutLeadingZero, 22 | }, 23 | pause: () => { 24 | stopwatch.pause(); 25 | timer.pause(); 26 | }, 27 | play: () => { 28 | stopwatch.play(); 29 | timer.play(); 30 | }, 31 | reset: () => { 32 | stopwatch.reset(); 33 | timer.reset(); 34 | }, 35 | togglePause: () => { 36 | stopwatch.togglePause(); 37 | timer.togglePause(); 38 | }, 39 | }; 40 | }; 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Daniel Castillo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/hooks/useStopwatch.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BaseCounter, 3 | BaseCounterStatus, 4 | Zero, 5 | StopwatchOptions, 6 | } from "../interfaces"; 7 | import { useInternalStopwatch, useInternalTimer } from "../helpers"; 8 | 9 | interface Stopwatch extends BaseCounter, BaseCounterStatus { 10 | remainingTime: Zero; 11 | } 12 | 13 | export const useStopwatch = (options?: StopwatchOptions): Stopwatch => { 14 | const stopwatch = useInternalStopwatch({ ...options }); 15 | const startTime = options?.endTime ?? "0:0:0:0"; 16 | const timer = useInternalTimer(startTime, { ...options }); 17 | 18 | return { 19 | ...stopwatch, 20 | remainingTime: { 21 | withLeadingZero: timer.current.withLeadingZero, 22 | withoutLeadingZero: timer.current.withoutLeadingZero, 23 | }, 24 | pause: () => { 25 | stopwatch.pause(); 26 | timer.pause(); 27 | }, 28 | play: () => { 29 | stopwatch.play(); 30 | timer.play(); 31 | }, 32 | reset: () => { 33 | stopwatch.reset(); 34 | timer.reset(); 35 | }, 36 | togglePause: () => { 37 | stopwatch.togglePause(); 38 | timer.togglePause(); 39 | }, 40 | }; 41 | }; 42 | -------------------------------------------------------------------------------- /src/helpers/parseTime.ts: -------------------------------------------------------------------------------- 1 | export const parseTime = (time: string) => { 2 | const hookTime = time.split(":"); 3 | 4 | if (hookTime.length !== 4) { 5 | throw new Error( 6 | "Invalid time parameter format. The time parameters has to be in the dd:hh:mm:ss format." 7 | ); 8 | } 9 | 10 | const [days, hours, minutes, seconds] = hookTime.map((value) => { 11 | const temp = Number(value); 12 | 13 | if (isNaN(temp)) { 14 | throw new Error( 15 | "Invalid number in time parameter. Each element in the time parameter has to be a valid number." 16 | ); 17 | } 18 | return temp; 19 | }); 20 | 21 | if (days < 0) { 22 | throw new Error( 23 | "Invalid range in time parameter. The days element has to be more or equal than 0." 24 | ); 25 | } else if (hours < 0 || hours >= 24) { 26 | throw new Error( 27 | "Invalid range in time parameter. The hours element has to be more or equal than 0 or less than 24." 28 | ); 29 | } else if (minutes < 0 || minutes >= 60) { 30 | throw new Error( 31 | "Invalid range in time parameter. The minutes element has to be more or equal than 0 or less than 60." 32 | ); 33 | } else if (seconds < 0 || seconds >= 60) { 34 | throw new Error( 35 | "Invalid range in time parameter. The seconds element has to be more or equal than 0 or less than 60." 36 | ); 37 | } 38 | 39 | return { days, hours, minutes, seconds }; 40 | }; 41 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { useStopwatch } from "./hooks"; 2 | 3 | const App = () => { 4 | const { 5 | current, 6 | remainingTime, 7 | currentDays, 8 | currentHours, 9 | currentMinutes, 10 | currentSeconds, 11 | elapsedSeconds, 12 | remainingSeconds, 13 | isPaused, 14 | isOver, 15 | pause, 16 | play, 17 | reset, 18 | togglePause, 19 | } = useStopwatch({ 20 | endTime: "00:00:00:10", 21 | startPaused: true, 22 | separator: "-", 23 | onFinish: () => console.log("Stopwatch ended"), 24 | }); 25 | 26 | return ( 27 |
28 |

Stopwatch value: {current.withLeadingZero}

29 |

Stopwatch value: {current.withoutLeadingZero}

30 |

Remaining time: {remainingTime.withLeadingZero}

31 |

Remaining time: {remainingTime.withoutLeadingZero}

32 |

Days: {currentDays}

33 |

Hours: {currentHours}

34 |

Minutes: {currentMinutes}

35 |

Seconds: {currentSeconds}

36 |

Elapsed seconds: {elapsedSeconds}

37 |

Remaining seconds: {remainingSeconds}

38 |

Is the counter paused? {isPaused ? "Yes" : "No"}

39 |

Has the counter over? {isOver ? "Yes" : "No"}

40 | 41 | 42 | 43 | 44 |
45 | ); 46 | }; 47 | 48 | export default App; 49 | -------------------------------------------------------------------------------- /src/helpers/useCounter.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import { BaseCounter, BaseCounterOptions } from "../interfaces"; 3 | import { addLeadingZero } from "."; 4 | 5 | export const useCounter = ( 6 | min: number, 7 | max: number, 8 | isCountingUp: boolean, 9 | options: BaseCounterOptions 10 | ): BaseCounter => { 11 | if (min >= max) { 12 | throw new Error("The min parameter has to be less than the max parameter."); 13 | } 14 | 15 | const { startPaused, onFinish } = options; 16 | const [count, setCount] = useState(isCountingUp ? min : max); 17 | const [paused, setPaused] = useState(startPaused ?? false); 18 | const [isOver, setIsOver] = useState(false); 19 | 20 | useEffect(() => { 21 | if (paused) { 22 | return; 23 | } 24 | 25 | const interval = setInterval(() => { 26 | setCount((prev) => { 27 | return isCountingUp ? prev + 1 : prev - 1; 28 | }); 29 | }, 1000); 30 | 31 | if ((count <= min && !isCountingUp) || (count >= max && isCountingUp)) { 32 | setIsOver(true); 33 | clearInterval(interval); 34 | return; 35 | } 36 | 37 | return () => clearInterval(interval); 38 | }, [count, min, max, paused, isCountingUp]); 39 | 40 | useEffect(() => { 41 | isOver && onFinish && onFinish(); 42 | }, [isOver]); 43 | 44 | return { 45 | current: { 46 | withLeadingZero: addLeadingZero(count), 47 | withoutLeadingZero: count.toString(), 48 | }, 49 | isPaused: paused, 50 | isOver, 51 | pause: () => setPaused(true), 52 | play: () => setPaused(false), 53 | reset: () => { 54 | setIsOver(false); 55 | setCount(isCountingUp ? min : max); 56 | }, 57 | togglePause: () => { 58 | setPaused(!paused); 59 | }, 60 | }; 61 | }; 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "final-countdown-js", 3 | "description": "A library of React hooks to manage counters, timers and stopwatches", 4 | "repository": { 5 | "type": "git", 6 | "url": "https://github.com/dlcastillop/final-countdown-js" 7 | }, 8 | "keywords": [ 9 | "timer", 10 | "timers", 11 | "stopwatch", 12 | "stopwatches", 13 | "counter", 14 | "counters" 15 | ], 16 | "author": "Daniel Castillo { 9 | const { days, hours, minutes, seconds } = parseTime(startTime); 10 | const { startPaused, separator, onFinish } = options; 11 | const [time, setTime] = useState({ days, hours, minutes, seconds }); 12 | const [paused, setPaused] = useState(startPaused ?? false); 13 | const divider = separator ?? ":"; 14 | const [isOver, setIsOver] = useState(false); 15 | 16 | useEffect(() => { 17 | if (paused) { 18 | return; 19 | } 20 | 21 | const interval = setInterval(() => { 22 | setTime((prev) => { 23 | let d = prev.days; 24 | let h = prev.hours; 25 | let m = prev.minutes; 26 | let s = prev.seconds; 27 | 28 | if (s - 1 < 0) { 29 | s = 59; 30 | if (m - 1 < 0) { 31 | m = 59; 32 | if (h - 1 < 0) { 33 | h = 23; 34 | if (d - 1 >= 0) { 35 | d--; 36 | } 37 | } else { 38 | h--; 39 | } 40 | } else { 41 | m--; 42 | } 43 | } else { 44 | s--; 45 | } 46 | 47 | return { days: d, hours: h, minutes: m, seconds: s }; 48 | }); 49 | }, 1000); 50 | 51 | if ( 52 | time.seconds === 0 && 53 | time.minutes === 0 && 54 | time.hours === 0 && 55 | time.days === 0 56 | ) { 57 | setIsOver(true); 58 | clearInterval(interval); 59 | return; 60 | } 61 | 62 | return () => clearInterval(interval); 63 | }, [days, hours, minutes, seconds, time, paused]); 64 | 65 | useEffect(() => { 66 | isOver && onFinish && onFinish(); 67 | }, [isOver]); 68 | 69 | return { 70 | current: { 71 | withLeadingZero: `${addLeadingZero(time.days)}${divider}${addLeadingZero( 72 | time.hours 73 | )}${divider}${addLeadingZero(time.minutes)}${divider}${addLeadingZero( 74 | time.seconds 75 | )}`, 76 | withoutLeadingZero: `${time.days}${divider}${time.hours}${divider}${time.minutes}${divider}${time.seconds}`, 77 | }, 78 | isPaused: paused, 79 | isOver, 80 | currentDays: time.days, 81 | currentHours: time.hours, 82 | currentMinutes: time.minutes, 83 | currentSeconds: time.seconds, 84 | elapsedSeconds: 85 | days * 86400 + 86 | hours * 3600 + 87 | minutes * 60 + 88 | seconds - 89 | (time.days * 86400 + 90 | time.hours * 3600 + 91 | time.minutes * 60 + 92 | time.seconds), 93 | remainingSeconds: 94 | time.days * 86400 + time.hours * 3600 + time.minutes * 60 + time.seconds, 95 | pause: () => setPaused(true), 96 | play: () => setPaused(false), 97 | reset: () => { 98 | setIsOver(false); 99 | setTime({ days, hours, minutes, seconds }); 100 | }, 101 | togglePause: () => { 102 | setPaused(!paused); 103 | }, 104 | }; 105 | }; 106 | -------------------------------------------------------------------------------- /src/helpers/useInternalStopwatch.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import { addLeadingZero, parseTime } from "../helpers"; 3 | import { InternalCounter, StopwatchOptions } from "../interfaces"; 4 | 5 | export const useInternalStopwatch = ( 6 | options: StopwatchOptions 7 | ): InternalCounter => { 8 | const { startPaused, separator, onFinish, endTime } = options; 9 | const { days, hours, minutes, seconds } = parseTime(endTime ?? "0:0:0:0"); 10 | const [time, setTime] = useState({ 11 | days: 0, 12 | hours: 0, 13 | minutes: 0, 14 | seconds: 0, 15 | }); 16 | const [paused, setPaused] = useState(startPaused ?? false); 17 | const divider = separator ?? ":"; 18 | const [isOver, setIsOver] = useState(false); 19 | 20 | useEffect(() => { 21 | if (paused) { 22 | return; 23 | } 24 | 25 | const interval = setInterval(() => { 26 | setTime((prev) => { 27 | let d = prev.days; 28 | let h = prev.hours; 29 | let m = prev.minutes; 30 | let s = prev.seconds; 31 | 32 | if (s + 1 >= 60) { 33 | s = 0; 34 | if (m + 1 >= 60) { 35 | m = 0; 36 | if (h + 1 >= 24) { 37 | h = 0; 38 | d++; 39 | } else { 40 | h++; 41 | } 42 | } else { 43 | m++; 44 | } 45 | } else { 46 | s++; 47 | } 48 | 49 | return { days: d, hours: h, minutes: m, seconds: s }; 50 | }); 51 | }, 1000); 52 | 53 | if ( 54 | endTime && 55 | time.seconds === seconds && 56 | time.minutes === minutes && 57 | time.hours === hours && 58 | time.days === days 59 | ) { 60 | setIsOver(true); 61 | clearInterval(interval); 62 | return; 63 | } 64 | 65 | return () => clearInterval(interval); 66 | }, [days, hours, minutes, seconds, time, paused]); 67 | 68 | useEffect(() => { 69 | isOver && onFinish && onFinish(); 70 | }, [isOver]); 71 | 72 | return { 73 | current: { 74 | withLeadingZero: `${addLeadingZero(time.days)}${divider}${addLeadingZero( 75 | time.hours 76 | )}${divider}${addLeadingZero(time.minutes)}${divider}${addLeadingZero( 77 | time.seconds 78 | )}`, 79 | withoutLeadingZero: `${time.days}${divider}${time.hours}${divider}${time.minutes}${divider}${time.seconds}`, 80 | }, 81 | isPaused: paused, 82 | isOver, 83 | currentDays: time.days, 84 | currentHours: time.hours, 85 | currentMinutes: time.minutes, 86 | currentSeconds: time.seconds, 87 | elapsedSeconds: 88 | time.days * 86400 + time.hours * 3600 + time.minutes * 60 + time.seconds, 89 | remainingSeconds: endTime 90 | ? days * 86400 + 91 | hours * 3600 + 92 | minutes * 60 + 93 | seconds - 94 | (time.days * 86400 + 95 | time.hours * 3600 + 96 | time.minutes * 60 + 97 | time.seconds) 98 | : 0, 99 | pause: () => setPaused(true), 100 | play: () => setPaused(false), 101 | reset: () => { 102 | setIsOver(false); 103 | setTime({ days: 0, hours: 0, minutes: 0, seconds: 0 }); 104 | }, 105 | togglePause: () => { 106 | setPaused(!paused); 107 | }, 108 | }; 109 | }; 110 | -------------------------------------------------------------------------------- /vite.config.ts.timestamp-1692018226773-58641b11ebb79.mjs: -------------------------------------------------------------------------------- 1 | // vite.config.ts 2 | import react from "file:///D:/Work/01.%20Proyectos/final-countdown-js/node_modules/@vitejs/plugin-react/dist/index.mjs"; 3 | import path from "node:path"; 4 | import { defineConfig } from "file:///D:/Work/01.%20Proyectos/final-countdown-js/node_modules/vite/dist/node/index.js"; 5 | import dts from "file:///D:/Work/01.%20Proyectos/final-countdown-js/node_modules/vite-plugin-dts/dist/index.mjs"; 6 | var __vite_injected_original_dirname = "D:\\Work\\01. Proyectos\\final-countdown-js"; 7 | var vite_config_default = defineConfig({ 8 | plugins: [ 9 | react(), 10 | dts({ 11 | insertTypesEntry: true 12 | }) 13 | ], 14 | build: { 15 | lib: { 16 | entry: path.resolve(__vite_injected_original_dirname, "src/hooks/index.ts"), 17 | name: "final-countdown-js", 18 | formats: ["es", "umd"], 19 | fileName: (format) => `final-countdown-js.${format}.js` 20 | }, 21 | rollupOptions: { 22 | external: ["react", "react-dom", "styled-components"], 23 | output: { 24 | globals: { 25 | react: "React", 26 | "react-dom": "ReactDOM", 27 | "styled-components": "styled" 28 | } 29 | } 30 | } 31 | } 32 | }); 33 | export { 34 | vite_config_default as default 35 | }; 36 | //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxXb3JrXFxcXDAxLiBQcm95ZWN0b3NcXFxcZmluYWwtY291bnRkb3duLWpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJEOlxcXFxXb3JrXFxcXDAxLiBQcm95ZWN0b3NcXFxcZmluYWwtY291bnRkb3duLWpzXFxcXHZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9EOi9Xb3JrLzAxLiUyMFByb3llY3Rvcy9maW5hbC1jb3VudGRvd24tanMvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSBcIkB2aXRlanMvcGx1Z2luLXJlYWN0XCI7XHJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcclxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVcIjtcclxuaW1wb3J0IGR0cyBmcm9tIFwidml0ZS1wbHVnaW4tZHRzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtcclxuICAgIHJlYWN0KCksXHJcbiAgICBkdHMoe1xyXG4gICAgICBpbnNlcnRUeXBlc0VudHJ5OiB0cnVlLFxyXG4gICAgfSksXHJcbiAgXSxcclxuICBidWlsZDoge1xyXG4gICAgbGliOiB7XHJcbiAgICAgIGVudHJ5OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcInNyYy9ob29rcy9pbmRleC50c1wiKSxcclxuICAgICAgbmFtZTogXCJmaW5hbC1jb3VudGRvd24tanNcIixcclxuICAgICAgZm9ybWF0czogW1wiZXNcIiwgXCJ1bWRcIl0sXHJcbiAgICAgIGZpbGVOYW1lOiAoZm9ybWF0KSA9PiBgZmluYWwtY291bnRkb3duLWpzLiR7Zm9ybWF0fS5qc2AsXHJcbiAgICB9LFxyXG4gICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICBleHRlcm5hbDogW1wicmVhY3RcIiwgXCJyZWFjdC1kb21cIiwgXCJzdHlsZWQtY29tcG9uZW50c1wiXSxcclxuICAgICAgb3V0cHV0OiB7XHJcbiAgICAgICAgZ2xvYmFsczoge1xyXG4gICAgICAgICAgcmVhY3Q6IFwiUmVhY3RcIixcclxuICAgICAgICAgIFwicmVhY3QtZG9tXCI6IFwiUmVhY3RET01cIixcclxuICAgICAgICAgIFwic3R5bGVkLWNvbXBvbmVudHNcIjogXCJzdHlsZWRcIixcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICB9LFxyXG59KTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFvVCxPQUFPLFdBQVc7QUFDdFUsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsb0JBQW9CO0FBQzdCLE9BQU8sU0FBUztBQUhoQixJQUFNLG1DQUFtQztBQUt6QyxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixTQUFTO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixJQUFJO0FBQUEsTUFDRixrQkFBa0I7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0wsS0FBSztBQUFBLE1BQ0gsT0FBTyxLQUFLLFFBQVEsa0NBQVcsb0JBQW9CO0FBQUEsTUFDbkQsTUFBTTtBQUFBLE1BQ04sU0FBUyxDQUFDLE1BQU0sS0FBSztBQUFBLE1BQ3JCLFVBQVUsQ0FBQyxXQUFXLHNCQUFzQixNQUFNO0FBQUEsSUFDcEQ7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLFVBQVUsQ0FBQyxTQUFTLGFBQWEsbUJBQW1CO0FBQUEsTUFDcEQsUUFBUTtBQUFBLFFBQ04sU0FBUztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsYUFBYTtBQUFBLFVBQ2IscUJBQXFCO0FBQUEsUUFDdkI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= 37 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | dlcastillo3015@gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Final Countdown JS 2 | 3 | Final Countdown JS is a library of React hooks to manage counters, timers and stopwatches. 4 | 5 | ## Featured 6 | 7 | Final Countdown JS - A react hook library to handle all kinds of timers | Product Hunt 8 | 9 | [Featured on DevHunt with 19 upvotes ending up in the 6th position of the week.](https://devhunt.org/tool/final-countdown-js) 10 | 11 | ## Installation 12 | 13 | You can use npm, yarn or pnpm to install Final Countdown JS. 14 | 15 | ```bash 16 | npm install final-countdown-js 17 | ``` 18 | 19 | ```bash 20 | yarn add final-countdown-js 21 | ``` 22 | 23 | ```bash 24 | pnpm install final-countdown-js 25 | ``` 26 | 27 | ## Hooks 28 | 29 | > [!NOTE] 30 | > Do you want to use these hooks, but without installing an extra dependency? Try [Nova.js: a collection of dependency-free React hooks](https://novajs.co/). 31 | 32 | ### useCountDown 33 | 34 | The useCountDown hook provides a simple countdown timer functionality. 35 | 36 | It takes three arguments: 37 | 38 | - `min` (number): the initial value of the counter. 39 | - `max`(number): the final value of the counter. It has to be greater than `min`. 40 | - `options`(optional object): the options for the counter. 41 | - `startPaused` (optional boolean): determines whether the counter should start in a paused state. Defaults to false. 42 | - `onFinish` (optional function): a function that will be called when the counter reaches the final value. 43 | 44 | It returns an object with the following props: 45 | 46 | - `current`: an object holding the current time of the counter in both leading zero and non-leading zero formats. This object has two properties: 47 | - `withLeadingZero`: a string indicating the current time of the counter with leading zeroes where necessary. 48 | - `withoutLeadingZero`: a string indicating the current time of the counter without leading zeros. 49 | - `isPaused`: a boolean value indicating if the counter is currently paused. 50 | - `isOver`: a boolean value indicating if the counter has finished running. 51 | - `pause`: a function that, when called, will pause the counter. 52 | - `play`: a function that, when called, will resume (or start) the counter. 53 | - `reset`: a function that, when called, will reset the counter. 54 | - `togglePause`: a function that, when called, will toggle between pausing and playing the counter. 55 | 56 | Example: 57 | 58 | ```tsx 59 | import { useCountDown } from "final-countdown-js"; 60 | 61 | const ReactCounter = () => { 62 | const { current, isPaused, isOver, pause, play, reset, togglePause } = 63 | useCountDown(0, 10, { 64 | startPaused: false, 65 | onFinish: () => console.log("Counter ended"), 66 | }); 67 | 68 | return ( 69 |
70 |

Counter value: {current.withLeadingZero}

71 |

Counter value: {current.withoutLeadingZero}

72 |

Is the counter paused? {isPaused ? "Yes" : "No"}

73 |

Has the counter over? {isOver ? "Yes" : "No"}

74 | 75 | 76 | 77 | 78 |
79 | ); 80 | }; 81 | 82 | export default ReactCounter; 83 | ``` 84 | 85 | ### useCountUp 86 | 87 | The useCountUp hook provides a simple countup timer functionality. 88 | 89 | It takes three arguments: 90 | 91 | - `min` (number): the initial value of the counter. 92 | - `max`(number): the final value of the counter. It has to be greater than `min`. 93 | - `options`(optional object): the options for the counter. 94 | - `startPaused` (optional boolean): determines whether the counter should start in a paused state. Defaults to false. 95 | - `onFinish` (optional function): a function that will be called when the counter reaches the final value. 96 | 97 | It returns an object with the following props: 98 | 99 | - `current`: an object holding the current time of the counter in both leading zero and non-leading zero formats. This object has two properties: 100 | - `withLeadingZero`: a string indicating the current time of the counter with leading zeroes where necessary. 101 | - `withoutLeadingZero`: a string indicating the current time of the counter without leading zeros. 102 | - `isPaused`: a boolean value indicating if the counter is currently paused. 103 | - `isOver`: a boolean value indicating if the counter has finished running. 104 | - `pause`: a function that, when called, will pause the counter. 105 | - `play`: a function that, when called, will resume (or start) the counter. 106 | - `reset`: a function that, when called, will reset the counter. 107 | - `togglePause`: a function that, when called, will toggle between pausing and playing the counter. 108 | 109 | Example: 110 | 111 | ```tsx 112 | import { useCountUp } from "final-countdown-js"; 113 | 114 | const ReactCounter = () => { 115 | const { current, isPaused, isOver, pause, play, reset, togglePause } = 116 | useCountUp(0, 10, { 117 | startPaused: false, 118 | onFinish: () => console.log("Counter ended"), 119 | }); 120 | 121 | return ( 122 |
123 |

Counter value: {current.withLeadingZero}

124 |

Counter value: {current.withoutLeadingZero}

125 |

Is the counter paused? {isPaused ? "Yes" : "No"}

126 |

Has the counter over? {isOver ? "Yes" : "No"}

127 | 128 | 129 | 130 | 131 |
132 | ); 133 | }; 134 | 135 | export default ReactCounter; 136 | ``` 137 | 138 | ### useStopwatch 139 | 140 | The useStopwatch hook provides stopwatch functionality with or without a limit. 141 | 142 | It takes one argument: 143 | 144 | - `options`(optional object): the options for the stopwatch. 145 | - `endTime` (options string): specifies the time at which the stopwatch will stop. It must be in `dd:hh:mm:ss` format. If not specified, the stopwatch will not end. 146 | - `startPaused` (optional boolean): determines whether the stopwatch should start in a paused state. Defaults to false. 147 | - `onFinish` (optional function): a function that will be called when the stopwatch reaches the final value. 148 | - `separator` (optional string): specifies the separator to be used between days, hours, minutes, and seconds when the time is represented as a string. By default, colon (:) is used as a separator. 149 | 150 | It returns an object with the following props: 151 | 152 | - `current`: an object holding the current time of the stopwatch in both leading zero and non-leading zero formats. This object has two properties: 153 | - `withLeadingZero`: a string indicating the current time of the stopwatch with leading zeroes where necessary. 154 | - `withoutLeadingZero`: a string indicating the current time of the stopwatch without leading zeros. 155 | - `isPaused`: a boolean value indicating if the stopwatch is currently paused. 156 | - `isOver`: a boolean value indicating if the stopwatch has finished running. 157 | - `currentDays`: a number indicating the current value of the days on the stopwatch. 158 | - `currentHours`: a number indicating the current value of the hours on the stopwatch. 159 | - `currentMinutes`: a number indicating the current value of the minutes on the stopwatch. 160 | - `currentSeconds`: a number indicating the current value of the seconds on the stopwatch. 161 | - `elapsedSeconds`: a number indicating the total elapsed time, calculated in seconds, since the stopwatch started. 162 | - `remainingSeconds`: a number indicating the total remaining time, calculated in seconds, until the stopwatch reaches the initially set time. If `endTime` is not specified, it will always be 0. 163 | - `remainingTime`: analogous to the `current` object, this object holds the remaining time in both formats: 164 | - `withLeadingZero`: a string indicating the remaining time with leading zeroes. If `endTime` is not specified, it will always be 00:00:00:00. 165 | - `withoutLeadingZero`: a string indicating the remaining time without leading zeroes. If `endTime` is not specified, it will always be 0:0:0:0. 166 | - `pause`: a function that, when called, will pause the stopwatch. 167 | - `play`: a function that, when called, will resume (or start) the stopwatch. 168 | - `reset`: a function that, when called, will reset the stopwatch. 169 | - `togglePause`: a function that, when called, will toggle between pausing and playing the stopwatch. 170 | 171 | Example: 172 | 173 | ```tsx 174 | import { useStopwatch } from "final-countdown-js"; 175 | 176 | const ReactCounter = () => { 177 | const { 178 | current, 179 | remainingTime, 180 | currentDays, 181 | currentHours, 182 | currentMinutes, 183 | currentSeconds, 184 | elapsedSeconds, 185 | remainingSeconds, 186 | isPaused, 187 | isOver, 188 | pause, 189 | play, 190 | reset, 191 | togglePause, 192 | } = useStopwatch({ 193 | endTime: "00:00:00:10", 194 | startPaused: true, 195 | separator: "-", 196 | onFinish: () => console.log("Stopwatch ended"), 197 | }); 198 | 199 | return ( 200 |
201 |

Stopwatch value: {current.withLeadingZero}

202 |

Stopwatch value: {current.withoutLeadingZero}

203 |

Remaining time: {remainingTime.withLeadingZero}

204 |

Remaining time: {remainingTime.withoutLeadingZero}

205 |

Days: {currentDays}

206 |

Hours: {currentHours}

207 |

Minutes: {currentMinutes}

208 |

Seconds: {currentSeconds}

209 |

Elapsed seconds: {elapsedSeconds}

210 |

Remaining seconds: {remainingSeconds}

211 |

Is the counter paused? {isPaused ? "Yes" : "No"}

212 |

Has the counter over? {isOver ? "Yes" : "No"}

213 | 214 | 215 | 216 | 217 |
218 | ); 219 | }; 220 | 221 | export default ReactCounter; 222 | ``` 223 | 224 | ### useTimer 225 | 226 | The useTimer hook provides timer functionality. 227 | 228 | It takes two arguments: 229 | 230 | - `startTime` (string): specifies the time at which the timer will start. It must be in `dd:hh:mm:ss` format. 231 | - `options`(optional object): the options for the timer. 232 | - `startPaused` (optional boolean): determines whether the timer should start in a paused state. Defaults to false. 233 | - `onFinish` (optional function): a function that will be called when the timer reaches the final value. 234 | - `separator` (optional string): specifies the separator to be used between days, hours, minutes, and seconds when the time is represented as a string. By default, colon (:) is used as a separator. 235 | 236 | It returns an object with the following props: 237 | 238 | - `current`: an object holding the current time of the timer in both leading zero and non-leading zero formats. This object has two properties: 239 | - `withLeadingZero`: a string indicating the current time of the timer with leading zeroes where necessary. 240 | - `withoutLeadingZero`: a string indicating the current time of the timer without leading zeros. 241 | - `isPaused`: a boolean value indicating if the timer is currently paused. 242 | - `isOver`: a boolean value indicating if the timer has finished running. 243 | - `currentDays`: a number indicating the current value of the days on the timer. 244 | - `currentHours`: a number indicating the current value of the hours on the timer. 245 | - `currentMinutes`: a number indicating the current value of the minutes on the timer. 246 | - `currentSeconds`: a number indicating the current value of the seconds on the timer. 247 | - `elapsedSeconds`: a number indicating the total elapsed time, calculated in seconds, since the timer started. 248 | - `remainingSeconds`: a number indicating the total remaining time, calculated in seconds, until the timer reaches the initially set time. 249 | - `elapsedTime`: analogous to the `current` object, this object holds the elapsed time in both formats: 250 | - `withLeadingZero`: a string indicating the elapsed time with leading zeroes. 251 | - `withoutLeadingZero`: a string indicating the elapsed time without leading zeroes. 252 | - `pause`: a function that, when called, will pause the timer. 253 | - `play`: a function that, when called, will resume (or start) the timer. 254 | - `reset`: a function that, when called, will reset the timer. 255 | - `togglePause`: a function that, when called, will toggle between pausing and playing the timer. 256 | 257 | Example: 258 | 259 | ```tsx 260 | import { useTimer } from "final-countdown-js"; 261 | 262 | const ReactCounter = () => { 263 | const { 264 | current, 265 | elapsedTime, 266 | currentDays, 267 | currentHours, 268 | currentMinutes, 269 | currentSeconds, 270 | elapsedSeconds, 271 | remainingSeconds, 272 | isPaused, 273 | isOver, 274 | pause, 275 | play, 276 | reset, 277 | togglePause, 278 | } = useTimer("00:00:00:10", { 279 | startPaused: true, 280 | separator: "-", 281 | onFinish: () => console.log("Timer ended"), 282 | }); 283 | 284 | return ( 285 |
286 |

Timer value: {current.withLeadingZero}

287 |

Timer value: {current.withoutLeadingZero}

288 |

Elapsed time: {elapsedTime.withLeadingZero}

289 |

Elapsed time: {elapsedTime.withoutLeadingZero}

290 |

Days: {currentDays}

291 |

Hours: {currentHours}

292 |

Minutes: {currentMinutes}

293 |

Seconds: {currentSeconds}

294 |

Elapsed seconds: {elapsedSeconds}

295 |

Remaining seconds: {remainingSeconds}

296 |

Is the counter paused? {isPaused ? "Yes" : "No"}

297 |

Has the counter over? {isOver ? "Yes" : "No"}

298 | 299 | 300 | 301 | 302 |
303 | ); 304 | }; 305 | 306 | export default ReactCounter; 307 | ``` 308 | 309 | ## Contributions 310 | 311 | If you're interested in contributing to Final Countdown JS, please read our [contributing docs](https://github.com/dlcastillop/final-countdown-js/blob/main/CONTRIBUTING.md) before submitting a pull request. 312 | 313 | ## Support 314 | 315 | Don't forget to leave a star and [a review on Product Hunt!](https://www.producthunt.com/products/final-countdown-js/reviews/new) 316 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | '@types/react': 9 | specifier: ^18.2.14 10 | version: 18.2.35 11 | '@types/react-dom': 12 | specifier: ^18.2.6 13 | version: 18.2.14 14 | '@typescript-eslint/eslint-plugin': 15 | specifier: ^5.61.0 16 | version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.53.0)(typescript@5.2.2) 17 | '@typescript-eslint/parser': 18 | specifier: ^5.61.0 19 | version: 5.62.0(eslint@8.53.0)(typescript@5.2.2) 20 | '@vitejs/plugin-react': 21 | specifier: ^4.0.1 22 | version: 4.1.1(vite@4.5.3) 23 | eslint: 24 | specifier: ^8.44.0 25 | version: 8.53.0 26 | eslint-plugin-react-hooks: 27 | specifier: ^4.6.0 28 | version: 4.6.0(eslint@8.53.0) 29 | eslint-plugin-react-refresh: 30 | specifier: ^0.4.1 31 | version: 0.4.4(eslint@8.53.0) 32 | react: 33 | specifier: ^18.2.0 34 | version: 18.2.0 35 | react-dom: 36 | specifier: ^18.2.0 37 | version: 18.2.0(react@18.2.0) 38 | typescript: 39 | specifier: ^5.0.2 40 | version: 5.2.2 41 | vite: 42 | specifier: ^4.5.3 43 | version: 4.5.3 44 | vite-plugin-dts: 45 | specifier: ^3.3.1 46 | version: 3.6.3(typescript@5.2.2)(vite@4.5.3) 47 | 48 | packages: 49 | 50 | /@aashutoshrathi/word-wrap@1.2.6: 51 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 52 | engines: {node: '>=0.10.0'} 53 | dev: true 54 | 55 | /@ampproject/remapping@2.2.1: 56 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 57 | engines: {node: '>=6.0.0'} 58 | dependencies: 59 | '@jridgewell/gen-mapping': 0.3.3 60 | '@jridgewell/trace-mapping': 0.3.20 61 | dev: true 62 | 63 | /@babel/code-frame@7.22.13: 64 | resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} 65 | engines: {node: '>=6.9.0'} 66 | dependencies: 67 | '@babel/highlight': 7.22.20 68 | chalk: 2.4.2 69 | dev: true 70 | 71 | /@babel/compat-data@7.23.2: 72 | resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} 73 | engines: {node: '>=6.9.0'} 74 | dev: true 75 | 76 | /@babel/core@7.23.2: 77 | resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} 78 | engines: {node: '>=6.9.0'} 79 | dependencies: 80 | '@ampproject/remapping': 2.2.1 81 | '@babel/code-frame': 7.22.13 82 | '@babel/generator': 7.23.0 83 | '@babel/helper-compilation-targets': 7.22.15 84 | '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) 85 | '@babel/helpers': 7.23.2 86 | '@babel/parser': 7.23.0 87 | '@babel/template': 7.22.15 88 | '@babel/traverse': 7.23.2 89 | '@babel/types': 7.23.0 90 | convert-source-map: 2.0.0 91 | debug: 4.3.4 92 | gensync: 1.0.0-beta.2 93 | json5: 2.2.3 94 | semver: 6.3.1 95 | transitivePeerDependencies: 96 | - supports-color 97 | dev: true 98 | 99 | /@babel/generator@7.23.0: 100 | resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} 101 | engines: {node: '>=6.9.0'} 102 | dependencies: 103 | '@babel/types': 7.23.0 104 | '@jridgewell/gen-mapping': 0.3.3 105 | '@jridgewell/trace-mapping': 0.3.20 106 | jsesc: 2.5.2 107 | dev: true 108 | 109 | /@babel/helper-compilation-targets@7.22.15: 110 | resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} 111 | engines: {node: '>=6.9.0'} 112 | dependencies: 113 | '@babel/compat-data': 7.23.2 114 | '@babel/helper-validator-option': 7.22.15 115 | browserslist: 4.22.1 116 | lru-cache: 5.1.1 117 | semver: 6.3.1 118 | dev: true 119 | 120 | /@babel/helper-environment-visitor@7.22.20: 121 | resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} 122 | engines: {node: '>=6.9.0'} 123 | dev: true 124 | 125 | /@babel/helper-function-name@7.23.0: 126 | resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} 127 | engines: {node: '>=6.9.0'} 128 | dependencies: 129 | '@babel/template': 7.22.15 130 | '@babel/types': 7.23.0 131 | dev: true 132 | 133 | /@babel/helper-hoist-variables@7.22.5: 134 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 135 | engines: {node: '>=6.9.0'} 136 | dependencies: 137 | '@babel/types': 7.23.0 138 | dev: true 139 | 140 | /@babel/helper-module-imports@7.22.15: 141 | resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} 142 | engines: {node: '>=6.9.0'} 143 | dependencies: 144 | '@babel/types': 7.23.0 145 | dev: true 146 | 147 | /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): 148 | resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} 149 | engines: {node: '>=6.9.0'} 150 | peerDependencies: 151 | '@babel/core': ^7.0.0 152 | dependencies: 153 | '@babel/core': 7.23.2 154 | '@babel/helper-environment-visitor': 7.22.20 155 | '@babel/helper-module-imports': 7.22.15 156 | '@babel/helper-simple-access': 7.22.5 157 | '@babel/helper-split-export-declaration': 7.22.6 158 | '@babel/helper-validator-identifier': 7.22.20 159 | dev: true 160 | 161 | /@babel/helper-plugin-utils@7.22.5: 162 | resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} 163 | engines: {node: '>=6.9.0'} 164 | dev: true 165 | 166 | /@babel/helper-simple-access@7.22.5: 167 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 168 | engines: {node: '>=6.9.0'} 169 | dependencies: 170 | '@babel/types': 7.23.0 171 | dev: true 172 | 173 | /@babel/helper-split-export-declaration@7.22.6: 174 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 175 | engines: {node: '>=6.9.0'} 176 | dependencies: 177 | '@babel/types': 7.23.0 178 | dev: true 179 | 180 | /@babel/helper-string-parser@7.22.5: 181 | resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} 182 | engines: {node: '>=6.9.0'} 183 | dev: true 184 | 185 | /@babel/helper-validator-identifier@7.22.20: 186 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 187 | engines: {node: '>=6.9.0'} 188 | dev: true 189 | 190 | /@babel/helper-validator-option@7.22.15: 191 | resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} 192 | engines: {node: '>=6.9.0'} 193 | dev: true 194 | 195 | /@babel/helpers@7.23.2: 196 | resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} 197 | engines: {node: '>=6.9.0'} 198 | dependencies: 199 | '@babel/template': 7.22.15 200 | '@babel/traverse': 7.23.2 201 | '@babel/types': 7.23.0 202 | transitivePeerDependencies: 203 | - supports-color 204 | dev: true 205 | 206 | /@babel/highlight@7.22.20: 207 | resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} 208 | engines: {node: '>=6.9.0'} 209 | dependencies: 210 | '@babel/helper-validator-identifier': 7.22.20 211 | chalk: 2.4.2 212 | js-tokens: 4.0.0 213 | dev: true 214 | 215 | /@babel/parser@7.23.0: 216 | resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} 217 | engines: {node: '>=6.0.0'} 218 | hasBin: true 219 | dependencies: 220 | '@babel/types': 7.23.0 221 | dev: true 222 | 223 | /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): 224 | resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} 225 | engines: {node: '>=6.9.0'} 226 | peerDependencies: 227 | '@babel/core': ^7.0.0-0 228 | dependencies: 229 | '@babel/core': 7.23.2 230 | '@babel/helper-plugin-utils': 7.22.5 231 | dev: true 232 | 233 | /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): 234 | resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} 235 | engines: {node: '>=6.9.0'} 236 | peerDependencies: 237 | '@babel/core': ^7.0.0-0 238 | dependencies: 239 | '@babel/core': 7.23.2 240 | '@babel/helper-plugin-utils': 7.22.5 241 | dev: true 242 | 243 | /@babel/template@7.22.15: 244 | resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} 245 | engines: {node: '>=6.9.0'} 246 | dependencies: 247 | '@babel/code-frame': 7.22.13 248 | '@babel/parser': 7.23.0 249 | '@babel/types': 7.23.0 250 | dev: true 251 | 252 | /@babel/traverse@7.23.2: 253 | resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} 254 | engines: {node: '>=6.9.0'} 255 | dependencies: 256 | '@babel/code-frame': 7.22.13 257 | '@babel/generator': 7.23.0 258 | '@babel/helper-environment-visitor': 7.22.20 259 | '@babel/helper-function-name': 7.23.0 260 | '@babel/helper-hoist-variables': 7.22.5 261 | '@babel/helper-split-export-declaration': 7.22.6 262 | '@babel/parser': 7.23.0 263 | '@babel/types': 7.23.0 264 | debug: 4.3.4 265 | globals: 11.12.0 266 | transitivePeerDependencies: 267 | - supports-color 268 | dev: true 269 | 270 | /@babel/types@7.23.0: 271 | resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} 272 | engines: {node: '>=6.9.0'} 273 | dependencies: 274 | '@babel/helper-string-parser': 7.22.5 275 | '@babel/helper-validator-identifier': 7.22.20 276 | to-fast-properties: 2.0.0 277 | dev: true 278 | 279 | /@esbuild/android-arm64@0.18.20: 280 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 281 | engines: {node: '>=12'} 282 | cpu: [arm64] 283 | os: [android] 284 | requiresBuild: true 285 | dev: true 286 | optional: true 287 | 288 | /@esbuild/android-arm@0.18.20: 289 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 290 | engines: {node: '>=12'} 291 | cpu: [arm] 292 | os: [android] 293 | requiresBuild: true 294 | dev: true 295 | optional: true 296 | 297 | /@esbuild/android-x64@0.18.20: 298 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 299 | engines: {node: '>=12'} 300 | cpu: [x64] 301 | os: [android] 302 | requiresBuild: true 303 | dev: true 304 | optional: true 305 | 306 | /@esbuild/darwin-arm64@0.18.20: 307 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 308 | engines: {node: '>=12'} 309 | cpu: [arm64] 310 | os: [darwin] 311 | requiresBuild: true 312 | dev: true 313 | optional: true 314 | 315 | /@esbuild/darwin-x64@0.18.20: 316 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 317 | engines: {node: '>=12'} 318 | cpu: [x64] 319 | os: [darwin] 320 | requiresBuild: true 321 | dev: true 322 | optional: true 323 | 324 | /@esbuild/freebsd-arm64@0.18.20: 325 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 326 | engines: {node: '>=12'} 327 | cpu: [arm64] 328 | os: [freebsd] 329 | requiresBuild: true 330 | dev: true 331 | optional: true 332 | 333 | /@esbuild/freebsd-x64@0.18.20: 334 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 335 | engines: {node: '>=12'} 336 | cpu: [x64] 337 | os: [freebsd] 338 | requiresBuild: true 339 | dev: true 340 | optional: true 341 | 342 | /@esbuild/linux-arm64@0.18.20: 343 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 344 | engines: {node: '>=12'} 345 | cpu: [arm64] 346 | os: [linux] 347 | requiresBuild: true 348 | dev: true 349 | optional: true 350 | 351 | /@esbuild/linux-arm@0.18.20: 352 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 353 | engines: {node: '>=12'} 354 | cpu: [arm] 355 | os: [linux] 356 | requiresBuild: true 357 | dev: true 358 | optional: true 359 | 360 | /@esbuild/linux-ia32@0.18.20: 361 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 362 | engines: {node: '>=12'} 363 | cpu: [ia32] 364 | os: [linux] 365 | requiresBuild: true 366 | dev: true 367 | optional: true 368 | 369 | /@esbuild/linux-loong64@0.18.20: 370 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 371 | engines: {node: '>=12'} 372 | cpu: [loong64] 373 | os: [linux] 374 | requiresBuild: true 375 | dev: true 376 | optional: true 377 | 378 | /@esbuild/linux-mips64el@0.18.20: 379 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 380 | engines: {node: '>=12'} 381 | cpu: [mips64el] 382 | os: [linux] 383 | requiresBuild: true 384 | dev: true 385 | optional: true 386 | 387 | /@esbuild/linux-ppc64@0.18.20: 388 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 389 | engines: {node: '>=12'} 390 | cpu: [ppc64] 391 | os: [linux] 392 | requiresBuild: true 393 | dev: true 394 | optional: true 395 | 396 | /@esbuild/linux-riscv64@0.18.20: 397 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 398 | engines: {node: '>=12'} 399 | cpu: [riscv64] 400 | os: [linux] 401 | requiresBuild: true 402 | dev: true 403 | optional: true 404 | 405 | /@esbuild/linux-s390x@0.18.20: 406 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 407 | engines: {node: '>=12'} 408 | cpu: [s390x] 409 | os: [linux] 410 | requiresBuild: true 411 | dev: true 412 | optional: true 413 | 414 | /@esbuild/linux-x64@0.18.20: 415 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 416 | engines: {node: '>=12'} 417 | cpu: [x64] 418 | os: [linux] 419 | requiresBuild: true 420 | dev: true 421 | optional: true 422 | 423 | /@esbuild/netbsd-x64@0.18.20: 424 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 425 | engines: {node: '>=12'} 426 | cpu: [x64] 427 | os: [netbsd] 428 | requiresBuild: true 429 | dev: true 430 | optional: true 431 | 432 | /@esbuild/openbsd-x64@0.18.20: 433 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 434 | engines: {node: '>=12'} 435 | cpu: [x64] 436 | os: [openbsd] 437 | requiresBuild: true 438 | dev: true 439 | optional: true 440 | 441 | /@esbuild/sunos-x64@0.18.20: 442 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 443 | engines: {node: '>=12'} 444 | cpu: [x64] 445 | os: [sunos] 446 | requiresBuild: true 447 | dev: true 448 | optional: true 449 | 450 | /@esbuild/win32-arm64@0.18.20: 451 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 452 | engines: {node: '>=12'} 453 | cpu: [arm64] 454 | os: [win32] 455 | requiresBuild: true 456 | dev: true 457 | optional: true 458 | 459 | /@esbuild/win32-ia32@0.18.20: 460 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 461 | engines: {node: '>=12'} 462 | cpu: [ia32] 463 | os: [win32] 464 | requiresBuild: true 465 | dev: true 466 | optional: true 467 | 468 | /@esbuild/win32-x64@0.18.20: 469 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 470 | engines: {node: '>=12'} 471 | cpu: [x64] 472 | os: [win32] 473 | requiresBuild: true 474 | dev: true 475 | optional: true 476 | 477 | /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): 478 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 479 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 480 | peerDependencies: 481 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 482 | dependencies: 483 | eslint: 8.53.0 484 | eslint-visitor-keys: 3.4.3 485 | dev: true 486 | 487 | /@eslint-community/regexpp@4.10.0: 488 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 489 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 490 | dev: true 491 | 492 | /@eslint/eslintrc@2.1.3: 493 | resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} 494 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 495 | dependencies: 496 | ajv: 6.12.6 497 | debug: 4.3.4 498 | espree: 9.6.1 499 | globals: 13.23.0 500 | ignore: 5.2.4 501 | import-fresh: 3.3.0 502 | js-yaml: 4.1.0 503 | minimatch: 3.1.2 504 | strip-json-comments: 3.1.1 505 | transitivePeerDependencies: 506 | - supports-color 507 | dev: true 508 | 509 | /@eslint/js@8.53.0: 510 | resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} 511 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 512 | dev: true 513 | 514 | /@humanwhocodes/config-array@0.11.13: 515 | resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} 516 | engines: {node: '>=10.10.0'} 517 | dependencies: 518 | '@humanwhocodes/object-schema': 2.0.1 519 | debug: 4.3.4 520 | minimatch: 3.1.2 521 | transitivePeerDependencies: 522 | - supports-color 523 | dev: true 524 | 525 | /@humanwhocodes/module-importer@1.0.1: 526 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 527 | engines: {node: '>=12.22'} 528 | dev: true 529 | 530 | /@humanwhocodes/object-schema@2.0.1: 531 | resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} 532 | dev: true 533 | 534 | /@jridgewell/gen-mapping@0.3.3: 535 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 536 | engines: {node: '>=6.0.0'} 537 | dependencies: 538 | '@jridgewell/set-array': 1.1.2 539 | '@jridgewell/sourcemap-codec': 1.4.15 540 | '@jridgewell/trace-mapping': 0.3.20 541 | dev: true 542 | 543 | /@jridgewell/resolve-uri@3.1.1: 544 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 545 | engines: {node: '>=6.0.0'} 546 | dev: true 547 | 548 | /@jridgewell/set-array@1.1.2: 549 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 550 | engines: {node: '>=6.0.0'} 551 | dev: true 552 | 553 | /@jridgewell/sourcemap-codec@1.4.15: 554 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 555 | dev: true 556 | 557 | /@jridgewell/trace-mapping@0.3.20: 558 | resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} 559 | dependencies: 560 | '@jridgewell/resolve-uri': 3.1.1 561 | '@jridgewell/sourcemap-codec': 1.4.15 562 | dev: true 563 | 564 | /@microsoft/api-extractor-model@7.28.2: 565 | resolution: {integrity: sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig==} 566 | dependencies: 567 | '@microsoft/tsdoc': 0.14.2 568 | '@microsoft/tsdoc-config': 0.16.2 569 | '@rushstack/node-core-library': 3.61.0 570 | transitivePeerDependencies: 571 | - '@types/node' 572 | dev: true 573 | 574 | /@microsoft/api-extractor@7.38.2: 575 | resolution: {integrity: sha512-JOARuhTwOcOMIU0O2czscoJy3ddVzIRhSA9/7T1ALuZSNphgWsPk+Bv4E7AnBDmTV4pP4lBNLtCxEHjjpWaytQ==} 576 | hasBin: true 577 | dependencies: 578 | '@microsoft/api-extractor-model': 7.28.2 579 | '@microsoft/tsdoc': 0.14.2 580 | '@microsoft/tsdoc-config': 0.16.2 581 | '@rushstack/node-core-library': 3.61.0 582 | '@rushstack/rig-package': 0.5.1 583 | '@rushstack/ts-command-line': 4.17.1 584 | colors: 1.2.5 585 | lodash: 4.17.21 586 | resolve: 1.22.8 587 | semver: 7.5.4 588 | source-map: 0.6.1 589 | typescript: 5.0.4 590 | transitivePeerDependencies: 591 | - '@types/node' 592 | dev: true 593 | 594 | /@microsoft/tsdoc-config@0.16.2: 595 | resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} 596 | dependencies: 597 | '@microsoft/tsdoc': 0.14.2 598 | ajv: 6.12.6 599 | jju: 1.4.0 600 | resolve: 1.19.0 601 | dev: true 602 | 603 | /@microsoft/tsdoc@0.14.2: 604 | resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} 605 | dev: true 606 | 607 | /@nodelib/fs.scandir@2.1.5: 608 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 609 | engines: {node: '>= 8'} 610 | dependencies: 611 | '@nodelib/fs.stat': 2.0.5 612 | run-parallel: 1.2.0 613 | dev: true 614 | 615 | /@nodelib/fs.stat@2.0.5: 616 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 617 | engines: {node: '>= 8'} 618 | dev: true 619 | 620 | /@nodelib/fs.walk@1.2.8: 621 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 622 | engines: {node: '>= 8'} 623 | dependencies: 624 | '@nodelib/fs.scandir': 2.1.5 625 | fastq: 1.15.0 626 | dev: true 627 | 628 | /@rollup/pluginutils@5.0.5: 629 | resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} 630 | engines: {node: '>=14.0.0'} 631 | peerDependencies: 632 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 633 | peerDependenciesMeta: 634 | rollup: 635 | optional: true 636 | dependencies: 637 | '@types/estree': 1.0.4 638 | estree-walker: 2.0.2 639 | picomatch: 2.3.1 640 | dev: true 641 | 642 | /@rushstack/node-core-library@3.61.0: 643 | resolution: {integrity: sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ==} 644 | peerDependencies: 645 | '@types/node': '*' 646 | peerDependenciesMeta: 647 | '@types/node': 648 | optional: true 649 | dependencies: 650 | colors: 1.2.5 651 | fs-extra: 7.0.1 652 | import-lazy: 4.0.0 653 | jju: 1.4.0 654 | resolve: 1.22.8 655 | semver: 7.5.4 656 | z-schema: 5.0.5 657 | dev: true 658 | 659 | /@rushstack/rig-package@0.5.1: 660 | resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} 661 | dependencies: 662 | resolve: 1.22.8 663 | strip-json-comments: 3.1.1 664 | dev: true 665 | 666 | /@rushstack/ts-command-line@4.17.1: 667 | resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} 668 | dependencies: 669 | '@types/argparse': 1.0.38 670 | argparse: 1.0.10 671 | colors: 1.2.5 672 | string-argv: 0.3.2 673 | dev: true 674 | 675 | /@types/argparse@1.0.38: 676 | resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} 677 | dev: true 678 | 679 | /@types/babel__core@7.20.3: 680 | resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} 681 | dependencies: 682 | '@babel/parser': 7.23.0 683 | '@babel/types': 7.23.0 684 | '@types/babel__generator': 7.6.6 685 | '@types/babel__template': 7.4.3 686 | '@types/babel__traverse': 7.20.3 687 | dev: true 688 | 689 | /@types/babel__generator@7.6.6: 690 | resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} 691 | dependencies: 692 | '@babel/types': 7.23.0 693 | dev: true 694 | 695 | /@types/babel__template@7.4.3: 696 | resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} 697 | dependencies: 698 | '@babel/parser': 7.23.0 699 | '@babel/types': 7.23.0 700 | dev: true 701 | 702 | /@types/babel__traverse@7.20.3: 703 | resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} 704 | dependencies: 705 | '@babel/types': 7.23.0 706 | dev: true 707 | 708 | /@types/estree@1.0.4: 709 | resolution: {integrity: sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==} 710 | dev: true 711 | 712 | /@types/json-schema@7.0.14: 713 | resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} 714 | dev: true 715 | 716 | /@types/prop-types@15.7.9: 717 | resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} 718 | dev: true 719 | 720 | /@types/react-dom@18.2.14: 721 | resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} 722 | dependencies: 723 | '@types/react': 18.2.35 724 | dev: true 725 | 726 | /@types/react@18.2.35: 727 | resolution: {integrity: sha512-LG3xpFZ++rTndV+/XFyX5vUP7NI9yxyk+MQvBDq+CVs8I9DLSc3Ymwb1Vmw5YDoeNeHN4PDZa3HylMKJYT9PNQ==} 728 | dependencies: 729 | '@types/prop-types': 15.7.9 730 | '@types/scheduler': 0.16.5 731 | csstype: 3.1.2 732 | dev: true 733 | 734 | /@types/scheduler@0.16.5: 735 | resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} 736 | dev: true 737 | 738 | /@types/semver@7.5.4: 739 | resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} 740 | dev: true 741 | 742 | /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.53.0)(typescript@5.2.2): 743 | resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} 744 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 745 | peerDependencies: 746 | '@typescript-eslint/parser': ^5.0.0 747 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 748 | typescript: '*' 749 | peerDependenciesMeta: 750 | typescript: 751 | optional: true 752 | dependencies: 753 | '@eslint-community/regexpp': 4.10.0 754 | '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@5.2.2) 755 | '@typescript-eslint/scope-manager': 5.62.0 756 | '@typescript-eslint/type-utils': 5.62.0(eslint@8.53.0)(typescript@5.2.2) 757 | '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@5.2.2) 758 | debug: 4.3.4 759 | eslint: 8.53.0 760 | graphemer: 1.4.0 761 | ignore: 5.2.4 762 | natural-compare-lite: 1.4.0 763 | semver: 7.5.4 764 | tsutils: 3.21.0(typescript@5.2.2) 765 | typescript: 5.2.2 766 | transitivePeerDependencies: 767 | - supports-color 768 | dev: true 769 | 770 | /@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@5.2.2): 771 | resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} 772 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 773 | peerDependencies: 774 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 775 | typescript: '*' 776 | peerDependenciesMeta: 777 | typescript: 778 | optional: true 779 | dependencies: 780 | '@typescript-eslint/scope-manager': 5.62.0 781 | '@typescript-eslint/types': 5.62.0 782 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) 783 | debug: 4.3.4 784 | eslint: 8.53.0 785 | typescript: 5.2.2 786 | transitivePeerDependencies: 787 | - supports-color 788 | dev: true 789 | 790 | /@typescript-eslint/scope-manager@5.62.0: 791 | resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} 792 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 793 | dependencies: 794 | '@typescript-eslint/types': 5.62.0 795 | '@typescript-eslint/visitor-keys': 5.62.0 796 | dev: true 797 | 798 | /@typescript-eslint/type-utils@5.62.0(eslint@8.53.0)(typescript@5.2.2): 799 | resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} 800 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 801 | peerDependencies: 802 | eslint: '*' 803 | typescript: '*' 804 | peerDependenciesMeta: 805 | typescript: 806 | optional: true 807 | dependencies: 808 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) 809 | '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@5.2.2) 810 | debug: 4.3.4 811 | eslint: 8.53.0 812 | tsutils: 3.21.0(typescript@5.2.2) 813 | typescript: 5.2.2 814 | transitivePeerDependencies: 815 | - supports-color 816 | dev: true 817 | 818 | /@typescript-eslint/types@5.62.0: 819 | resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} 820 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 821 | dev: true 822 | 823 | /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): 824 | resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} 825 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 826 | peerDependencies: 827 | typescript: '*' 828 | peerDependenciesMeta: 829 | typescript: 830 | optional: true 831 | dependencies: 832 | '@typescript-eslint/types': 5.62.0 833 | '@typescript-eslint/visitor-keys': 5.62.0 834 | debug: 4.3.4 835 | globby: 11.1.0 836 | is-glob: 4.0.3 837 | semver: 7.5.4 838 | tsutils: 3.21.0(typescript@5.2.2) 839 | typescript: 5.2.2 840 | transitivePeerDependencies: 841 | - supports-color 842 | dev: true 843 | 844 | /@typescript-eslint/utils@5.62.0(eslint@8.53.0)(typescript@5.2.2): 845 | resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} 846 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 847 | peerDependencies: 848 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 849 | dependencies: 850 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) 851 | '@types/json-schema': 7.0.14 852 | '@types/semver': 7.5.4 853 | '@typescript-eslint/scope-manager': 5.62.0 854 | '@typescript-eslint/types': 5.62.0 855 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) 856 | eslint: 8.53.0 857 | eslint-scope: 5.1.1 858 | semver: 7.5.4 859 | transitivePeerDependencies: 860 | - supports-color 861 | - typescript 862 | dev: true 863 | 864 | /@typescript-eslint/visitor-keys@5.62.0: 865 | resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} 866 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 867 | dependencies: 868 | '@typescript-eslint/types': 5.62.0 869 | eslint-visitor-keys: 3.4.3 870 | dev: true 871 | 872 | /@ungap/structured-clone@1.2.0: 873 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 874 | dev: true 875 | 876 | /@vitejs/plugin-react@4.1.1(vite@4.5.3): 877 | resolution: {integrity: sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==} 878 | engines: {node: ^14.18.0 || >=16.0.0} 879 | peerDependencies: 880 | vite: ^4.2.0 881 | dependencies: 882 | '@babel/core': 7.23.2 883 | '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2) 884 | '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2) 885 | '@types/babel__core': 7.20.3 886 | react-refresh: 0.14.0 887 | vite: 4.5.3 888 | transitivePeerDependencies: 889 | - supports-color 890 | dev: true 891 | 892 | /@volar/language-core@1.10.10: 893 | resolution: {integrity: sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==} 894 | dependencies: 895 | '@volar/source-map': 1.10.10 896 | dev: true 897 | 898 | /@volar/source-map@1.10.10: 899 | resolution: {integrity: sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==} 900 | dependencies: 901 | muggle-string: 0.3.1 902 | dev: true 903 | 904 | /@volar/typescript@1.10.10: 905 | resolution: {integrity: sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==} 906 | dependencies: 907 | '@volar/language-core': 1.10.10 908 | path-browserify: 1.0.1 909 | dev: true 910 | 911 | /@vue/compiler-core@3.3.7: 912 | resolution: {integrity: sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==} 913 | dependencies: 914 | '@babel/parser': 7.23.0 915 | '@vue/shared': 3.3.7 916 | estree-walker: 2.0.2 917 | source-map-js: 1.0.2 918 | dev: true 919 | 920 | /@vue/compiler-dom@3.3.7: 921 | resolution: {integrity: sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==} 922 | dependencies: 923 | '@vue/compiler-core': 3.3.7 924 | '@vue/shared': 3.3.7 925 | dev: true 926 | 927 | /@vue/language-core@1.8.22(typescript@5.2.2): 928 | resolution: {integrity: sha512-bsMoJzCrXZqGsxawtUea1cLjUT9dZnDsy5TuZ+l1fxRMzUGQUG9+Ypq4w//CqpWmrx7nIAJpw2JVF/t258miRw==} 929 | peerDependencies: 930 | typescript: '*' 931 | peerDependenciesMeta: 932 | typescript: 933 | optional: true 934 | dependencies: 935 | '@volar/language-core': 1.10.10 936 | '@volar/source-map': 1.10.10 937 | '@vue/compiler-dom': 3.3.7 938 | '@vue/shared': 3.3.7 939 | computeds: 0.0.1 940 | minimatch: 9.0.3 941 | muggle-string: 0.3.1 942 | typescript: 5.2.2 943 | vue-template-compiler: 2.7.15 944 | dev: true 945 | 946 | /@vue/shared@3.3.7: 947 | resolution: {integrity: sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==} 948 | dev: true 949 | 950 | /acorn-jsx@5.3.2(acorn@8.11.2): 951 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 952 | peerDependencies: 953 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 954 | dependencies: 955 | acorn: 8.11.2 956 | dev: true 957 | 958 | /acorn@8.11.2: 959 | resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} 960 | engines: {node: '>=0.4.0'} 961 | hasBin: true 962 | dev: true 963 | 964 | /ajv@6.12.6: 965 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 966 | dependencies: 967 | fast-deep-equal: 3.1.3 968 | fast-json-stable-stringify: 2.1.0 969 | json-schema-traverse: 0.4.1 970 | uri-js: 4.4.1 971 | dev: true 972 | 973 | /ansi-regex@5.0.1: 974 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 975 | engines: {node: '>=8'} 976 | dev: true 977 | 978 | /ansi-styles@3.2.1: 979 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 980 | engines: {node: '>=4'} 981 | dependencies: 982 | color-convert: 1.9.3 983 | dev: true 984 | 985 | /ansi-styles@4.3.0: 986 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 987 | engines: {node: '>=8'} 988 | dependencies: 989 | color-convert: 2.0.1 990 | dev: true 991 | 992 | /argparse@1.0.10: 993 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 994 | dependencies: 995 | sprintf-js: 1.0.3 996 | dev: true 997 | 998 | /argparse@2.0.1: 999 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1000 | dev: true 1001 | 1002 | /array-union@2.1.0: 1003 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 1004 | engines: {node: '>=8'} 1005 | dev: true 1006 | 1007 | /balanced-match@1.0.2: 1008 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1009 | dev: true 1010 | 1011 | /brace-expansion@1.1.11: 1012 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1013 | dependencies: 1014 | balanced-match: 1.0.2 1015 | concat-map: 0.0.1 1016 | dev: true 1017 | 1018 | /brace-expansion@2.0.1: 1019 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1020 | dependencies: 1021 | balanced-match: 1.0.2 1022 | dev: true 1023 | 1024 | /braces@3.0.2: 1025 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1026 | engines: {node: '>=8'} 1027 | dependencies: 1028 | fill-range: 7.0.1 1029 | dev: true 1030 | 1031 | /browserslist@4.22.1: 1032 | resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} 1033 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1034 | hasBin: true 1035 | dependencies: 1036 | caniuse-lite: 1.0.30001561 1037 | electron-to-chromium: 1.4.576 1038 | node-releases: 2.0.13 1039 | update-browserslist-db: 1.0.13(browserslist@4.22.1) 1040 | dev: true 1041 | 1042 | /callsites@3.1.0: 1043 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1044 | engines: {node: '>=6'} 1045 | dev: true 1046 | 1047 | /caniuse-lite@1.0.30001561: 1048 | resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==} 1049 | dev: true 1050 | 1051 | /chalk@2.4.2: 1052 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1053 | engines: {node: '>=4'} 1054 | dependencies: 1055 | ansi-styles: 3.2.1 1056 | escape-string-regexp: 1.0.5 1057 | supports-color: 5.5.0 1058 | dev: true 1059 | 1060 | /chalk@4.1.2: 1061 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1062 | engines: {node: '>=10'} 1063 | dependencies: 1064 | ansi-styles: 4.3.0 1065 | supports-color: 7.2.0 1066 | dev: true 1067 | 1068 | /color-convert@1.9.3: 1069 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1070 | dependencies: 1071 | color-name: 1.1.3 1072 | dev: true 1073 | 1074 | /color-convert@2.0.1: 1075 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1076 | engines: {node: '>=7.0.0'} 1077 | dependencies: 1078 | color-name: 1.1.4 1079 | dev: true 1080 | 1081 | /color-name@1.1.3: 1082 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1083 | dev: true 1084 | 1085 | /color-name@1.1.4: 1086 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1087 | dev: true 1088 | 1089 | /colors@1.2.5: 1090 | resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} 1091 | engines: {node: '>=0.1.90'} 1092 | dev: true 1093 | 1094 | /commander@9.5.0: 1095 | resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 1096 | engines: {node: ^12.20.0 || >=14} 1097 | requiresBuild: true 1098 | dev: true 1099 | optional: true 1100 | 1101 | /computeds@0.0.1: 1102 | resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} 1103 | dev: true 1104 | 1105 | /concat-map@0.0.1: 1106 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1107 | dev: true 1108 | 1109 | /convert-source-map@2.0.0: 1110 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1111 | dev: true 1112 | 1113 | /cross-spawn@7.0.3: 1114 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1115 | engines: {node: '>= 8'} 1116 | dependencies: 1117 | path-key: 3.1.1 1118 | shebang-command: 2.0.0 1119 | which: 2.0.2 1120 | dev: true 1121 | 1122 | /csstype@3.1.2: 1123 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 1124 | dev: true 1125 | 1126 | /de-indent@1.0.2: 1127 | resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 1128 | dev: true 1129 | 1130 | /debug@4.3.4: 1131 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1132 | engines: {node: '>=6.0'} 1133 | peerDependencies: 1134 | supports-color: '*' 1135 | peerDependenciesMeta: 1136 | supports-color: 1137 | optional: true 1138 | dependencies: 1139 | ms: 2.1.2 1140 | dev: true 1141 | 1142 | /deep-is@0.1.4: 1143 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1144 | dev: true 1145 | 1146 | /dir-glob@3.0.1: 1147 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1148 | engines: {node: '>=8'} 1149 | dependencies: 1150 | path-type: 4.0.0 1151 | dev: true 1152 | 1153 | /doctrine@3.0.0: 1154 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1155 | engines: {node: '>=6.0.0'} 1156 | dependencies: 1157 | esutils: 2.0.3 1158 | dev: true 1159 | 1160 | /electron-to-chromium@1.4.576: 1161 | resolution: {integrity: sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==} 1162 | dev: true 1163 | 1164 | /esbuild@0.18.20: 1165 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 1166 | engines: {node: '>=12'} 1167 | hasBin: true 1168 | requiresBuild: true 1169 | optionalDependencies: 1170 | '@esbuild/android-arm': 0.18.20 1171 | '@esbuild/android-arm64': 0.18.20 1172 | '@esbuild/android-x64': 0.18.20 1173 | '@esbuild/darwin-arm64': 0.18.20 1174 | '@esbuild/darwin-x64': 0.18.20 1175 | '@esbuild/freebsd-arm64': 0.18.20 1176 | '@esbuild/freebsd-x64': 0.18.20 1177 | '@esbuild/linux-arm': 0.18.20 1178 | '@esbuild/linux-arm64': 0.18.20 1179 | '@esbuild/linux-ia32': 0.18.20 1180 | '@esbuild/linux-loong64': 0.18.20 1181 | '@esbuild/linux-mips64el': 0.18.20 1182 | '@esbuild/linux-ppc64': 0.18.20 1183 | '@esbuild/linux-riscv64': 0.18.20 1184 | '@esbuild/linux-s390x': 0.18.20 1185 | '@esbuild/linux-x64': 0.18.20 1186 | '@esbuild/netbsd-x64': 0.18.20 1187 | '@esbuild/openbsd-x64': 0.18.20 1188 | '@esbuild/sunos-x64': 0.18.20 1189 | '@esbuild/win32-arm64': 0.18.20 1190 | '@esbuild/win32-ia32': 0.18.20 1191 | '@esbuild/win32-x64': 0.18.20 1192 | dev: true 1193 | 1194 | /escalade@3.1.1: 1195 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1196 | engines: {node: '>=6'} 1197 | dev: true 1198 | 1199 | /escape-string-regexp@1.0.5: 1200 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1201 | engines: {node: '>=0.8.0'} 1202 | dev: true 1203 | 1204 | /escape-string-regexp@4.0.0: 1205 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1206 | engines: {node: '>=10'} 1207 | dev: true 1208 | 1209 | /eslint-plugin-react-hooks@4.6.0(eslint@8.53.0): 1210 | resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} 1211 | engines: {node: '>=10'} 1212 | peerDependencies: 1213 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 1214 | dependencies: 1215 | eslint: 8.53.0 1216 | dev: true 1217 | 1218 | /eslint-plugin-react-refresh@0.4.4(eslint@8.53.0): 1219 | resolution: {integrity: sha512-eD83+65e8YPVg6603Om2iCIwcQJf/y7++MWm4tACtEswFLYMwxwVWAfwN+e19f5Ad/FOyyNg9Dfi5lXhH3Y3rA==} 1220 | peerDependencies: 1221 | eslint: '>=7' 1222 | dependencies: 1223 | eslint: 8.53.0 1224 | dev: true 1225 | 1226 | /eslint-scope@5.1.1: 1227 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1228 | engines: {node: '>=8.0.0'} 1229 | dependencies: 1230 | esrecurse: 4.3.0 1231 | estraverse: 4.3.0 1232 | dev: true 1233 | 1234 | /eslint-scope@7.2.2: 1235 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1236 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1237 | dependencies: 1238 | esrecurse: 4.3.0 1239 | estraverse: 5.3.0 1240 | dev: true 1241 | 1242 | /eslint-visitor-keys@3.4.3: 1243 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1244 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1245 | dev: true 1246 | 1247 | /eslint@8.53.0: 1248 | resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} 1249 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1250 | hasBin: true 1251 | dependencies: 1252 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) 1253 | '@eslint-community/regexpp': 4.10.0 1254 | '@eslint/eslintrc': 2.1.3 1255 | '@eslint/js': 8.53.0 1256 | '@humanwhocodes/config-array': 0.11.13 1257 | '@humanwhocodes/module-importer': 1.0.1 1258 | '@nodelib/fs.walk': 1.2.8 1259 | '@ungap/structured-clone': 1.2.0 1260 | ajv: 6.12.6 1261 | chalk: 4.1.2 1262 | cross-spawn: 7.0.3 1263 | debug: 4.3.4 1264 | doctrine: 3.0.0 1265 | escape-string-regexp: 4.0.0 1266 | eslint-scope: 7.2.2 1267 | eslint-visitor-keys: 3.4.3 1268 | espree: 9.6.1 1269 | esquery: 1.5.0 1270 | esutils: 2.0.3 1271 | fast-deep-equal: 3.1.3 1272 | file-entry-cache: 6.0.1 1273 | find-up: 5.0.0 1274 | glob-parent: 6.0.2 1275 | globals: 13.23.0 1276 | graphemer: 1.4.0 1277 | ignore: 5.2.4 1278 | imurmurhash: 0.1.4 1279 | is-glob: 4.0.3 1280 | is-path-inside: 3.0.3 1281 | js-yaml: 4.1.0 1282 | json-stable-stringify-without-jsonify: 1.0.1 1283 | levn: 0.4.1 1284 | lodash.merge: 4.6.2 1285 | minimatch: 3.1.2 1286 | natural-compare: 1.4.0 1287 | optionator: 0.9.3 1288 | strip-ansi: 6.0.1 1289 | text-table: 0.2.0 1290 | transitivePeerDependencies: 1291 | - supports-color 1292 | dev: true 1293 | 1294 | /espree@9.6.1: 1295 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1296 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1297 | dependencies: 1298 | acorn: 8.11.2 1299 | acorn-jsx: 5.3.2(acorn@8.11.2) 1300 | eslint-visitor-keys: 3.4.3 1301 | dev: true 1302 | 1303 | /esquery@1.5.0: 1304 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1305 | engines: {node: '>=0.10'} 1306 | dependencies: 1307 | estraverse: 5.3.0 1308 | dev: true 1309 | 1310 | /esrecurse@4.3.0: 1311 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1312 | engines: {node: '>=4.0'} 1313 | dependencies: 1314 | estraverse: 5.3.0 1315 | dev: true 1316 | 1317 | /estraverse@4.3.0: 1318 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1319 | engines: {node: '>=4.0'} 1320 | dev: true 1321 | 1322 | /estraverse@5.3.0: 1323 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1324 | engines: {node: '>=4.0'} 1325 | dev: true 1326 | 1327 | /estree-walker@2.0.2: 1328 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1329 | dev: true 1330 | 1331 | /esutils@2.0.3: 1332 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1333 | engines: {node: '>=0.10.0'} 1334 | dev: true 1335 | 1336 | /fast-deep-equal@3.1.3: 1337 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1338 | dev: true 1339 | 1340 | /fast-glob@3.3.1: 1341 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 1342 | engines: {node: '>=8.6.0'} 1343 | dependencies: 1344 | '@nodelib/fs.stat': 2.0.5 1345 | '@nodelib/fs.walk': 1.2.8 1346 | glob-parent: 5.1.2 1347 | merge2: 1.4.1 1348 | micromatch: 4.0.5 1349 | dev: true 1350 | 1351 | /fast-json-stable-stringify@2.1.0: 1352 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1353 | dev: true 1354 | 1355 | /fast-levenshtein@2.0.6: 1356 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1357 | dev: true 1358 | 1359 | /fastq@1.15.0: 1360 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1361 | dependencies: 1362 | reusify: 1.0.4 1363 | dev: true 1364 | 1365 | /file-entry-cache@6.0.1: 1366 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1367 | engines: {node: ^10.12.0 || >=12.0.0} 1368 | dependencies: 1369 | flat-cache: 3.1.1 1370 | dev: true 1371 | 1372 | /fill-range@7.0.1: 1373 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1374 | engines: {node: '>=8'} 1375 | dependencies: 1376 | to-regex-range: 5.0.1 1377 | dev: true 1378 | 1379 | /find-up@5.0.0: 1380 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1381 | engines: {node: '>=10'} 1382 | dependencies: 1383 | locate-path: 6.0.0 1384 | path-exists: 4.0.0 1385 | dev: true 1386 | 1387 | /flat-cache@3.1.1: 1388 | resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} 1389 | engines: {node: '>=12.0.0'} 1390 | dependencies: 1391 | flatted: 3.2.9 1392 | keyv: 4.5.4 1393 | rimraf: 3.0.2 1394 | dev: true 1395 | 1396 | /flatted@3.2.9: 1397 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 1398 | dev: true 1399 | 1400 | /fs-extra@7.0.1: 1401 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 1402 | engines: {node: '>=6 <7 || >=8'} 1403 | dependencies: 1404 | graceful-fs: 4.2.11 1405 | jsonfile: 4.0.0 1406 | universalify: 0.1.2 1407 | dev: true 1408 | 1409 | /fs.realpath@1.0.0: 1410 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1411 | dev: true 1412 | 1413 | /fsevents@2.3.3: 1414 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1415 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1416 | os: [darwin] 1417 | requiresBuild: true 1418 | dev: true 1419 | optional: true 1420 | 1421 | /function-bind@1.1.2: 1422 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1423 | dev: true 1424 | 1425 | /gensync@1.0.0-beta.2: 1426 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1427 | engines: {node: '>=6.9.0'} 1428 | dev: true 1429 | 1430 | /glob-parent@5.1.2: 1431 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1432 | engines: {node: '>= 6'} 1433 | dependencies: 1434 | is-glob: 4.0.3 1435 | dev: true 1436 | 1437 | /glob-parent@6.0.2: 1438 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1439 | engines: {node: '>=10.13.0'} 1440 | dependencies: 1441 | is-glob: 4.0.3 1442 | dev: true 1443 | 1444 | /glob@7.2.3: 1445 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1446 | dependencies: 1447 | fs.realpath: 1.0.0 1448 | inflight: 1.0.6 1449 | inherits: 2.0.4 1450 | minimatch: 3.1.2 1451 | once: 1.4.0 1452 | path-is-absolute: 1.0.1 1453 | dev: true 1454 | 1455 | /globals@11.12.0: 1456 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1457 | engines: {node: '>=4'} 1458 | dev: true 1459 | 1460 | /globals@13.23.0: 1461 | resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} 1462 | engines: {node: '>=8'} 1463 | dependencies: 1464 | type-fest: 0.20.2 1465 | dev: true 1466 | 1467 | /globby@11.1.0: 1468 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1469 | engines: {node: '>=10'} 1470 | dependencies: 1471 | array-union: 2.1.0 1472 | dir-glob: 3.0.1 1473 | fast-glob: 3.3.1 1474 | ignore: 5.2.4 1475 | merge2: 1.4.1 1476 | slash: 3.0.0 1477 | dev: true 1478 | 1479 | /graceful-fs@4.2.11: 1480 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1481 | dev: true 1482 | 1483 | /graphemer@1.4.0: 1484 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1485 | dev: true 1486 | 1487 | /has-flag@3.0.0: 1488 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1489 | engines: {node: '>=4'} 1490 | dev: true 1491 | 1492 | /has-flag@4.0.0: 1493 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1494 | engines: {node: '>=8'} 1495 | dev: true 1496 | 1497 | /hasown@2.0.0: 1498 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 1499 | engines: {node: '>= 0.4'} 1500 | dependencies: 1501 | function-bind: 1.1.2 1502 | dev: true 1503 | 1504 | /he@1.2.0: 1505 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 1506 | hasBin: true 1507 | dev: true 1508 | 1509 | /ignore@5.2.4: 1510 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1511 | engines: {node: '>= 4'} 1512 | dev: true 1513 | 1514 | /import-fresh@3.3.0: 1515 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1516 | engines: {node: '>=6'} 1517 | dependencies: 1518 | parent-module: 1.0.1 1519 | resolve-from: 4.0.0 1520 | dev: true 1521 | 1522 | /import-lazy@4.0.0: 1523 | resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} 1524 | engines: {node: '>=8'} 1525 | dev: true 1526 | 1527 | /imurmurhash@0.1.4: 1528 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1529 | engines: {node: '>=0.8.19'} 1530 | dev: true 1531 | 1532 | /inflight@1.0.6: 1533 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1534 | dependencies: 1535 | once: 1.4.0 1536 | wrappy: 1.0.2 1537 | dev: true 1538 | 1539 | /inherits@2.0.4: 1540 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1541 | dev: true 1542 | 1543 | /is-core-module@2.13.1: 1544 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1545 | dependencies: 1546 | hasown: 2.0.0 1547 | dev: true 1548 | 1549 | /is-extglob@2.1.1: 1550 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1551 | engines: {node: '>=0.10.0'} 1552 | dev: true 1553 | 1554 | /is-glob@4.0.3: 1555 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1556 | engines: {node: '>=0.10.0'} 1557 | dependencies: 1558 | is-extglob: 2.1.1 1559 | dev: true 1560 | 1561 | /is-number@7.0.0: 1562 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1563 | engines: {node: '>=0.12.0'} 1564 | dev: true 1565 | 1566 | /is-path-inside@3.0.3: 1567 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1568 | engines: {node: '>=8'} 1569 | dev: true 1570 | 1571 | /isexe@2.0.0: 1572 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1573 | dev: true 1574 | 1575 | /jju@1.4.0: 1576 | resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} 1577 | dev: true 1578 | 1579 | /js-tokens@4.0.0: 1580 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1581 | dev: true 1582 | 1583 | /js-yaml@4.1.0: 1584 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1585 | hasBin: true 1586 | dependencies: 1587 | argparse: 2.0.1 1588 | dev: true 1589 | 1590 | /jsesc@2.5.2: 1591 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1592 | engines: {node: '>=4'} 1593 | hasBin: true 1594 | dev: true 1595 | 1596 | /json-buffer@3.0.1: 1597 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1598 | dev: true 1599 | 1600 | /json-schema-traverse@0.4.1: 1601 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1602 | dev: true 1603 | 1604 | /json-stable-stringify-without-jsonify@1.0.1: 1605 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1606 | dev: true 1607 | 1608 | /json5@2.2.3: 1609 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1610 | engines: {node: '>=6'} 1611 | hasBin: true 1612 | dev: true 1613 | 1614 | /jsonfile@4.0.0: 1615 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 1616 | optionalDependencies: 1617 | graceful-fs: 4.2.11 1618 | dev: true 1619 | 1620 | /keyv@4.5.4: 1621 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1622 | dependencies: 1623 | json-buffer: 3.0.1 1624 | dev: true 1625 | 1626 | /kolorist@1.8.0: 1627 | resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 1628 | dev: true 1629 | 1630 | /levn@0.4.1: 1631 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1632 | engines: {node: '>= 0.8.0'} 1633 | dependencies: 1634 | prelude-ls: 1.2.1 1635 | type-check: 0.4.0 1636 | dev: true 1637 | 1638 | /locate-path@6.0.0: 1639 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1640 | engines: {node: '>=10'} 1641 | dependencies: 1642 | p-locate: 5.0.0 1643 | dev: true 1644 | 1645 | /lodash.get@4.4.2: 1646 | resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} 1647 | dev: true 1648 | 1649 | /lodash.isequal@4.5.0: 1650 | resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} 1651 | dev: true 1652 | 1653 | /lodash.merge@4.6.2: 1654 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1655 | dev: true 1656 | 1657 | /lodash@4.17.21: 1658 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1659 | dev: true 1660 | 1661 | /loose-envify@1.4.0: 1662 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1663 | hasBin: true 1664 | dependencies: 1665 | js-tokens: 4.0.0 1666 | dev: true 1667 | 1668 | /lru-cache@5.1.1: 1669 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1670 | dependencies: 1671 | yallist: 3.1.1 1672 | dev: true 1673 | 1674 | /lru-cache@6.0.0: 1675 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1676 | engines: {node: '>=10'} 1677 | dependencies: 1678 | yallist: 4.0.0 1679 | dev: true 1680 | 1681 | /merge2@1.4.1: 1682 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1683 | engines: {node: '>= 8'} 1684 | dev: true 1685 | 1686 | /micromatch@4.0.5: 1687 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1688 | engines: {node: '>=8.6'} 1689 | dependencies: 1690 | braces: 3.0.2 1691 | picomatch: 2.3.1 1692 | dev: true 1693 | 1694 | /minimatch@3.1.2: 1695 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1696 | dependencies: 1697 | brace-expansion: 1.1.11 1698 | dev: true 1699 | 1700 | /minimatch@9.0.3: 1701 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1702 | engines: {node: '>=16 || 14 >=14.17'} 1703 | dependencies: 1704 | brace-expansion: 2.0.1 1705 | dev: true 1706 | 1707 | /ms@2.1.2: 1708 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1709 | dev: true 1710 | 1711 | /muggle-string@0.3.1: 1712 | resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} 1713 | dev: true 1714 | 1715 | /nanoid@3.3.6: 1716 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1717 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1718 | hasBin: true 1719 | dev: true 1720 | 1721 | /natural-compare-lite@1.4.0: 1722 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 1723 | dev: true 1724 | 1725 | /natural-compare@1.4.0: 1726 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1727 | dev: true 1728 | 1729 | /node-releases@2.0.13: 1730 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 1731 | dev: true 1732 | 1733 | /once@1.4.0: 1734 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1735 | dependencies: 1736 | wrappy: 1.0.2 1737 | dev: true 1738 | 1739 | /optionator@0.9.3: 1740 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1741 | engines: {node: '>= 0.8.0'} 1742 | dependencies: 1743 | '@aashutoshrathi/word-wrap': 1.2.6 1744 | deep-is: 0.1.4 1745 | fast-levenshtein: 2.0.6 1746 | levn: 0.4.1 1747 | prelude-ls: 1.2.1 1748 | type-check: 0.4.0 1749 | dev: true 1750 | 1751 | /p-limit@3.1.0: 1752 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1753 | engines: {node: '>=10'} 1754 | dependencies: 1755 | yocto-queue: 0.1.0 1756 | dev: true 1757 | 1758 | /p-locate@5.0.0: 1759 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1760 | engines: {node: '>=10'} 1761 | dependencies: 1762 | p-limit: 3.1.0 1763 | dev: true 1764 | 1765 | /parent-module@1.0.1: 1766 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1767 | engines: {node: '>=6'} 1768 | dependencies: 1769 | callsites: 3.1.0 1770 | dev: true 1771 | 1772 | /path-browserify@1.0.1: 1773 | resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 1774 | dev: true 1775 | 1776 | /path-exists@4.0.0: 1777 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1778 | engines: {node: '>=8'} 1779 | dev: true 1780 | 1781 | /path-is-absolute@1.0.1: 1782 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1783 | engines: {node: '>=0.10.0'} 1784 | dev: true 1785 | 1786 | /path-key@3.1.1: 1787 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1788 | engines: {node: '>=8'} 1789 | dev: true 1790 | 1791 | /path-parse@1.0.7: 1792 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1793 | dev: true 1794 | 1795 | /path-type@4.0.0: 1796 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1797 | engines: {node: '>=8'} 1798 | dev: true 1799 | 1800 | /picocolors@1.0.0: 1801 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1802 | dev: true 1803 | 1804 | /picomatch@2.3.1: 1805 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1806 | engines: {node: '>=8.6'} 1807 | dev: true 1808 | 1809 | /postcss@8.4.31: 1810 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 1811 | engines: {node: ^10 || ^12 || >=14} 1812 | dependencies: 1813 | nanoid: 3.3.6 1814 | picocolors: 1.0.0 1815 | source-map-js: 1.0.2 1816 | dev: true 1817 | 1818 | /prelude-ls@1.2.1: 1819 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1820 | engines: {node: '>= 0.8.0'} 1821 | dev: true 1822 | 1823 | /punycode@2.3.1: 1824 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1825 | engines: {node: '>=6'} 1826 | dev: true 1827 | 1828 | /queue-microtask@1.2.3: 1829 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1830 | dev: true 1831 | 1832 | /react-dom@18.2.0(react@18.2.0): 1833 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1834 | peerDependencies: 1835 | react: ^18.2.0 1836 | dependencies: 1837 | loose-envify: 1.4.0 1838 | react: 18.2.0 1839 | scheduler: 0.23.0 1840 | dev: true 1841 | 1842 | /react-refresh@0.14.0: 1843 | resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} 1844 | engines: {node: '>=0.10.0'} 1845 | dev: true 1846 | 1847 | /react@18.2.0: 1848 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1849 | engines: {node: '>=0.10.0'} 1850 | dependencies: 1851 | loose-envify: 1.4.0 1852 | dev: true 1853 | 1854 | /resolve-from@4.0.0: 1855 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1856 | engines: {node: '>=4'} 1857 | dev: true 1858 | 1859 | /resolve@1.19.0: 1860 | resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} 1861 | dependencies: 1862 | is-core-module: 2.13.1 1863 | path-parse: 1.0.7 1864 | dev: true 1865 | 1866 | /resolve@1.22.8: 1867 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1868 | hasBin: true 1869 | dependencies: 1870 | is-core-module: 2.13.1 1871 | path-parse: 1.0.7 1872 | supports-preserve-symlinks-flag: 1.0.0 1873 | dev: true 1874 | 1875 | /reusify@1.0.4: 1876 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1877 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1878 | dev: true 1879 | 1880 | /rimraf@3.0.2: 1881 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1882 | hasBin: true 1883 | dependencies: 1884 | glob: 7.2.3 1885 | dev: true 1886 | 1887 | /rollup@3.29.4: 1888 | resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} 1889 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1890 | hasBin: true 1891 | optionalDependencies: 1892 | fsevents: 2.3.3 1893 | dev: true 1894 | 1895 | /run-parallel@1.2.0: 1896 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1897 | dependencies: 1898 | queue-microtask: 1.2.3 1899 | dev: true 1900 | 1901 | /scheduler@0.23.0: 1902 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1903 | dependencies: 1904 | loose-envify: 1.4.0 1905 | dev: true 1906 | 1907 | /semver@6.3.1: 1908 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1909 | hasBin: true 1910 | dev: true 1911 | 1912 | /semver@7.5.4: 1913 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 1914 | engines: {node: '>=10'} 1915 | hasBin: true 1916 | dependencies: 1917 | lru-cache: 6.0.0 1918 | dev: true 1919 | 1920 | /shebang-command@2.0.0: 1921 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1922 | engines: {node: '>=8'} 1923 | dependencies: 1924 | shebang-regex: 3.0.0 1925 | dev: true 1926 | 1927 | /shebang-regex@3.0.0: 1928 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1929 | engines: {node: '>=8'} 1930 | dev: true 1931 | 1932 | /slash@3.0.0: 1933 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1934 | engines: {node: '>=8'} 1935 | dev: true 1936 | 1937 | /source-map-js@1.0.2: 1938 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1939 | engines: {node: '>=0.10.0'} 1940 | dev: true 1941 | 1942 | /source-map@0.6.1: 1943 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1944 | engines: {node: '>=0.10.0'} 1945 | dev: true 1946 | 1947 | /sprintf-js@1.0.3: 1948 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1949 | dev: true 1950 | 1951 | /string-argv@0.3.2: 1952 | resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 1953 | engines: {node: '>=0.6.19'} 1954 | dev: true 1955 | 1956 | /strip-ansi@6.0.1: 1957 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1958 | engines: {node: '>=8'} 1959 | dependencies: 1960 | ansi-regex: 5.0.1 1961 | dev: true 1962 | 1963 | /strip-json-comments@3.1.1: 1964 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1965 | engines: {node: '>=8'} 1966 | dev: true 1967 | 1968 | /supports-color@5.5.0: 1969 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1970 | engines: {node: '>=4'} 1971 | dependencies: 1972 | has-flag: 3.0.0 1973 | dev: true 1974 | 1975 | /supports-color@7.2.0: 1976 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1977 | engines: {node: '>=8'} 1978 | dependencies: 1979 | has-flag: 4.0.0 1980 | dev: true 1981 | 1982 | /supports-preserve-symlinks-flag@1.0.0: 1983 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1984 | engines: {node: '>= 0.4'} 1985 | dev: true 1986 | 1987 | /text-table@0.2.0: 1988 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1989 | dev: true 1990 | 1991 | /to-fast-properties@2.0.0: 1992 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1993 | engines: {node: '>=4'} 1994 | dev: true 1995 | 1996 | /to-regex-range@5.0.1: 1997 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1998 | engines: {node: '>=8.0'} 1999 | dependencies: 2000 | is-number: 7.0.0 2001 | dev: true 2002 | 2003 | /tslib@1.14.1: 2004 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2005 | dev: true 2006 | 2007 | /tsutils@3.21.0(typescript@5.2.2): 2008 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2009 | engines: {node: '>= 6'} 2010 | peerDependencies: 2011 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 2012 | dependencies: 2013 | tslib: 1.14.1 2014 | typescript: 5.2.2 2015 | dev: true 2016 | 2017 | /type-check@0.4.0: 2018 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2019 | engines: {node: '>= 0.8.0'} 2020 | dependencies: 2021 | prelude-ls: 1.2.1 2022 | dev: true 2023 | 2024 | /type-fest@0.20.2: 2025 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2026 | engines: {node: '>=10'} 2027 | dev: true 2028 | 2029 | /typescript@5.0.4: 2030 | resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} 2031 | engines: {node: '>=12.20'} 2032 | hasBin: true 2033 | dev: true 2034 | 2035 | /typescript@5.2.2: 2036 | resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} 2037 | engines: {node: '>=14.17'} 2038 | hasBin: true 2039 | dev: true 2040 | 2041 | /universalify@0.1.2: 2042 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 2043 | engines: {node: '>= 4.0.0'} 2044 | dev: true 2045 | 2046 | /update-browserslist-db@1.0.13(browserslist@4.22.1): 2047 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 2048 | hasBin: true 2049 | peerDependencies: 2050 | browserslist: '>= 4.21.0' 2051 | dependencies: 2052 | browserslist: 4.22.1 2053 | escalade: 3.1.1 2054 | picocolors: 1.0.0 2055 | dev: true 2056 | 2057 | /uri-js@4.4.1: 2058 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2059 | dependencies: 2060 | punycode: 2.3.1 2061 | dev: true 2062 | 2063 | /validator@13.11.0: 2064 | resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} 2065 | engines: {node: '>= 0.10'} 2066 | dev: true 2067 | 2068 | /vite-plugin-dts@3.6.3(typescript@5.2.2)(vite@4.5.3): 2069 | resolution: {integrity: sha512-NyRvgobl15rYj65coi/gH7UAEH+CpSjh539DbGb40DfOTZSvDLNYTzc8CK4460W+LqXuMK7+U3JAxRB3ksrNPw==} 2070 | engines: {node: ^14.18.0 || >=16.0.0} 2071 | peerDependencies: 2072 | typescript: '*' 2073 | vite: '*' 2074 | peerDependenciesMeta: 2075 | vite: 2076 | optional: true 2077 | dependencies: 2078 | '@microsoft/api-extractor': 7.38.2 2079 | '@rollup/pluginutils': 5.0.5 2080 | '@vue/language-core': 1.8.22(typescript@5.2.2) 2081 | debug: 4.3.4 2082 | kolorist: 1.8.0 2083 | typescript: 5.2.2 2084 | vite: 4.5.3 2085 | vue-tsc: 1.8.22(typescript@5.2.2) 2086 | transitivePeerDependencies: 2087 | - '@types/node' 2088 | - rollup 2089 | - supports-color 2090 | dev: true 2091 | 2092 | /vite@4.5.3: 2093 | resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} 2094 | engines: {node: ^14.18.0 || >=16.0.0} 2095 | hasBin: true 2096 | peerDependencies: 2097 | '@types/node': '>= 14' 2098 | less: '*' 2099 | lightningcss: ^1.21.0 2100 | sass: '*' 2101 | stylus: '*' 2102 | sugarss: '*' 2103 | terser: ^5.4.0 2104 | peerDependenciesMeta: 2105 | '@types/node': 2106 | optional: true 2107 | less: 2108 | optional: true 2109 | lightningcss: 2110 | optional: true 2111 | sass: 2112 | optional: true 2113 | stylus: 2114 | optional: true 2115 | sugarss: 2116 | optional: true 2117 | terser: 2118 | optional: true 2119 | dependencies: 2120 | esbuild: 0.18.20 2121 | postcss: 8.4.31 2122 | rollup: 3.29.4 2123 | optionalDependencies: 2124 | fsevents: 2.3.3 2125 | dev: true 2126 | 2127 | /vue-template-compiler@2.7.15: 2128 | resolution: {integrity: sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==} 2129 | dependencies: 2130 | de-indent: 1.0.2 2131 | he: 1.2.0 2132 | dev: true 2133 | 2134 | /vue-tsc@1.8.22(typescript@5.2.2): 2135 | resolution: {integrity: sha512-j9P4kHtW6eEE08aS5McFZE/ivmipXy0JzrnTgbomfABMaVKx37kNBw//irL3+LlE3kOo63XpnRigyPC3w7+z+A==} 2136 | hasBin: true 2137 | peerDependencies: 2138 | typescript: '*' 2139 | dependencies: 2140 | '@volar/typescript': 1.10.10 2141 | '@vue/language-core': 1.8.22(typescript@5.2.2) 2142 | semver: 7.5.4 2143 | typescript: 5.2.2 2144 | dev: true 2145 | 2146 | /which@2.0.2: 2147 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2148 | engines: {node: '>= 8'} 2149 | hasBin: true 2150 | dependencies: 2151 | isexe: 2.0.0 2152 | dev: true 2153 | 2154 | /wrappy@1.0.2: 2155 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2156 | dev: true 2157 | 2158 | /yallist@3.1.1: 2159 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2160 | dev: true 2161 | 2162 | /yallist@4.0.0: 2163 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2164 | dev: true 2165 | 2166 | /yocto-queue@0.1.0: 2167 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2168 | engines: {node: '>=10'} 2169 | dev: true 2170 | 2171 | /z-schema@5.0.5: 2172 | resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} 2173 | engines: {node: '>=8.0.0'} 2174 | hasBin: true 2175 | dependencies: 2176 | lodash.get: 4.4.2 2177 | lodash.isequal: 4.5.0 2178 | validator: 13.11.0 2179 | optionalDependencies: 2180 | commander: 9.5.0 2181 | dev: true 2182 | --------------------------------------------------------------------------------