diff --git a/.github/workflows/publish-dockerhub.yml b/.github/workflows/publish-dockerhub.yml index 8b379b4..5f22518 100644 --- a/.github/workflows/publish-dockerhub.yml +++ b/.github/workflows/publish-dockerhub.yml @@ -20,10 +20,18 @@ jobs: uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} + password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build the Docker image - run: docker build . --file Dockerfile --tag ${{ secrets.DOCKERHUB_USERNAME }}/devops:${{ steps.package-version.outputs.current-version}} - - - name: Docker Push - run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/devops:${{ steps.package-version.outputs.current-version}} \ No newline at end of file + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push Docker image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + push: true + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/devops:latest + ${{ secrets.DOCKERHUB_USERNAME }}/devops:${{ steps.package-version.outputs.current-version}} + platforms: linux/amd64,linux/arm64,linux/arm/v7 diff --git a/.github/workflows/publish-ghcr.yml b/.github/workflows/publish-ghcr.yml index 9cb46b5..b531cb7 100644 --- a/.github/workflows/publish-ghcr.yml +++ b/.github/workflows/publish-ghcr.yml @@ -1,4 +1,4 @@ -name: Publish Image - GHCR +name: Build and Push Image to GHCR on: workflow_dispatch: @@ -37,12 +37,17 @@ jobs: with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Build and push Docker image uses: docker/build-push-action@v6 with: context: . + file: ./Dockerfile push: true tags: | ghcr.io/pradumnasaraf/devops:${{ steps.package-version.outputs.current-version}} ghcr.io/pradumnasaraf/devops:latest - labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file + platforms: linux/amd64,linux/arm64,linux/arm/v7 + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index df1e42a..d63ac55 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -17,7 +17,7 @@ jobs: with: github-token: ${{ secrets.PA_TOKEN }} version-file: 'package.json, package-lock.json' - skip-ci: 'false' + output-file: "false" create-summary: 'true' - name: create release diff --git a/CHANGELOG.md b/CHANGELOG.md index f6d13f7..25dc4d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [2.3.1](https://github.com/Pradumnasaraf/DevOps/compare/v2.3.0...v2.3.1) (2024-09-17) + + +### Bug Fixes + +* Update Docker build and push actions to build and push multi-arch images ([#99](https://github.com/Pradumnasaraf/DevOps/issues/99)) ([f537f16](https://github.com/Pradumnasaraf/DevOps/commit/f537f162f737aceb9ccc95394e93ed677a10b2f8)) + + + # [2.3.0](https://github.com/Pradumnasaraf/DevOps/compare/v2.2.0...v2.3.0) (2024-08-02) @@ -34,12 +43,3 @@ -## [1.5.1](https://github.com/Pradumnasaraf/DevOps/compare/v2.0.0...v1.5.1) (2024-07-24) - - -### Bug Fixes - -* V2 cleanup ([#93](https://github.com/Pradumnasaraf/DevOps/issues/93)) ([6c852a8](https://github.com/Pradumnasaraf/DevOps/commit/6c852a8b62e9e2208c4271c81832dfaf1a312378)) - - - diff --git a/docs/golang/concepts/0) test.go b/docs/golang/concepts/0) test.go index 7a20cd8..d923a38 100644 --- a/docs/golang/concepts/0) test.go +++ b/docs/golang/concepts/0) test.go @@ -12,3 +12,4 @@ func main() { fmt.Println(numFloat) fmt.Println(numInt) } + diff --git a/docs/golang/concepts/11) slices.go b/docs/golang/concepts/11) slices.go index 40bbe8f..416fb5e 100644 --- a/docs/golang/concepts/11) slices.go +++ b/docs/golang/concepts/11) slices.go @@ -9,7 +9,6 @@ func main() { var fruits []string // We don't need to specify the size of the array // fruits := []string{} - We can also use this syntax to create a slice // fruits := make([]string, 2) - We can also use make function to create a slice - fruits = append(fruits, "Apple") fruits = append(fruits, "Orange") fruits = append(fruits, "Banana") diff --git a/docs/golang/concepts/12) slices2.go b/docs/golang/concepts/12) slices2.go index fd67fb5..0ba33ae 100644 --- a/docs/golang/concepts/12) slices2.go +++ b/docs/golang/concepts/12) slices2.go @@ -5,9 +5,10 @@ import "fmt" func main() { // remove an element from a slice var cars = []string{"BMW", "Audi", "Mercedes", "Ford", "Fiat"} - + fmt.Println(cars) var index int = 2 + // We are concatenating two slice and rewriting the 1st Slice. cars = append(cars[:index], cars[index+1:]...) // remove the element at index 2. :index is from 0 to index-1, [index+1:] is from index+1 to end. We can append both elements as well as a slice. ... is to denote a slice fmt.Println(cars) diff --git a/docs/golang/concepts/13) map.go b/docs/golang/concepts/13) map.go index 26a43b7..b66a57e 100644 --- a/docs/golang/concepts/13) map.go +++ b/docs/golang/concepts/13) map.go @@ -5,8 +5,8 @@ import ( ) func main() { - // var languages = map[string]string{} - var languages = make(map[string]string, 0) // create a slice of maps with a length of 0. // map[keyType]valueType + var languages = map[string]string{} + // var languages = make(map[string]string, 0) // create a slice of maps with a length of 0. // map[keyType]valueType //laguages[key] = value languages["JS"] = "JavaScript" @@ -17,10 +17,10 @@ func main() { fmt.Println(languages) fmt.Println(languages["JS"]) // access the value of a key - delete(languages, "RB") // delete a key from a map + delete(languages, "RB") // Deleting a Key (No key means no Value as well) fmt.Println(languages) - for _, value := range languages { - fmt.Println(value) + for key, value := range languages { + fmt.Println(key, value) } } diff --git a/docs/golang/concepts/20) methods.go b/docs/golang/concepts/20) methods.go index 283627e..c7942eb 100644 --- a/docs/golang/concepts/20) methods.go +++ b/docs/golang/concepts/20) methods.go @@ -2,26 +2,30 @@ package main import "fmt" -type UserData struct { // struct is a collection of fields. +type UserData struct { fistName string lastName string email string numberOfTickets int } +/* +func (receiver Type) MethodName(parameters) returnType { + // method body +} +*/ + +func (u UserData) greetUser() { + fmt.Println("Hello", u.fistName, u.lastName) +} + func main() { - user := UserData{ // struct initialization + user := UserData{ fistName: "John", lastName: "Doe", email: "pradumnasaraf@gmail.com", numberOfTickets: 2, } - - fmt.Println(user) - - user.greetUser() // Method call -} - -func (u UserData) greetUser() { // method with receiver - fmt.Println("Hello", u.fistName, u.lastName) + + user.greetUser() // Call the method } diff --git a/docs/golang/concepts/21) defer.go b/docs/golang/concepts/21) defer.go index c8b3100..d6c9fab 100644 --- a/docs/golang/concepts/21) defer.go +++ b/docs/golang/concepts/21) defer.go @@ -2,6 +2,8 @@ package main import "fmt" + +// Defer statements are run at the end func main() { defer fmt.Println("This is the first defer statement") defer fmt.Println("This is the second defer statement") diff --git a/docs/golang/concepts/22) map-ad.go b/docs/golang/concepts/22) map-ad.go index 3a3fe08..e074e50 100644 --- a/docs/golang/concepts/22) map-ad.go +++ b/docs/golang/concepts/22) map-ad.go @@ -6,8 +6,8 @@ import ( ) func main() { - var bookings = make([]map[string]string, 0) // This is a slice of map. - // var bookings = []map[string]string{} // This is also valid + + bookings :=[]map[string]string{} // This is a slice of map. for i := 0; i < 1; i++ { @@ -15,7 +15,7 @@ func main() { age := 32 city := "New York" - var myMap = make(map[string]string) + myMap := map[string]string{} myMap["name"] = name myMap["age"] = strconv.FormatInt(int64(age), 10) diff --git a/docs/golang/concepts/23) files.go b/docs/golang/concepts/23) files.go index 60c3187..45f581a 100644 --- a/docs/golang/concepts/23) files.go +++ b/docs/golang/concepts/23) files.go @@ -8,17 +8,16 @@ import ( func main() { - // Process to create, write and read a file - content := "Hey I am Pradumna" - //"." means current directory + // Create a file file, err := os.Create("./hello.txt") if err != nil { panic(err) } + // Writing content in a file length, err := io.WriteString(file, content) if err != nil { @@ -27,6 +26,7 @@ func main() { fmt.Println("Length:", length) + // Reading a file data, err := os.ReadFile("./hello.txt") if err != nil { @@ -34,6 +34,14 @@ func main() { } - // data is of type []byte so we need to convert it to string + // Print the read data fmt.Println(string(data)) + + //Removing a file + err = os.Remove("./hello.txt") + + if err != nil { + panic(err) + + } } diff --git a/docs/golang/concepts/24) handling-web-req.go b/docs/golang/concepts/24) handling-web-req.go index 71f9829..01aa92c 100644 --- a/docs/golang/concepts/24) handling-web-req.go +++ b/docs/golang/concepts/24) handling-web-req.go @@ -15,11 +15,12 @@ func main() { fmt.Printf("Response is of type: %T\n", res) fmt.Println(res.Status) + fmt.Println(res.Proto) - databytes, err := io.ReadAll(res.Body) //We can't read the response directly. So we use ioutil.ReadAll() + dataBytes, err := io.ReadAll(res.Body) //We can't read the response directly. So we use ioutil.ReadAll() checkNilError(err) - content := string(databytes) // convert the byte array to string + content := string(dataBytes) // convert the byte array to string fmt.Println(content) } diff --git a/docs/golang/concepts/26) http-requests.go b/docs/golang/concepts/26) http-requests.go index b18b87f..83ee2b5 100644 --- a/docs/golang/concepts/26) http-requests.go +++ b/docs/golang/concepts/26) http-requests.go @@ -3,7 +3,6 @@ package main import ( "fmt" "io" - "io/ioutil" "log" "net/http" "net/url" diff --git a/docs/golang/concepts/27) json.go b/docs/golang/concepts/27) json.go index 2133ed7..897cb6b 100644 --- a/docs/golang/concepts/27) json.go +++ b/docs/golang/concepts/27) json.go @@ -6,77 +6,92 @@ import ( "log" ) +// It's important to mention `json:"key-name"` otherwise it will pick the keyword mentioned in the Struct with capitalization. type Person struct { - Name string `json:"coursename"` - Age int `json:"age"` - DOBY int `json:"doby"` + Name string `json:"name"` + Age int `json:"age"` + Place string `json:"place"` } func main() { - - // structToJson() - // jsonToStruct() + // letsMarshal() + // letsUnMarshal() extractJsonData() } -func structToJson() { - tom := []Person{ +func letsUnMarshal() { + jsonData := []byte(` { - Name: "Tom", - Age: 21, - DOBY: 199, + "name": "Pradumna Saraf", + "age": 25, + "place": "India" + } + `) + + var myData Person + + isJSONValid := json.Valid(jsonData) + if isJSONValid == true { + json.Unmarshal(jsonData, &myData) + } else { + fmt.Println("Invalid JSON") + } + + fmt.Println(myData.Age) + fmt.Println(myData.Name) + fmt.Println(myData.Place) + + +} + +func letsMarshal() { + myPerson := Person{ + Name: "Pradumna Saraf", + Age: 25, + Place: "India", + } + + myPersonSlice := []Person{ + { + Name: "Pradumna Saraf", + Age: 25, + Place: "India", }, { - Name: "Ben", - Age: 21, - DOBY: 199, + Name: "Pradumna Saraf", + Age: 25, + Place: "India", }, { - Name: "Loft", - Age: 21, - DOBY: 199, + Name: "Pradumna Saraf", + Age: 25, + Place: "India", }, } - // Marshal will convert the struct to json - jsonOutput, err := json.MarshalIndent(tom, "", " ") + // Single Object + data, err := json.Marshal(&myPerson) if err != nil { - log.Fatal(err) - + log.Fatal("Unable to Marshal") } + fmt.Println(string(data)) - fmt.Println(string(jsonOutput)) -} - -func jsonToStruct() { - jsonData := []byte(`{ - "coursename": "ben", - "age": 200, - "doby": 1975 -}`) - - var myUser Person - - validateJson := json.Valid(jsonData) - if validateJson == true { - // Unmarshal will convert the json to struct - json.Unmarshal(jsonData, &myUser) - fmt.Println(myUser) - } else { - fmt.Println("JSON is invalid") + // A list of Objects + sliceData, err := json.MarshalIndent(&myPersonSlice, "", " ") + if err != nil { + log.Fatal("Unable to Marshal") } - + fmt.Println(string(sliceData)) } -func extractJsonData() { +func extractJsonData() { jsonData := []byte(` { - "coursename": "Mern", - "price": 200, - "website": "yt", - "tags": [ "full-stack", "js" ] + "name": "Pradumna Saraf", + "age": 25, + "place": "India" } `) @@ -89,4 +104,4 @@ func extractJsonData() { fmt.Printf("Key is %v with the value %v and type is: %T\n", k, v, v) } -} +} \ No newline at end of file diff --git a/docs/golang/concepts/28) go-routine.go b/docs/golang/concepts/28) go-routine.go index 29fb1ca..8d3b349 100644 --- a/docs/golang/concepts/28) go-routine.go +++ b/docs/golang/concepts/28) go-routine.go @@ -6,8 +6,9 @@ import ( ) func main() { - go greeter("Hello") - greeter("World") + go greeter("First Statement") + go greeter("Second Statement") + greeter("Third Statement") } @@ -17,22 +18,4 @@ func greeter(s string) { time.Sleep(1 * time.Second) fmt.Println(s) } - - //runThisInMain() -} - -func runThisInMain() { - for { - var input string - go sayHello() // go keyword is used to create a go routine. This is a concurrent execution of the function, meaning it will run in the background and will not block the main thread. - fmt.Print("Enter Text: ") - fmt.Scanln(&input) - fmt.Println("Your Input was:", input) - } -} - -func sayHello() { - time.Sleep(5 * time.Second) - fmt.Println("Hello from sayHello") - } diff --git a/docs/golang/concepts/30) waitgroup-api-eg.go b/docs/golang/concepts/30) waitgroup-api-eg.go index 53ecd95..c5ba21b 100644 --- a/docs/golang/concepts/30) waitgroup-api-eg.go +++ b/docs/golang/concepts/30) waitgroup-api-eg.go @@ -6,9 +6,9 @@ import ( "sync" ) -var wg sync.WaitGroup //pointer -var mut sync.Mutex //pointer -var signals = []string{"test"} +var wg sync.WaitGroup +var mut sync.Mutex +var statusCodes = []int{} func main() { @@ -25,10 +25,10 @@ func main() { for _, endpoint := range endpoints { go checkStausCode(endpoint) wg.Add(1) - } + } wg.Wait() - fmt.Print(signals) + fmt.Print(statusCodes) } func checkStausCode(endpoint string) { @@ -39,7 +39,7 @@ func checkStausCode(endpoint string) { fmt.Println("Problem in the endpoint", endpoint) } else { mut.Lock() - signals = append(signals, endpoint) + statusCodes = append(statusCodes, res.StatusCode) mut.Unlock() fmt.Printf("Status code for %s is %d\n", endpoint, res.StatusCode) } diff --git a/docs/golang/concepts/32) channels.go b/docs/golang/concepts/32) channels.go index 0224611..199dec1 100644 --- a/docs/golang/concepts/32) channels.go +++ b/docs/golang/concepts/32) channels.go @@ -6,14 +6,15 @@ import ( ) func main() { - myChannel := make(chan int, 2) // buffered channel. By default, it is unbuffered + + myChannel := make(chan int, 2) // buffered channel + // var myChannel chan int // unbuffered channel wg := &sync.WaitGroup{} + wg.Add(2) go func(ch chan int, wg *sync.WaitGroup) { fmt.Println(<-ch) // read from channel - - wg.Done() }(myChannel, wg) diff --git a/docs/golang/concepts/33) channels-open.go b/docs/golang/concepts/33) channels-open.go index 5a21d7a..8cd63fc 100644 --- a/docs/golang/concepts/33) channels-open.go +++ b/docs/golang/concepts/33) channels-open.go @@ -6,25 +6,30 @@ import ( ) func main() { - // When channel is closed, the value read from the channel is the zero value and at the same time maybe the write value can also be zero value. - // So we need to check if the channel is closed or not by using the second return value of the read operation. - myChannel := make(chan int, 2) wg := &sync.WaitGroup{} + myCh := make(chan int, 1) wg.Add(2) - go func(ch <-chan int, wg *sync.WaitGroup) { - val, isChannelOpen := <-ch - fmt.Println(val, isChannelOpen) - wg.Done() - }(myChannel, wg) - - go func(ch chan<- int, wg *sync.WaitGroup) { - // ch <- 5 uncomment this line to see the difference - close(myChannel) - wg.Done() - - }(myChannel, wg) + go func(channel chan int, wait *sync.WaitGroup) { + fmt.Println("First Go Routine") + wait.Done() + + value, isChannelOpen := <-myCh + + if !isChannelOpen { + fmt.Println("Channel Closed") + } + fmt.Println(value) + }(myCh, wg) + + go func(channel chan int, wait *sync.WaitGroup) { + fmt.Println("Second Go Routine") + // myCh <- 3 + close(myCh) + wait.Done() + // myCh <- 5 + }(myCh, wg) wg.Wait() } diff --git a/docs/golang/concepts/34) Interface.go b/docs/golang/concepts/34) Interface.go index d5d1bf8..f9c2a54 100644 --- a/docs/golang/concepts/34) Interface.go +++ b/docs/golang/concepts/34) Interface.go @@ -1,39 +1,36 @@ package main -import "fmt" +import ( + "fmt" + "math" +) -type Printer interface { - printInfo() +type shape interface { + area() float64 } - - -type Book struct { - Title string - Price float32 +type circle struct { + radius float64 } -type Drink struct { - Name string - Price float32 +type rectangle struct { + width float64 + length float64 } -func (b Book) printInfo() { - fmt.Println("Book Title:", b.Title, "Price:", b.Price) +func (r rectangle) area() float64 { + return r.length * r.width } -func (d Drink) printInfo() { - fmt.Println("Drink Name:", d.Name, "Price:", d.Price) +func (c circle) area() float64 { + return 2 * math.Pi * c.radius } func main() { - book := Book{Title: "The Alchemist", Price: 9.99} - drink := Drink{Name: "Coke", Price: 1.99} - - // book.printInfo() - // drink.printInfo() + myRectangle := rectangle{width: 8, length: 10} + fmt.Println(myRectangle.area()) - info := []Printer{book, drink} + myCircle := circle{radius: 10} + fmt.Println(myCircle.area()) - info[0].printInfo() - info[1].printInfo() + } diff --git a/docs/golang/concepts/8) pointers.go b/docs/golang/concepts/8) pointers.go index 2c2d89b..768b9a8 100644 --- a/docs/golang/concepts/8) pointers.go +++ b/docs/golang/concepts/8) pointers.go @@ -10,5 +10,15 @@ func main(){ println("myInt:", ptr) // ptr is the address of the variable println("myInt:", *ptr) // * is used to get the value stored at the address + +} +type Persons struct { + Name string + Age int +} + + +func ModifyPerson(p *Persons) { + p.Name = "Alice" } \ No newline at end of file diff --git a/docs/golang/introduction.md b/docs/golang/introduction.md index 0ba60eb..9f32c0c 100644 --- a/docs/golang/introduction.md +++ b/docs/golang/introduction.md @@ -3,27 +3,32 @@ sidebar_position: 1 title: Golang Introduction --- -Golang (or Go) is statically typed, compiled programming language designed at Google. It is syntactically similar to C, but with memory safety, garbage collection, structural typing, and CSP-style concurrency. In Golang, everything is a package. A package is a collection of source files in the same directory that are compiled together. A package can be imported by other packages. `main` is a special package that defines a standalone executable program, not a library. +Golang (or Go) is statically typed, compiled programming language designed at Google. It is syntactically similar to C, but with memory safety, garbage collection, structural typing, and CSP-style concurrency. + +In Golang, everything is a package. A package is a collection of source files in the same directory that are compiled together. A package can be imported by other packages. `main` is a special package that defines a standalone executable program, not a library. ## Installation - [Download](https://golang.org/dl/) and install Go + +- Garbage collected +- Multithreading +- concurrency -## Modules and Packages +## Packages -Modules are a collection of related Go packages that are versioned together as a single unit. For example `net/http` is a package that is part of the `net` module. Some of the standard library packages in Go are: +Module is a collection of related Go packages that are versioned together as a single unit. -- **fmt** - formatted I/O with functions analogous to C's printf and scanf. -- **os** - provides a platform-independent interface to operating system functionality. -- **strconv** - implements conversions to and from string representations of basic data types. -- **time** - provides functionality for measuring and displaying time. -- **math** - provides basic constants and mathematical functions. -- **net/http** - provides HTTP client and server implementations. -- **encoding/json** - implements encoding and decoding of JSON. +- fmt - formatted I/O with functions analogous to C's printf and scanf. +- os - provides a platform-independent interface to operating system functionality. +- strconv - implements conversions to and from string representations of basic data types. +- time - provides functionality for measuring and displaying time. +- math - provides basic constants and mathematical functions. +- net/http - provides HTTP client and server implementations. +- encoding/json - implements encoding and decoding of JSON. -## Writing a program (skeleton) -> `main.go` file +## Hello World - Running a program ```go package main // package declaration @@ -33,20 +38,21 @@ import "fmt" // import fmt package import ( "fmt" "os") // import multiple packages func main() { -fmt.Println("Hello, World!") // Println is a function from the fmt package +fmt.Println("Hello, World!") } ``` -We can run the program using the following command: + +We can run and compile the program using the following command: ```bash -$ go run main.go +$ go run hello.go ``` -## Go Mod +## Go Mod (go.mod) -Go Mod helps to manage dependencies in Go. It is a dependency management tool that is built into the Go toolchain. It is used to manage the dependencies of a Go project. It creates a `go.mod` file that describes the module's dependencies. +Go modules are a dependency management system that makes dependency version information explicit and easier to manage. Go modules are the future of dependency management in Go. -`go mod init github.com/username/repo` - creates a new module, initializing the go.mod file that describes it. In this case our desired module path is `github.com/username/repo`. +`go mod init github.com/username/repo` - creates a new module, initializing the go.mod file that describes it. - `go mod tidy` - command will add any missing modules necessary to build the current module's packages and dependencies. It will also remove any unused modules that don't provide any relevant packages. It will update the go.mod file and the go.sum file. @@ -64,19 +70,22 @@ Go Mod helps to manage dependencies in Go. It is a dependency management tool th ## Sum (go.sum) -It is a file that contains the expected cryptographic checksums of the content of specific module versions. It ensures that dependencies have not been modified. It will automatically be created when we run `go mod tidy` or `go get`. We don't need to worry about this file. It is automatically managed by Go. +It is a file that contains the expected cryptographic checksums of the content of specific module versions. It ensures that dependencies have not been modified. + +## Go Path + +Go path is an environment variable that specifies the location of your workspace. It is used to find the location of your Go code. + ## Build -We can build a Go program and create an executable file so that we can run from anywhere. We can use the `go build` command to build a Go program. It will create an executable file with the same name as the package name. +We can build a program using the following command: ```bash -$ go build main.go -$ go build . # it will build all the files in the current directory -$ go build -o app main.go # we can specify the name of the executable file +$ go build hello.go ``` -We can also build for different platforms using the following command: +we can also build for different platforms using the following command: ```bash $ GOOS=linux GOARCH=amd64 go build hello.go @@ -87,94 +96,41 @@ $ GOOS=linux GOARCH=amd64 go build hello.go - new() - It allocates memory. The size of the memory is equal to the size of the type. It returns a pointer to the memory. - make() - It creates slices, maps, and channels only. It returns an initialized (not zeroed) value of type. It is used to create dynamically sized objects. -It will be get clearer as we move forward. - +Garbage collection is a form of automatic memory management. The garbage collector frees the memory occupied by objects that are no longer in use by the program. -### Print +## Print -There are several ways to print in Go. We generally use the `fmt` package to print in Go. +There are serveral ways to print in Go. We can use `fmt` package to print. -- `fmt.Println` - Prints a line with a new line -- `fmt.Print` - Prints without a new line -- `fmt.Printf` - Prints with formatting +- `fmt.Println` - prints a line +- `fmt.Print` - prints without a new line +- `fmt.Printf` - prints with formatting -Eg: - -```go -func main() { - fmt.Println("Hello, World!") - fmt.Print("Hello, World!") - fmt.Printf("Hello, %s!", "World") -} -``` +Placeholders for `printf` -#### Placeholders for `printf` : - -- **%v** - value in default format -- **%+v** - value in default format with field names -- **%T** - type of value -- **%t** - boolean -- **%d** - decimal integer -- **%b** - binary integer -- **%c** - character -- **%x** - hexadecimal integer -- **%f** - floating point number -- **%s** - string - -Eg: - -```go -fmt.Printf("Hello, %s! You are %d years old.", "John", 25) -``` +- %v - value in default format +- %+v - value in default format with field names +- %T - type of value +- %t - boolean +- %d - decimal integer +- %b - binary integer +- %c - character +- %x - hexadecimal integer +- %f - floating point number +- %s - string Escape sequences: - \n - newline - \t - tab -- \r - carriage return -Eg: - -```go -func main() { - fmt.Println("Hello, World!") // It will print Hello, World! - fmt.Println("Hello, \tWorld!") // It will print Hello, World! with a tab -} -``` - -### Variables and Constants +## Variables and Constants - `var` - variables with initializers. - `const` - declares a constant value. Can't be updated. - `:=` - short variable declaration. Can be used only inside a function. Called Syntax sugar. We can't use it to declare a global variable. -```go -var name string = "John" // variable declaration with type -const pi = 3.14 // constant declaration - -func main() { - age := 25 // short variable declaration -} -``` - -### Scope rules - -- `Local variables` are scoped to the function in which they are declared. They are not visible outside the function. -- `Package level variables` are scoped to the package in which they are declared. They are visible to all the functions in the package. -- `Exported variables` are scoped to the package in which they are declared. They are visible to all the functions in the package and other packages that import the package. -- `Block level variables` are scoped to the block in which they are declared. They are not visible outside the block. - -NOTE: For Package level variables We can't use the short variable declaration operator `:=` to declare package level variables. - -```go -var name string = "John" // It will be available to all the functions in the package - -func main() { - fmt.Println(name) -} -``` - -### Data Types +## Data Types When we declare with a value we don't need to specify the type. Go will infer the type from the value. But when we declare without a value we need to specify the type. @@ -197,9 +153,46 @@ name = "John" - If we don't put a variable type go will automatically assign the type based on the value.- -## Scanner +### String -### Scanning through fmt +- A string is a sequence of characters. We can use double quotes to create a string. + +```go +var name = "John" +``` + +- We can use backticks to create a raw string literal. It is used to create a string without escape sequences. + +```go +var name = `John\n` +``` + +We can perform a lot of operations on strings like concatenation, length, indexing etc. Here are some examples: + +```go +var name = "John" + +fmt.Println(len(name)) // it will print the length of the string +fmt.Println(name[0]) // it will print the first character of the string +fmt.Println(name + " Doe") // it will concatenate the strings +``` + +With the `strings` package, we can perform more operations on strings like splitting, joining, replacing etc. It's one of most used packages in Go. + +```go +import "strings" + +var name = "John Doe" + +fmt.Println(strings.Split(name, " ")) // it will split the string based on the space +fmt.Println(strings.Join([]string{"John", "Doe"}, " ")) // it will join the strings with a space +fmt.Println(strings.Replace(name, "John", "Jane", 1)) // it will replace the first occurrence of John with Jane +fmt.Println(strings.Contains(name, "John")) // it will check if the string contains John +fmy.Println(strings.ToLower(name)) // it will convert the string to lowercase +fmt.Println(strings.ToUpper(name)) // it will convert the string to uppercase +``` + +## Scan `fmt.Scan` reads text from standard input, scanning the text read into successive arguments. Newlines count as space. It returns the number of items successfully scanned. If that is less than the number of arguments, err will report why. @@ -221,7 +214,7 @@ fmt.Println(text) } ``` -## "text , err syntax" | ok, err syntax +### "text , err syntax" In the above example we used `text, err` syntax. It is a common way to handle errors in Go. If we don't want to handle the error we can use `_` to ignore it. @@ -235,29 +228,20 @@ if err != nil { - `panic` - It is a built-in function that stops the ordinary flow of control and begins panicking. When the function F calls panic, execution of F stops, any deferred functions in F are executed normally, and then F returns to its caller. -## Conversion - -We can convert a value from one type to another using the type conversion syntax. We can convert a value from one type to another using the type conversion syntax. Eg: - -```go -var num int = 42 -var numFloat float64 = float64(num) -var numFloat = 3.14 -var numInt = int(numFloat) -``` +## Conversion -Else we can also use the `strconv` package to convert a value to a string and vice versa. +We can convert a value from one type to another. The expression T(v) converts the value v to the type T. We can use `strconv` package to convert a data type to another. ```go var num = 42 -var numStr = strconv.Itoa(num) +var stringNum = "42" -var numStr = "42" -var num, _ = strconv.Atoi(numStr) +var str = strconv.Itoa(num) // it will convert the integer to a string +var intNum, _ = strconv.Atoi(stringNum) // it will convert the string to an integer ``` -### Time +## Time We can use `time` package to get the current time. @@ -266,71 +250,47 @@ t := time.Now() fmt.Println(t) ``` -### Math +## Pointers -We can use the `math` package to perform mathematical operations in Go. We can do operations like addition, subtraction, multiplication, division, etc. +A pointer is a variable that stores the memory address of another variable. We can declare a pointer by using `*` operator. Eg: ```go -rand.Seed(time.Now().UnixNano()) +var p *int ``` -## Strings Operations +We can get the memory address of a variable using `&` operator. -We can perform various operations on strings in Go. Some of them are: +```go +var name = "John" +fmt.Println(&name) // it will print the memory address of the variable name +``` -- `len()` - It is used to get the length of a string. -- `strings.ToUpper()` - It is used to convert a string to uppercase. -- `strings.ToLower()` - It is used to convert a string to lowercase. -- `strings.TrimSpace()` - It is used to remove leading and trailing spaces from a string. -- `strings.Split()` - It is used to split a string into substrings based on a separator. -- `strings.Contains()` - It is used to check if a string contains a substring. -- `strings.Replace()` - It is used to replace a substring with another substring. -- `strings.Join()` - It is used to join a slice of strings into a single string. -- `strings.Index()` - It is used to find the index of a substring in a string. +We can get the value of a pointer using `*` operator. Called dereferencing. ```go -func main() { - - var name = "John" - fmt.Println(len(name)) // It will print the length of the string - fmt.Println(strings.ToUpper(name)) // It will print the string in uppercase - fmt.Println(strings.ToLower(name)) // It will print the string in lowercase - fmt.Println(strings.Title(name)) // It will print the string in title case - fmt.Println(strings.Repeat(name, 3)) // It will repeat the string 3 times - fmt.Println(strings.Replace(name, "J", "K", 1)) // It will replace the first occurrence of J with K - fmt.Println(strings.Split(name, "")) // It will split the string into a slice of characters -} -``` -## Pointers +var name = "John" +var myName = &name -A pointer is a variable that stores the memory address of another variable. It is used to store the address of a variable. We can use the `&` operator to get the address of a variable and the `*` operator to get the value stored at the address. +fmt.Println(*myName) // it will print the value of the variable name +``` -Use of pointers: +- `*int` - the type `*int` is a pointer to an `int`. -- To pass a large struct to a function without copying it. -- To update the value of a variable in a function. ```go -myInt := 42 -ptr := &myInt // & is used to get the address of the variable -// var ptr *int = &myInt - -println("myInt:", ptr) // ptr is the address of the variable -println("myInt:", *ptr) // * is used to get the value stored at the address +var name = "John" +fmt.Println(&name) // it will print the memory address of the variable name ``` -- `*int` - the type `*int` is a pointer to an `int`. - ## Arrays -An array is a collection of elements of the same type. It is a fixed-size collection of elements. +An array is a numbered sequence of elements of a single type with a fixed length. We can store a fixed size collection of elements of the same type. We declare an array as follows: ```go var arr [5]int // array of 5 integers -var arr1 = [5]int{1, 2, 3, 4, 5} // array of 5 integers with values arr[0] = 1 arr[1] = 2 @@ -338,13 +298,10 @@ arr[1] = 2 ## Slice -Slice are more flexible than arrays. Their size is not fixed. A slice is a lightweight data structure that gives access to a subsequence of the elements of an array. +In this we don't need to specify the size of the array. It is a dynamically sized, flexible view into the elements of an array. ```go var names []int // slice of integers -var names = []int{1, 2, 3, 4, 5} // slice of integers with values -var names = make([]int, 5) // slice of integers with length 5 -var names = [5]string{} ``` Unlink arrays, we don't add elements to a slice using `arr[index] = value`. We use `append` function to add elements to a slice. @@ -354,124 +311,70 @@ names = append(names, 1) names = append(names, 2) ``` -## Maps - -Maps are used to store key-value pairs. It is an unordered collection of key-value pairs. Maps are similar to dictionaries in Python. - -```go -var names = make(map[string]string) // map of string to string -var names = map[string]string{} -``` - -We can add key-value pairs to a map using the following syntax: - -```go -names["John"] = "Doe" -names["Jane"] = "Doe" - -fmt.Println(names["John"]) -``` - -We can delete a key-value pair from a map using the `delete` function. - -```go -delete(names, "John") -``` +## Loops -We can loop through a map using a `for` loop. +In Go, there is only one looping construct, the `for` loop. ```go -for key, value := range names { - fmt.Println(key, value) +for i := 0; i < 5; i++ { +fmt.Println(i) } ``` -## Structs - -A struct is a collection of fields. It is a data structure that lets us bundle together related data and behavior. We can use structs to represent real-world objects. +- `range` - The range form of the for loop iterates over a slice or map. ```go -type Person struct { - name string - age int -} +names := []string{"John", "Paul", "George", "Ringo"} -var p Person -p.name = "John" -p.age = 25 +for i, name := range names { +fmt.Println(i, name) +} ``` -## If else - -In Go, the `if` statement is used to execute a block of code if a condition is true. The `else` statement is used to execute a block of code if the same condition is false. +- `_` - The blank identifier is a special identifier that is used to ignore values when multiple values are returned from a function. It is used to ignore the index in the above example. ```go -if num > 0 { - fmt.Println("Positive") -} else if num == 0 { - fmt.Println("Equal to zero") -} else { - fmt.Println("Negative") +for _, name := range names { +fmt.Println(name) } ``` -There is shorthand syntax for `if` statements. We can declare a variable and check the condition in the same line. +## If Else ```go -if num := 10; num > 0 { - fmt.Println("Positive") +if num > 0 { // this condition will only be true if num is greater than 0 +fmt.Println("Positive") +} else if num == 0 { // this condition will only be true if num is equal to 0 +fmt.Println("Equal to zero") +} else { // this condition will only be true if num is less than 0 +fmt.Println("Negative") } ``` -## Loops - -In Go, we have three types of loops: +We can check also write `data == false` or `!data` -- `for` - The for loop is the only loop statement in Go. It is similar to the for loop in other languages. -- `range` - The range form of the for loop iterates over a slice or map. -- `_` - The blank identifier is a special identifier that is used to ignore values when multiple values are returned from a function. - -### For loop +### Break and Continue -For loop is used to execute a block of code multiple times. It is similar to the for loop in other languages. +- `break` - The break statement terminates the loop or switch statement and transfers execution to the statement immediately following the loop or switch. ```go + for i := 0; i < 5; i++ { + if i == 3 { + break + } fmt.Println(i) } ``` -### Range - -The range form of the for loop iterates over a slice or map. - -```go -names := []string{"John", "Paul", "George", "Ringo"} - -for i, name := range names { - fmt.Println(i, name) -} -``` - -### Blank Identifier - -Blank identifier is a special identifier that is used to ignore values when multiple values are returned from a function. - -We can use the blank identifier to ignore the index. - -```go -for _, name := range names { - fmt.Println(name) -} -``` - -Infinite loop - -We can create an infinite loop using the `for` loop. +- `continue` - The continue statement terminates the current iteration of the loop, and resumes execution at the next iteration. It can be used only within an iterative or switch statement and only within the body of that statement. ```go -for { - fmt.Println("Hello") +for i := 0; i < 5; i++ { + if i == 3 { + continue + } + fmt.Println(i) } ``` @@ -481,7 +384,7 @@ The switch statement is a shorter way to write a sequence of if - else statement ```go switch num { -case 1 3: // It will execute the code if num is 1 or 3 +case 1: fmt.Println("One") case 2: fmt.Println("Two") @@ -490,13 +393,15 @@ default: } ``` -We can use the `fallthrough` keyword to execute the next case. It will execute the next case even if the condition is false. +### Fallthrough + +In Go, we don't need to write `break` after each case. It will automatically break after each case. If we want to execute the next case we can use `fallthrough` keyword. ```go switch num { case 1: fmt.Println("One") - fallthrough + fallthrough // it will execute the next case case 2: fmt.Println("Two") default: @@ -504,141 +409,54 @@ default: } ``` -We can also use the `switch` statement without a condition. It is similar to an if-else chain. - -```go -switch { -case num > 0: - fmt.Println("Positive") -case num == 0: - fmt.Println("Equal to zero") -case num < 0: - fmt.Println("Negative") -} -``` - -## Break and Continue - -- `break` - Break is used to terminate the loop immediately. It is used to exit the loop. - -```go -for i := 0; i < 5; i++ { - if i == 3 { // It will exit the loop when i is 3 - break - } - fmt.Println(i) -} -``` - -- `continue` - Continue is used to skip the current iteration of the loop. It is used to skip the current iteration and continue with the next iteration. - -```go -for i := 0; i < 5; i++ { - if i == 3 { // It will skip the iteration when i is 3 - continue - } - fmt.Println(i) -} -``` - -### Functions +## Functions -Functions is a block of code that performs a specific task. It is a reusable piece of code. We can define a function using the `func` keyword. +- A function is a block of code that performs a specific task. It is a reusable piece of code. ```go - -func hello() { - fmt.Println("Hello") +func add(x int, y int) int { // We can specify the type of the parameters + return x + y } func main() { - hello() + fmt.Println(add(1, 2)) // We can call the function by passing the arguments } ``` -### Functions with arguments - -Functions can take arguments. We can specify the type of the arguments. We can pass them when we call the function. +- A function can return multiple values. ```go -func add(x int, y int) { // We can specify the type of the parameters - fmt.Println(x + y) +func swap(x, y string) (string, string) { // When we have more than one return value we put them in parenthesis (). +return y, x } -func main() { - add(1, 2) -} -``` - -### Functions with return values - -We can return a value from a function. We can specify the return type. - -```go -func number() int { // We can specify the return type - return 42 -} +a, b := swap("hello", "world") // We can get the return values using multiple assignment ``` -### Function with parameters and return values +### Anonymous functions -We can have functions with parameters and return values. +- We can declare a function without a name. Such functions are called anonymous functions. ```go -func add(x, y int) int { // We can specify the type of the parameters and the return type +func(x, y int) int { return x + y } ``` -When we have multiple multiple parameters we put them in parentheses and arguments are separated by commas. Remember Arguments are actual data. +## Methods -```go -func addSub(x, y int) (int, int) { // We can specify the type of the parameters and the return type - return x + y, x - y -} -``` +A method is a function with a special receiver argument. The receiver appears in its own argument list between the func keyword and the method name. Receiver can be of any type. Receiver is a special type of parameter that is passed to a method. It is similar to `this` in other languages. It is used to access the fields and methods associated with the Type like a Struct. There are two types of receivers: -### Variadic functions +1. **Value Receiver**: It is used when we don't want to modify the original value. -A variadic function is a function that can accept a variable number of arguments. We can use the `...` operator to specify a variadic parameter. +> `func (t Test) printName() { fmt.Println(t.Name) }` -```go -func sum(nums ...int) int { // We can specify the type of the parameters - total := 0 - for _, num := range nums { - total += num - } - return total -} -``` +2. **Pointer Receiver**: It is used when we want to modify the original value. -### Anonymous functions +> `func (t *Test) printName() { fmt.Println(t.Name) }` -An anonymous function is a function that doesn't have a name. It is a function literal. We can assign it to a variable. -```go -add := func(x, y int) int { - return x + y -} - -fmt.Println(add(1, 2)) -``` - -### IIFE (Immediately Invoked Function Expression) - -An IIFE is a function that is immediately invoked. It is a function that is defined and called at the same time. - -```go -func main() { - func() { - fmt.Println("Hello") - }() -} -``` - -## Methods - -Methods are functions that are associated with a type. They are similar to functions but are defined with a receiver. The receiver is like a parameter. It is the first argument of the method. +Here is an example of a method: ```go type Person struct { @@ -657,7 +475,7 @@ func main() { ## Defer -Defer is used to delay the execution of a function until the surrounding function returns. It is used to ensure that a function call is performed regardless of the outcome of the surrounding function. It runs at the end of the function. +- A defer statement defers the execution of a function until the surrounding function returns. ```go func main() { @@ -667,132 +485,52 @@ func main() { } ``` -We can use defer to close a file after we open it. - -```go -func main() { - file, err := os.Open("file.txt") - if err != nil { - fmt.Println(err) - return - } - defer file.Close() // It will close the file after the main function returns -} -``` - -## File Handling +## Mutex -We can use the `os` package to work with files in Go. We can use the `os.Open` function to open a file. It returns a file and an error. We can use the `os.Create` function to create a file. It returns a file and an error. +- Mutex is a mutual exclusion lock. The zero value for a Mutex is an unlocked mutex. ```go +var mutex sync.Mutex -func main() { - file, err := os.Open("file.txt") - if err != nil { - fmt.Println(err) - return - } - defer file.Close() - - // Read the file - data, err := ioutil.ReadAll(file) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(data)) -} +mutex.Lock() // It will lock the mutex +mutex.Unlock() // It will unlock the mutex ``` -## Web Requests - -We can use the `net/http` package to make web requests in Go. We can use the `http.Get` function to make a GET request. It returns a response and an error. +- RWMutex is a reader/writer mutual exclusion lock. The lock can be held by an arbitrary number of readers or a single writer. When a writer is active, no readers can be active. ```go -func main() { - resp, err := http.Get("https://jsonplaceholder.typicode.com/posts") - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() - - data, err := ioutil.ReadAll(resp.Body) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(data)) -} -``` - -## URLs - -We can use the `net/url` package to parse URLs in Go. We can use the `url.Parse` function to parse a URL. It returns a URL and an error. We can construct or deconstruct URLs. - -```go -const url = "https://example.com/path?name=John&age=25" +var rwMutex sync.RWMutex -u, err := url.Parse(url) -if err != nil { - fmt.Println(err) - return -} +rwMutex.RLock() // It will lock the mutex for reading +rwMutex.RUnlock() // It will unlock the mutex for reading -fmt.Println(u.Scheme) // It will print the scheme -fmt.Println(u.Host) // It will print the host -fmt.Println(u.Path) // It will print the path -fmt.Println(u.RawQuery) // It will print the query +rwMutex.Lock() // It will lock the mutex for writing +rwMutex.Unlock() // It will unlock the mutex for writing ``` -## Web Servers +## Maps -We can create a web server in Go using the `net/http` package. We can use the `http.HandleFunc` function to register a handler function for a pattern. We can use the `http.ListenAndServe` function to start the server. +- A map is an unordered collection of key-value pairs. Maps are similar to dictionaries in Python. The limitation of maps is that the key should be of the same type and the value should be of the same type. The key and value can be of any type. ```go -func handler(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hello, World!") -} +var cars = make(map[string]string, 0) // map of string to string -func main() { - http.HandleFunc("/", handler) - http.ListenAndServe(":8080", nil) -} -``` +cars["Toyota"] = "Camry" // adding a key-value pair -This is provided by the `net/http` package, but we can use frameworks like `Gin` or `Echo` to create web servers. +delete(cars, "Toyota") // deleting a key-value pair +``` -### JSON +## Structs -We can use the `encoding/json` package to encode and decode JSON data in Go. We can use the `json.Marshal` function to encode a value to JSON. It returns a byte slice and an error. We can use the `json.Unmarshal` function to decode a JSON-encoded value. It returns an error. +- A struct is a collection of fields. It is a data structure that lets us bundle together related data and behavior. We can use structs to represent real-world objects. It can handle multiple data types. It is similar to classes in other languages. ```go type Person struct { - Name string `json:"name"` - Age int `json:"age"` -} - -func main() { - p := Person{Name: "John", Age: 25} - - data, err := json.Marshal(p) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(data)) - - var p1 Person - err = json.Unmarshal(data, &p1) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(p1) + name string + age int } ``` - ## Go routines and WaitGroup - A goroutine is a lightweight thread managed by the Go runtime. We can create a goroutine using the keyword `go`. It is similar to threads in other languages. The purpose of a goroutine is to run a function concurrently with other functions. @@ -805,7 +543,11 @@ go func() { - If the main function exits, the program will exit immediately even if the goroutine is still running. To prevent this, we can use the `WaitGroup` type. For Eg: -```go +#### WaitGroup + +- A WaitGroup waits for a collection of goroutines to finish. The main function will wait for the goroutines to finish before exiting. + +```go var wg sync.WaitGroup @@ -824,55 +566,42 @@ func sayHello() { `Add()` increments the WaitGroup counter by 1 and `Done()` decrements the WaitGroup counter by 1. -## Race Conditions and Mutex +### Concurrency vs Parallelism + +- **Concurrency** - It is the ability of a program to be decomposed into parts that can run independently of each other. It is the composition of independently executing processes. It is about dealing with lots of things at once. + +- **Parallelism** - It is the ability of a program to run multiple tasks simultaneously. It is about doing lots of things at once. -Race conditions occur when two or more goroutines access the same variable concurrently and at least one of the accesses is a write. It can lead to unpredictable behavior. To overcome this we can use the `sync` package. We can use the `sync.Mutex` type to lock and unlock a variable. + +## Math + +- rand.Seed() - It is used to initialize the default Source to a deterministic state. If Seed is not called, the generator behaves as if seeded by Seed(1). It should only be called once. It is usually called before the first call to Intn or Float64. ```go -func main() { - wg := &sync.WaitGroup{} - mut := &sync.RWMutex{} - - var score = []int{0} - - wg.Add(3) - - go func(wg *sync.WaitGroup, mut *sync.RWMutex) { - fmt.Println("One Routine") - mut.Lock() // Lock the memory location of score - score = append(score, 1) - mut.Unlock() // Unlock the memory location of score - wg.Done() - }(wg, mut) // Pass the pointer of WaitGroup and Mutex - go func(wg *sync.WaitGroup, mut *sync.RWMutex) { - fmt.Println("Two Routine") - mut.Lock() - score = append(score, 2) - mut.Unlock() - wg.Done() - }(wg, mut) - - wg.Wait() - fmt.Println(score) -} +rand.Seed(time.Now().UnixNano()) ``` -- `Lock()` - It will lock the mutex and prevent other goroutines from accessing the variable -- `Unlock()` - It will unlock the mutex and allow other goroutines to access the variable +## Json +- We can use the `json` package to encode and decode JSON data. -- `RWMutex` - It is a reader/writer mutual exclusion lock. It can be locked for reading or writing. It allows multiple readers or a single writer at a time. +- `json.Marshal()` - It is used to encode a value to JSON. It returns a byte slice and an error. +- `json.MarshalIndent()` - It is used to encode a value to JSON with indentation. It returns a byte slice and an error. +- `json.Unmarshal()` - It is used to decode a JSON-encoded value. It returns an error. + +In the Structs we can use the `json` tag to specify the name of the field in the JSON. I ```go -var rwMutex sync.RWMutex -rwMutex.RLock() // It will lock the mutex for reading -rwMutex.RUnlock() // It will unlock the mutex for reading -``` +type Person struct { + Name string `json:"name"` + Age int `json:"age"` +} +``` ## Channels -A channel is a communication mechanism that allows one goroutine to pass values of a specified type to another goroutine. It is communication between goroutines. It is similar to pipes in other languages. +- A channel is a communication mechanism that allows one goroutine to pass values of a specified type to another goroutine. It is communication between goroutines. It is similar to pipes in other languages. - `make()` - It is used to create a channel. It takes the type of the channel as an argument. @@ -889,64 +618,109 @@ fmt.Println(val) We can create a buffered channel by passing the buffer size as the second argument to the `make()` function. By default, the channel is unbuffered and can only hold one value. So, if we try to send multiple value to the channel it will give an error. +### Buffered Channel + +A buffered channel is a channel with a buffer. It can hold multiple values. We can specify the buffer size when we create the channel. + +```go +var ch = make(chan int, 5) // buffered channel with a buffer size of 5 +``` + +### Unbuffered Channel + +An unbuffered channel is a channel without a buffer. It can hold only one value. We can send a value to the channel only if there is a goroutine ready to receive the value. + ```go var ch = make(chan int) // unbuffered channel +``` + +### Closing a Channel -var ch = make(chan int, 10) // buffered channel +We can close a channel using the `close()` function. It is used to indicate that no more values will be sent on the channel. + +```go +msg := make(chan int) + +go func() { + msg <- 1 + close(msg) // After closing the channel we can't send any more values +}() ``` +But here a catch even tho channel is closed we can still receive the values from it like zero, so it's dalmatic whether the it's channel is closed or the value is zero. To overcome this we can receive the value and a boolean value which will tell us whether the channel is closed or not. + ```go -ch := make(chan int) +package main -ch <- 10 // It will send 10 to the channel +import ( + "fmt" + "sync" +) -<- ch // It will receive from the channel -val, ok := <- ch // It will receive from the channel and check if the channel is closed or not -``` +var wait = sync.WaitGroup{} -- `close()` - It is used to close a channel. It takes the channel as an argument. +func main() { + myChannel := make(chan int, 1) -#### Send Only Channel + wait.Add(2) + go func() { + fmt.Println("First Go Routine") + wait.Done() -```go -var ch = make(chan<- int) // send only channel + hello, isChannelOpen := <- myChannel + + if !isChannelOpen { + fmt.Println("Channel Closed") + } + fmt.Println(hello) + }() + + go func() { + fmt.Println("Second Go Routine") + close(myChannel) + wait.Done() + // myChannel <- 5 + }() + + wait.Wait() +} ``` -Receive Only Channel +### Send Only Channel ```go -var ch = make(<-chan int) // receive only channel +var ch = make(chan<- int) // send only channel ``` -## Interfaces +```go +go func (ch chan<- int) { + ch <- 10 +}(ch) +``` -An interface is a collection of method signatures. It is a set of methods that a type must implement. We can use interfaces to define the behavior of an object. We can use the `interface` keyword to define an interface. +### Receive Only Channel ```go -type Shape interface { - Area() float64 -} - -type Circle struct { - radius float64 -} +var ch = make(<-chan int) // receive only channel +``` -func (c Circle) Area() float64 { - return math.Pi * c.radius * c.radius -} +```go +go func (ch <-chan int) { + val := <-ch + fmt.Println(val) +}(ch) ``` -We can use interfaces to create polymorphic behavior. We can use an interface as a type. +## IIF's (Immediately Invoked Functions) -```go -func getArea(s Shape) float64 { - return s.Area() -} +- An immediately invoked function is a function that is executed as soon as it is created. It is a function that is executed immediately after it is created. It is also known as a self-invoking function. +```go func main() { - c := Circle{radius: 5} - fmt.Println(getArea(c)) + func() { + fmt.Println("Hello") + }() } ``` ## Error Handling @@ -961,16 +735,45 @@ func divide(x, y int) (int, error) { return x / y, nil } ``` +## goto -### Code Organization +- The goto statement transfers control to the labeled statement. It is similar to the break statement in other languages. It is used to transfer control to a different part of the program. -We can organize our code by putting functions/ variables in different files and can use them in the main file or calling the main function from other files. +```go +func main() { + i := 0 + start: + fmt.Println(i) + i++ + if i < 5 { + goto start + } +} +``` -Also, we can have multiple packages in a single directory. +## Scope rules + +- `Local variables` are scoped to the function in which they are declared. They are not visible outside the function. +- `Package level variables` are scoped to the package in which they are declared. They are visible to all the functions in the package. +- `Exported variables` are scoped to the package in which they are declared. They are visible to all the functions in the package and other packages that import the package. + +## Package level variables + +- We can declare variables at the package level. They are called package level variables. -### Expoting and Importing +NOTE: We can't use the short variable declaration operator `:=` to declare package level variables. -- We can export a function/ variable by capitalizing the first letter of the function/ variable name. Now we can use it in other packages. +```go +var name string = "John" // It will be available to all the functions in the package + +func main() { + fmt.Println(name) +} +``` + +## Expoting and Importing + +We can export a function/ variable by capitalizing the first letter of the function/ variable name. Now we can use it in other packages. ```go func Add(x, y int) int { @@ -980,24 +783,15 @@ func Add(x, y int) int { var Name string = "John" ``` -### goto +## Code Organization + +We can organize our code by putting functions/ variables in different files and can use them in the main file or calling the main function from other files. + +Also, we can have multiple packages in a single directory. -- `goto` is a statement that allows us to jump to a labeled statement in the same function. It is similar to the `goto` statement in other languages. -```go -func main() { - i := 0 -loop: - fmt.Println(i) - i++ - if i < 5 { - goto loop - } -} -``` -### What's next? +## What's next? - [Learning Resources](./learning-resources.md) - Learn more about Golang with these resources. - [Other Resources](./other-resources.md) - A list of resources to learn more about Golang. -- \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 749d982..aae1892 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "devops", - "version": "2.3.0", + "version": "2.3.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "devops", - "version": "2.3.0", + "version": "2.3.2", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/preset-classic": "3.4.0", @@ -104,6 +104,27 @@ "@algolia/transporter": "4.24.0" } }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, "node_modules/@algolia/client-analytics": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", @@ -116,7 +137,7 @@ "@algolia/transporter": "4.24.0" } }, - "node_modules/@algolia/client-common": { + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", @@ -126,6 +147,27 @@ "@algolia/transporter": "4.24.0" } }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.5.2.tgz", + "integrity": "sha512-LFkAilO+t06/SsFLTzdyh4FD8FGldCXD6Hf3O1ygcrOrxSNQvowy/Dtmqi68MbGP5/MKj24fFmFWhUGhSPh4wA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/client-personalization": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", @@ -137,17 +179,32 @@ "@algolia/transporter": "4.24.0" } }, - "node_modules/@algolia/client-search": { + "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" } }, + "node_modules/@algolia/client-search": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.5.2.tgz", + "integrity": "sha512-fJH+U6LzzI/LnGkD/Uy8VA8MbmF8ERRG5bXYiIsrcMC/QGyOW5G5y3XNhZlxUhqesrO7w+oTE7ZQ0YMXtW/5/Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.5.2", + "@algolia/requester-browser-xhr": "5.5.2", + "@algolia/requester-fetch": "5.5.2", + "@algolia/requester-node-http": "5.5.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/events": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", @@ -188,7 +245,28 @@ "@algolia/transporter": "4.24.0" } }, - "node_modules/@algolia/requester-browser-xhr": { + "node_modules/@algolia/recommend/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-browser-xhr": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", @@ -197,19 +275,58 @@ "@algolia/requester-common": "4.24.0" } }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.5.2.tgz", + "integrity": "sha512-fCsJL+97TswpDO5gu8CKf68ZS5yBSksaK8bszeU7BrjSYgu2vL/eFxpN4wxIBGIbDVJtcriWI0aTkT2ovrn/iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.5.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/requester-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", "license": "MIT" }, + "node_modules/@algolia/requester-fetch": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.5.2.tgz", + "integrity": "sha512-zKawgSZR7toQEERwP4wazvQ6eR7I8KE4nidQzdWL4/8sxxhwiNvn8x9FjCePDnzzHmeiQy9NnUlw4rmT8R0nYg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.5.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.5.2.tgz", + "integrity": "sha512-rBVG8rgzUws2CB972RSgtn3/gRArvp5VDbnTODANj2V17qV/gm/CmV2Ax0IWpgWDh1xWxpEs8s5l4oc0m8QN9A==", "license": "MIT", + "peer": true, "dependencies": { - "@algolia/requester-common": "4.24.0" + "@algolia/client-common": "5.5.2" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/transporter": { @@ -250,9 +367,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -298,12 +415,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -363,9 +480,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", - "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -373,7 +490,7 @@ "@babel/helper-optimise-call-expression": "^7.24.7", "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.0", + "@babel/traverse": "^7.25.4", "semver": "^6.3.1" }, "engines": { @@ -601,13 +718,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "license": "MIT", "dependencies": { "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" @@ -700,12 +817,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -869,12 +986,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -884,12 +1001,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1040,12 +1157,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1086,15 +1203,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", - "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-remap-async-to-generator": "^7.25.0", "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.4" }, "engines": { "node": ">=6.9.0" @@ -1151,13 +1268,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1184,16 +1301,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", - "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.0", + "@babel/traverse": "^7.25.4", "globals": "^11.1.0" }, "engines": { @@ -1637,13 +1754,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1797,15 +1914,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", - "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz", + "integrity": "sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -1968,13 +2085,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1984,12 +2101,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", - "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", + "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", + "@babel/compat-data": "^7.25.4", "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-validator-option": "^7.24.8", @@ -2018,13 +2135,13 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", + "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-dotall-regex": "^7.24.7", @@ -2052,7 +2169,7 @@ "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-property-literals": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", @@ -2065,10 +2182,10 @@ "@babel/plugin-transform-unicode-escapes": "^7.24.7", "@babel/plugin-transform-unicode-property-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.37.1", "semver": "^6.3.1" @@ -2149,9 +2266,9 @@ "license": "MIT" }, "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2161,9 +2278,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.0.tgz", - "integrity": "sha512-BOehWE7MgQ8W8Qn0CQnMtg2tHPHPulcS/5AVpFvs2KCK1ET+0WqZqPvnpRpFN81gYoFopdIEJX9Sgjw3ZBccPg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.6.tgz", + "integrity": "sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw==", "license": "MIT", "dependencies": { "core-js-pure": "^3.30.2", @@ -2188,16 +2305,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", + "@babel/types": "^7.25.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2206,9 +2323,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.24.8", @@ -3101,9 +3218,9 @@ "license": "ISC" }, "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", @@ -3115,9 +3232,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", "license": "MIT" }, "node_modules/@sideway/address": { @@ -3504,30 +3621,10 @@ "@types/ms": "*" } }, - "node_modules/@types/eslint": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", - "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -3603,9 +3700,9 @@ "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -3669,12 +3766,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.0.2.tgz", - "integrity": "sha512-yPL6DyFwY5PiMVEwymNeqUTKsDczQBJ/5T7W/46RwLU/VH+AA8aT5TZkvBviLKLbbm0hlfftEkGrNzfRk/fofQ==", + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "license": "MIT", "dependencies": { - "undici-types": "~6.11.1" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-forge": { @@ -3699,15 +3796,15 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -3717,9 +3814,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "version": "18.3.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz", + "integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -3813,9 +3910,9 @@ } }, "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, "node_modules/@types/ws": { @@ -3828,9 +3925,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -4071,9 +4168,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -4173,9 +4270,9 @@ } }, "node_modules/algoliasearch-helper": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.3.tgz", - "integrity": "sha512-2eoEz8mG4KHE+DzfrBTrCmDPxVXv7aZZWPojAJFtARpxxMO6lkos1dJ+XDCXdPvq7q3tpYWRi6xXmVQikejtpA==", + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.5.tgz", + "integrity": "sha512-lWvhdnc+aKOKx8jyA3bsdEgHzm/sglC4cYdMG4xSQyRiPLJVJtH/IVYZG3Hp6PkTEhQqhyVYkeP9z2IlcHJsWw==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -4184,6 +4281,45 @@ "algoliasearch": ">= 3.1 < 6" } }, + "node_modules/algoliasearch/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -4290,9 +4426,9 @@ } }, "node_modules/astring": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "license": "MIT", "bin": { "astring": "bin/astring" @@ -4308,9 +4444,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "funding": [ { "type": "opencollective", @@ -4327,11 +4463,11 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -4345,9 +4481,9 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", @@ -4394,13 +4530,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4462,9 +4598,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -4475,7 +4611,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -4503,6 +4639,18 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4706,9 +4854,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001646", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001646.tgz", - "integrity": "sha512-dRg00gudiBDDTmUhClSdv3hqRfpbOnU28IpI1T6PBTLWa+kOj0681C8uML3PifYfREuBrVjDGhL3adYpBT6spw==", + "version": "1.0.30001662", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", + "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", "funding": [ { "type": "opencollective", @@ -4801,21 +4949,25 @@ } }, "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=18.17" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" @@ -5289,9 +5441,9 @@ } }, "node_modules/core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -5300,12 +5452,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "license": "MIT", "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.23.3" }, "funding": { "type": "opencollective", @@ -5313,9 +5465,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", - "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", + "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -5683,12 +5835,12 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -6080,9 +6232,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", - "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", + "version": "1.5.25", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", + "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -6107,9 +6259,9 @@ } }, "node_modules/emoticon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", - "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", "license": "MIT", "funding": { "type": "github", @@ -6117,14 +6269,27 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -6187,9 +6352,9 @@ "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -6451,37 +6616,37 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -6520,9 +6685,9 @@ "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "license": "MIT" }, "node_modules/express/node_modules/range-parser": { @@ -6732,13 +6897,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -6806,9 +6971,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -7528,18 +7693,18 @@ } }, "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", "license": "MIT" }, "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "license": "MIT", "dependencies": { - "inline-style-parser": "0.2.3" + "inline-style-parser": "0.2.4" } }, "node_modules/hast-util-to-parse5": { @@ -7808,9 +7973,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -7822,8 +7987,8 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, "node_modules/http-cache-semantics": { @@ -7933,12 +8098,12 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -7957,9 +8122,9 @@ } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" @@ -8153,9 +8318,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -8600,9 +8765,9 @@ } }, "node_modules/launch-editor": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", - "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "license": "MIT", "dependencies": { "picocolors": "^1.0.0", @@ -8910,9 +9075,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -9045,9 +9210,9 @@ } }, "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -9063,9 +9228,9 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -9078,7 +9243,6 @@ "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, @@ -9201,10 +9365,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "license": "MIT" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -9356,9 +9523,9 @@ "license": "MIT" }, "node_modules/micromark-extension-directive": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.1.tgz", - "integrity": "sha512-VGV2uxUzhEZmaP7NSFo2vtq7M2nUD+WfmYQD+d8i/1nHbzE+rMy9uzTvUybBbNiVbrhOZibg3gbyoARGqgDWyg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -9906,9 +10073,9 @@ "license": "MIT" }, "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", + "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", "license": "MIT", "dependencies": { "@types/acorn": "^4.0.0", @@ -9918,6 +10085,7 @@ "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" @@ -10189,9 +10357,9 @@ "license": "MIT" }, "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", + "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", "funding": [ { "type": "GitHub Sponsors", @@ -10206,6 +10374,7 @@ "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -10214,6 +10383,26 @@ "vfile-message": "^4.0.0" } }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", @@ -10995,9 +11184,9 @@ "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -11062,9 +11251,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", @@ -11118,9 +11307,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/multicast-dns": { @@ -11531,9 +11720,9 @@ } }, "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, "node_modules/parse-json": { @@ -11585,6 +11774,18 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -11644,9 +11845,9 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "license": "MIT", "dependencies": { "isarray": "0.0.1" @@ -11673,9 +11874,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "license": "ISC" }, "node_modules/picomatch": { @@ -11779,9 +11980,9 @@ } }, "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -11799,8 +12000,8 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -12310,9 +12511,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -12406,9 +12607,9 @@ } }, "node_modules/prism-react-renderer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.0.tgz", + "integrity": "sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==", "license": "MIT", "dependencies": { "@types/prismjs": "^1.26.0", @@ -12517,12 +12718,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -12614,6 +12815,18 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -12825,9 +13038,9 @@ "license": "MIT" }, "node_modules/react-json-view-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz", - "integrity": "sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz", + "integrity": "sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==", "license": "MIT", "engines": { "node": ">=14" @@ -12978,9 +13191,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -13189,9 +13402,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -13438,9 +13651,9 @@ "license": "BSD-3-Clause" }, "node_modules/rtlcss": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.2.0.tgz", - "integrity": "sha512-AV+V3oOVvCrqyH5Q/6RuT1IDH1Xy5kJTkEWTWZPN5rdQ3HCFOd8SrbC7c6N5Y8bPpCfZSR6yYbUATXslvfvu5g==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "license": "MIT", "dependencies": { "escalade": "^3.1.1", @@ -13539,9 +13752,9 @@ } }, "node_modules/search-insights": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.15.0.tgz", - "integrity": "sha512-ch2sPCUDD4sbPQdknVl9ALSi9H7VyoeVbsxznYz6QV55jJ8CI3EtwpO1i84keN4+hF5IeHWIeGvc08530JkVXQ==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz", + "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==", "license": "MIT", "peer": true }, @@ -13605,9 +13818,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -13643,11 +13856,14 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/send/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==", - "license": "MIT" + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", @@ -13768,15 +13984,15 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -14000,9 +14216,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -14127,9 +14343,9 @@ } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "license": "MIT", "engines": { "node": ">=12" @@ -14322,9 +14538,9 @@ } }, "node_modules/terser": { - "version": "5.31.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", - "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", + "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -14541,9 +14757,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, "node_modules/type-fest": { @@ -14602,9 +14818,9 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "license": "Apache-2.0", "peer": true, "bin": { @@ -14615,16 +14831,25 @@ "node": ">=14.17" } }, + "node_modules/undici": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.11.1.tgz", - "integrity": "sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "license": "MIT", "engines": { "node": ">=4" @@ -14653,9 +14878,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "license": "MIT", "engines": { "node": ">=4" @@ -14743,20 +14968,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -15091,13 +15302,12 @@ } }, "node_modules/vfile": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", - "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, "funding": { @@ -15134,9 +15344,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -15166,12 +15376,11 @@ } }, "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", @@ -15180,7 +15389,7 @@ "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -15514,6 +15723,27 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -15568,9 +15798,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "license": "MIT", "engines": { "node": ">=12" diff --git a/package.json b/package.json index 3b8f702..106f81d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,6 @@ { "name": "devops", - "version": "2.3.0", - "private": true, + "version": "2.3.3", "scripts": { "docusaurus": "docusaurus", "start": "docusaurus start", diff --git a/static/img/devops-lifecycle.png b/static/img/devops-lifecycle.png index 44f92ad..70cc3ef 100644 Binary files a/static/img/devops-lifecycle.png and b/static/img/devops-lifecycle.png differ