diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..40b878db --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..8e6b48f2 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/Intermediate/17-debugging.js" + } + ] +} \ No newline at end of file diff --git a/Basic/00-helloworld.js b/Basic/00-helloworld.js index bd53b78c..23a48e6e 100644 --- a/Basic/00-helloworld.js +++ b/Basic/00-helloworld.js @@ -1,7 +1,9 @@ /* -Clase 1 en vídeo | 10/07/2024 -Introducción, instalación, hola mundo y variables -https://www.twitch.tv/videos/2194200202?t=00h14m43s +Clases 1 a 14 (sin código) +Vídeo: https://youtu.be/1glVfFxj8a4 + +Clase 15 - Hola mundo +Vídeo: https://youtu.be/1glVfFxj8a4?t=2390 */ // Esto es un comentario simple diff --git a/Basic/01-variables.js b/Basic/01-variables.js index 15eb6ec2..e1f7b6dd 100644 --- a/Basic/01-variables.js +++ b/Basic/01-variables.js @@ -1,7 +1,6 @@ /* -Clase 1 en vídeo | 10/07/2024 -Introducción, instalación, hola mundo y variables -https://www.twitch.tv/videos/2194200202?t=00h14m43s +Clase 16 - Variables +Vídeo: https://youtu.be/1glVfFxj8a4?t=3049 */ // var diff --git a/Basic/02-datatypes.js b/Basic/02-datatypes.js index 71392292..ab37f6ee 100644 --- a/Basic/02-datatypes.js +++ b/Basic/02-datatypes.js @@ -1,7 +1,6 @@ /* -Clase 2 en vídeo | 17/07/2024 -Tipos de datos, operadores y strings -https://www.twitch.tv/videos/2200149072?t=00h08m02s +Clase 17 - Tipos de datos +Vídeo: https://youtu.be/1glVfFxj8a4?t=3599 */ // Tipos de datos primitivos diff --git a/Basic/03-beginner-exercises.js b/Basic/03-beginner-exercises.js index 9d7000a4..2e7dd657 100644 --- a/Basic/03-beginner-exercises.js +++ b/Basic/03-beginner-exercises.js @@ -1,7 +1,6 @@ /* -Clase 2 en vídeo | 17/07/2024 -Tipos de datos, operadores y strings -https://www.twitch.tv/videos/2200149072?t=00h08m02s +Clase 18 - Ejercicios: primeros pasos +Vídeo: https://youtu.be/1glVfFxj8a4?t=4733 */ // 1. Escribe un comentario en una línea @@ -22,4 +21,4 @@ https://www.twitch.tv/videos/2200149072?t=00h08m02s // 9. A continuación, modifica los valores de las constantes -// 10. Comenta las líneas que produzcan algún tipo de error al ejecutarser \ No newline at end of file +// 10. Comenta las líneas que produzcan algún tipo de error al ejecutarse \ No newline at end of file diff --git a/Basic/04-operators.js b/Basic/04-operators.js index 30507444..cac42886 100644 --- a/Basic/04-operators.js +++ b/Basic/04-operators.js @@ -1,7 +1,6 @@ /* -Clase 2 en vídeo | 17/07/2024 -Tipos de datos, operadores y strings -https://www.twitch.tv/videos/2200149072?t=00h08m02s +Clase 19 - Operadores +Vídeo: https://youtu.be/1glVfFxj8a4?t=4937 */ // Operadores Aritméticos diff --git a/Basic/05-operators-exercises.js b/Basic/05-operators-exercises.js index 22bf2a89..a6265eac 100644 --- a/Basic/05-operators-exercises.js +++ b/Basic/05-operators-exercises.js @@ -1,7 +1,6 @@ /* -Clase 2 en vídeo | 17/07/2024 -Tipos de datos, operadores y strings -https://www.twitch.tv/videos/2200149072?t=00h08m02s +Clase 20 - Ejercicios: Operadores +Vídeo: https://youtu.be/1glVfFxj8a4?t=6458 */ // 1. Crea una variable para cada operación aritmética @@ -9,7 +8,7 @@ https://www.twitch.tv/videos/2200149072?t=00h08m02s // 2. Crea una variable para cada tipo de operación de asignación, // que haga uso de las variables utilizadas para las operaciones aritméticas -// 3. Imprime 5 comparaciones verdades con diferentes operadores de comparación +// 3. Imprime 5 comparaciones verdaderas con diferentes operadores de comparación // 4. Imprime 5 comparaciones falsas con diferentes operadores de comparación diff --git a/Basic/06-strings.js b/Basic/06-strings.js index f0fa999e..8c257b7b 100644 --- a/Basic/06-strings.js +++ b/Basic/06-strings.js @@ -1,7 +1,6 @@ /* -Clase 2 en vídeo | 17/07/2024 -Tipos de datos, operadores y strings -https://www.twitch.tv/videos/2200149072?t=00h08m02s +Clase 21 - Strings +Vídeo: https://youtu.be/1glVfFxj8a4?t=6565 */ // Strings (cadenas de texto) diff --git a/Basic/07-strings-exercises.js b/Basic/07-strings-exercises.js index abcb7e65..c08f0166 100644 --- a/Basic/07-strings-exercises.js +++ b/Basic/07-strings-exercises.js @@ -1,7 +1,6 @@ /* -Clase 2 en vídeo | 17/07/2024 -Tipos de datos, operadores y strings -https://www.twitch.tv/videos/2200149072?t=00h08m02s +Clase 22 - Ejercicios: Strings +Vídeo: https://youtu.be/1glVfFxj8a4?t=7226 */ // 1. Concatena dos cadenas de texto diff --git a/Basic/08-conditionals.js b/Basic/08-conditionals.js index 01c8704d..22bfcfa2 100644 --- a/Basic/08-conditionals.js +++ b/Basic/08-conditionals.js @@ -1,7 +1,6 @@ /* -Clase 3 en vídeo | 24/07/2024 -Condicionales, arrays y sets -https://www.twitch.tv/videos/2206228701?t=00h16m02s +Clase 23 - Condicionales +Vídeo: https://youtu.be/1glVfFxj8a4?t=7277 */ // if, else if, else diff --git a/Basic/09-conditionals-exercises.js b/Basic/09-conditionals-exercises.js index 60eefd43..380e6542 100644 --- a/Basic/09-conditionals-exercises.js +++ b/Basic/09-conditionals-exercises.js @@ -1,7 +1,6 @@ /* -Clase 3 en vídeo | 24/07/2024 -Condicionales, arrays y sets -https://www.twitch.tv/videos/2206228701?t=00h16m02s +Clase 24 - Ejercicios: Condicionales +Vídeo: https://youtu.be/1glVfFxj8a4?t=8652 */ // if/else/else if/ternaria diff --git a/Basic/10-array.js b/Basic/10-array.js index f498c853..b9028147 100644 --- a/Basic/10-array.js +++ b/Basic/10-array.js @@ -1,7 +1,6 @@ /* -Clase 3 en vídeo | 24/07/2024 -Condicionales, arrays y sets -https://www.twitch.tv/videos/2206228701?t=00h16m02s +Clase 25 - Arrays +Vídeo: https://youtu.be/1glVfFxj8a4?t=8741 */ // Array diff --git a/Basic/11-set.js b/Basic/11-set.js index 83b3971a..aab6cf3f 100644 --- a/Basic/11-set.js +++ b/Basic/11-set.js @@ -1,7 +1,6 @@ /* -Clase 3 en vídeo | 24/07/2024 -Condicionales, arrays y sets -https://www.twitch.tv/videos/2206228701?t=00h16m02s +Clase 26 - Sets +Vídeo: https://youtu.be/1glVfFxj8a4?t=9952 */ // Set diff --git a/Basic/12-map.js b/Basic/12-map.js index c97944bd..b91f3d6c 100644 --- a/Basic/12-map.js +++ b/Basic/12-map.js @@ -1,7 +1,6 @@ /* -Clase 4 en vídeo | 31/07/2024 -Mapas, bucles y funciones -https://www.twitch.tv/videos/2212289583?t=00h17m45s +Clase 27 - Maps +Vídeo: https://youtu.be/1glVfFxj8a4?t=10755 */ // Map diff --git a/Basic/13-structures-exercises.js b/Basic/13-structures-exercises.js index b172fa49..1b094502 100644 --- a/Basic/13-structures-exercises.js +++ b/Basic/13-structures-exercises.js @@ -1,7 +1,6 @@ /* -Clase 4 en vídeo | 31/07/2024 -Mapas, bucles y funciones -https://www.twitch.tv/videos/2212289583?t=00h17m45s +Clase 28 - Ejercicios: Estructuras +Vídeo: https://youtu.be/1glVfFxj8a4?t=11451 */ // 1. Crea un array que almacene cinco animales diff --git a/Basic/14-loops.js b/Basic/14-loops.js index 1b642933..9c404287 100644 --- a/Basic/14-loops.js +++ b/Basic/14-loops.js @@ -1,7 +1,6 @@ /* -Clase 4 en vídeo | 31/07/2024 -Mapas, bucles y funciones -https://www.twitch.tv/videos/2212289583?t=00h17m45s +Clase 29 - Bucles +Vídeo: https://youtu.be/1glVfFxj8a4?t=11575 */ // Loops o bucles @@ -40,32 +39,32 @@ do { // for of -myArray = [1, 2, 3, 4] +const myArray = [1, 2, 3, 4] -mySet = new Set(["Brais", "Moure", "mouredev", 37, true, "braismoure@mouredev.com"]) +const mySet = new Set(["Brais", "Moure", "mouredev", 37, true, "braismoure@mouredev.com"]) -myMap = new Map([ +const myMap = new Map([ ["name", "Brais"], ["email", "braismoure@mouredev.com"], ["age", 37] ]) -myString = "¡Hola, JavaScript!" +const myString = "¡Hola, JavaScript!" -for (let valor of myArray) { - console.log(valor) +for (let value of myArray) { + console.log(value) } -for (let valor of mySet) { - console.log(valor) +for (let value of mySet) { + console.log(value) } -for (let valor of myMap) { - console.log(valor) +for (let value of myMap) { + console.log(value) } -for (let valor of myString) { - console.log(valor) +for (let value of myString) { + console.log(value) } // break y continue diff --git a/Basic/15-loops-exercises.js b/Basic/15-loops-exercises.js index dab8552e..2a27cdd0 100644 --- a/Basic/15-loops-exercises.js +++ b/Basic/15-loops-exercises.js @@ -1,7 +1,6 @@ /* -Clase 4 en vídeo | 31/07/2024 -Mapas, bucles y funciones -https://www.twitch.tv/videos/2212289583?t=00h17m45s +Clase 30 - Ejercicios: Bucles +Vídeo: https://youtu.be/1glVfFxj8a4?t=12732 */ // NOTA: Explora diferentes sintaxis de bucles para resolver los ejercicios diff --git a/Basic/16-functions.js b/Basic/16-functions.js index 42a886f2..b7952a02 100644 --- a/Basic/16-functions.js +++ b/Basic/16-functions.js @@ -1,7 +1,6 @@ /* -Clase 4 en vídeo | 31/07/2024 -Mapas, bucles y funciones -https://www.twitch.tv/videos/2212289583?t=00h17m45s +Clase 31 - Funciones +Vídeo: https://youtu.be/1glVfFxj8a4?t=12829 */ // Funciones @@ -63,7 +62,7 @@ function defaultSum(a = 0, b = 0) { defaultSum() defaultSum(5) defaultSum(5, 10) -defaultSum(b = 5) +defaultSum(undefined, 5) // Retorno de valores @@ -97,11 +96,11 @@ applyFunc(myFunc4, "función de orden superior") // forEach -myArray = [1, 2, 3, 4] +const myArray = [1, 2, 3, 4] -mySet = new Set(["Brais", "Moure", "mouredev", 37, true, "braismoure@mouredev.com"]) +const mySet = new Set(["Brais", "Moure", "mouredev", 37, true, "braismoure@mouredev.com"]) -myMap = new Map([ +const myMap = new Map([ ["name", "Brais"], ["email", "braismoure@mouredev.com"], ["age", 37] diff --git a/Basic/17-functions-exercises.js b/Basic/17-functions-exercises.js index 81bbb6b9..fb7eb4e5 100644 --- a/Basic/17-functions-exercises.js +++ b/Basic/17-functions-exercises.js @@ -1,7 +1,6 @@ /* -Clase 4 en vídeo | 31/07/2024 -Mapas, bucles y funciones -https://www.twitch.tv/videos/2212289583?t=00h17m45s +Clase 32 - Ejercicios: Funciones +Vídeo: https://youtu.be/1glVfFxj8a4?t=14146 */ // NOTA: Explora diferentes sintaxis de funciones para resolver los ejercicios diff --git a/Basic/18-objects.js b/Basic/18-objects.js new file mode 100644 index 00000000..4e71a6b2 --- /dev/null +++ b/Basic/18-objects.js @@ -0,0 +1,119 @@ +/* +Clase 33 - Objetos +Vídeo: https://youtu.be/1glVfFxj8a4?t=14229 +*/ + +// Objetos + +// Sintaxis + +let person = { + name: "Brais", + age: 37, + alias: "MoureDev" +} + +// Acceso a propiedades + +// Notación punto +console.log(person.name) + +// Notación de corchetes +console.log(person["name"]) + +// Modificación de propiedades + +person.name = "Brais Moure" +console.log(person.name) + +console.log(typeof person.age) +person.age = "37" +console.log(person.age) +console.log(typeof person.age) + +// Eliminación de propiedades + +delete person.age + +console.log(person) + +// Nueva propiedad + +person.email = "braismoure@mouredev.com" +person["age"] = 37 + +console.log(person) + +// Métodos (funciones) + +let person2 = { + name: "Brais", + age: 37, + alias: "MoureDev", + walk: function () { + console.log("La persona camina.") + } +} +person2.walk() + +// Anidación de objetos + +let person3 = { + name: "Brais", + age: 37, + alias: "MoureDev", + walk: function () { + console.log("La persona camina.") + }, + job: { + name: "Programador", + exp: 15, + work: function () { + console.log(`La persona de ${this.age} años de experiencia trabaja.`) + } + } +} + +console.log(person3) + +console.log(person3.name) +console.log(person3.job) +console.log(person3.job.name) +person3.job.work() + +// Igualdad de objetos + +let person4 = { + name: "Brais Moure", + alias: "MoureDev", + email: "braismoure@mouredev.com", + age: 37 +} + +console.log(person) +console.log(person4) + +console.log(person == person4) +console.log(person === person4) + +console.log(person.name == person4.name) + +// Iteración + +for (let key in person4) { + console.log(key + ": " + person4[key]) +} + +// Funciones como objetos + +function Person(name, age) { // Debería ser una clase + this.name = name + this.age = age +} + +let person5 = new Person("Brais", 37) +console.log(person5) +console.log(person5.name) + +console.log(typeof person5) +console.log(typeof person4) \ No newline at end of file diff --git a/Basic/19-objects-exercises.js b/Basic/19-objects-exercises.js new file mode 100644 index 00000000..5dbbd628 --- /dev/null +++ b/Basic/19-objects-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 34 - Ejercicios: Objetos +Vídeo: https://youtu.be/1glVfFxj8a4?t=15675 +*/ + +// 1. Crea un objeto con 3 propiedades + +// 2. Accede y muestra su valor + +// 3. Agrega una nueva propiedad + +// 4. Elimina una de las 3 primeras propiedades + +// 5. Agrega una función e invócala + +// 6. Itera las propiedades del objeto + +// 7. Crea un objeto anidado + +// 8. Accede y muestra el valor de las propiedades anidadas + +// 9. Comprueba si los dos objetos creados son iguales + +// 10. Comprueba si dos propiedades diferentes son iguales \ No newline at end of file diff --git a/Basic/20-destructuring-spreading.js b/Basic/20-destructuring-spreading.js new file mode 100644 index 00000000..385cb24d --- /dev/null +++ b/Basic/20-destructuring-spreading.js @@ -0,0 +1,121 @@ +/* +Clase 35 - Desestructuración y propagación +Vídeo: https://youtu.be/1glVfFxj8a4?t=15747 +*/ + +let myArray = [1, 2, 3, 4] + +let person = { + name: "Brais", + age: 37, + alias: "MoureDev" +} + +let myValue = myArray[1] +console.log(myValue) + +let myName = person.name +console.log(myName) + +// Desestructuración + +// Sintaxis arrays + +let [myValue0, myValue1, myValue2, myValue3, myValue4] = myArray +console.log(myValue0) +console.log(myValue1) +console.log(myValue2) +console.log(myValue3) +console.log(myValue4) + +// Sintaxis arrays con valores predeterminados + +let [myValue5 = 0, myValue6 = 0, myValue7 = 0, myValue8 = 0, myValue9 = 0] = myArray +console.log(myValue5) +console.log(myValue6) +console.log(myValue7) +console.log(myValue8) +console.log(myValue9) + +// Ignorar elementos array + +let [myValue10, , , myValue13] = myArray +console.log(myValue10) +console.log(myValue13) + +// Sintaxis objects + +let { name, age, alias } = person +console.log(name) +console.log(age) +console.log(alias) + +// Sintaxis objects con valores predeterminados + +let { name2, age2, alias2, email = "email@email.com" } = person +console.log(name2) // No existe +console.log(age2) // No existe +console.log(alias2) // No existe +console.log(email) + +// Sintaxis objects con nuevos nombres de variables + +let { alias: alias3, name: name3, age: age3 } = person +console.log(name3) +console.log(age3) +console.log(alias3) + +// Objects anidados + +let person3 = { + name: "Brais", + age: 37, + alias: "MoureDev", + walk: function () { + console.log("La persona camina.") + }, + job: { + name: "Programador", + exp: 15, + work: function () { + console.log(`La persona de ${this.age} años de experiencia trabaja.`) + } + } +} + +let { name: name4, job: { name: jobName } } = person3 + +console.log(name4) +console.log(jobName) + +// Propagación (...) + +// Sintaxis arrays + +let myArray2 = [...myArray, 5, 6] + +console.log(myArray2) + +// Copia de arrays + +let myArray3 = [...myArray] + +console.log(myArray3) + +// Combinación de arrays + +let myArray4 = [...myArray, ...myArray2, ...myArray3] + +console.log(myArray4) + +// Sintaxis objects + +let person4 = { ...person, email: "braismoure@mouredev.com" } + +console.log(person4) + +// Copia de objects + +let person5 = { ...person } + +console.log(person5) \ No newline at end of file diff --git a/Basic/21-destructuring-spreading-exercises.js b/Basic/21-destructuring-spreading-exercises.js new file mode 100644 index 00000000..feadceb3 --- /dev/null +++ b/Basic/21-destructuring-spreading-exercises.js @@ -0,0 +1,25 @@ +/* +Clase 36 - Ejercicios: Desestructuración y propagación +Vídeo: https://youtu.be/1glVfFxj8a4?t=16802 +*/ + +// 1. Usa desestructuración para extraer los dos primeros elementos de un array + +// 2. Usa desestructuración en un array y asigna un valor predeterminado a una variable + +// 3. Usa desestructuración para extraer dos propiedades de un objeto + +// 4. Usa desestructuración para extraer dos propiedades de un objeto y asígnalas +// a nuevas variables con nombres diferentes + +// 5. Usa desestructuración para extraer dos propiedades de un objeto anidado + +// 6. Usa propagación para combinar dos arrays en uno nuevo + +// 7. Usa propagación para crear una copia de un array + +// 8. Usa propagación para combinar dos objetos en uno nuevo + +// 9. Usa propagación para crear una copia de un objeto + +// 10. Combina desestructuración y propagación \ No newline at end of file diff --git a/Basic/22-classes.js b/Basic/22-classes.js new file mode 100644 index 00000000..b95ddc26 --- /dev/null +++ b/Basic/22-classes.js @@ -0,0 +1,193 @@ +/* +Clase 37 - Clases +Vídeo: https://youtu.be/1glVfFxj8a4?t=16864 +*/ + +// Clases + +class Person { + + constructor(name, age, alias) { + this.name = name + this.age = age + this.alias = alias + } + +} + +// Sintaxis + +let person = new Person("Brais", 37, "MoureDev") +let person2 = new Person("Brais", 37, "MoureDev") + +console.log(person) +console.log(person2) + +console.log(typeof person) + +// Valores por defecto + +class DefaultPerson { + + constructor(name = "Sin nombre", age = 0, alias = "Sin alias") { + this.name = name + this.age = age + this.alias = alias + } + +} + +let person3 = new DefaultPerson("Brais", 37) + +console.log(person3) + +// Acceso a propiedades + +console.log(person3.alias) +console.log(person3["alias"]) + +person3.alias = "MoureDev" + +console.log(person3.alias) + +// Funciones en clases + +class PersonWithMethod { + + constructor(name, age, alias) { + this.name = name + this.age = age + this.alias = alias + } + + walk() { + console.log("La persona camina.") + } + +} + +let person4 = new PersonWithMethod("Brais", 37, "MoureDev") +person4.walk() + +// Propiedades privadas + +class PrivatePerson { + + #bank + + constructor(name, age, alias, bank) { + this.name = name + this.age = age + this.alias = alias + this.#bank = bank + } + + pay() { + this.#bank + } + +} + +let person5 = new PrivatePerson("Brais", 37, "MoureDev", "IBAN123456789") + +// No podemos acceder +// console.log(person5.bank) +// person5.bank = "new IBAN123456789" // bank no es #bank + +console.log(person5) + +// Getters y Setters + +class GetSetPerson { + + #name + #age + #alias + #bank + + constructor(name, age, alias, bank) { + this.#name = name + this.#age = age + this.#alias = alias + this.#bank = bank + } + + get name() { + return this.#name + } + + set bank(bank) { + this.#bank = bank + } + +} + +person6 = new GetSetPerson("Brais", 37, "MoureDev", "IBAN123456789") + +console.log(person6) +console.log(person6.name) + +person6.bank = "new IBAN123456789" + +/* +Clase 38 - Herencia de clases +Vídeo: https://youtu.be/1glVfFxj8a4?t=17999 +*/ + +// Herencia + +class Animal { + + constructor(name) { + this.name = name + } + + sound() { + console.log("El animal emite un sonido genérico") + } + +} + +class Dog extends Animal { + + sound() { + console.log("Guau!") + } + + run() { + console.log("El perro corre") + } + +} + +class Fish extends Animal { + + constructor(name, size) { + super(name) + this.size = size + } + + swim() { + console.log("El pez nada") + } + +} + +let myDog = new Dog("MoureDog") +myDog.run() +myDog.sound() + +let myFish = new Fish("MoureFish", 10) +myFish.swim() +myFish.sound() + +// Métodos estáticos + +class MathOperations { + + static sum(a, b) { + return a + b + } +} + +console.log(MathOperations.sum(5, 10)) \ No newline at end of file diff --git a/Basic/23-classes-exercises.js b/Basic/23-classes-exercises.js new file mode 100644 index 00000000..e26e0232 --- /dev/null +++ b/Basic/23-classes-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 39 - Ejercicios: Clases +Vídeo: https://youtu.be/1glVfFxj8a4?t=18630 +*/ + +// 1. Crea una clase que reciba dos propiedades + +// 2. Añade un método a la clase que utilice las propiedades + +// 3. Muestra los valores de las propiedades e invoca a la función + +// 4. Añade un método estático a la primera clase + +// 5. Haz uso del método estático + +// 6. Crea una clase que haga uso de herencia + +// 7. Crea una clase que haga uso de getters y setters + +// 8. Modifica la clase con getters y setters para que use propiedades privadas + +// 9. Utiliza los get y set y muestra sus valores + +// 10. Sobrescribe un método de una clase que utilice herencia \ No newline at end of file diff --git a/Basic/24-error-handling.js b/Basic/24-error-handling.js new file mode 100644 index 00000000..43cb9d9d --- /dev/null +++ b/Basic/24-error-handling.js @@ -0,0 +1,111 @@ +/* +Clase 40 - Manejo de errores +Vídeo: https://youtu.be/1glVfFxj8a4?t=18751 +*/ + +// Excepción + +// Produce una excepción +let myObject +// console.log(myObject.email) + +// Captura de errores + +// try-catch + +try { + // Código que intenta ejecutar + console.log(myObject.email) + console.log("Finaliza la ejecución sin errores") +} catch { + // Bloque de error + console.log("Se ha producido un error") +} + +// Captura del error + +try { + console.log(myObject.email) +} catch (error) { + console.log("Se ha producido un error:", error.message) +} + +// finally + +try { + console.log(myObject.email) +} catch (error) { + console.log("Se ha producido un error:", error.message) +} finally { + console.log("Este código se ejecuta siempre") +} + +// No está soportado +// try { +// console.log(myObject.email) +// } finally { +// console.log("Este código se ejecuta siempre") +// } + +// Lanzamiento de errores + +// throw + +// throw new Error("Se ha producido un error") + +function sumIntegers(a, b) { + if (typeof a !== "number" || typeof b !== "number") { + throw new TypeError("Esta operación sólo suma números") + } + if (!Number.isInteger(a) || !Number.isInteger(b)) { + throw new Error("Esta operación sólo suma números enteros") + } + if (a == 0 || b == 0) { + throw new SumZeroIntegerError("Se está intentando sumar cero", a, b) + } + return a + b +} + +try { + console.log(sumIntegers(5, 10)) + // console.log(sumIntegers(5.5, 10)) + console.log(sumIntegers("5", 10)) + // console.log(sumIntegers(5, "10")) + // console.log(sumIntegers("5", "10")) +} catch (error) { + console.log("Se ha producido un error:", error.message) +} + +// Capturar varios tipos de errores + +try { + // console.log(sumIntegers(5.5, 10)) + console.log(sumIntegers("5", 10)) +} catch (error) { + if (error instanceof TypeError) { + console.log("Se ha producido un error de tipo:", error.message) + } else if (error instanceof Error) { + console.log("Se ha producido un error:", error.message) + } +} + +// Crear excepciones personalizadas + +class SumZeroIntegerError extends Error { + constructor(message, a, b) { + super(message) + this.a = a + this.b = b + } + + printNumbers() { + console.log(this.a, " + ", this.b) + } +} + +try { + console.log(sumIntegers(0, 10)) +} catch (error) { + console.log("Se ha producido un error personalizado:", error.message) + error.printNumbers() +} \ No newline at end of file diff --git a/Basic/25-error-handling-exercises.js b/Basic/25-error-handling-exercises.js new file mode 100644 index 00000000..5e227586 --- /dev/null +++ b/Basic/25-error-handling-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 41 - Ejercicios: Manejo de errores +Vídeo: https://youtu.be/1glVfFxj8a4?t=20392 +*/ + +// 1. Captura una excepción utilizando try-catch + +// 2. Captura una excepción utilizando try-catch y finally + +// 3. Lanza una excepción genérica + +// 4. Crea una excepción personalizada + +// 5. Lanza una excepción personalizada + +// 6. Lanza varias excepciones según una lógica definida + +// 7. Captura varias excepciones en un mismo try-catch + +// 8. Crea un bucle que intente transformar a float cada valor y capture y muestre los errores + +// 9. Crea una función que verifique si un objeto tiene una propiedad específica y lance una excepción personalizada + +// 10. Crea una función que realice reintentos en caso de error hasta un máximo de 10 \ No newline at end of file diff --git a/Basic/26-console-methods.js b/Basic/26-console-methods.js new file mode 100644 index 00000000..e5f9177d --- /dev/null +++ b/Basic/26-console-methods.js @@ -0,0 +1,97 @@ +/* +Clase 42 - Console +Vídeo: https://youtu.be/1glVfFxj8a4?t=20444 +*/ + +// Console + +// log + +console.log("¡Hola, JavaScript!") + +// error + +console.error("Este es un mensaje de error.") +console.error("Error al conectarse a la base de datos: ", new Error("Conexión fallida.")) + +// warn + +console.warn("Este es un mensaje de advertencia.") + +// info + +console.info("Este es un mensaje de información adicional.") + +// table + +let data = [ + ["Brais", 37], + ["Sara", 21] +] + +console.table(data) + +data = [ + { name: "Brais", age: 37 }, + { name: "Sara", age: 21 } +] + +console.table(data) + +// group + +console.group("Usuario:") +console.log("Nombre: Brais") +console.log("Edad: 37") +console.groupEnd() + +// time + +console.time("Tiempo de ejecución 2") + +for (let i = 0; i < 10000; i++) { + +} + +console.time("Tiempo de ejecución 1") + +for (let i = 0; i < 10000; i++) { + +} + +console.timeEnd("Tiempo de ejecución 2") + +for (let i = 0; i < 10000; i++) { + +} + +console.timeEnd("Tiempo de ejecución 1") + +// assert + +let age = 17 +console.assert(age >= 18, "El usuario debe ser mayor de edad.") + +// count + +console.count("Click") +console.count("Click") +console.count("Click") +console.countReset("Click") +console.count("Click") + +// trace + +function funcA() { + funcB() +} + +function funcB() { + console.trace("Seguimiento de la ejecución.") +} + +funcA() + +// clear + +// console.clear() \ No newline at end of file diff --git a/Basic/27-console-methods-exercises.js b/Basic/27-console-methods-exercises.js new file mode 100644 index 00000000..9c38919b --- /dev/null +++ b/Basic/27-console-methods-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 43 - Ejercicios: Console +Vídeo: https://youtu.be/1glVfFxj8a4?t=21421 +*/ + +// 1. Crea un función que utilice error correctamente + +// 2. Crea una función que utilice warn correctamente + +// 3. Crea una función que utilice info correctamente + +// 4. Utiliza table + +// 5. Utiliza group + +// 6. Utiliza time + +// 7. Valida con assert si un número es positivo + +// 8. Utiliza count + +// 9. Utiliza trace + +// 10. Utiliza clear \ No newline at end of file diff --git a/Basic/28-export-modules.js b/Basic/28-export-modules.js new file mode 100644 index 00000000..42f92679 --- /dev/null +++ b/Basic/28-export-modules.js @@ -0,0 +1,50 @@ +/* +Clase 44 - Módulos +Vídeo: https://youtu.be/1glVfFxj8a4?t=21480 +*/ + +// Exportación de módulos + +// Funciones + +export function add(a, b) { + return a + b +} + +console.log(add(5, 10)) + +// Propiedades + +export const PI = 3.1416 +export let name = "MoureDev" + +// Clases + +export class Circle { + + constructor(radius) { + this.radius = radius + } + + area() { + return Math.PI * Math.pow(this.radius, 2) + } + + perimeter() { + return 2 * Math.PI * this.radius + } + +} + +// Exportación por defecto + +export default function substract(a, b) { + return a - b +} + +// export default class MyClass { + +// func() { +// console.log("Mi clase") +// } +// } diff --git a/Basic/29-import-modules.js b/Basic/29-import-modules.js new file mode 100644 index 00000000..e702dc84 --- /dev/null +++ b/Basic/29-import-modules.js @@ -0,0 +1,37 @@ +/* +Clase 44 - Módulos +Vídeo: https://youtu.be/1glVfFxj8a4?t=21480 +*/ + +// Importación de módulos + +import { add, PI, name, Circle } from "./28-export-modules.js" + +import defaultImport from "./28-export-modules.js" + +// Funciones + +console.log(add(5, 10)) + +// Propiedades + +console.log(PI) +console.log(name) + +// Clases + +let circle = new Circle(10) +console.log(circle.radius) +console.log(circle.area().toFixed(2)) +console.log(circle.perimeter().toFixed(2)) + +// Importación por defecto + +console.log(defaultImport(5, 10)) + +// let myClass = new defaultImport() +// myClass.func() + +// Proyecto modular + +// import { MyImport } from "./directory/file.js" \ No newline at end of file diff --git a/Basic/30-import-external-modules.cjs b/Basic/30-import-external-modules.cjs new file mode 100644 index 00000000..5718b5d4 --- /dev/null +++ b/Basic/30-import-external-modules.cjs @@ -0,0 +1,13 @@ +/* +Clase 44 - Módulos +Vídeo: https://youtu.be/1glVfFxj8a4?t=21480 +*/ + +// Módulos externos + +const os = require("os") + +console.log(os.platform()) +console.log(os.arch()) +console.log(os.totalmem()) +console.log(os.freemem()) \ No newline at end of file diff --git a/Basic/31-modules-exercises.js b/Basic/31-modules-exercises.js new file mode 100644 index 00000000..a09c62b9 --- /dev/null +++ b/Basic/31-modules-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 45 - Ejercicios: Módulos +Vídeo: https://youtu.be/1glVfFxj8a4?t=22720 +*/ + +// 1. Exporta una función + +// 2. Exporta una constante + +// 3. Exporta una clase + +// 4. Importa una función + +// 5. Importa una constante + +// 6. Importa una clase + +// 7. Exporta una función, una constante y una clase por defecto (en caso de que lo permita) + +// 8. Importa una función, una constante y una clase por defecto (en caso de que lo permita) + +// 9. Exporta una función, una constante y una clase desde una carpeta + +// 10. Importa una función, una constante y una clase desde un directorio diferente al anterior \ No newline at end of file diff --git a/Basic/package.json b/Basic/package.json new file mode 100644 index 00000000..96ae6e57 --- /dev/null +++ b/Basic/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} \ No newline at end of file diff --git a/Images/header.jpg b/Images/header.jpg index 9783d134..b4d99095 100644 Binary files a/Images/header.jpg and b/Images/header.jpg differ diff --git a/Images/intermediate.jpg b/Images/intermediate.jpg new file mode 100644 index 00000000..02aa04f1 Binary files /dev/null and b/Images/intermediate.jpg differ diff --git a/Images/pro.jpg b/Images/pro.jpg new file mode 100644 index 00000000..986b7705 Binary files /dev/null and b/Images/pro.jpg differ diff --git a/Intermediate/00-advanced-functions.js b/Intermediate/00-advanced-functions.js new file mode 100644 index 00000000..e2094d5f --- /dev/null +++ b/Intermediate/00-advanced-functions.js @@ -0,0 +1,155 @@ +/* +Clases 2 a 11 - Funciones avanzadas +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=346 +*/ + +// Ciudadanos de primera clase + +const greet = function (name) { + console.log(`Hola, ${name}`) +} + +greet("Brais") + +function processGreeting(greetFunction, name) { + greetFunction(name) +} + +function returnGreeting() { + return greet +} + +processGreeting(greet, "MoureDev") +const greet2 = returnGreeting() +greet2("Brais Moure") + +// Arrow functions avanzadas + +// - Retorno implícito +const multiply = (a, b) => a * b +console.log(multiply(2, 5)) + +// - this léxico +const handler = { + name: "Brais", + greeting: function () { + console.log(`Hola, ${this.name}`) + }, + arrowGreeting: () => { + console.log(`Hola, ${this.name}`) + } +} + +handler.greeting() +handler.arrowGreeting(); + +// IIFE (Expresión de Función Invocada Inmediatamente) + +(function () { + console.log("IIFE clásico") +})(); + +(() => { + console.log("IIFE con arrow function") +})(); + +// Parámetros Rest (...) + +function sum(...numbers) { + let result = 0 + for (let number of numbers) { + result += number + } + return result +} + +console.log(sum(1, 2, 3, 4, 5)) +console.log(sum(10, 15)) + +// Operador Spread (...) + +const numbers = [1, 2, 3] +function sumWithSpread(a, b, c) { + return a + b + c +} + +console.log(sumWithSpread(1, 2, 3)) // Sin Spread +console.log(sumWithSpread(...numbers)) // Con Spread + +// Closures (Clausuras) + +function createCounter() { + let counter = 0 + return function () { + counter++ + console.log(`Contador: ${counter}`) + } +} + +const counter = createCounter() +counter() +counter() +counter() +counter() + +// Recursividad + +function factorial(n) { + if (n <= 1) { + return 1 + } + return n * factorial(n - 1) +} + +console.log(factorial(5)) + +// Funciones parciales + +function partialSum(a) { + return function (b, c) { + return sum(a, b, c) + } +} + +const sumWith = partialSum(4) +console.log(sumWith(2, 3)) +console.log(sumWith(1, 2)) + +// Currying + +function currySum(a) { + return function (b) { + return function (c) { + return function (d) { + return sum(a, b, c, d) + } + } + } +} + +const sumAB = currySum(1)(2) +const sumC = sumAB(3) +console.log(sumC(3)) +console.log(sumC(4)) +console.log(sumAB(5)(7)) + +// Callbacks + +function processData(data, callback) { + const result = sum(...data) + callback(result) +} + +function processResult(result) { + console.log(result) +} + +function processResult2(result) { + console.log(`Mi resultado es: ${result}`) +} + +processData([1, 2, 3], processResult) +processData([1, 2, 3], processResult2) +processData([1, 2, 3], (result) => { + console.log(`Mi resultado en la arrow function es: ${result}`) +}) \ No newline at end of file diff --git a/Intermediate/01-advanced-functions-exercises.js b/Intermediate/01-advanced-functions-exercises.js new file mode 100644 index 00000000..2d182882 --- /dev/null +++ b/Intermediate/01-advanced-functions-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 12 - Funciones avanzadas +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=4112 +*/ + +// 1. Crea una función que retorne a otra función + +// 2. Implementa una función currificada que multiplique 3 números + +// 3. Desarrolla una función recursiva que calcule la potencia de un número elevado a un exponente + +// 4. Crea una función createCounter() que reciba un valor inicial y retorne un objeto con métodos para increment(), decrement() y getValue(), utilizando un closure para mantener el estado + +// 5. Crea una función sumManyTimes(multiplier, ...numbers) que primero sume todos los números (usando parámetros Rest) y luego multiplique el resultado por multiplier + +// 6. Crea un Callback que se invoque con el resultado de la suma de todos los números que se le pasan a una función + +// 7. Desarrolla una función parcial + +// 8. Implementa un ejemplo que haga uso de Spread + +// 9. Implementa un retorno implícito + +// 10. Haz uso del this léxico \ No newline at end of file diff --git a/Intermediate/02-advanced-structures.js b/Intermediate/02-advanced-structures.js new file mode 100644 index 00000000..52245b08 --- /dev/null +++ b/Intermediate/02-advanced-structures.js @@ -0,0 +1,150 @@ +/* +Clases 13 a 22 - Estructuras avanzadas +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=4355 +*/ + +// Arrays avanzados + +// - Métodos funcionales + +// forEach + +let numbers = [1, 2, 3, 4, 5, 6] + +numbers.forEach(element => console.log(element)) + +// map + +let doubled = numbers.map(element => element * 2) +console.log(doubled) + +// filter + +let evens = numbers.filter(element => element % 2 === 0) +console.log(evens) + +// reduce + +let sum = numbers.reduce((result, current) => result + current, 0) +console.log(sum) + +// - Manipulación + +// flat + +let nestedArray = [1, [2, [3, [4]]]] +console.log(nestedArray) +let flatArray = nestedArray.flat(1) +console.log(flatArray) +flatArray = nestedArray.flat(2) +console.log(flatArray) +flatArray = nestedArray.flat(3) +console.log(flatArray) + +// flatMap + +let phrases = ["Hola mundo", "Adiós mundo"] +let words = phrases.flatMap(phrase => phrase.split(" ")) +console.log(words) + +// - Ordenación + +// sort + +let unsorted = ["b", "a", "d", "c"] +let sorted = unsorted.sort() +console.log(sorted) + +unsorted = [3, 4, 1, 6, 10] +sorted = unsorted.sort((a, b) => a - b) + +console.log(sorted) + +// reverse + +sorted.reverse() +console.log(sorted) + +// - Búsqueda + +// includes + +console.log(sorted.includes(4)) +console.log(sorted.includes(5)) + +// find + +let firstEven = sorted.find(element => element % 2 === 0) +console.log(firstEven) + +// findIndex + +let firstEvenIndex = sorted.findIndex(element => element % 2 === 0) +console.log(firstEvenIndex) + +// Sets avanzados + +// - Operaciones + +// Eliminación de duplicados + +let numbersArray = [1, 2, 2, 3, 4, 5, 6, 6] +numbersArray = [...new Set(numbersArray)] +console.log(numbersArray) + +// Unión + +const setA = new Set([1, 2, 3]) +const setB = new Set([2, 3, 4, 5]) +const union = new Set([...setA, ...setB]) +console.log(union) + +// Intersección + +const intersection = new Set([...setA].filter(element => setB.has(element))) +console.log(intersection) + +// Diferencia + +const difference = new Set([...setA].filter(element => !setB.has(element))) +console.log(difference) + +// - Conversión + +// Set a Array + +console.log([...setA]) + +// - Iteración + +// forEach + +setA.forEach(element => console.log(element)) + +// Maps avanzados + +// - Iteración + +let myMap = new Map([ + ["name", "MoureDev"], + ["age", 37] +]) + +myMap.forEach((value, key) => console.log(`${key}: ${value}`)) + +// - Conversión + +// Map a Array + +const arrayFromMap = Array.from(myMap) +console.log(arrayFromMap) + +// Map a Objeto + +const objectFromMap = Object.fromEntries(myMap) +console.log(objectFromMap) + +// Objeto a Map + +const mapFromObject = new Map(Object.entries(objectFromMap)) +console.log(mapFromObject) \ No newline at end of file diff --git a/Intermediate/03-advanced-structures-exercises.js b/Intermediate/03-advanced-structures-exercises.js new file mode 100644 index 00000000..c633ef28 --- /dev/null +++ b/Intermediate/03-advanced-structures-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 23 - Estructuras avanzadas +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=7514 +*/ + +// 1. Utiliza map, filter y reduce para crear un ejemplo diferente al de la lección + +// 2. Dado un array de números, crea uno nuevo con dichos números elevados al cubo y filtra sólo los números pares + +// 3. Utiliza flat y flatMap para crear un ejemplo diferente al de la lección + +// 4. Ordena un array de números de mayor a menor + +// 5. Dados dos sets, encuentra la unión, intersección y diferencia de ellos + +// 6. Itera los resultados del ejercicio anterior + +// 7. Crea un mapa que almacene información se usuarios (nombre, edad y email) e itera los datos + +// 8. Dado el mapa anterior, crea un array con los nombres + +// 9. Dado el mapa anterior, obtén un array con los email de los usuarios mayores de edad y transfórmalo a un set + +// 10. Transforma el mapa en un objeto, a continuación, transforma el objeto en un mapa con clave el email de cada usuario y como valor todos los datos del usuario \ No newline at end of file diff --git a/Intermediate/04-advanced-objects.js b/Intermediate/04-advanced-objects.js new file mode 100644 index 00000000..d99a0250 --- /dev/null +++ b/Intermediate/04-advanced-objects.js @@ -0,0 +1,73 @@ +/* +Clases 24 a 28 - Objetos y clases avanzados +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=7639 +*/ + +// Objetos avanzados + +// - Prototipos y Herencia + +// Prototipos + +let person = { + name: "Brais", + age: 37, + greet() { + console.log(`Hola, soy ${this.name}`) + } +} + +console.log(person.__proto__) +console.log(Object.getPrototypeOf(person)) + +person.sayAge = function () { + console.log(`Tengo ${this.age} años`) +} + +console.log(person) +person.sayAge() + +// Herencia + +let programmer = Object.create(person) +programmer.language = "JavaScript" + +programmer.name = "MoureDev" +console.log(person.name) +console.log(person.language) + +console.log(programmer.name) +console.log(programmer.age) +console.log(programmer.language) +programmer.greet() +programmer.sayAge() + +// - Métodos estáticos y de instancia + +function Person(name, age) { + this.name = name + this.age = age +} + +Person.prototype.greet = function () { + console.log(`Hola, soy ${this.name}`) +} + +let newPerson = new Person("Brais", 37) +newPerson.greet() + +// - Métodos avanzados + +// assign + +let personCore = { name: "Brais" } +let personDetails = { age: 37, alias: "MoureDev" } + +let fullPerson = Object.assign(personCore, personDetails) +console.log(fullPerson) + +// keys, values, entries + +console.log(Object.keys(fullPerson)) +console.log(Object.values(fullPerson)) +console.log(Object.entries(fullPerson)) \ No newline at end of file diff --git a/Intermediate/05-advanced-classes.js b/Intermediate/05-advanced-classes.js new file mode 100644 index 00000000..61c086d6 --- /dev/null +++ b/Intermediate/05-advanced-classes.js @@ -0,0 +1,180 @@ +/* +Clases 29 a 37 - Objetos y clases avanzados +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=9096 +*/ + +// Clases avanzadas + +class Person { + constructor(name, age) { + this.name = name + this.age = age + } + + greet() { + console.log(`Hola, soy ${this.name}`) + } +} + +const person = new Person("Brais", 37) +person.greet() + +person.sayAge = function () { + console.log(`Tengo ${this.age} años`) +} +person.sayAge() + +// - Abstracción + +class Animal { + constructor(name) { + if (new.target === Animal) { + throw new Error("No se puede instanciar una clase abstracta") + } + this.name = name + } + + makeSound() { + throw new Error("Este método tiene que ser implementado por la subclase") + } +} + +// Error +// const animal = new Animal("Mou") +// console.log(animal) + +// - Polimorfismo + +class Cat extends Animal { + + makeSound() { + console.log("Miau!") + } +} + +class Dog extends Animal { + + makeSound() { + console.log("Guau!") + } +} + +const cat = new Cat("MoureCat") +console.log(cat) +cat.makeSound() + +const dog = new Dog("MoureDog") +console.log(dog) +dog.makeSound() + +// - Mixins + +const FlyMixin = { + fly() { + console.log(`${this.name} está volando`) + } +} + +class Bird extends Animal { } + +class Dragon extends Animal { } + +Object.assign(Bird.prototype, FlyMixin) +Object.assign(Dragon.prototype, FlyMixin) + +const bird = new Bird("MoureBird") + +console.log(bird.name) +bird.fly() + +const dragon = new Dragon("MoureDragon") + +console.log(dragon.name) +dragon.fly() + +// - Patrón Singleton + +class Session { + + constructor(name) { + if (Session.instance) { + return Session.instance + } + this.name = name + Session.instance = this + } +} + +const session1 = new Session("Brais Moure") +const session2 = new Session() +console.log(session1.name) +console.log(session2.name) +console.log(session1 === session2) + +const session3 = new Session("MoureDev") +console.log(session3.name) +console.log(session2 === session3) + +// - Symbol + +const ID = Symbol("id") + +class User { + constructor(name) { + this.name = name + this[ID] = Math.random() + } + + getId() { + return this[ID] + } +} + +const user = new User("Brais") +console.log(user.name) +console.log(user.ID) +console.log(user.getId()) + +// - instanceof + +class Car { } + +const car = new Car() + +console.log(car instanceof Car) + +// - create + +const anotherCar = Object.create(Car.prototype) + +console.log(anotherCar instanceof Car) + +// - Proxy + +const proxy = { + get(target, property) { + console.log(`Se accede a la propiedad ${property}`) + return target[property] + }, + set(target, property, value) { + if (property === "balance" && value < 0) { + throw new Error("El saldo no puede ser negativo") + } + target[property] = value + } +} + +class BankAccount { + constructor(balance) { + this.balance = balance + } +} + +const account = new Proxy(new BankAccount(100), proxy) +console.log(account.balance) + +account.balance = 50 +console.log(account.balance) + +// Error +// account.balance = -10 \ No newline at end of file diff --git a/Intermediate/06-advanced-objects-classes-exercises.js b/Intermediate/06-advanced-objects-classes-exercises.js new file mode 100644 index 00000000..af2d1192 --- /dev/null +++ b/Intermediate/06-advanced-objects-classes-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 38 - Objetos y clases avanzados +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=11832 +*/ + +// 1. Agregega una función al prototipo de un objeto + +// 2. Crea un objeto que herede de otro + +// 3. Define un método de instancia en un objeto + +// 4. Haz uso de get y set en un objeto + +// 5. Utiliza la operación assign en un objeto + +// 6. Crea una clase abstracta + +// 7. Utiliza polimorfismo en dos clases diferentes + +// 8. Implementa un Mixin + +// 9. Crea un Singleton + +// 10. Desarrolla un Proxy \ No newline at end of file diff --git a/Intermediate/07-async.js b/Intermediate/07-async.js new file mode 100644 index 00000000..376131fc --- /dev/null +++ b/Intermediate/07-async.js @@ -0,0 +1,154 @@ +/* +Clases 39 a 44 - Asincronía +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=11890 +*/ + +// Programación asíncrona + +// Código síncrono + +console.log("Inicio") + +for (let i = 0; i < 100000000; i++) { } + +console.log("Fin") + +// Event Loop (Bucle de eventos) + +// Componentes del Event Loop: +// 1. Call Stack (Pila de ejecución) +// 2. Web APIs (APIs del navegador) o Node.js: +// 3. Task Queue (setTimeout()) y Microtask Queue (Promesas) + +// Flujo del Event Loop: +// 1. Call Stack +// 2. Operaciones asíncronas -> Web APIs o Node.js +// 3. Operación termina -> La coloca en Task Queue o Microtask Queue +// 4. Si Call Stack vacío -> Mueve tareas del Microtask Queue o Task Queue al Call Stack +// 5. El proceso se repite + +// Código asíncrono + +// - Callbacks + +console.log("Inicio") + +setTimeout(() => { + console.log("Esto se ejecuta después de 2 segundos") +}, 2000) + +console.log("Fin") + +// - Problema: Callback Hell + +function step1(callback) { + setTimeout(() => { + console.log("Paso 1 completado") + callback() + }, 1000) +} + +function step2(callback) { + setTimeout(() => { + console.log("Paso 2 completado") + callback() + }, 1000) +} + +function step3(callback) { + setTimeout(() => { + console.log("Paso 3 completado") + callback() + }, 1000) +} + +step1(() => { + step2(() => { + step3(() => { + console.log("Todos los pasos completados") + }) + }) +}) + +// - Promesas + +const promise = new Promise((resolve, reject) => { + // IMPORTANTE: Inicialmente escribí setInterval, pero lo correcto es setTimeout + // setInterval se ejecutaría indefinidamente cada 4s, y el proceso nunca finalizaría + setTimeout(() => { + const ok = false + if (ok) { + resolve("Operación exitosa") + } else { + reject("Se ha producido un error") + } + }, 4000) +}) + +promise + .then(result => { + console.log(result) + }) + .catch(error => { + console.log(error) + }) + +// - Encadenamiento de promesas + +function step1Promise() { + return new Promise(resolve => { + setTimeout(() => { + console.log("Paso 1 con promesa completado") + resolve() + }, 1000) + }) +} + +function step2Promise() { + return new Promise(resolve => { + setTimeout(() => { + console.log("Paso 2 con promesa completado") + resolve() + }, 1000) + }) +} + +function step3Promise() { + return new Promise(resolve => { + setTimeout(() => { + console.log("Paso 3 con promesa completado") + resolve() + }, 1000) + }) +} + +step1Promise() + .then(step2Promise) + .then(step3Promise) + .then(() => { + console.log("Todos los pasos con promesa completados") + }) + +// - Async/Await + +function wait(ms) { + return new Promise(resolve => setTimeout(resolve, ms)) +} + +async function process() { + + console.log("Inicio del proceso") + + await wait(5000) + console.log("Proceso después de 5 segundos") + + await wait(1000) + console.log("Proceso después de 1 segundo") + + await wait(2000) + console.log("Proceso después de 2 segundos") + + console.log("Fin del proceso") +} + +process() \ No newline at end of file diff --git a/Intermediate/08-async-exercises.js b/Intermediate/08-async-exercises.js new file mode 100644 index 00000000..2dfecf6c --- /dev/null +++ b/Intermediate/08-async-exercises.js @@ -0,0 +1,50 @@ +/* +Clase 45 - Asincronía +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=14558 +*/ + +// 1. Crea una función para saludar que reciba un nombre y un callback. +// El callback debe ejecutarse después de 2 segundos y mostrar en consola "Hola, [nombre]". + +// 2. Crea tres funciones task1(callback), task2(callback) y task3(callback). +// Cada función debe tardar 1 segundo en ejecutarse y luego llamar al callback. + +// 3. Crea una función para verificar un número que retorne una Promesa. +// Si el número es par, la promesa se resuelve con el mensaje "Número par". +// Si el número es impar, la promesa se rechaza con el mensaje "Número impar". + +// 4. Crea tres funciones que devuelvan promesas: +// firstTask(): tarda 1s y muestra "Primera tarea completada". +// secondTask(): tarda 2s y muestra "Segunda tarea completada". +// thirdTask(): tarda 1.5s y muestra "Tercera tarea completada". + +// 5. Transforma el ejercicio anterior de Promesas en una función async/await llamada executeTasks(). + +// 6. Crea una función getUser(id) que devuelva una promesa y simule una llamada a una API (que se demore 2s). +// Si el id es menor a 5, la promesa se resuelve con { id, nombre: "Usuario " + id }. +// Si el id es 5 o mayor, la promesa se rechaza con el mensaje "Usuario no encontrado". +// Usa async/await para llamar a getUser(id) y maneja los errores con try/catch. + +// 7. Intenta predecir el resultado de este código antes de ejecutarlo en la consola: +// console.log("Inicio") +// setTimeout(() => console.log("setTimeout ejecutado"), 0) +// Promise.resolve().then(() => console.log("Promesa resuelta")) +// console.log("Fin") + +// 8. Crea tres funciones que devuelvan promesas con tiempos de espera distintos. +// A continuación, usa Promise.all() para ejecutarlas todas al mismo tiempo y mostrar "Todas las promesas resueltas" cuando terminen. + +// 9. Crea una función waitSeconds(segundos) que use setTimeout dentro de una Promesa para esperar la cantidad de segundos indicada. +// A continuación, usa async/await para que se espere 3 segundos antes de mostrar "Tiempo finalizado" en consola. + +// 10. Crea una simulación de un cajero automático usando asincronía. +// - La función checkBalance() tarda 1s y devuelve un saldo de 500$. +// - La función withdrawMoney(amount) tarda 2s y retira dinero si hay suficiente saldo, o devuelve un error si no hay fondos. +// - Usa async/await para hacer que el usuario intente retirar 300$ y luego 300$ más. +// +// Posible salida esperada: +// Saldo disponible: 500$ +// Retirando 300$... +// Operación exitosa, saldo restante: 200$ +// Retirando 300$... +// Error: Fondos insuficientes \ No newline at end of file diff --git a/Intermediate/09-apis.js b/Intermediate/09-apis.js new file mode 100644 index 00000000..fc172f08 --- /dev/null +++ b/Intermediate/09-apis.js @@ -0,0 +1,171 @@ +/* +Clases 46 a 59 - APIs +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=14777 +*/ + +// Manejo de APIs + +// - APIs REST (HTTP + URLs + JSON) + +// Métodos HTTP: +// - GET +// - POST +// - PUT +// - DELETE + +// Códigos de respuesta HTTP: +// - 200 OK +// - 201 +// - 400 +// - 404 +// - 500 + +// Consumir una API + +// https://jsonplaceholder.typicode.com + +// GET +fetch("https://jsonplaceholder.typicode.com/posts") + .then(response => { + // Transforma la respuesta a JSON + return response.json() + }) + .then(data => { + // Procesa los datos + console.log(data) + }) + .catch(error => { + // Captura errores + console.log("Error", error) + }) + +// Uso de Async/Await + +async function getPosts() { + try { + const response = await fetch("https://jsonplaceholder.typicode.com/posts") + const data = await response.json() + console.log(data) + } catch (error) { + console.log("Error", error) + } +} + +getPosts() + +// Solicitud POST + +async function createPost() { + try { + + const newPost = { + userId: 1, + title: "Este es el título de mi post", + body: "Este es el cuerpo de mi post" + } + + const response = await fetch("https://jsonplaceholder.typicode.com/posts", { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(newPost) + }) + + const data = await response.json() + console.log(data) + } catch (error) { + console.log("Error", error) + } +} + +createPost() + +// Herramientas para realizar peticiones HTTP +// - https://postman.com +// - https://apidog.com +// - https://thunderclient.com + +// Manejo de errores + +fetch("https://jsonplaceholder.typicode.com/mouredev") + .then(response => { + if (!response.ok) { + throw Error(`Status HTTP: ${response.status}`) + } + return response.json() + }) + .catch(error => { + console.log("Error", error) + }) + +// Métodos HTTP adicionales +// - PATCH +// - OPTIONS + +async function partialPostUpdate() { + try { + const response = await fetch("https://jsonplaceholder.typicode.com/posts/10", { + method: "PATCH", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ title: "Este es el nuevo título de mi post" }) + }) + + const data = await response.json() + console.log(data) + } catch (error) { + console.log("Error", error) + } +} + +partialPostUpdate() + +// Autenticación mediante API Key + +async function getWeather(city) { + + // https://openweathermap.org + const apiKey = "TU_API_KEY" + const url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}` + + try { + const response = await fetch(url) + const data = await response.json() + console.log(data) + } catch (error) { + console.log("Error", error) + } +} + +getWeather("Madrid") + +// Otros métodos de Autenticación y Autorización +// - Bearer Tokens +// - JWT + +// Versionado de APIs +// - https://api.example.com/v1/resources +// - https://api.example.com/v2/resources + +// Otras APIs + +async function getPokemon(pokemon) { + + // https://pokeapi.co + const url = `https://pokeapi.co/api/v2/pokemon/${pokemon}` + + try { + const response = await fetch(url) + const data = await response.json() + console.log(`Habilidades de ${data.name}`) + data.abilities.forEach(ability => { + console.log(ability.ability.name) + }) + } catch (error) { + console.log("Error", error) + } +} + +getPokemon("pikachu") \ No newline at end of file diff --git a/Intermediate/10-apis-exercises.js b/Intermediate/10-apis-exercises.js new file mode 100644 index 00000000..54962e23 --- /dev/null +++ b/Intermediate/10-apis-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 60 - APIs +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=18710 +*/ + +// 1. Realiza una petición GET con fetch() a JSONPlaceholder y muestra en la consola la lista de publicaciones + +// 2. Modifica el ejercicio anterior para que verifique si la respuesta es correcta usando response.ok. Si no lo es, lanza y muestra un error + +// 3. Reescribe el ejercicio 1 usando la sintaxis async/await en lugar de promesas + +// 4. Realiza una petición POST a JSONPlaceholder para crear una nueva publicación. Envía un objeto con propiedades como title o body + +// 5. Utiliza el método PUT para actualizar completamente un recurso (por ejemplo, modificar una publicación) en JSONPlaceholder + +// 6. Realiza una petición PATCH para modificar únicamente uno o dos campos de un recurso existente + +// 7. Envía una solicitud DELETE a la API para borrar un recurso (por ejemplo, una publicación) y verifica la respuesta + +// 8. Crea una función que realice una solicitud GET (la que quieras) a OpenWeatherMap + +// 9. Utiliza la PokéAPI para obtener los datos de un Pokémon concreto, a continuación los detalles de la especie y, finalmente, la cadena evolutiva a partir de la especie + +// 10. Utiliza una herramienta como Postman o Thunder Client para probar diferentes endpoint de una API diff --git a/Intermediate/11-dom.js b/Intermediate/11-dom.js new file mode 100644 index 00000000..64d8fe49 --- /dev/null +++ b/Intermediate/11-dom.js @@ -0,0 +1,123 @@ +/* +Clases 61 a 68 - DOM +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=18822 +*/ + +// Manejo del DOM (Document Object Model) + +console.log(document) + +// - Selección de elementos + +// Métodos básicos (selector HTML) + +const myElementById = document.getElementById("id") + +const myElementsByClass = document.getElementsByClassName("class") + +const myElementsByTag = document.getElementsByTagName("tag") + +// Métodos más modernos (selector CSS) + +document.querySelector(".paragraph") +document.querySelectorAll(".paragraph") + +// - Manipulación de elementos + +const title = document.getElementById("title") +title.textContent = "Hola JavaScript" + +const container = document.querySelector(".container") +container.innerHTML = "

Esto es un nuevo párrafo

" + +// - Modificación de atributos + +// Obtención del atributo +const link = document.querySelector("a") +const url = link.getAttribute("href") + +// Establecimiento del atributo +link.setAttribute("href", "https://example.com") + +// Comprobación de atributo +const hasTarget = link.hasAttribute("target") + +// Eliminación de atributos +link.removeAttribute("target") + +// - Interacción con clases CSS + +const box = document.querySelector(".box") +box.classList.add("selected") +box.classList.remove("selected") +box.classList.toggle("selected") + +const button = document.querySelector("button") +button.style.backgroundColor = "blue" +button.style.color = "white" +button.style.padding = "10px" + +// - Creación y eliminación de elementos + +// Creación + +const newParagraph = document.createElement("p") +newParagraph.textContent = "Este es un nuevo párrafo creado desde JS" +newParagraph.style.padding = "8px" + +container.appendChild(newParagraph) + +const itemsList = document.querySelector("ul") +const newItem = document.createElement("li") +newItem.textContent = "Nuevo elemento" + +// Inserción en un lugar concreto + +const secondItem = itemsList.children[1] +itemsList.insertBefore(newItem, secondItem) + +itemsList.append(newItem) +itemsList.prepend(newItem) +secondItem.before(newItem) +secondItem.after(newItem) + +// Eliminación + +newParagraph.remove() + +// Eliminación tradicional + +const parent = newParagraph.parentElement +parent.removeChild(newParagraph) + +// - Elementos del DOM + +function showMsg() { + alert("Clic!") +} + +const sendButton = document.querySelector("#send") +sendButton.addEventListener("click", showMsg) + +sendButton.addEventListener("click", () => { + alert("Clic con una arrow function!") +}) + +// Eventos comunes + +document.addEventListener("DOMContentLoader", () => { + console.log("El DOM está completamente cargado") +}) + +sendButton.addEventListener("mouseenter", () => { + sendButton.style.backgroundColor = "green" +}) + +sendButton.addEventListener("mouseleave", () => { + sendButton.style.backgroundColor = "blue" +}) + +const form = document.querySelector("form") +form.addEventListener("submit", (event) => { + // Código +}) \ No newline at end of file diff --git a/Intermediate/12-dom-example.html b/Intermediate/12-dom-example.html new file mode 100644 index 00000000..aab8d1f1 --- /dev/null +++ b/Intermediate/12-dom-example.html @@ -0,0 +1,23 @@ + + + + + + HTML de ejemplo + + +

Mi título

+ + + + + \ No newline at end of file diff --git a/Intermediate/13-dom-example.js b/Intermediate/13-dom-example.js new file mode 100644 index 00000000..946568d4 --- /dev/null +++ b/Intermediate/13-dom-example.js @@ -0,0 +1,11 @@ +/* +Clase 69 - DOM +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=21754 +*/ + +console.log(document) + +const myH1 = document.querySelector("h1") +console.log(myH1) + +myH1.textContent = "Mi nuevo título" \ No newline at end of file diff --git a/Intermediate/14-tasklist.html b/Intermediate/14-tasklist.html new file mode 100644 index 00000000..7f691bfd --- /dev/null +++ b/Intermediate/14-tasklist.html @@ -0,0 +1,18 @@ + + + + + + Lista de tareas + + +

Mis tareas

+ + + + + + \ No newline at end of file diff --git a/Intermediate/15-tasklist.js b/Intermediate/15-tasklist.js new file mode 100644 index 00000000..0f126986 --- /dev/null +++ b/Intermediate/15-tasklist.js @@ -0,0 +1,32 @@ +/* +Clase 70 - DOM +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=22342 +*/ + +const text = document.getElementById("text") +const button = document.getElementById("button") +const list = document.getElementById("list") + +function addTask() { + + if (text.value === "") return + + const newElement = document.createElement("li") + newElement.textContent = text.value + + newElement.addEventListener("click", () => { + newElement.remove() + }) + + list.appendChild(newElement) + + text.value = "" +} + +button.addEventListener("click", addTask) + +text.addEventListener("keypress", (event) => { + if (event.key === "Enter") { + addTask() + } +}) \ No newline at end of file diff --git a/Intermediate/16-dom-exercises.js b/Intermediate/16-dom-exercises.js new file mode 100644 index 00000000..468093dc --- /dev/null +++ b/Intermediate/16-dom-exercises.js @@ -0,0 +1,24 @@ +/* +Clase 71 - DOM +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=23010 +*/ + +// 1. Crea un elemento (por ejemplo, un

) y cambia su contenido a "¡Hola Mundo!"" al cargar la página + +// 2. Inserta una imagen con id="myImage" y cambia su atributo src a otra URL + +// 3. Crea un
sin clases y agrega la clase resaltado cuando se cargue la página + +// 4. Crea un párrafo con id="paragraph" y cambia su color de texto a azul + +// 5. Agrega un botón que, al hacer clic, cree un nuevo elemento
  • con el texto "Nuevo elemento y lo agregue a una lista
      + +// 6. Crea un párrafo con id="deleteParagraph" y un botón. Al hacer clic en el botón, elimina el párrafo del DOM + +// 7. Crea un
      con algún texto y reemplaza su contenido por un

      con el mensaje "Nuevo Contenido" + +// 8. Crea un botón con id="greetBtn" y añade un evento que muestre una alerta con el mensaje "¡Hola!" al hacer clic + +// 9. Crea un y un
      . Al escribir en el input, el
      se debe actualizarse mostrando lo que se escribe + +// 10. Crea un botón con id="backgroundBtn" y, al hacer clic, cambia el color de fondo del a un color diferente \ No newline at end of file diff --git a/Intermediate/17-debugging.js b/Intermediate/17-debugging.js new file mode 100644 index 00000000..cef6ba93 --- /dev/null +++ b/Intermediate/17-debugging.js @@ -0,0 +1,29 @@ +/* +Clases 72 a 73 - Depuración +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=23085 +*/ + +// Depuración + +// console.log() (básico) + +function sum(a, b) { + console.log("a:", a) + console.log("typeof a:", typeof a) + console.log("b:", b) + console.log("typeof b:", typeof b) + return a + b +} + +console.log(sum(3, "5")) + +// Depurador (profesional) + +function divide(a, b) { + if (b === 0) { + throw new Error("No se puede dividir por cero") + } + return a / b +} + +// console.log(divide(5, 0)) Error \ No newline at end of file diff --git a/Intermediate/18-debugging-exercises.js b/Intermediate/18-debugging-exercises.js new file mode 100644 index 00000000..36d28dba --- /dev/null +++ b/Intermediate/18-debugging-exercises.js @@ -0,0 +1,8 @@ +/* +Clases 74 - Depuración +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=24329 +*/ + +// 1. Crea un código con un error lógico y usa VS Code para encontrarlo + +// 2. Experimenta con breakpoints y observa cómo cambia el flujo de ejecución diff --git a/Intermediate/19-regex.js b/Intermediate/19-regex.js new file mode 100644 index 00000000..9c305b2c --- /dev/null +++ b/Intermediate/19-regex.js @@ -0,0 +1,38 @@ +/* +Clases 75 a 78 - Regex +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=24363 +*/ + +// Expresiones regulares + +// - Sintaxis + +const regex = /abc/ +const regex2 = RegExp("abc") +const text = "Hola abc JavaScript" + +// test: verifica coincidencia con true o false + +console.log(regex.test(text)) +console.log(regex2.test(text)) + +const text2 = "Mi edad es 37" +const regex3 = /\d/g +const regex4 = /[4-6]/ +console.log(regex3.test(text2)) +console.log(regex4.test(text2)) + +// replace: reemplaza el texto que coincide con el patrón + +const regex5 = /JavaScript/ +console.log("Hola JavaScript".replace(regex5, "JS")) +const text3 = "Estoy contando 1 2 3 4 5 6 7" +console.log(text3.replace(regex3, "[número]")) + +// exec: retorna detalles de la coincidencia + +console.log(regex3.exec(text3)) + +while ((match = regex3.exec(text3)) !== null) { + console.log(match) +} \ No newline at end of file diff --git a/Intermediate/20-regex-exercises.js b/Intermediate/20-regex-exercises.js new file mode 100644 index 00000000..35d33377 --- /dev/null +++ b/Intermediate/20-regex-exercises.js @@ -0,0 +1,12 @@ +/* +Clase 79 - Regex +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=25888 +*/ + +// 1. Crea una RegEx que valide correos electrónicos + +// 2. Crea una RegEx obtenga Hashtags de un Texto + +// 3. Crea una RegEx que valide contraseñas seguras (mínimo 8 caracteres, al menos una letra y un número) + +// NOTA: Aplícalas utilizando diferentes operaciones \ No newline at end of file diff --git a/Intermediate/21-testing.js b/Intermediate/21-testing.js new file mode 100644 index 00000000..7c3d85f4 --- /dev/null +++ b/Intermediate/21-testing.js @@ -0,0 +1,22 @@ +/* +Clases 80 a 81 - Testing +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=25938 +*/ + +// Testing + +// - Tipos de testing + +// Pruebas unitarias + +function sum(a, b) { + return a + b +} + +module.exports = sum + +console.log(sum(3, 5) === 8) + +// Pruebas de integración + +// Pruebas end-to-end (E2E) \ No newline at end of file diff --git a/Intermediate/22-testing.test.js b/Intermediate/22-testing.test.js new file mode 100644 index 00000000..888b2c04 --- /dev/null +++ b/Intermediate/22-testing.test.js @@ -0,0 +1,14 @@ +/* +Clases 80 a 81 - Testing +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=25938 +*/ + +const sum = require('./21-testing') + +test("Suma de 3 + 5 tiene que ser 8", () => { + expect(sum(3, 5)).toBe(8) +}) + +test("Suma de 3 + 3 tiene que ser 6", () => { + expect(sum(3, 4)).toBe(6) +}) \ No newline at end of file diff --git a/Intermediate/23-testing-exercises.js b/Intermediate/23-testing-exercises.js new file mode 100644 index 00000000..05c02390 --- /dev/null +++ b/Intermediate/23-testing-exercises.js @@ -0,0 +1,10 @@ +/* +Clase 82 - Testing +Vídeo: https://youtu.be/iJvLAZ8MJ2E?t=26946 +*/ + +// 1. Crea una función isEven(number) que devuelva true si el número es par y false si es impar + +// 2. Escribe una prueba en Jest para verificar que la función funciona correctamente + +// 3. Verifica que la prueba se ejecuta satisfactoriamente \ No newline at end of file diff --git a/README.md b/README.md index bd230a16..88df06ae 100644 --- a/README.md +++ b/README.md @@ -9,50 +9,175 @@ ### Proyecto realizado durante emisiones en directo desde [Twitch](https://twitch.tv/mouredev) > ##### Si consideras útil el curso, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias! -## Próxima clase - -### Miércoles 7 de agosto a las 20:00h (España) en directo desde [Twitch](https://twitch.tv/mouredev) -#### Puedes crear un recordatorio y consultar el horario en tu país desde [Discord](https://discord.gg/ZZ98qNuV?event=1268298731183411200) - ## Clases en vídeo -#### [CLASE 1 | 10/07/2024 | Introducción, instalación, hola mundo y variables](https://www.twitch.tv/videos/2194200202?t=00h14m43s) - -Código: - -* [00 - Hola Mundo](./Basic/00-helloworld.js) -* [01 - Variables](./Basic/01-variables.js) - -#### [CLASE 2 | 17/07/2024 | Tipos de datos, operadores y strings](https://www.twitch.tv/videos/2200149072?t=00h08m02s) - -Código: - -* [02 - Tipos de datos](./Basic/02-datatypes.js) -* [03 - Ejercicios: Primeros pasos](./Basic/03-beginner-exercises.js) -* [04 - Operadores](./Basic/04-operators.js) -* [05 - Ejercicios: Operadores](./Basic/05-operators-exercises.js) -* [06 - Strings](./Basic/06-strings.js) -* [07 - Ejercicios: Strings](./Basic/07-strings-exercises.js) - -#### [CLASE 3 | 24/07/2024 | Condicionales, arrays y sets](https://www.twitch.tv/videos/2206228701?t=00h16m02s) - -Código: - -* [08 - Condicionales](./Basic/08-conditionals.js) -* [09 - Ejercicios: Condicionales](./Basic/09-conditionals-exercises.js) -* [10 - Array](./Basic/10-array.js) -* [11 - Set](./Basic/11-set.js) - -#### [CLASE 4 | 31/07/2024 | Mapas, bucles y funciones](https://www.twitch.tv/videos/2212289583?t=00h17m45s) - -Código: - -* [12 - Map](./Basic/12-map.js) -* [13 - Ejercicios: Estructuras](./Basic/13-structures-exercises.js) -* [14 - Bucles](./Basic/14-loops.js) -* [15 - Ejercicios: Bucles](./Basic/15-loops-exercises.js) -* [16 - Funciones](./Basic/16-functions.js) -* [17 - Ejercicios: Funciones](./Basic/17-functions-exercises.js) +### Curso de fundamentos desde cero + + + +* [Introducción](https://youtu.be/1glVfFxj8a4) +* [1 - Contexto](https://youtu.be/1glVfFxj8a4?t=174) +* [2 - Historia](https://youtu.be/1glVfFxj8a4?t=322) +* [3 - JavaScript y Java](https://youtu.be/1glVfFxj8a4?t=665) +* [4 - Utilización](https://youtu.be/1glVfFxj8a4?t=931) +* [5 - Especificación ECMAScript](https://youtu.be/1glVfFxj8a4?t=1017) +* [6 - Motor V8](https://youtu.be/1glVfFxj8a4?t=1293) +* [7 - Referencia](https://youtu.be/1glVfFxj8a4?t=1403) +* [8 - Ejercicios prácticos](https://youtu.be/1glVfFxj8a4?t=1621) +* [9 - Versión](https://youtu.be/1glVfFxj8a4?t=1705) +* [10 - Explorador web](https://youtu.be/1glVfFxj8a4?t=1768) +* [11 - Playground](https://youtu.be/1glVfFxj8a4?t=1893) +* [12 - Instalación](https://youtu.be/1glVfFxj8a4?t=1988) +* [13 - Editor de código](https://youtu.be/1glVfFxj8a4?t=2256) +* [14 - Buenas prácticas](https://youtu.be/1glVfFxj8a4?t=2311) +* [15 - Hola mundo](https://youtu.be/1glVfFxj8a4?t=2390) | [Código](./Basic/00-helloworld.js) +* [16 - Variables](https://youtu.be/1glVfFxj8a4?t=3049) | [Código](./Basic/01-variables.js) +* [17 - Tipos de datos](https://youtu.be/1glVfFxj8a4?t=3599) | [Código](./Basic/02-datatypes.js) +* [18 - Ejercicios: primeros pasos](https://youtu.be/1glVfFxj8a4?t=4733) | [Ejercicios](./Basic/03-beginner-exercises.js) +* [19 - Operadores](https://youtu.be/1glVfFxj8a4?t=4937) | [Código](./Basic/04-operators.js) +* [20 - Ejercicios: Operadores](https://youtu.be/1glVfFxj8a4?t=6458) | [Ejercicios](./Basic/05-operators-exercises.js) +* [21 - Strings](https://youtu.be/1glVfFxj8a4?t=6565) | [Código](./Basic/06-strings.js) +* [22 - Ejercicios: Strings](https://youtu.be/1glVfFxj8a4?t=7226) | [Ejercicios](./Basic/07-strings-exercises.js) +* [23 - Condicionales](https://youtu.be/1glVfFxj8a4?t=7277) | [Código](./Basic/08-conditionals.js) +* [24 - Ejercicios: Condicionales](https://youtu.be/1glVfFxj8a4?t=8652) | [Ejercicios](./Basic/09-conditionals-exercises.js) +* [25 - Arrays](https://youtu.be/1glVfFxj8a4?t=8741) | [Código](./Basic/10-array.js) +* [26 - Sets](https://youtu.be/1glVfFxj8a4?t=9952) | [Código](./Basic/11-set.js) +* [27 - Maps](https://youtu.be/1glVfFxj8a4?t=10755) | [Código](./Basic/12-map.js) +* [28 - Ejercicios: Estructuras](https://youtu.be/1glVfFxj8a4?t=11451) | [Ejercicios](./Basic/13-structures-exercises.js) +* [29 - Bucles](https://youtu.be/1glVfFxj8a4?t=11575) | [Código](./Basic/14-loops.js) +* [30 - Ejercicios: Bucles](https://youtu.be/1glVfFxj8a4?t=12732) | [Ejercicios](./Basic/15-loops-exercises.js) +* [31 - Funciones](https://youtu.be/1glVfFxj8a4?t=12829) | [Código](./Basic/16-functions.js) +* [32 - Ejercicios: Funciones](https://youtu.be/1glVfFxj8a4?t=14146) | [Ejercicios](./Basic/17-functions-exercises.js) +* [33 - Objetos](https://youtu.be/1glVfFxj8a4?t=14229) | [Código](./Basic/18-objects.js) +* [34 - Ejercicios: Objetos](https://youtu.be/1glVfFxj8a4?t=15675) | [Ejercicios](./Basic/19-objects-exercises.js) +* [35 - Desestructuración y propagación](https://youtu.be/1glVfFxj8a4?t=15747) | [Código](./Basic/20-destructuring-spreading.js) +* [36 - Ejercicios: Desestructuración y propagación](https://youtu.be/1glVfFxj8a4?t=16802) | [Ejercicios](./Basic/21-destructuring-spreading-exercises.js) +* [37 - Clases](https://youtu.be/1glVfFxj8a4?t=16864) | [Código](./Basic/22-classes.js) +* [38 - Herencia de clases](https://youtu.be/1glVfFxj8a4?t=17999) | [Código](./Basic/22-classes.js) +* [39 - Ejercicios: Clases](https://youtu.be/1glVfFxj8a4?t=18630) | [Ejercicios](./Basic/23-classes-exercises.js) +* [40 - Manejo de errores](https://youtu.be/1glVfFxj8a4?t=18751) | [Código](./Basic/24-error-handling.js) +* [41 - Ejercicios: Manejo de errores](https://youtu.be/1glVfFxj8a4?t=20392) | [Ejercicios](./Basic/25-error-handling-exercises.js) +* [42 - Console](https://youtu.be/1glVfFxj8a4?t=20444) | [Código](./Basic/26-console-methods.js) +* [43 - Ejercicios: Console](https://youtu.be/1glVfFxj8a4?t=21421) | [Ejercicios](./Basic/27-console-methods-exercises.js) +* [44 - Módulos](https://youtu.be/1glVfFxj8a4?t=21480) | [Código exportación](./Basic/28-export-modules.js) | [Código importación](./Basic/29-import-modules.js) | [Código externos](./Basic/30-import-external-modules.cjs) +* [45 - Ejercicios: Módulos](https://youtu.be/1glVfFxj8a4?t=22720) | [Ejercicios](./Basic/31-modules-exercises.js) | [package.json](./Basic/package.json) +* [Despedida](https://youtu.be/1glVfFxj8a4?t=22776) + +### Curso de fundamentos intermedio (continuación del desde cero) + + + +* [Introducción](https://youtu.be/iJvLAZ8MJ2E) +* [1 - Primeros pasos](https://youtu.be/iJvLAZ8MJ2E?t=279) + +Funciones avanzadas | [Código](./Intermediate/00-advanced-functions.js) + +* [2 - Ciudadanos de primera clase](https://youtu.be/iJvLAZ8MJ2E?t=346) +* [3 - Arrow functions](https://youtu.be/iJvLAZ8MJ2E?t=782) +* [4 - IIFE](https://youtu.be/iJvLAZ8MJ2E?t=1278) +* [5 - Parámetros rest](https://youtu.be/iJvLAZ8MJ2E?t=1873) +* [6 - Operador Spread](https://youtu.be/iJvLAZ8MJ2E?t=2126) +* [7 - Closures](https://youtu.be/iJvLAZ8MJ2E?t=2356) +* [8 - Recursividad](https://youtu.be/iJvLAZ8MJ2E?t=2650) +* [9 - Funciones parciales](https://youtu.be/iJvLAZ8MJ2E?t=3013) +* [10 - Currying](https://youtu.be/iJvLAZ8MJ2E?t=3473) +* [11 - Callbacks](https://youtu.be/iJvLAZ8MJ2E?t=3675) +* [12 - Ejercicios: Funciones avanzadas](https://youtu.be/iJvLAZ8MJ2E?t=4112) | [Ejercicios](./Intermediate/01-advanced-functions-exercises.js) + +Estructuras avanzadas | [Código](./Intermediate/02-advanced-structures.js) + +* [13 - Estructuras avanzadas](https://youtu.be/iJvLAZ8MJ2E?t=4355) +* [14 - Arrays avanzados: métodos funcionales](https://youtu.be/iJvLAZ8MJ2E?t=4411) +* [15 - Arrays avanzados: manipulación](https://youtu.be/iJvLAZ8MJ2E?t=5244) +* [16 - Arrays avanzados: ordenación](https://youtu.be/iJvLAZ8MJ2E?t=5621) +* [17 - Arrays avanzados: búsqueda](https://youtu.be/iJvLAZ8MJ2E?t=5979) +* [18 - Sets avanzados: operaciones](https://youtu.be/iJvLAZ8MJ2E?t=6288) +* [19 - Sets avanzados: conversión](https://youtu.be/iJvLAZ8MJ2E?t=6949) +* [20 - Sets avanzados: iteración](https://youtu.be/iJvLAZ8MJ2E?t=6992) +* [21 - Maps avanzados: iteración](https://youtu.be/iJvLAZ8MJ2E?t=7061) +* [22 - Maps avanzados: conversión](https://youtu.be/iJvLAZ8MJ2E?t=7207) +* [23 - Ejercicios: Estructuras avanzadas](https://youtu.be/iJvLAZ8MJ2E?t=7514) | [Ejercicios](./Intermediate/03-advanced-structures-exercises.js) + +Objetos y clases avanzados | [Código Objetos](./Intermediate/04-advanced-objects.js) | [Código Clases](./Intermediate/05-advanced-classes.js) + +* [24 - Objetos avanzados](https://youtu.be/iJvLAZ8MJ2E?t=7639) +* [25 - Prototipos](https://youtu.be/iJvLAZ8MJ2E?t=7695) +* [26 - Herencia](https://youtu.be/iJvLAZ8MJ2E?t=8068) +* [27 - Métodos estáticos y de instancia](https://youtu.be/iJvLAZ8MJ2E?t=8577) +* [28 - Métodos avanzados](https://youtu.be/iJvLAZ8MJ2E?t=8896) +* [29 - Clases avanzadas](https://youtu.be/iJvLAZ8MJ2E?t=9096) +* [30 - Abstracción](https://youtu.be/iJvLAZ8MJ2E?t=9408) +* [31 - Polimorfismo](https://youtu.be/iJvLAZ8MJ2E?t=9694) +* [32 - Mixins](https://youtu.be/iJvLAZ8MJ2E?t=9956) +* [33 - Singleton](https://youtu.be/iJvLAZ8MJ2E?t=10454) +* [34 - Symbol](https://youtu.be/iJvLAZ8MJ2E?t=10901) +* [35 - instanceof](https://youtu.be/iJvLAZ8MJ2E?t=11264) +* [36 - create](https://youtu.be/iJvLAZ8MJ2E?t=11331) +* [37 - Proxy](https://youtu.be/iJvLAZ8MJ2E?t=11375) +* [38 - Ejercicios: Objetos y clases avanzados](https://youtu.be/iJvLAZ8MJ2E?t=11832) | [Ejercicios](./Intermediate/06-advanced-objects-classes-exercises) + +Asincronía | [Código](./Intermediate/07-async.js) + +* [39 - Asincronía](https://youtu.be/iJvLAZ8MJ2E?t=11890) +* [40 - Código síncrono](https://youtu.be/iJvLAZ8MJ2E?t=12245) +* [41 - Event Loop](https://youtu.be/iJvLAZ8MJ2E?t=12366) +* [42 - Callbacks](https://youtu.be/iJvLAZ8MJ2E?t=12729) +* [43 - Promesas](https://youtu.be/iJvLAZ8MJ2E?t=13349) +* [44 - Async/Await](https://youtu.be/iJvLAZ8MJ2E?t=14171) +* [45 - Ejercicios: Asincronía](https://youtu.be/iJvLAZ8MJ2E?t=14558) | [Ejercicios](./Intermediate/08-async-exercises.js) + +APIs | [Código](./Intermediate/09-apis.js) + +* [46 - APIs](https://youtu.be/iJvLAZ8MJ2E?t=14777) +* [47 - API REST](https://youtu.be/iJvLAZ8MJ2E?t=14973) +* [48 - Métodos HTTP](https://youtu.be/iJvLAZ8MJ2E?t=15134) +* [49 - Códigos de respuesta HTTP](https://youtu.be/iJvLAZ8MJ2E?t=15294) +* [50 - GET](https://youtu.be/iJvLAZ8MJ2E?t=15477) +* [51 - Async/Await en APIs](https://youtu.be/iJvLAZ8MJ2E?t=16400) +* [52 - POST](https://youtu.be/iJvLAZ8MJ2E?t=16626) +* [53 - Herramientas para realizar peticiones HTTP](https://youtu.be/iJvLAZ8MJ2E?t=17088) +* [54 - Manejo de errores](https://youtu.be/iJvLAZ8MJ2E?t=17325) +* [55 - Métodos HTTP adicionales](https://youtu.be/iJvLAZ8MJ2E?t=17619) +* [56 - Autenticación mediante API Key](https://youtu.be/iJvLAZ8MJ2E?t=17770) +* [57 - Otros métodos de autenticación y autorización](https://youtu.be/iJvLAZ8MJ2E?t=18244) +* [58 - Versionado de APIs](https://youtu.be/iJvLAZ8MJ2E?t=18323) +* [59 - Otras APIs](https://youtu.be/iJvLAZ8MJ2E?t=18441) +* [60 - Ejercicios: APIs](https://youtu.be/iJvLAZ8MJ2E?t=18710) | [Ejercicios](./Intermediate/10-apis-exercises.js) + +DOM | [Código](./Intermediate/11-dom.js) + +* [61 - DOM](https://youtu.be/iJvLAZ8MJ2E?t=18822) +* [62 - Estructura del DOM](https://youtu.be/iJvLAZ8MJ2E?t=19105) +* [63 - Métodos de selección](https://youtu.be/iJvLAZ8MJ2E?t=19172) +* [64 - Manipulación de elementos](https://youtu.be/iJvLAZ8MJ2E?t=19792) +* [65 - Modificación de atributos](https://youtu.be/iJvLAZ8MJ2E?t=19996) +* [66 - Interacción con clases CSS](https://youtu.be/iJvLAZ8MJ2E?t=20326) +* [67 - Creación y eliminación de elementos](https://youtu.be/iJvLAZ8MJ2E?t=20787) +* [68 - Elementos y eventos del DOM](https://youtu.be/iJvLAZ8MJ2E?t=21377) +* [69 - Ejemplos: acceso al DOM](https://youtu.be/iJvLAZ8MJ2E?t=21754) | Ejemplo simple: [HTML](./Intermediate/12-dom-example.html) - [JS](./Intermediate/13-dom-example.js) +* [70 - Ejemplos: lista de tareas](https://youtu.be/iJvLAZ8MJ2E?t=22342) Ejemplo lista de tareas: [HTML](./Intermediate/14-tasklist.html) - [JS](./Intermediate/15-tasklist.js) +* [71 - Ejercicios: DOM](https://youtu.be/iJvLAZ8MJ2E?t=23010) | [Ejercicios](./Intermediate/16-dom-exercises.js) + +Depuración | [Código](./Intermediate/17-debugging.js) + +* [72 - Depuración](https://youtu.be/iJvLAZ8MJ2E?t=23085) +* [73 - Depurador](https://youtu.be/iJvLAZ8MJ2E?t=23370) +* [74 - Ejercicios: Depuración](https://youtu.be/iJvLAZ8MJ2E?t=24329) | [Ejercicios](./Intermediate/18-debugging-exercises.js) + +Regex | [Código](./Intermediate/19-regex.js) + +* [75 - Regex](https://youtu.be/iJvLAZ8MJ2E?t=24363) +* [76 - Sintaxis: test](https://youtu.be/iJvLAZ8MJ2E?t=24444) +* [77 - Sintaxis: replace](https://youtu.be/iJvLAZ8MJ2E?t=24989) +* [78 - Sintaxis: exec](https://youtu.be/iJvLAZ8MJ2E?t=25365) +* [79 - Ejercicios: Regex](https://youtu.be/iJvLAZ8MJ2E?t=25888) | [Ejercicios](./Intermediate/20-regex-exercises.js) + +Testing | [Código](./Intermediate/21-testing.js) | [Test](./Intermediate/22-testing.test.js) + +* [80 - Testing](https://youtu.be/iJvLAZ8MJ2E?t=25938) +* [81 - Jest](https://youtu.be/iJvLAZ8MJ2E?t=26272) +* [82 - Ejercicios: Testing](https://youtu.be/iJvLAZ8MJ2E?t=26946) | [Ejercicios](./Intermediate/23-testing-exercises.js) +* [Despedida](https://youtu.be/iJvLAZ8MJ2E?t=26970) ## Enlaces de interés @@ -68,7 +193,21 @@ Código: * Exploradores: [Chrome](https://www.google.com/intl/es_es/chrome/) | [Brave](https://brave.com/download/) * [Visual Studio Code](https://code.visualstudio.com/) * [Guía de estilo](https://google.github.io/styleguide/jsguide.html) +* Clientes HTTP: [Postman](https://postman.com) | [Apidog](https://apidog.com) | [Thunder Client](https://thunderclient.com) +* APIs: [JSONPlaceholder](https://jsonplaceholder.typicode.com) | [OpenWeather](https://openweathermap.org) | [PokéAPI](https://pokeapi.co) +* Expresiones regulares: [Documentación](https://developer.mozilla.org/es/docs/Web/JavaScript/Guide/Regular_expressions/Cheatsheet +) | [Regex101](https://regex101.com/) +* [Jest](https://jestjs.io/) + +## Únete al campus de programación de la comunidad + +![https://mouredev.pro](./Images/pro.jpg) + +#### Te presento [mouredev pro](https://mouredev.pro), mi proyecto más importante para ayudarte a estudiar programación y desarrollo de software de manera diferente. +> **¿Buscas un extra?** Aquí encontrarás este y otros cursos editados por lecciones individuales, para avanzar a tu ritmo y guardar el progreso. También dispondrás de ejercicios y correcciones, test para validar tus conocimientos, examen y certificado público de finalización, soporte, foro de estudiantes, reunionnes grupales, cursos exclusivos y mucho más. +> +> Entra en **[mouredev.pro](https://mouredev.pro)** y utiliza el cupón **"JAVASCRIPT"** con un 15% de descuento en tu primera suscripción. ## Preguntas frecuentes @@ -77,17 +216,15 @@ Mi idea es que el curso sea desde cero y para principiantes. Pensado para una pe Si la acogida de la comunidad es buena, seguiré creando cursos más avanzados. -#### ¿Se subirá el curso a YouTube? -Sí, cuando esté finalizado lo subiré editado y en un único vídeo a mi [canal principal](https://youtube.com/@mouredev). Por el momento puedes ver cada clase independiente desde la grabación de [Twitch](https://www.twitch.tv/mouredev/videos) (todas las emisiones quedan guardadas 3 meses). +#### ¿Este curso se va a subir a YouTube? -#### ¿Cuánto durará el curso? -Esta primera parte se centrará en los fundamentos del lenguaje. El curso finalizará cuando se explique todo el temario, es decir, el tiempo que haga falta. Creo que es mucho mejor así que poniendo una fecha límite, así me aseguro de emplear el tiempo que sea necesario para que el aprendizaje sea lo mejor posible. +Sí, una vez finalizados, todos los cursos son editados y subidos en bloque a YouTube. #### ¿Existe algún lugar donde consultar dudas? He creado un canal llamado "JavaScript" en el [servidor de Discord](https://discord.gg/mouredev) de la comunidad. Allí puedes consultar dudas y ayudar al resto de miembros. Así nos beneficiamos tod@s. #### ¿Cómo puedo practicar? -A medida que avance el curso, crearé ficheros de ejercicios para poner en práctica lo aprendido. También puedes realizar los ejercicios de mi web [retosdeprogramacion.com](https://retosdeprogramacion.com). +En cada lección encontrarás ejercicios para poner en práctica lo aprendido. También puedes realizar los ejercicios de mi web [retosdeprogramacion.com](https://retosdeprogramacion.com). ## ![https://mouredev.com](https://raw.githubusercontent.com/mouredev/mouredev/master/mouredev_emote.png) Hola, mi nombre es Brais Moure. ### Freelance full-stack iOS & Android engineer @@ -104,5 +241,5 @@ Soy ingeniero de software desde 2010. Desde 2018 combino mi trabajo desarrolland Si quieres unirte a nuestra comunidad de desarrollo, aprender programación, mejorar tus habilidades y ayudar a la continuidad del proyecto, puedes encontrarnos en: [![Twitch](https://img.shields.io/badge/Twitch-Programación_en_directo-9146FF?style=for-the-badge&logo=twitch&logoColor=white&labelColor=101010)](https://twitch.tv/mouredev) -[![Discord](https://img.shields.io/badge/Discord-Servidor_de_la_comunidad-5865F2?style=for-the-badge&logo=discord&logoColor=white&labelColor=101010)](https://mouredev.com/discord) -[![Link](https://img.shields.io/badge/Links_de_interés-moure.dev-39E09B?style=for-the-badge&logo=Linktree&logoColor=white&labelColor=101010)](https://moure.dev) [![Web](https://img.shields.io/badge/GitHub-MoureDev-14a1f0?style=for-the-badge&logo=github&logoColor=white&labelColor=101010)](https://github.com/mouredev) +[![Discord](https://img.shields.io/badge/Discord-Servidor_de_la_comunidad-5865F2?style=for-the-badge&logo=discord&logoColor=white&labelColor=101010)](https://mouredev.com/discord) [![Pro](https://img.shields.io/badge/Cursos-mouredev.pro-FF5500?style=for-the-badge&logo=gnometerminal&logoColor=white&labelColor=101010)](https://mouredev.pro) +[![Link](https://img.shields.io/badge/Links_de_interés-moure.dev-14a1f0?style=for-the-badge&logo=Linktree&logoColor=white&labelColor=101010)](https://moure.dev) [![Web](https://img.shields.io/badge/GitHub-MoureDev-087ec4?style=for-the-badge&logo=github&logoColor=white&labelColor=101010)](https://github.com/mouredev) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..e8594158 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3389 @@ +{ + "name": "hello_javascript", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hello_javascript", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "jest": "^29.7.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "dev": true, + "dependencies": { + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.26.10" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001703", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz", + "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.115", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.115.tgz", + "integrity": "sha512-MN1nahVHAQMOz6dz6bNZ7apgqc9InZy7Ja4DBEVCTdeiUcegbyOYE9bi/f2Z/z6ZxLi0RxLpyJ3EGe+4h3w73A==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..6b22a903 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "hello_javascript", + "version": "1.0.0", + "description": "[![JavaScript](https://img.shields.io/badge/JavaScript-ES6+-yellow?style=for-the-badge&logo=javascript&logoColor=white&labelColor=101010)](https://developer.mozilla.org/es/docs/Web/JavaScript) [![NodeJS](https://img.shields.io/badge/NODEJS-v20+-green?style=for-the-badge&logo=nodedotjs&logoColor=white&labelColor=101010)](https://nodejs.org/)", + "main": "index.js", + "scripts": { + "test": "jest" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "jest": "^29.7.0" + } +} \ No newline at end of file