diff --git a/.github/actions/build-mokapi-image/action.yml b/.github/actions/build-mokapi-image/action.yml
index 28d03ba56..6c8d4d066 100644
--- a/.github/actions/build-mokapi-image/action.yml
+++ b/.github/actions/build-mokapi-image/action.yml
@@ -14,6 +14,18 @@ inputs:
runs:
using: "composite"
steps:
+ - uses: actions/setup-go@v5
+ with:
+ go-version: 1.25.5
+ - name: Build CLI doc
+ run: go run ./cmd/internal/gen-cli-docs/main.go
+ shell: bash
+ - name: Add CLI Flags nav entry
+ run: |
+ jq '.Configuration.items.Static.items["CLI Flags"] = "configuration/static/mokapi.md"' ./config.json > ./tmp.json
+ mv ./tmp.json ./config.json
+ working-directory: ./docs
+ shell: bash
- name: Build docker alpha image
run: docker build --build-arg VERSION=${{ inputs.version }} -t ${{ inputs.image-name }} -t mokapi/mokapi:alpha -f ./images/alpha.Dockerfile .
shell: bash
diff --git a/.github/actions/publish-website/action.yml b/.github/actions/publish-website/action.yml
index 23670c658..569e9dbe7 100644
--- a/.github/actions/publish-website/action.yml
+++ b/.github/actions/publish-website/action.yml
@@ -29,6 +29,15 @@ runs:
repository: marle3003/mokapi
excludes: prerelease, draft
token: ${{ inputs.token }}
+ - name: Download image
+ id: download
+ uses: actions/download-artifact@v4
+ with:
+ name: ${{ env.image-artifact-name }}
+ path: /tmp
+ - name: Load image
+ run: docker load --input /tmp/mokapi.tar
+ shell: bash
- name: Run mokapi image
run: docker run --name mokapi --rm -d -p 80:80 -p 8080:8080 -p 9092:9092 -p 8389:8389 -p 8025:8025 --mount type=bind,source=$(pwd)/webui/scripts/dashboard-demo/demo-configs,target=/data --env MOKAPI_Providers_File_Directory=/data ${{ inputs.image-name }}
shell: bash
@@ -42,11 +51,25 @@ runs:
if: always()
run: docker stop mokapi || true
shell: bash
- - name: build website
+ - name: build webui
working-directory: ./webui
run: |
npm install
npm version ${{ steps.release.outputs.release }}
+ npm run build
+ shell: bash
+ - name: Build CLI doc
+ run: go run ./cmd/internal/gen-cli-docs/main.go
+ shell: bash
+ - name: Add CLI Flags nav entry
+ run: |
+ jq '.Configuration.items.Static.items["CLI Flags"] = "configuration/static/mokapi.md"' ./config.json > ./tmp.json
+ mv ./tmp.json ./config.json
+ working-directory: ./docs
+ shell: bash
+ - name: build website
+ working-directory: ./webui
+ run: |
npm run copy-docs
npm run build-sitemap
npm run build-website
@@ -55,6 +78,16 @@ runs:
working-directory: ./webui
run: npx playwright install --with-deps
shell: bash
+ - name: test website
+ working-directory: ./webui
+ run: npx playwright test --project=website
+ shell: bash
+ - name: Upload test results
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: website-test-report
+ path: webui/playwright-report
- name: prerender
working-directory: ./webui/ssg
run: node index.js
diff --git a/acceptance/ldap_test.go b/acceptance/ldap_test.go
index 20a6b0d83..64d0e5ea3 100644
--- a/acceptance/ldap_test.go
+++ b/acceptance/ldap_test.go
@@ -2,13 +2,14 @@ package acceptance
import (
"fmt"
- "github.com/stretchr/testify/require"
"mokapi/config/static"
"mokapi/ldap"
"mokapi/runtime/metrics"
"mokapi/try"
"net/http"
"time"
+
+ "github.com/stretchr/testify/require"
)
type LdapSuite struct {
@@ -18,8 +19,7 @@ type LdapSuite struct {
func (suite *LdapSuite) SetupSuite() {
cfg := static.NewConfig()
- port := try.GetFreePort()
- cfg.Api.Port = fmt.Sprintf("%v", port)
+ cfg.Api.Port = try.GetFreePort()
cfg.Providers.File.Directories = []string{"./ldap"}
suite.initCmd(cfg)
// ensure scripts are executed
diff --git a/acceptance/mail_test.go b/acceptance/mail_test.go
index dd17a54a4..f53723e27 100644
--- a/acceptance/mail_test.go
+++ b/acceptance/mail_test.go
@@ -23,8 +23,7 @@ type MailSuite struct{ BaseSuite }
func (suite *MailSuite) SetupSuite() {
cfg := static.NewConfig()
- port := try.GetFreePort()
- cfg.Api.Port = fmt.Sprintf("%v", port)
+ cfg.Api.Port = try.GetFreePort()
wd, err := os.Getwd()
require.NoError(suite.T(), err)
cfg.ConfigFile = path.Join(wd, "mokapi.yaml")
diff --git a/acceptance/petstore_test.go b/acceptance/petstore_test.go
index 253a11058..241bc14ed 100644
--- a/acceptance/petstore_test.go
+++ b/acceptance/petstore_test.go
@@ -23,8 +23,7 @@ type PetStoreSuite struct{ BaseSuite }
func (suite *PetStoreSuite) SetupSuite() {
cfg := static.NewConfig()
- port := try.GetFreePort()
- cfg.Api.Port = fmt.Sprintf("%v", port)
+ cfg.Api.Port = try.GetFreePort()
cfg.Providers.File.Directories = []string{"./petstore"}
cfg.Api.Search.Enabled = true
suite.initCmd(cfg)
@@ -172,7 +171,7 @@ func (suite *PetStoreSuite) TestJsHttpHandler() {
try.BodyContains(`"name":"Zoe"`))
// test http metrics
- try.GetRequest(suite.T(), fmt.Sprintf("http://127.0.0.1:%s/api/metrics/http?path=/pet/{petId}", suite.cfg.Api.Port), nil,
+ try.GetRequest(suite.T(), fmt.Sprintf("http://127.0.0.1:%d/api/metrics/http?path=/pet/{petId}", suite.cfg.Api.Port), nil,
try.BodyContains(`http_requests_total{service=\"Swagger Petstore\",endpoint=\"/pet/{petId}\"}","value":4}`),
)
}
@@ -307,12 +306,12 @@ func (suite *PetStoreSuite) TestKafkaEventAndMetrics() {
time.Sleep(3 * time.Second)
// test kafka metrics
- try.GetRequest(suite.T(), fmt.Sprintf("http://127.0.0.1:%s/api/metrics/kafka", suite.cfg.Api.Port), nil,
+ try.GetRequest(suite.T(), fmt.Sprintf("http://127.0.0.1:%d/api/metrics/kafka", suite.cfg.Api.Port), nil,
try.BodyContains(`kafka_messages_total{service=\"A sample AsyncApi Kafka streaming api\",topic=\"petstore.order-event\"}","value":1}`),
)
// test kafka events, header added by JavaScript event handler
- try.GetRequest(suite.T(), fmt.Sprintf("http://127.0.0.1:%s/api/events?namespace=kafka", suite.cfg.Api.Port), nil,
+ try.GetRequest(suite.T(), fmt.Sprintf("http://127.0.0.1:%d/api/events?namespace=kafka", suite.cfg.Api.Port), nil,
try.BodyContains(`"headers":{"foo":{"value":"bar","binary":"YmFy"}`),
try.BodyContains(`"messageId":"order"`),
)
diff --git a/api/handler_test.go b/api/handler_test.go
index f864e18da..918ba383c 100644
--- a/api/handler_test.go
+++ b/api/handler_test.go
@@ -1,7 +1,6 @@
package api_test
import (
- "github.com/stretchr/testify/require"
"mokapi/api"
"mokapi/config/static"
"mokapi/providers/openapi"
@@ -11,6 +10,8 @@ import (
"net/http"
"net/http/httptest"
"testing"
+
+ "github.com/stretchr/testify/require"
)
func TestHandler_ServeHTTP(t *testing.T) {
@@ -57,7 +58,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
h,
try.HasStatusCode(200),
try.HasHeader("Content-Type", "application/json"),
- try.HasBody(`{"version":"","buildTime":"","search":{"enabled":false}}`))
+ try.HasBody(`{"version":"0.0.0","buildTime":"","search":{"enabled":false}}`))
},
},
{
@@ -120,7 +121,7 @@ func TestHandler_Api_Info(t *testing.T) {
h,
try.HasStatusCode(200),
try.HasHeader("Content-Type", "application/json"),
- try.HasBody(`{"version":"","buildTime":"","activeServices":["http"],"search":{"enabled":false}}`))
+ try.HasBody(`{"version":"0.0.0","buildTime":"","activeServices":["http"],"search":{"enabled":false}}`))
},
},
{
@@ -135,7 +136,7 @@ func TestHandler_Api_Info(t *testing.T) {
h,
try.HasStatusCode(200),
try.HasHeader("Content-Type", "application/json"),
- try.HasBody(`{"version":"","buildTime":"","activeServices":["kafka"],"search":{"enabled":false}}`))
+ try.HasBody(`{"version":"0.0.0","buildTime":"","activeServices":["kafka"],"search":{"enabled":false}}`))
},
},
{
@@ -150,7 +151,7 @@ func TestHandler_Api_Info(t *testing.T) {
h,
try.HasStatusCode(200),
try.HasHeader("Content-Type", "application/json"),
- try.HasBody(`{"version":"","buildTime":"","activeServices":["mail"],"search":{"enabled":false}}`))
+ try.HasBody(`{"version":"0.0.0","buildTime":"","activeServices":["mail"],"search":{"enabled":false}}`))
},
},
{
@@ -165,7 +166,7 @@ func TestHandler_Api_Info(t *testing.T) {
h,
try.HasStatusCode(200),
try.HasHeader("Content-Type", "application/json"),
- try.HasBody(`{"version":"","buildTime":"","activeServices":["ldap"],"search":{"enabled":false}}`))
+ try.HasBody(`{"version":"0.0.0","buildTime":"","activeServices":["ldap"],"search":{"enabled":false}}`))
},
},
}
@@ -204,5 +205,5 @@ func TestHandler_SearchEnabled(t *testing.T) {
h,
try.HasStatusCode(200),
try.HasHeader("Content-Type", "application/json"),
- try.HasBody(`{"version":"","buildTime":"","search":{"enabled":true}}`))
+ try.HasBody(`{"version":"0.0.0","buildTime":"","search":{"enabled":true}}`))
}
diff --git a/cmd/internal/gen-cli-docs/main.go b/cmd/internal/gen-cli-docs/main.go
new file mode 100644
index 000000000..de2bc2246
--- /dev/null
+++ b/cmd/internal/gen-cli-docs/main.go
@@ -0,0 +1,13 @@
+package main
+
+import (
+ "mokapi/pkg/cmd/mokapi"
+ "os"
+)
+
+func main() {
+ err := mokapi.NewGenCliDocCmd().Execute()
+ if err != nil {
+ _, _ = os.Stderr.Write([]byte(err.Error()))
+ }
+}
diff --git a/cmd/mokapi/help.go b/cmd/mokapi/help.go
deleted file mode 100644
index 39204e57d..000000000
--- a/cmd/mokapi/help.go
+++ /dev/null
@@ -1,85 +0,0 @@
-package main
-
-import (
- "fmt"
- log "github.com/sirupsen/logrus"
- "gopkg.in/yaml.v3"
- "mokapi/config/decoders"
- "mokapi/config/static"
- "reflect"
- "strings"
-)
-
-func printHelp() {
- fmt.Print("\nMokapi is an easy, modern and flexible API mocking tool using Go and Javascript.\n")
- fmt.Print("\nUsage:\n mokapi [flags]\n")
- fmt.Print("\nFlags:")
- fmt.Print("\n --log-level (string)\n\tLog level (default: info)")
- fmt.Print("\n --log-format string\n\tLog format (default: text)")
- fmt.Print("\n")
-
- fmt.Print("\n --api-port (integer)\n\tApi port (default: 8080)")
- fmt.Print("\n --api-dashboard | --api-no-dashboard (boolean)\n\tActivate dashboard (default: true)")
- fmt.Print("\n --api-path (string)\n\tThe path prefix where dashboard is served (default: empty)")
- fmt.Print("\n --api-base (string)\n\tThe base path of the dashboard useful in case of url rewriting (default: empty)")
- fmt.Print("\n")
-
- fmt.Print("\n --providers-file-filename (string)\n\tLoad configuration from this URL")
- fmt.Print("\n --providers-file-directory (string)\n\tLoad one or more dynamic configuration from a directory")
- fmt.Print("\n --providers-file-skip-prefix (list)\n\tOne or more prefixes that indicate whether a file or directory should be skipped.")
- fmt.Print("\n\n\t(string)\n\t The prefix of the files to skip")
- fmt.Print("\n --providers-file-include (list)\n\tOne or more patterns that a file must match, except when empty")
- fmt.Print("\n\n\t(string)\n\t The pattern that a file must match")
- fmt.Print("\n")
-
- fmt.Print("\n --providers-http-url (string)\n\tLoad the dynamic configuration from file")
- fmt.Print("\n --providers-http-poll-interval (string)\n\tLPolling interval for URL (default: 3m)")
- fmt.Print("\n --providers-http-poll-timeout (string)\n\tPolling timeout for URL (default is 5s)")
- fmt.Print("\n --providers-http-proxy (string)\n\tSpecifies a proxy server for the request")
- fmt.Print("\n --providers-http-tls-skip-verify (boolean)\n\tSpecifies a proxy server for the request")
- fmt.Print("\n --providers-http-ca (string)\n\tPath to the certificate authority used for secure connection (default: system certification pool)")
- fmt.Print("\n")
-
- fmt.Print("\n --providers-git-url (string)\n\tLoad one or more dynamic configuration from a GIT repository")
- fmt.Print("\n --providers-git-pull-interval (string)\n\tPulling interval for URL (default: 3m)")
- fmt.Print("\n --providers-git-temp-dir (string)\n\tSpecifies the folder to checkout all GIT repositories")
- fmt.Print("\n")
-
- fmt.Print("\n --providers-npm-package (string)\n\tLoad one or more dynamic configuration from a GIT repository")
- fmt.Print("\n")
-
- fmt.Print("\n --generate-cli-skeleton [string]\n\tGenerates the skeleton configuration file")
-
- fmt.Print("\n\nGet help with Mokapi CLI: https://mokapi.io/docs/configuration/static/cli")
-}
-
-func writeSkeleton(cfg *static.Config) {
- var skeleton interface{}
- if s, ok := cfg.GenerateSkeleton.(string); ok {
- paths := decoders.ParsePath(s)
- current := reflect.ValueOf(static.NewConfig())
- for _, path := range paths {
- if current.Kind() == reflect.Pointer {
- current = current.Elem()
- }
- field := current.FieldByNameFunc(func(f string) bool {
- return strings.ToLower(f) == path
- })
- if !field.IsValid() {
- log.Errorf("unable to find config element: %v", cfg.GenerateSkeleton.(string))
- return
- }
- current = field
- }
- skeleton = current.Interface()
- } else {
- skeleton = static.NewConfig()
- }
-
- b, err := yaml.Marshal(skeleton)
- if err != nil {
- log.Errorf("unable to write skeleton: %v", err)
- return
- }
- fmt.Print(string(b))
-}
diff --git a/cmd/mokapi/main.go b/cmd/mokapi/main.go
index a36c586c2..587d1d99d 100644
--- a/cmd/mokapi/main.go
+++ b/cmd/mokapi/main.go
@@ -2,172 +2,14 @@ package main
import (
"context"
- "fmt"
- stdlog "log"
- "mokapi/api"
- "mokapi/config/decoders"
- "mokapi/config/dynamic"
- "mokapi/config/dynamic/asyncApi"
- "mokapi/config/dynamic/mail"
- "mokapi/config/static"
- "mokapi/engine"
- "mokapi/feature"
- "mokapi/providers/asyncapi3"
- "mokapi/providers/directory"
- mail2 "mokapi/providers/mail"
- "mokapi/providers/openapi"
- "mokapi/providers/swagger"
- "mokapi/runtime"
- "mokapi/safe"
- "mokapi/schema/json/generator"
- "mokapi/server"
- "mokapi/server/cert"
- "mokapi/version"
+ "mokapi/pkg/cmd/mokapi"
"os"
- "os/signal"
- "strings"
- "syscall"
-
- log "github.com/sirupsen/logrus"
)
-const logo = "888b d888 888 d8888 d8b \n8888b d8888 888 d88888 Y8P \n88888b.d88888 888 d88P888 \n888Y88888P888 .d88b. 888 888 d88P 888 88888b. 888 \n888 Y888P 888 d88\"\"88b 888 .88P d88P 888 888 \"88b 888 \n888 Y8P 888 888 888 888888K d88P 888 888 888 888 \n888 \" 888 Y88..88P 888 \"88b d8888888888 888 d88P 888 \n888 888 \"Y88P\" 888 888 d88P 888 88888P\" 888 \n v%s by Marcel Lehmann%s 888 \n https://mokapi.io 888 \n 888 \n"
-
func main() {
- versionString := version.BuildVersion
-
- cfg := static.NewConfig()
- configDecoders := []decoders.ConfigDecoder{decoders.NewDefaultFileDecoder(), decoders.NewFlagDecoder()}
- err := decoders.Load(configDecoders, cfg)
- if err != nil {
- log.Errorf("load config failed: %v", err)
- return
- }
- err = cfg.Parse()
- if err != nil {
- log.Errorf("parse config failed: %v", err)
- return
- }
-
- switch {
- case cfg.Help:
- printHelp()
- return
- case cfg.GenerateSkeleton != nil:
- writeSkeleton(cfg)
- return
- case cfg.Version:
- fmt.Println(versionString)
- return
- }
-
- feature.Enable(cfg.Features)
- generator.SetConfig(cfg.DataGen)
-
- fmt.Printf(logo, version.BuildVersion, strings.Repeat(" ", 17-len(versionString)))
-
- configureLogging(cfg)
- registerDynamicTypes()
-
- s, err := createServer(cfg)
+ cmd := mokapi.NewCmdMokapi()
+ err := cmd.ExecuteWithContext(context.Background())
if err != nil {
- log.WithField("error", err).Error("error creating server")
+ _, _ = os.Stderr.Write([]byte(err.Error()))
}
-
- exitChannel := make(chan os.Signal, 1)
- signal.Notify(exitChannel, os.Interrupt)
- signal.Notify(exitChannel, syscall.SIGTERM)
- signal.Notify(exitChannel, syscall.SIGKILL)
- go func() {
- <-exitChannel
- fmt.Println("Shutting down")
- s.Close()
- os.Exit(0)
- }()
-
- err = s.Start()
- if err != nil {
- log.Error(err)
- }
-}
-
-func createServer(cfg *static.Config) (*server.Server, error) {
- pool := safe.NewPool(context.Background())
- app := runtime.New(cfg)
-
- watcher := server.NewConfigWatcher(cfg)
- scriptEngine := engine.New(watcher, app, cfg, true)
- certStore, err := cert.NewStore(cfg)
- if err != nil {
- return nil, err
- }
- http := server.NewHttpManager(scriptEngine, certStore, app)
- kafka := server.NewKafkaManager(scriptEngine, app)
- mqtt := server.NewMqttManager(scriptEngine, app)
- mailManager := server.NewMailManager(app, scriptEngine, certStore)
- ldap := server.NewLdapDirectoryManager(scriptEngine, certStore, app)
-
- watcher.AddListener(func(e dynamic.ConfigEvent) {
- kafka.UpdateConfig(e)
- mqtt.UpdateConfig(e)
- http.Update(e)
- mailManager.UpdateConfig(e)
- ldap.UpdateConfig(e)
- if err := scriptEngine.AddScript(e); err != nil {
- log.Error(err)
- }
- app.UpdateConfig(e)
- })
-
- if u, err := api.BuildUrl(cfg.Api); err == nil {
- err = http.AddInternalService("api", u, api.New(app, cfg.Api))
- if err != nil {
- return nil, err
- }
- } else {
- return nil, err
- }
-
- return server.NewServer(pool, app, watcher, kafka, http, mailManager, ldap, scriptEngine), nil
-}
-
-func configureLogging(cfg *static.Config) {
- stdlog.SetFlags(stdlog.Lshortfile | stdlog.LstdFlags)
-
- level, err := log.ParseLevel(cfg.Log.Level)
- if err != nil {
- log.WithField("logLevel", cfg.Log.Level).Errorf("error parsing log level: %v", err.Error())
- }
- log.SetLevel(level)
-
- if strings.ToLower(cfg.Log.Format) == "json" {
- log.SetFormatter(&log.JSONFormatter{})
- } else {
- formatter := &log.TextFormatter{DisableColors: false, FullTimestamp: true, DisableSorting: true}
- log.SetFormatter(formatter)
- }
-}
-
-func registerDynamicTypes() {
- dynamic.Register("openapi", func(v version.Version) bool {
- return true
- }, &openapi.Config{})
- dynamic.Register("asyncapi", func(v version.Version) bool {
- return v.Major == 2
- }, &asyncApi.Config{})
- dynamic.Register("asyncapi", func(v version.Version) bool {
- return v.Major == 3
- }, &asyncapi3.Config{})
- dynamic.Register("swagger", func(v version.Version) bool {
- return true
- }, &swagger.Config{})
- dynamic.Register("ldap", func(v version.Version) bool {
- return true
- }, &directory.Config{})
- dynamic.Register("smtp", func(v version.Version) bool {
- return true
- }, &mail.Config{})
- dynamic.Register("mail", func(v version.Version) bool {
- return true
- }, &mail2.Config{})
}
diff --git a/cmd/mokapi/main_test.go b/cmd/mokapi/main_test.go
index 459a30cdb..08e8384b0 100644
--- a/cmd/mokapi/main_test.go
+++ b/cmd/mokapi/main_test.go
@@ -2,11 +2,12 @@ package main
import (
"bytes"
- "github.com/stretchr/testify/require"
"io"
"mokapi/version"
"os"
"testing"
+
+ "github.com/stretchr/testify/require"
)
func TestMain_Skeleton(t *testing.T) {
@@ -53,12 +54,12 @@ providers:
globalFolders: []
packages: []
api:
- port: "8080"
+ port: 8080
path: ""
base: ""
dashboard: true
search:
- enabled: false
+ enabled: true
rootCaCert: ""
rootCaKey: ""
configs: []
diff --git a/config/decoders/decoder_flag.go b/config/decoders/decoder_flag.go
index ce00bd97c..1902d52ab 100644
--- a/config/decoders/decoder_flag.go
+++ b/config/decoders/decoder_flag.go
@@ -82,6 +82,13 @@ func (f *FlagDecoder) setValue(ctx *context) error {
}
ctx.element.SetInt(i)
return nil
+ case reflect.Int:
+ i, err := strconv.Atoi(ctx.value[0])
+ if err != nil {
+ return fmt.Errorf("parse int64 failed: %v", err)
+ }
+ ctx.element.SetInt(int64(i))
+ return nil
case reflect.Bool:
b := false
if ctx.value[0] == "" {
diff --git a/config/static/static_config.go b/config/static/static_config.go
index d62a890af..38976a4ef 100644
--- a/config/static/static_config.go
+++ b/config/static/static_config.go
@@ -14,7 +14,7 @@ import (
type Config struct {
Log MokApiLog `json:"log" yaml:"log"`
- ConfigFile string `json:"-" yaml:"-" flag:"-"`
+ ConfigFile string `json:"-" yaml:"-" flag:"config-file"`
Providers Providers `json:"providers" yaml:"providers"`
Api Api `json:"api" yaml:"api"`
RootCaCert tls.FileOrContent `json:"rootCaCert" yaml:"rootCaCert" name:"root-ca-cert"`
@@ -34,9 +34,9 @@ func NewConfig() *Config {
cfg := &Config{}
cfg.Log = MokApiLog{Level: "info", Format: "text"}
- cfg.Api.Port = "8080"
+ cfg.Api.Port = 8080
cfg.Api.Dashboard = true
- cfg.Api.Search.Enabled = false
+ cfg.Api.Search.Enabled = true
cfg.Providers.File.SkipPrefix = []string{"_"}
cfg.Event.Store = map[string]Store{"default": {Size: 100}}
@@ -57,7 +57,7 @@ type Providers struct {
}
type Api struct {
- Port string
+ Port int
Path string
Base string
Dashboard bool
@@ -69,8 +69,8 @@ type Search struct {
}
type FileProvider struct {
- Filenames []string `explode:"filename"`
- Directories []string `explode:"directory"`
+ Filenames []string `aliases:"filename" explode:"filename"`
+ Directories []string `aliases:"directory" explode:"directory"`
SkipPrefix []string `yaml:"skipPrefix" json:"skipPrefix" flag:"skip-prefix"`
Include []string
}
diff --git a/config/static/static_config_test.go b/config/static/static_config_test.go
index 2a1670574..a7cbf76e1 100644
--- a/config/static/static_config_test.go
+++ b/config/static/static_config_test.go
@@ -2,13 +2,14 @@ package static_test
import (
"encoding/json"
- "github.com/sirupsen/logrus/hooks/test"
- "github.com/stretchr/testify/require"
"mokapi/config/decoders"
"mokapi/config/dynamic/provider/file/filetest"
"mokapi/config/static"
"os"
"testing"
+
+ "github.com/sirupsen/logrus/hooks/test"
+ "github.com/stretchr/testify/require"
)
func TestStaticConfig(t *testing.T) {
@@ -179,6 +180,21 @@ func TestStaticConfig(t *testing.T) {
require.Equal(t, "3m", cfg.Providers.Git.Repositories[0].PullInterval)
},
},
+ {
+ name: "api port as env var",
+ test: func(t *testing.T) {
+ os.Args = append(os.Args, "mokapi.exe")
+ err := os.Setenv("MOKAPI_API_PORT", "1234")
+ require.NoError(t, err)
+ defer os.Unsetenv("MOKAPI_API_PORT")
+
+ cfg := static.Config{}
+ err = decoders.Load([]decoders.ConfigDecoder{&decoders.FlagDecoder{}}, &cfg)
+ require.NoError(t, err)
+
+ require.Equal(t, 1234, cfg.Api.Port)
+ },
+ },
{
name: "file provider include",
test: func(t *testing.T) {
diff --git a/docs/config.json b/docs/config.json
index adc66f4d9..9f8589d3a 100644
--- a/docs/config.json
+++ b/docs/config.json
@@ -48,7 +48,7 @@
"Static": {
"expanded": true,
"items": {
- "CLI": "configuration/static/cli.md"
+ "CLI Usage": "configuration/static/cli.md"
}
},
"Dynamic": {
diff --git a/docs/configuration/static/cli.md b/docs/configuration/static/cli.md
index b956fb30d..dbe75d1f6 100644
--- a/docs/configuration/static/cli.md
+++ b/docs/configuration/static/cli.md
@@ -4,7 +4,7 @@ description: This page provides information on how to configure Mokapi using CLI
---
# Use Mokapi CLI
-This page provides information on how to configure Mokapi using CLI parameters. A list of available parameters can be found [here](/docs/configuration/reference.md)
+This page provides information on how to configure Mokapi using CLI parameters. A list of available parameters can be found [here](/docs/configuration/static/cli-flags)
## Command structure
@@ -121,13 +121,13 @@ Therefore, Mokapi supports a shorthand syntax that allows a simpler representati
The shorthand syntax for flat (non-nested) structures makes it easier for you to define your inputs.
```bash
---parameter key1=value1,key2,value2,key3=value3
+--parameter key1=value1,key2=value2,key3=value3
```
This is equivalent to the following JSON example.
```bash
---parameter '{"key1":"value1","key2","value2","key3"="value3"}'
+--parameter '{"key1":"value1","key2"="value2","key3"="value3"}'
```
``` box=warning title=PowerShell
diff --git a/docs/guides/get-started/dashboard.md b/docs/guides/get-started/dashboard.md
index 34897863b..574c80ac1 100644
--- a/docs/guides/get-started/dashboard.md
+++ b/docs/guides/get-started/dashboard.md
@@ -12,7 +12,7 @@ and ensuring the mock APIs works seamlessly under various scenarios.
The dashboard is available on port 8080 by default. Open `http://localhost:8080` from your browser.
-
+
## Working with Dashboard
diff --git a/engine/kafka_test.go b/engine/kafka_test.go
index 1d82f1e22..198d1f70b 100644
--- a/engine/kafka_test.go
+++ b/engine/kafka_test.go
@@ -529,7 +529,7 @@ func TestKafkaClient(t *testing.T) {
hook := test.NewGlobal()
go func() {
- time.Sleep(time.Second * 1)
+ time.Sleep(time.Second * 3)
msg := asyncapi3test.NewMessage(
asyncapi3test.WithPayload(schematest.New("string")),
diff --git a/go.mod b/go.mod
index 1d304c69c..5dd15dfd5 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.25.5
require (
github.com/Masterminds/sprig v2.22.0+incompatible
github.com/blevesearch/bleve/v2 v2.5.7
- github.com/blevesearch/bleve_index_api v1.2.11
+ github.com/blevesearch/bleve_index_api v1.3.0
github.com/bradleyfalzon/ghinstallation/v2 v2.17.0
github.com/brianvoe/gofakeit/v6 v6.28.0
github.com/dop251/goja v0.0.0-20250309171923-bcd7cc6bf64c
@@ -16,11 +16,11 @@ require (
github.com/google/uuid v1.6.0
github.com/jinzhu/inflection v1.0.0
github.com/pkg/errors v0.9.1
- github.com/sirupsen/logrus v1.9.3
+ github.com/sirupsen/logrus v1.9.4
github.com/stretchr/testify v1.11.1
github.com/yuin/gopher-lua v1.1.1
- golang.org/x/net v0.48.0
- golang.org/x/text v0.32.0
+ golang.org/x/net v0.49.0
+ golang.org/x/text v0.33.0
gopkg.in/go-asn1-ber/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d
gopkg.in/yaml.v3 v3.0.1
layeh.com/gopher-luar v1.0.11
@@ -80,8 +80,8 @@ require (
github.com/xanzy/ssh-agent v0.3.3 // indirect
go.etcd.io/bbolt v1.4.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
- golang.org/x/crypto v0.46.0 // indirect
- golang.org/x/sys v0.39.0 // indirect
+ golang.org/x/crypto v0.47.0 // indirect
+ golang.org/x/sys v0.40.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)
diff --git a/go.sum b/go.sum
index e9f71cbbc..53c7de3ab 100644
--- a/go.sum
+++ b/go.sum
@@ -24,8 +24,8 @@ github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCk
github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/blevesearch/bleve/v2 v2.5.7 h1:2d9YrL5zrX5EBBW++GOaEKjE+NPWeZGaX77IM26m1Z8=
github.com/blevesearch/bleve/v2 v2.5.7/go.mod h1:yj0NlS7ocGC4VOSAedqDDMktdh2935v2CSWOCDMHdSA=
-github.com/blevesearch/bleve_index_api v1.2.11 h1:bXQ54kVuwP8hdrXUSOnvTQfgK0KI1+f9A0ITJT8tX1s=
-github.com/blevesearch/bleve_index_api v1.2.11/go.mod h1:rKQDl4u51uwafZxFrPD1R7xFOwKnzZW7s/LSeK4lgo0=
+github.com/blevesearch/bleve_index_api v1.3.0 h1:DsMpWVjFNlBw9/6pyWf59XoqcAkhHj3H0UWiQsavb6E=
+github.com/blevesearch/bleve_index_api v1.3.0/go.mod h1:xvd48t5XMeeioWQ5/jZvgLrV98flT2rdvEJ3l/ki4Ko=
github.com/blevesearch/geo v0.2.4 h1:ECIGQhw+QALCZaDcogRTNSJYQXRtC8/m8IKiA706cqk=
github.com/blevesearch/geo v0.2.4/go.mod h1:K56Q33AzXt2YExVHGObtmRSFYZKYGv0JEN5mdacJJR8=
github.com/blevesearch/go-faiss v1.0.26 h1:4dRLolFgjPyjkaXwff4NfbZFdE/dfywbzDqporeQvXI=
@@ -164,8 +164,8 @@ github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
-github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
+github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8=
github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -190,13 +190,13 @@ go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
-golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
+golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
+golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
-golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
+golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
+golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -207,14 +207,14 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
-golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
+golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q=
-golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
+golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY=
+golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
-golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
+golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
+golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
diff --git a/pkg/cli/bind.go b/pkg/cli/bind.go
index 505dfffbd..98e8fc802 100644
--- a/pkg/cli/bind.go
+++ b/pkg/cli/bind.go
@@ -8,48 +8,50 @@ import (
"net/url"
"reflect"
"slices"
- "sort"
"strconv"
"strings"
)
type flagConfigBinder struct{}
-type context struct {
+type bindContext struct {
path string
paths []string
element reflect.Value
- value []string
+ value any
}
-func (f *flagConfigBinder) Decode(flags map[string][]string, element interface{}) error {
- keys := make([]string, 0, len(flags))
- for k := range flags {
- keys = append(keys, k)
- }
- sort.Strings(keys)
-
- for _, name := range keys {
- paths := ParsePath(name)
- ctx := &context{path: name, paths: paths, value: flags[name], element: reflect.ValueOf(element)}
+func (f *flagConfigBinder) Decode(flags *FlagSet, element interface{}) error {
+ return flags.Visit(func(flag *Flag) error {
+ paths := ParsePath(flag.Name)
+ v := flag.Value.Value()
+ ctx := &bindContext{path: flag.Name, paths: paths, value: v, element: reflect.ValueOf(element)}
err := f.setValue(ctx)
if err != nil {
- return fmt.Errorf("configuration error '%v' value '%v': %w", name, flags[name], err)
+ return fmt.Errorf("configuration error '%v' value '%v': %w", flag.Name, v, err)
}
- }
-
- return nil
+ return nil
+ })
}
-func (f *flagConfigBinder) setValue(ctx *context) error {
+func (f *flagConfigBinder) setValue(ctx *bindContext) error {
switch ctx.element.Kind() {
case reflect.Struct:
if len(ctx.paths) == 0 {
- return f.convert(ctx.value[0], ctx.element)
+ return f.convert(ctx.value, ctx.element)
}
err := ctx.setFieldFromStruct()
if err != nil {
- return f.explode(ctx.element, ctx.paths[0], ctx.value)
+ if len(ctx.paths) == 1 {
+ if arr, ok := ctx.value.([]string); ok {
+ return f.explode(ctx.element, ctx.paths[0], arr)
+ }
+ if s, ok := ctx.value.(string); ok {
+ return f.explode(ctx.element, ctx.paths[0], []string{s})
+ }
+ }
+ // skip: field not found
+ return nil
}
return f.setValue(ctx)
case reflect.Pointer:
@@ -58,42 +60,74 @@ func (f *flagConfigBinder) setValue(ctx *context) error {
}
ctx.element = ctx.element.Elem()
return f.setValue(ctx)
+ case reflect.Slice:
+ return f.setArray(ctx)
+ case reflect.Map:
+ return f.setMap(ctx)
+ case reflect.Bool:
+ switch v := ctx.value.(type) {
+ case bool:
+ ctx.element.SetBool(v)
+ return nil
+ case string:
+ b, err := strconv.ParseBool(v)
+ if err != nil {
+ return fmt.Errorf("value %v cannot be parsed as bool: %w", ctx.value, err)
+ }
+ ctx.element.SetBool(b)
+ return nil
+ }
+ return fmt.Errorf("value %v cannot be parsed as bool", ctx.value)
case reflect.String:
- if len(ctx.value) > 1 {
- return fmt.Errorf("expected a single string, but received multiple values")
+ if s, ok := ctx.value.(string); ok {
+ return f.convert(s, ctx.element)
}
- s := strings.Trim(ctx.value[0], "\"")
- ctx.element.SetString(s)
- return nil
+ return fmt.Errorf("expected string but got '%v'", ctx.value)
+ case reflect.Int:
+ if i, ok := ctx.value.(int); ok {
+ ctx.element.SetInt(int64(i))
+ return nil
+ }
+ return fmt.Errorf("expected integer but got '%v'", ctx.value)
case reflect.Int64:
- i, err := strconv.ParseInt(ctx.value[0], 10, 64)
- if err != nil {
- return fmt.Errorf("parse int64 failed: %v", err)
+ if i, ok := ctx.value.(int); ok {
+ ctx.element.SetInt(int64(i))
+ return nil
}
- ctx.element.SetInt(i)
- return nil
- case reflect.Bool:
- b := false
- if ctx.value[0] == "" {
- b = true
- } else {
- var err error
- b, err = strconv.ParseBool(ctx.value[0])
+ if s, ok := ctx.value.(string); ok {
+ i, err := strconv.ParseInt(s, 10, 64)
if err != nil {
- return fmt.Errorf("value %v cannot be parsed as bool: %v", ctx.value[0], err.Error())
+ return fmt.Errorf("parse int64 failed: %v", err)
}
+ ctx.element.SetInt(i)
+ return nil
}
- ctx.element.SetBool(b)
- return nil
- case reflect.Slice:
- return f.setArray(ctx)
- case reflect.Map:
- return f.setMap(ctx)
+ return fmt.Errorf("value %v cannot be parsed as integer", ctx.value)
+ case reflect.Float32:
+ if i, ok := ctx.value.(float32); ok {
+ ctx.element.SetFloat(float64(i))
+ return nil
+ }
+ if i, ok := ctx.value.(float64); ok {
+ ctx.element.SetFloat(i)
+ return nil
+ }
+ return fmt.Errorf("expected floating number but got '%v'", ctx.value)
+ case reflect.Float64:
+ if i, ok := ctx.value.(float32); ok {
+ ctx.element.SetFloat(float64(i))
+ return nil
+ }
+ if i, ok := ctx.value.(float64); ok {
+ ctx.element.SetFloat(i)
+ return nil
+ }
+ return fmt.Errorf("expected floating number but got '%v'", ctx.value)
case reflect.Interface:
- if len(ctx.value) == 0 || ctx.value[0] == "" {
+ if ctx.value == "" {
ctx.element.Set(reflect.ValueOf(true))
} else {
- ctx.element.Set(reflect.ValueOf(ctx.value[0]))
+ ctx.element.Set(reflect.ValueOf(ctx.value))
}
return nil
default:
@@ -118,7 +152,7 @@ func ParsePath(key string) []string {
return paths
}
-func (f *flagConfigBinder) setArray(ctx *context) error {
+func (f *flagConfigBinder) setArray(ctx *bindContext) error {
if len(ctx.paths) > 0 {
index, err := f.parseArrayIndex(ctx.paths[0])
if err != nil {
@@ -146,21 +180,31 @@ func (f *flagConfigBinder) setArray(ctx *context) error {
return f.setValue(ctx.Next(ctx.element.Index(index)))
} else {
- if len(ctx.value) == 1 {
- ctx.value = splitArrayItems(ctx.value[0])
+ var values []string
+ if arr, ok := ctx.value.([]string); ok {
+ if arr == nil {
+ return nil
+ }
+ values = arr
+ } else if s, ok := ctx.value.(string); ok {
+ values = []string{s}
}
- if len(ctx.value) > 1 {
+ if len(values) == 1 {
+ values = splitArrayItems(values[0])
+ }
+
+ if len(values) > 0 {
// reset slice; remove default values
- ctx.element.Set(reflect.MakeSlice(ctx.element.Type(), 0, len(ctx.value)))
+ ctx.element.Set(reflect.MakeSlice(ctx.element.Type(), 0, len(values)))
}
- for _, v := range ctx.value {
+ for _, v := range values {
ptr := reflect.New(ctx.element.Type().Elem())
- ctxItem := &context{
+ ctxItem := &bindContext{
paths: ctx.paths,
element: ptr,
- value: []string{v},
+ value: v,
}
if err := f.setValue(ctxItem); err != nil {
return err
@@ -182,7 +226,17 @@ func (f *flagConfigBinder) parseArrayIndex(path string) (int, error) {
return strconv.Atoi(path)
}
-func (f *flagConfigBinder) setMap(ctx *context) error {
+func (f *flagConfigBinder) setMap(ctx *bindContext) error {
+ var values []string
+ if arr, ok := ctx.value.([]string); ok {
+ values = arr
+ } else if s, ok := ctx.value.(string); ok {
+ if s == "" {
+ return nil
+ }
+ values = []string{s}
+ }
+
m := ctx.element
if m.IsNil() {
m.Set(reflect.MakeMap(ctx.element.Type()))
@@ -192,13 +246,13 @@ func (f *flagConfigBinder) setMap(ctx *context) error {
if len(ctx.paths) >= 1 {
key = reflect.ValueOf(ctx.paths[0])
} else if len(ctx.paths) == 0 {
- if len(ctx.value) == 1 {
- kv := strings.Split(ctx.value[0], "=")
+ if len(values) == 1 {
+ kv := strings.Split(values[0], "=")
if len(kv) != 2 {
- return fmt.Errorf("expected value with key value pair for map like key=value: %s", ctx.value[0])
+ return fmt.Errorf("expected value with key value pair for map like key=value: %s", values[0])
}
key = reflect.ValueOf(kv[0])
- ctx.value = []string{kv[1]}
+ ctx.value = kv[1]
}
}
@@ -264,61 +318,79 @@ func getFieldByTag(structValue reflect.Value, name, tag string) reflect.Value {
return reflect.Value{}
}
-func (f *flagConfigBinder) convert(s string, v reflect.Value) error {
- u, err := url.ParseRequestURI(s)
- if err == nil {
- switch u.Scheme {
- case "file":
- var path string
- if len(u.Host) > 0 {
- path = u.Host
+func (f *flagConfigBinder) convert(value any, target reflect.Value) error {
+ kind := target.Type().Kind()
+
+ if s, ok := value.(string); ok {
+ u, err := url.ParseRequestURI(s)
+ if err == nil {
+ switch u.Scheme {
+ case "file":
+ var path string
+ if len(u.Host) > 0 {
+ path = u.Host
+ }
+ if len(u.Path) > 0 {
+ path += u.Path
+ }
+ if len(u.Opaque) > 0 {
+ path = u.Opaque
+ }
+ b, err := fileReader.ReadFile(path)
+ if err != nil {
+ return err
+ }
+ // remove bom sequence if present
+ if len(b) >= 4 && bytes.Equal(b[0:3], file.Bom) {
+ b = b[3:]
+ }
+ s = string(b)
}
- if len(u.Path) > 0 {
- path += u.Path
+ }
+
+ if kind == reflect.Struct {
+ err = f.convertJson(s, target)
+ if err == nil {
+ return nil
}
- if len(u.Opaque) > 0 {
- path = u.Opaque
+ }
+
+ if kind == reflect.Struct {
+ if s == "" {
+ return nil
}
- b, err := readFile(path)
- if err != nil {
- return err
+ pairs := strings.Split(s, ",")
+ for _, pair := range pairs {
+ kv := strings.Split(pair, "=")
+ if len(kv) != 2 {
+ return fmt.Errorf("parse shorthand failed: %v", s)
+ }
+ err = f.setValue(&bindContext{paths: []string{kv[0]}, value: kv[1], element: target})
+ if err != nil {
+ return err
+ }
}
- // remove bom sequence if present
- if len(b) >= 4 && bytes.Equal(b[0:3], file.Bom) {
- b = b[3:]
+ return nil
+ } else if kind == reflect.Slice {
+ return f.setValue(&bindContext{paths: []string{}, element: target, value: []string{s}})
+ } else if kind == reflect.String {
+ v := reflect.ValueOf(s)
+ t := target.Type()
+ if v.Type().AssignableTo(t) {
+ target.Set(v)
+ return nil
+ } else if v.Type().ConvertibleTo(t) {
+ target.Set(v.Convert(t))
+ return nil
}
- s = string(b)
}
- }
- kind := v.Type().Kind()
- if kind == reflect.Struct {
- err = f.convertJson(s, v)
- if err == nil {
- return nil
- }
+ value = s
}
- if kind == reflect.Struct {
- if s == "" {
- return nil
- }
- pairs := strings.Split(s, ",")
- for _, pair := range pairs {
- kv := strings.Split(pair, "=")
- if len(kv) != 2 {
- return fmt.Errorf("parse shorthand failed: %v", s)
- }
- err = f.setValue(&context{paths: []string{kv[0]}, value: []string{kv[1]}, element: v})
- if err != nil {
- return err
- }
- }
- return nil
- } else if kind == reflect.Slice {
- return f.setValue(&context{paths: []string{}, element: v, value: []string{s}})
- } else if kind == reflect.String {
- v.Set(reflect.ValueOf(s))
+ v := reflect.ValueOf(value)
+ if v.Type().AssignableTo(target.Type()) {
+ target.Set(v)
return nil
}
@@ -338,12 +410,16 @@ func (f *flagConfigBinder) convertJson(s string, v reflect.Value) error {
func splitArrayItems(s string) []string {
quoted := false
splitC := getSplitCharsForList(s)
- return strings.FieldsFunc(s, func(r rune) bool {
+ items := strings.FieldsFunc(s, func(r rune) bool {
if r == '"' {
quoted = !quoted
}
return !quoted && slices.Contains(splitC, r)
})
+ for i, item := range items {
+ items[i] = strings.Trim(item, "\"")
+ }
+ return items
}
func (f *flagConfigBinder) setJson(element reflect.Value, i interface{}) error {
@@ -391,19 +467,7 @@ func (f *flagConfigBinder) setJson(element reflect.Value, i interface{}) error {
return nil
}
-func invertFlag(value string) (string, error) {
- flag := false
- if value != "" {
- b, err := strconv.ParseBool(value)
- if err != nil {
- return "", fmt.Errorf("value %v cannot be parsed as bool: %v", value, err.Error())
- }
- flag = !b
- }
- return fmt.Sprintf("%v", flag), nil
-}
-
-func (c *context) setFieldFromStruct() error {
+func (c *bindContext) setFieldFromStruct() error {
name := strings.ToLower(c.paths[0])
field := c.element.FieldByNameFunc(func(f string) bool {
return strings.ToLower(f) == name
@@ -413,22 +477,6 @@ func (c *context) setFieldFromStruct() error {
return nil
}
- if c.paths[0] == "no" && len(c.paths) == 2 {
- name = strings.ToLower(c.paths[1])
- field = c.element.FieldByNameFunc(func(f string) bool {
- return strings.ToLower(f) == c.paths[1]
- })
- if field.IsValid() {
- value, err := invertFlag(c.value[0])
- if err != nil {
- return err
- }
- c.value = []string{value}
- c.Next(field)
- return nil
- }
- }
-
for i := 0; i < c.element.NumField(); i++ {
f := c.element.Type().Field(i)
@@ -466,7 +514,7 @@ func (c *context) setFieldFromStruct() error {
return fmt.Errorf("no configuration found")
}
-func (c *context) Next(element reflect.Value) *context {
+func (c *bindContext) Next(element reflect.Value) *bindContext {
c.paths = c.paths[1:]
c.element = element
return c
diff --git a/pkg/cli/clitest/reader.go b/pkg/cli/clitest/reader.go
new file mode 100644
index 000000000..7fcc055e7
--- /dev/null
+++ b/pkg/cli/clitest/reader.go
@@ -0,0 +1,31 @@
+package clitest
+
+import (
+ "os"
+ "strings"
+)
+
+type TestFileReader struct {
+ Files map[string][]byte
+}
+
+func (t *TestFileReader) ReadFile(name string) ([]byte, error) {
+ if b, ok := t.Files[name]; ok {
+ return b, nil
+ }
+ // if test is executed on windows we get second path
+ name = strings.ReplaceAll(name, "\\", "/")
+ if b, ok := t.Files[name]; ok {
+ return b, nil
+ }
+ return nil, os.ErrNotExist
+}
+
+func (t *TestFileReader) FileExists(name string) bool {
+ if _, ok := t.Files[name]; ok {
+ return true
+ }
+ name = strings.ReplaceAll(name, "\\", "/")
+ _, ok := t.Files[name]
+ return ok
+}
diff --git a/pkg/cli/command.go b/pkg/cli/command.go
index 1c558ad8c..f0b3b74a4 100644
--- a/pkg/cli/command.go
+++ b/pkg/cli/command.go
@@ -1,14 +1,16 @@
package cli
import (
+ "context"
"fmt"
+ "io"
"os"
- "reflect"
- "strings"
+ "slices"
)
type Command struct {
Name string
+ Use string
Short string
Long string
Example string
@@ -16,10 +18,15 @@ type Command struct {
Commands []*Command
Run func(cmd *Command, args []string) error
EnvPrefix string
-
- configFile string
- args []string
- flags *FlagSet
+ Version string
+
+ configFileName string
+ configPaths []string
+ configFile string
+ args []string
+ flags *FlagSet
+ output io.Writer
+ ctx context.Context
}
func (c *Command) Execute() error {
@@ -43,67 +50,33 @@ func (c *Command) Execute() error {
}
}
- m, err := parseFlags(args, envPrefix, c.Flags().IsValidFlag)
+ positional, err := parseFlags(args, envPrefix, cmd.Flags())
if err != nil {
return err
}
- if cmd.Config != nil {
- var file string
- file, err = readConfigFileFromFlags(m, cmd.Config)
- if err != nil {
- return err
- }
- if file != "" {
- var valuesFromConfig map[string][]string
- valuesFromConfig, err = getMapFromConfig(cmd.Config, cmd.Flags())
- if err != nil {
- return fmt.Errorf("reading config file '%s' failed: %w", file, err)
- }
- for k, v := range valuesFromConfig {
- if _, ok := m[k]; !ok {
- m[k] = v
- }
- }
- }
+ if cmd.Flags().GetBool("help") {
+ c.printHelp()
+ return nil
}
- var positional []string
- for k, v := range m {
- switch k {
- case "args":
- positional = v
- default:
- err = cmd.Flags().setValue(k, v)
- if err != nil {
- return fmt.Errorf("failed to set flag '%s': %w", k, err)
- }
+ if cmd.Version != "" {
+ if cmd.Flags().GetBool("version") {
+ fmt.Println(cmd.Version)
+ return nil
}
}
- defaultValues := map[string][]string{}
- for _, f := range cmd.flags.flags {
- if f.DefaultValue == "" {
- continue
- }
- if _, ok := m[f.Name]; ok {
- continue
- }
- if _, ok := m[f.Shorthand]; ok {
- continue
+ if cmd.Config != nil {
+ err = c.readConfigFile()
+ if err != nil {
+ return err
}
- defaultValues[f.Name] = []string{f.DefaultValue}
}
if cmd.Config != nil {
- // reset configs, because values are now in the flag set
- clearConfig(cmd.Config)
b := flagConfigBinder{}
- err = b.Decode(defaultValues, cmd.Config)
- if err != nil {
- return fmt.Errorf("failed to bind flags to config: %w", err)
- }
- err = b.Decode(m, cmd.Config)
+ err = b.Decode(cmd.Flags(), cmd.Config)
if err != nil {
return fmt.Errorf("failed to bind flags to config: %w", err)
}
@@ -116,120 +89,57 @@ func (c *Command) Execute() error {
}
}
+func (c *Command) ExecuteWithContext(ctx context.Context) error {
+ c.SetContext(ctx)
+ return c.Execute()
+}
+
func (c *Command) SetArgs(args []string) {
c.args = args
}
func (c *Command) Flags() *FlagSet {
if c.flags == nil {
- c.flags = &FlagSet{}
+ c.flags = &FlagSet{
+ orderedFlags: make(map[string]int),
+ setConfigFile: func(s string) {
+ c.configFile = s
+ },
+ }
+
+ c.Flags().Bool("help", false, FlagDoc{Short: "Show help information and exit"})
+
+ if c.Version != "" {
+ c.Flags().Bool("version", false, FlagDoc{Short: "Show version information and exit"})
+ }
}
return c.flags
}
-func (c *Command) SetConfigFile(file string) {
- c.configFile = file
+func (c *Command) SetConfigName(name string) {
+ c.configFileName = name
}
-func getMapFromConfig(cfg any, flags *FlagSet) (map[string][]string, error) {
- return getMapFrom(reflect.ValueOf(cfg), "", flags)
+func (c *Command) SetConfigFile(file string) {
+ c.configFile = file
}
-func getMapFrom(v reflect.Value, key string, flags *FlagSet) (map[string][]string, error) {
- switch v.Kind() {
- case reflect.Ptr:
- return getMapFrom(v.Elem(), key, flags)
- case reflect.Struct:
- t := v.Type()
- result := map[string][]string{}
- for i := 0; i < v.NumField(); i++ {
- field := t.Field(i)
- if !field.IsExported() {
- continue
- }
-
- name := strings.ToLower(field.Name)
- tag := field.Tag.Get("name")
- if tag != "" {
- name = strings.Split(tag, ",")[0]
- } else {
- tag = field.Tag.Get("flag")
- if tag != "" {
- name = strings.Split(tag, ",")[0]
- }
- }
- if name == "-" {
- continue
- }
- if key != "" {
- name = key + "-" + name
- }
-
- m, err := getMapFrom(v.Field(i), name, flags)
- if err != nil {
- return nil, err
- } else if m == nil {
- continue
- }
- for k, val := range m {
- result[k] = val
- }
+func (c *Command) SetConfigPath(path ...string) {
+ for _, p := range path {
+ if !slices.Contains(c.configPaths, p) {
+ c.configPaths = append(c.configPaths, p)
}
- return result, nil
- case reflect.Slice:
- if _, err := flags.GetValue(key); err == nil {
- var values []string
- for i := 0; i < v.Len(); i++ {
- values = append(values, fmt.Sprintf("%v", v.Index(i)))
- }
- return map[string][]string{key: values}, nil
- }
- result := map[string][]string{}
- for i := 0; i < v.Len(); i++ {
- m, err := getMapFrom(v.Index(i), fmt.Sprintf("%s[%v]", key, i), flags)
- if err != nil {
- return nil, err
- } else if m == nil {
- continue
- }
- for k, val := range m {
- result[k] = val
- }
- }
- return result, nil
- case reflect.Map:
- result := map[string][]string{}
- for _, k := range v.MapKeys() {
- m, err := getMapFrom(v.MapIndex(k), fmt.Sprintf("%s-%v", key, k.Interface()), flags)
- if err != nil {
- return nil, err
- } else if m == nil {
- continue
- }
- for k, val := range m {
- result[k] = val
- }
- }
-
- return result, nil
- default:
- if canBeNil(v) && v.IsNil() {
- return nil, nil
- }
- return map[string][]string{key: {fmt.Sprintf("%v", v.Interface())}}, nil
}
}
-func canBeNil(v reflect.Value) bool {
- switch v.Kind() {
- case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
- return true
- default:
- return false
- }
+func (c *Command) SetOutput(writer io.Writer) {
+ c.output = writer
+}
+
+func (c *Command) SetContext(ctx context.Context) {
+ c.ctx = ctx
}
-func clearConfig(v interface{}) {
- p := reflect.ValueOf(v).Elem()
- p.Set(reflect.Zero(p.Type()))
+func (c *Command) Context() context.Context {
+ return c.ctx
}
diff --git a/pkg/cli/command_test.go b/pkg/cli/command_test.go
index f9bfff8ce..3ff506d44 100644
--- a/pkg/cli/command_test.go
+++ b/pkg/cli/command_test.go
@@ -1,117 +1,147 @@
-package cli
+package cli_test
import (
- "github.com/stretchr/testify/require"
+ "mokapi/pkg/cli"
"testing"
+
+ "github.com/stretchr/testify/require"
)
func TestCommand(t *testing.T) {
- cfg := &struct {
+ type config struct {
Flag bool
Name string
SkipPrefix []string `flag:"skip-prefix"`
- }{}
+ }
testcases := []struct {
name string
- cmd func() *Command
+ cmd func() *cli.Command
args []string
- test func(t *testing.T, cmd *Command, args []string, err error)
+ test func(t *testing.T, cmd *cli.Command, args []string, err error)
}{
{
- name: "--help",
- cmd: func() *Command {
- c := &Command{Name: "foo", EnvPrefix: "Mokapi"}
- c.Flags().Bool("help", false, "")
+ name: "--foo",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo"}
+ c.Flags().Bool("foo", false, cli.FlagDoc{})
return c
},
- args: []string{"--help"},
- test: func(t *testing.T, cmd *Command, args []string, err error) {
+ args: []string{"--foo"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
require.NoError(t, err)
require.Equal(t, "foo", cmd.Name)
- require.Equal(t, true, cmd.Flags().GetBool("help"))
+ require.Equal(t, true, cmd.Flags().GetBool("foo"))
},
},
{
- name: "-h",
- cmd: func() *Command {
- c := &Command{Name: "foo", EnvPrefix: "Mokapi"}
- c.Flags().BoolShort("help", "h", false, "")
+ name: "-f",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo"}
+ c.Flags().BoolShort("foo", "f", false, cli.FlagDoc{})
return c
},
- args: []string{"-h"},
- test: func(t *testing.T, cmd *Command, args []string, err error) {
+ args: []string{"-f"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
require.NoError(t, err)
require.Equal(t, "foo", cmd.Name)
- require.Equal(t, true, cmd.Flags().GetBool("help"))
+ require.Equal(t, true, cmd.Flags().GetBool("foo"))
},
},
{
name: "bind to config",
- cmd: func() *Command {
- c := &Command{Config: cfg, EnvPrefix: "Mokapi"}
- c.Flags().Bool("flag", false, "")
+ cmd: func() *cli.Command {
+ c := &cli.Command{Config: &config{}}
+ c.Flags().Bool("flag", false, cli.FlagDoc{})
return c
},
args: []string{"--flag"},
- test: func(t *testing.T, cmd *Command, args []string, err error) {
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
require.NoError(t, err)
require.Equal(t, true, cmd.Flags().GetBool("flag"))
- require.Equal(t, true, cfg.Flag)
+ require.Equal(t, true, cmd.Config.(*config).Flag)
},
},
{
name: "--count",
- cmd: func() *Command {
- c := &Command{Config: cfg, EnvPrefix: "Mokapi"}
- c.Flags().Int("count", 12, "")
+ cmd: func() *cli.Command {
+ c := &cli.Command{Config: &config{}}
+ c.Flags().Int("count", 12, cli.FlagDoc{})
return c
},
args: []string{"--count", "10"},
- test: func(t *testing.T, cmd *Command, args []string, err error) {
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
require.NoError(t, err)
require.Equal(t, 10, cmd.Flags().GetInt("count"))
},
},
{
name: "--count default",
- cmd: func() *Command {
- c := &Command{Config: cfg, EnvPrefix: "Mokapi"}
- c.Flags().Int("count", 12, "")
+ cmd: func() *cli.Command {
+ c := &cli.Command{Config: &config{}}
+ c.Flags().Int("count", 12, cli.FlagDoc{})
return c
},
args: []string{},
- test: func(t *testing.T, cmd *Command, args []string, err error) {
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
require.NoError(t, err)
require.Equal(t, 12, cmd.Flags().GetInt("count"))
},
},
{
name: "--skip-prefix",
- cmd: func() *Command {
- c := &Command{Config: cfg, EnvPrefix: "Mokapi"}
- c.Flags().StringSlice("skip-prefix", []string{"_"}, "", false)
+ cmd: func() *cli.Command {
+ c := &cli.Command{Config: &config{}}
+ c.Flags().StringSlice("skip-prefix", []string{"_"}, false, cli.FlagDoc{})
return c
},
args: []string{"--skip-prefix", "_", "foo_"},
- test: func(t *testing.T, cmd *Command, args []string, err error) {
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
require.NoError(t, err)
- require.Equal(t, []string{"_", "foo_"}, cmd.Flags().GetStringSlice("skip-prefix"))
- require.Equal(t, []string{"_", "foo_"}, cfg.SkipPrefix)
+ require.Equal(t, []string{"foo_"}, cmd.Flags().GetStringSlice("skip-prefix"))
+ require.Equal(t, []string{"foo_"}, cmd.Config.(*config).SkipPrefix)
},
},
{
name: "--skip-prefix default",
- cmd: func() *Command {
- c := &Command{Config: cfg, EnvPrefix: "Mokapi"}
- c.Flags().StringSlice("skip-prefix", []string{"_"}, "", false)
+ cmd: func() *cli.Command {
+ c := &cli.Command{Config: &config{}}
+ c.Flags().StringSlice("skip-prefix", []string{"_"}, false, cli.FlagDoc{})
return c
},
args: []string{},
- test: func(t *testing.T, cmd *Command, args []string, err error) {
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
require.NoError(t, err)
require.Equal(t, []string{"_"}, cmd.Flags().GetStringSlice("skip-prefix"))
- require.Equal(t, []string{"_"}, cfg.SkipPrefix)
+ require.Equal(t, []string{"_"}, cmd.Config.(*config).SkipPrefix)
+ },
+ },
+ {
+ name: "--skip-prefix=foo",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Config: &config{}}
+ c.Flags().StringSlice("skip-prefix", []string{"_"}, false, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--skip-prefix=foo"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, []string{"foo"}, cmd.Flags().GetStringSlice("skip-prefix"))
+ require.Equal(t, []string{"foo"}, cmd.Config.(*config).SkipPrefix)
+ },
+ },
+ {
+ name: "--no-flag",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Config: &config{}}
+ c.Flags().Bool("flag", true, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--no-flag"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, false, cmd.Flags().GetBool("flag"))
+ require.Equal(t, false, cmd.Config.(*config).Flag)
},
},
}
@@ -119,11 +149,11 @@ func TestCommand(t *testing.T) {
for _, tc := range testcases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
- var cmd *Command
+ var cmd *cli.Command
var args []string
root := tc.cmd()
root.SetArgs(tc.args)
- root.Run = func(c *Command, a []string) error {
+ root.Run = func(c *cli.Command, a []string) error {
cmd = c
args = a
return nil
diff --git a/pkg/cli/docs.go b/pkg/cli/docs.go
new file mode 100644
index 000000000..42e87687d
--- /dev/null
+++ b/pkg/cli/docs.go
@@ -0,0 +1,253 @@
+package cli
+
+import (
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+const markdownExtension = ".md"
+
+func (c *Command) GenMarkdown(dir string) error {
+ basename := strings.ReplaceAll(c.Name, " ", "_") + markdownExtension
+ filename := filepath.Join(dir, basename)
+ f, err := os.Create(filename)
+ if err != nil {
+ return err
+ }
+ defer func() { _ = f.Close() }()
+
+ return c.WriteMarkdown(f)
+}
+
+func (c *Command) WriteMarkdown(out io.StringWriter) error {
+ if c.Name == "" {
+ return fmt.Errorf("command must specify a name")
+ }
+
+ if _, err := out.WriteString(fmt.Sprintf(`---
+title: %s CLI Flags
+description: A complete list of all %s flags, with descriptions, defaults, and examples of how to set the option in config file, environment variables, or CLI.
+---`+"\n\n", c.Name, c.Name)); err != nil {
+ return err
+ }
+
+ if err := writeCommand(c, out); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func writeCommand(c *Command, f io.StringWriter) error {
+ if _, err := f.WriteString(fmt.Sprintf("# %s\n\n", c.Name)); err != nil {
+ return err
+ }
+
+ if c.Short != "" {
+ if _, err := f.WriteString(fmt.Sprintf("%s\n\n", c.Short)); err != nil {
+ return err
+ }
+ }
+
+ if c.Long != "" {
+ if _, err := f.WriteString(fmt.Sprintf("## Description\n\n %s\n\n", c.Long)); err != nil {
+ return err
+ }
+ }
+
+ if c.Use != "" {
+ use := fmt.Sprintf("```bash tab=Bash\n%s\n```\n\n", c.Use)
+ if _, err := f.WriteString(fmt.Sprintf("## Usage\n\n%s\n\n", use)); err != nil {
+ return err
+ }
+ }
+
+ return writeFlags(f, c.Flags(), c.EnvPrefix)
+}
+
+func writeFlag(w io.StringWriter, f *Flag, envPrefix string) error {
+ escapedName := strings.ReplaceAll(f.Name, "<", "<")
+ escapedName = strings.ReplaceAll(escapedName, ">", ">")
+ if _, err := w.WriteString(fmt.Sprintf("## %s\n\n", escapedName, escapedName)); err != nil {
+ return err
+ }
+
+ if f.Long != "" {
+ if _, err := w.WriteString(fmt.Sprintf("%s\n\n", f.Long)); err != nil {
+ return err
+ }
+ } else if f.Short != "" {
+ if _, err := w.WriteString(fmt.Sprintf("%s\n\n", f.Short)); err != nil {
+ return err
+ }
+ }
+
+ if f.Shorthand != "" {
+ if _, err := w.WriteString(`| Flag | Shorthand | Env | Type | Default |
+|------|:---------:|------|:----:|:-------:|
+`); err != nil {
+ return err
+ }
+ } else {
+ if _, err := w.WriteString(`| Flag | Env | Type | Default |
+|------|------|:----:|:-------:|
+`); err != nil {
+ return err
+ }
+ }
+
+ var defaultValue string
+ switch v := f.DefaultValue.(type) {
+ case []string:
+ switch len(v) {
+ case 0:
+ defaultValue = "-"
+ case 1:
+ defaultValue = v[0]
+ default:
+ defaultValue = strings.Join(v, ", ")
+ }
+ case string:
+ if v == "" {
+ defaultValue = "-"
+ } else {
+ defaultValue = v
+ }
+ default:
+ if v == nil {
+ defaultValue = "-"
+ } else {
+ defaultValue = fmt.Sprintf("%v", v)
+ }
+ }
+
+ env := fmt.Sprintf("%s%s", envPrefix, strings.ToUpper(strings.ReplaceAll(f.Name, "-", "_")))
+
+ if f.Shorthand != "" {
+ if _, err := w.WriteString(fmt.Sprintf("| --%s | -%s | %s | %s | %s |\n", f.Name, f.Shorthand, env, f.Type, defaultValue)); err != nil {
+ return err
+ }
+ } else {
+ if _, err := w.WriteString(fmt.Sprintf("| --%s | %s | %s | %s |\n", f.Name, env, f.Type, defaultValue)); err != nil {
+ return err
+ }
+ }
+
+ if _, err := w.WriteString("\n"); err != nil {
+ return err
+ }
+
+ if len(f.Examples) > 0 {
+ for _, example := range f.Examples {
+ if example.Title != "" {
+ if _, err := w.WriteString(fmt.Sprintf("### %s\n\n", example.Title)); err != nil {
+ return err
+ }
+ }
+
+ if example.Description != "" {
+ if _, err := w.WriteString(fmt.Sprintf("%s\n\n", example.Description)); err != nil {
+ return err
+ }
+ }
+
+ for _, code := range example.Codes {
+ codeType := "bash"
+ if code.Language != "" {
+ codeType = code.Language
+ }
+ var s string
+ if code.Title != "" {
+ s = fmt.Sprintf("```%s tab=%s\n%s\n```\n", codeType, code.Title, code.Source)
+ } else {
+ s = fmt.Sprintf("```%s\n%s\n```\n", codeType, code)
+ }
+ if _, err := w.WriteString(s); err != nil {
+ return err
+ }
+ }
+ if _, err := w.WriteString("\n"); err != nil {
+ return err
+ }
+ }
+ }
+
+ if len(f.Aliases) > 0 {
+ if _, err := w.WriteString(fmt.Sprintf("### Aliases\n\n")); err != nil {
+ return err
+ }
+
+ for _, alias := range f.Aliases {
+ if _, err := w.WriteString(fmt.Sprintf("- %s\n", alias)); err != nil {
+ return err
+ }
+ }
+
+ if _, err := w.WriteString("\n"); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func writeFlags(w io.StringWriter, flags *FlagSet, envPrefix string) error {
+ if flags.Len() == 0 {
+ return nil
+ }
+
+ if _, err := w.WriteString("
\n\n"); err != nil {
+ return err
+ }
+
+ if _, err := w.WriteString("## Flags \n\n"); err != nil {
+ return err
+ }
+
+ if _, err := w.WriteString(`| Name | Usage |
+|------|-------|
+`,
+ ); err != nil {
+ return err
+ }
+
+ details := &strings.Builder{}
+ done := map[string]bool{}
+ err := flags.VisitAll(func(f *Flag) error {
+ // skip aliases
+ if done[f.Name] {
+ return nil
+ }
+ done[f.Name] = true
+
+ _, err := w.WriteString(getFlagRow(f))
+ if err != nil {
+ return err
+ }
+ return writeFlag(details, f, envPrefix)
+ })
+ if err != nil {
+ return err
+ }
+
+ if _, err = w.WriteString("\n
\n\n"); err != nil {
+ return err
+ }
+
+ _, err = w.WriteString(details.String())
+ return err
+}
+
+func getFlagRow(f *Flag) string {
+ short := f.Shorthand
+ if short == "" {
+ short = "-"
+ } else {
+ short = "-" + short
+ }
+ name := fmt.Sprintf("[%s](#%s)", f.Name, f.Name)
+ return fmt.Sprintf("| --%s | %s |\n", name, f.Short)
+}
diff --git a/pkg/cli/docs_test.go b/pkg/cli/docs_test.go
new file mode 100644
index 000000000..b5c1a04c1
--- /dev/null
+++ b/pkg/cli/docs_test.go
@@ -0,0 +1,181 @@
+package cli_test
+
+import (
+ "fmt"
+ "mokapi/pkg/cli"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestDocs(t *testing.T) {
+ testcases := []struct {
+ name string
+ args []string
+ test func(t *testing.T)
+ }{
+ {
+ name: "one flag",
+ test: func(t *testing.T) {
+ c := cli.Command{Name: "Foo", Run: func(cmd *cli.Command, args []string) error {
+ return nil
+ }}
+ c.Flags().String("foo", "", cli.FlagDoc{})
+ sb := &strings.Builder{}
+ err := c.WriteMarkdown(sb)
+ require.NoError(t, err)
+ require.Equal(t, `---
+title: Foo CLI Flags
+description: A complete list of all Foo flags, with descriptions, defaults, and examples of how to set the option in config file, environment variables, or CLI.
+---
+
+# Foo
+
+
+
+## Flags
+
+| Name | Usage |
+|------|-------|
+| --[foo](#foo) | |
+| --[help](#help) | Show help information and exit |
+
+
+
+## foo
+
+| Flag | Env | Type | Default |
+|------|------|:----:|:-------:|
+| --foo | FOO | string | - |
+
+## help
+
+Show help information and exit
+
+| Flag | Env | Type | Default |
+|------|------|:----:|:-------:|
+| --help | HELP | bool | false |
+
+`, sb.String())
+ },
+ },
+ {
+ name: "one flag with alias",
+ test: func(t *testing.T) {
+ c := cli.Command{Name: "Foo", Run: func(cmd *cli.Command, args []string) error {
+ return nil
+ }}
+ c.Flags().String("foo", "", cli.FlagDoc{})
+ c.Flags().Alias("foo", "alias")
+ sb := &strings.Builder{}
+ err := c.WriteMarkdown(sb)
+ require.NoError(t, err)
+ require.Equal(t, `---
+title: Foo CLI Flags
+description: A complete list of all Foo flags, with descriptions, defaults, and examples of how to set the option in config file, environment variables, or CLI.
+---
+
+# Foo
+
+
+
+## Flags
+
+| Name | Usage |
+|------|-------|
+| --[foo](#foo) | |
+| --[help](#help) | Show help information and exit |
+
+
+
+## foo
+
+| Flag | Env | Type | Default |
+|------|------|:----:|:-------:|
+| --foo | FOO | string | - |
+
+### Aliases
+
+- alias
+
+## help
+
+Show help information and exit
+
+| Flag | Env | Type | Default |
+|------|------|:----:|:-------:|
+| --help | HELP | bool | false |
+
+`, sb.String())
+ },
+ },
+ {
+ name: "one flag with documentation",
+ test: func(t *testing.T) {
+ c := cli.Command{Name: "Foo", Run: func(cmd *cli.Command, args []string) error {
+ return nil
+ }}
+ c.Flags().String("foo", "", cli.FlagDoc{
+ Short: "A short description of the foo flag",
+ Long: `Some long description here`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--foo bar"},
+ {Title: "Env", Source: "FOO=bar"},
+ {Title: "File", Source: "foo: bar"},
+ },
+ },
+ },
+ })
+ sb := &strings.Builder{}
+ err := c.WriteMarkdown(sb)
+ require.NoError(t, err)
+ require.Equal(t, fmt.Sprintf(`---
+title: Foo CLI Flags
+description: A complete list of all Foo flags, with descriptions, defaults, and examples of how to set the option in config file, environment variables, or CLI.
+---
+
+# Foo
+
+
+
+## Flags
+
+| Name | Usage |
+|------|-------|
+| --[foo](#foo) | A short description of the foo flag |
+| --[help](#help) | Show help information and exit |
+
+
+
+## foo
+
+Some long description here
+
+| Flag | Env | Type | Default |
+|------|------|:----:|:-------:|
+| --foo | FOO | string | - |
+
+%s
+
+## help
+
+Show help information and exit
+
+| Flag | Env | Type | Default |
+|------|------|:----:|:-------:|
+| --help | HELP | bool | false |
+
+`, "```bash tab=CLI\n--foo bar\n```\n```bash tab=Env\nFOO=bar\n```\n```bash tab=File\nfoo: bar\n```"), sb.String())
+ },
+ },
+ }
+ for _, tc := range testcases {
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ tc.test(t)
+ })
+ }
+}
diff --git a/pkg/cli/dynamic.go b/pkg/cli/dynamic.go
index 512d9f0ab..7d5f887ea 100644
--- a/pkg/cli/dynamic.go
+++ b/pkg/cli/dynamic.go
@@ -8,43 +8,76 @@ import (
var regexIndex = regexp.MustCompile(`\[<.*>]`)
var regexKey = regexp.MustCompile(`<.*>`)
-func (fs *FlagSet) DynamicInt(name string, defaultValue int, usage string) {
- v := &intFlag{value: defaultValue}
+func (fs *FlagSet) DynamicInt(name string, doc FlagDoc) *FlagBuilder {
f := &DynamicFlag{
- Flag: Flag{
- Usage: usage,
- Value: v,
- DefaultValue: v.String(),
- },
+ Name: name,
+ Flag: Flag{FlagDoc: doc},
pattern: convertToPattern(name),
+ setValue: func(name string, value []string, source Source) error {
+ f, ok := fs.flags[name]
+ if !ok {
+ v := &intFlag{}
+ if err := v.Set(value, source); err != nil {
+ return err
+ }
+ f = &Flag{Name: name, Value: v, Type: "int", FlagDoc: doc}
+ fs.setFlag(f)
+ return nil
+ } else {
+ return f.Value.Set(value, source)
+ }
+ },
}
fs.dynamic = append(fs.dynamic, f)
+ return &FlagBuilder{flag: &f.Flag}
}
-func (fs *FlagSet) DynamicString(name string, defaultValue string, usage string) {
- v := &stringFlag{value: defaultValue}
+func (fs *FlagSet) DynamicString(name string, doc FlagDoc) *FlagBuilder {
f := &DynamicFlag{
- Flag: Flag{
- Usage: usage,
- Value: v,
- DefaultValue: v.String(),
- },
+ Name: name,
+ Flag: Flag{FlagDoc: doc},
pattern: convertToPattern(name),
+ setValue: func(name string, value []string, source Source) error {
+ f, ok := fs.flags[name]
+ if !ok {
+ v := &stringFlag{}
+ if err := v.Set(value, source); err != nil {
+ return err
+ }
+ f = &Flag{Name: name, Value: v, Type: "string", FlagDoc: doc}
+ fs.setFlag(f)
+ return nil
+ } else {
+ return f.Value.Set(value, source)
+ }
+ },
}
fs.dynamic = append(fs.dynamic, f)
+ return &FlagBuilder{flag: &f.Flag}
}
-func (fs *FlagSet) DynamicStringSlice(name string, defaultValue []string, usage string, explode bool) {
- v := &stringSliceFlag{value: defaultValue, explode: explode}
+func (fs *FlagSet) DynamicStringSlice(name string, explode bool, doc FlagDoc) *FlagBuilder {
f := &DynamicFlag{
- Flag: Flag{
- Usage: usage,
- Value: v,
- DefaultValue: v.String(),
- },
+ Name: name,
+ Flag: Flag{FlagDoc: doc},
pattern: convertToPattern(name),
+ setValue: func(name string, value []string, source Source) error {
+ f, ok := fs.flags[name]
+ if !ok {
+ v := &stringSliceFlag{explode: explode}
+ if err := v.Set(value, source); err != nil {
+ return err
+ }
+ f = &Flag{Name: name, Value: v, Type: "list", FlagDoc: doc}
+ fs.setFlag(f)
+ return nil
+ } else {
+ return f.Value.Set(value, source)
+ }
+ },
}
fs.dynamic = append(fs.dynamic, f)
+ return &FlagBuilder{flag: &f.Flag}
}
func convertToPattern(s string) *regexp.Regexp {
diff --git a/pkg/cli/dynamic_test.go b/pkg/cli/dynamic_test.go
index 8452010ce..874c27960 100644
--- a/pkg/cli/dynamic_test.go
+++ b/pkg/cli/dynamic_test.go
@@ -27,7 +27,7 @@ func TestDynamic(t *testing.T) {
test: func(t *testing.T) {
s := &struct{ Foo []string }{}
c := newCmd([]string{"--foo[0]", "bar"}, &s)
- c.Flags().DynamicString("foo[]", "", "")
+ c.Flags().DynamicString("foo[]", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, []string{"bar"}, s.Foo)
@@ -38,7 +38,7 @@ func TestDynamic(t *testing.T) {
test: func(t *testing.T) {
s := &struct{ Foo []string }{}
c := newCmd([]string{"--foo[1]", "bar"}, &s)
- c.Flags().DynamicString("foo[]", "", "")
+ c.Flags().DynamicString("foo[]", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, []string{"", "bar"}, s.Foo)
@@ -49,12 +49,55 @@ func TestDynamic(t *testing.T) {
test: func(t *testing.T) {
s := &struct{ Foo map[string]string }{}
c := newCmd([]string{"--foo-bar", "yuh"}, &s)
- c.Flags().DynamicString("foo-", "", "")
+ c.Flags().DynamicString("foo-", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, map[string]string{"bar": "yuh"}, s.Foo)
},
},
+ {
+ name: "dynamic with an array",
+ test: func(t *testing.T) {
+ s := &struct {
+ Foo map[string]map[string][]string
+ }{}
+ c := newCmd([]string{"--foo[0]-bar", "a b c"}, &s)
+ c.Flags().DynamicStringSlice("foo[]-bar", false, cli.FlagDoc{})
+ err := c.Execute()
+ require.NoError(t, err)
+ require.Equal(t, map[string]map[string][]string{
+ "[0]": {"bar": []string{"a", "b", "c"}},
+ }, s.Foo)
+ },
+ },
+ {
+ name: "dynamic with an array and explode",
+ test: func(t *testing.T) {
+ s := &struct {
+ Foo map[string]map[string][]string
+ }{}
+ c := newCmd([]string{"--foo[0]-bar", "a", "--foo[0]-bar", "b"}, &s)
+ c.Flags().DynamicStringSlice("foo[]-bar", true, cli.FlagDoc{})
+ err := c.Execute()
+ require.NoError(t, err)
+ require.Equal(t, map[string]map[string][]string{
+ "[0]": {"bar": []string{"a", "b"}},
+ }, s.Foo)
+ },
+ },
+ {
+ name: "int",
+ test: func(t *testing.T) {
+ s := &struct {
+ Foo []int
+ }{}
+ c := newCmd([]string{"--foo[0]", "12"}, &s)
+ c.Flags().DynamicInt("foo[]", cli.FlagDoc{})
+ err := c.Execute()
+ require.NoError(t, err)
+ require.Equal(t, []int{12}, s.Foo)
+ },
+ },
}
for _, tc := range testcases {
diff --git a/pkg/cli/file.go b/pkg/cli/file.go
index b35f8fc64..3c2669a90 100644
--- a/pkg/cli/file.go
+++ b/pkg/cli/file.go
@@ -3,71 +3,90 @@ package cli
import (
"encoding/json"
"fmt"
- "golang.org/x/text/cases"
- "golang.org/x/text/language"
- "gopkg.in/yaml.v3"
"os"
"path/filepath"
"reflect"
+ "strings"
+
+ "golang.org/x/text/cases"
+ "golang.org/x/text/language"
+ "gopkg.in/yaml.v3"
)
var (
- searchPaths = []string{".", "/etc/mokapi"}
- fileNames = []string{"mokapi.yaml", "mokapi.yml", "mokapi.json"}
+ supportedExts = []string{".yaml", ".yml", ".json"}
)
-type ReadFileFS func(path string) ([]byte, error)
+type FSReader interface {
+ ReadFile(name string) ([]byte, error)
+ FileExists(name string) bool
+}
+
+type FileReader struct{}
+
+func (r *FileReader) ReadFile(name string) ([]byte, error) {
+ return os.ReadFile(name)
+}
+
+func (r *FileReader) FileExists(name string) bool {
+ _, err := os.Stat(name)
+ if err != nil {
+ return false
+ }
+ return true
+}
-var readFile ReadFileFS = os.ReadFile
+var fileReader FSReader = &FileReader{}
-func SetReadFileFS(f ReadFileFS) {
- readFile = f
+func SetFileReader(r FSReader) {
+ fileReader = r
}
-func readConfigFileFromFlags(flags map[string][]string, element interface{}) (string, error) {
- var filename string
- if len(filename) == 0 {
- if val, ok := flags["configfile"]; ok {
- delete(flags, "configfile")
- filename = val[0]
- } else if val, ok := flags["config-file"]; ok {
- delete(flags, "config-file")
- filename = val[0]
- } else if val, ok := flags["cli-input"]; ok {
- delete(flags, "cli-input")
- filename = val[0]
- }
+func (c *Command) readConfigFile() error {
+ file := c.configFile
+ if file == "" {
+ file = c.findConfigFile()
}
- if len(filename) > 0 {
- err := readConfigFile(filename, element)
- return filename, err
+ if file == "" {
+ return nil
}
- for _, dir := range searchPaths {
- for _, name := range fileNames {
- path := filepath.Join(dir, name)
- if err := readConfigFile(path, element); err == nil {
- return path, nil
- } else if !os.IsNotExist(err) {
- return path, err
+ err := readConfigFile(file, c.Config)
+ if err != nil {
+ return fmt.Errorf("read config file '%s' failed: %w", file, err)
+ }
+
+ return mapConfigToFlags(c.Config, c.flags)
+}
+
+func (c *Command) findConfigFile() string {
+ name := c.configFileName
+ if name == "" {
+ name = strings.ToLower(c.Name)
+ }
+
+ for _, dir := range c.configPaths {
+ for _, ext := range supportedExts {
+ path := filepath.Join(dir, fmt.Sprintf("%s%s", name, ext))
+ if fileReader.FileExists(path) {
+ return path
}
}
}
-
- return "", nil
+ return ""
}
-func readConfigFile(path string, element interface{}) error {
- data, err := readFile(path)
+func readConfigFile(path string, config any) error {
+ data, err := fileReader.ReadFile(path)
if err != nil {
return err
}
switch filepath.Ext(path) {
case ".yaml", ".yml":
- err = unmarshalYaml(data, reflect.ValueOf(element))
+ err = unmarshalYaml(data, config)
case ".json":
- err = unmarshalJson(data, reflect.ValueOf(element))
+ err = unmarshalJson(data, config)
default:
err = fmt.Errorf("unsupported file extension: %v", filepath.Ext(path))
}
@@ -78,61 +97,141 @@ func readConfigFile(path string, element interface{}) error {
return nil
}
-func unmarshalYaml(b []byte, element reflect.Value) error {
+func mapConfigToFlags(config any, flags *FlagSet) error {
+ return mapValueToFlags(reflect.ValueOf(config), "", flags)
+}
+
+func mapValueToFlags(v reflect.Value, key string, flags *FlagSet) error {
+ switch v.Kind() {
+ case reflect.Ptr:
+ return mapValueToFlags(v.Elem(), key, flags)
+ case reflect.Struct:
+ t := v.Type()
+ for i := 0; i < v.NumField(); i++ {
+ field := t.Field(i)
+ if !field.IsExported() {
+ continue
+ }
+
+ name := strings.ToLower(field.Name)
+ tag := field.Tag.Get("name")
+ if tag != "" {
+ name = strings.Split(tag, ",")[0]
+ } else {
+ tag = field.Tag.Get("flag")
+ if tag != "" {
+ name = strings.Split(tag, ",")[0]
+ }
+ }
+ if name == "-" {
+ continue
+ }
+ if key != "" {
+ name = key + "-" + name
+ }
+
+ err := mapValueToFlags(v.Field(i), name, flags)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+ case reflect.Slice:
+ if _, ok := flags.GetValue(key); ok {
+ var values []string
+ for i := 0; i < v.Len(); i++ {
+ values = append(values, fmt.Sprintf("%v", v.Index(i)))
+ }
+ return flags.setValue(key, values, SourceFile)
+ }
+ for i := 0; i < v.Len(); i++ {
+ err := mapValueToFlags(v.Index(i), fmt.Sprintf("%s[%v]", key, i), flags)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+ case reflect.Map:
+ for _, k := range v.MapKeys() {
+ err := mapValueToFlags(v.MapIndex(k), fmt.Sprintf("%s-%v", key, k.Interface()), flags)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+ default:
+ if canBeNil(v) && v.IsNil() {
+ return nil
+ }
+ return flags.setValue(key, []string{fmt.Sprintf("%v", v.Interface())}, SourceFile)
+ }
+}
+
+func canBeNil(v reflect.Value) bool {
+ switch v.Kind() {
+ case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
+ return true
+ default:
+ return false
+ }
+}
+
+func unmarshalYaml(b []byte, config any) error {
m := map[string]interface{}{}
err := yaml.Unmarshal(b, m)
if err != nil {
return err
}
- return mapConfig(m, element, "yaml")
+ return mapValueToConfig(m, reflect.ValueOf(config), "yaml")
}
-func unmarshalJson(b []byte, element reflect.Value) error {
+func unmarshalJson(b []byte, config any) error {
m := map[string]interface{}{}
err := json.Unmarshal(b, &m)
if err != nil {
return err
}
- return mapConfig(m, element, "json")
+ return mapValueToConfig(m, reflect.ValueOf(config), "json")
}
var caser = cases.Title(language.English)
-func mapConfig(value interface{}, element reflect.Value, format string) (err error) {
+func mapValueToConfig(value interface{}, configElement reflect.Value, format string) (err error) {
defer func() {
r := recover()
if r != nil {
- err = fmt.Errorf("cannot unmarshal %v into %v", toTypeName(reflect.ValueOf(value)), toTypeName(element))
+ err = fmt.Errorf("cannot unmarshal %v into %v", toTypeName(reflect.ValueOf(value)), toTypeName(configElement))
}
}()
- switch element.Type().Kind() {
+ switch configElement.Type().Kind() {
case reflect.Pointer:
- if element.IsNil() {
- element.Set(reflect.New(element.Type().Elem()))
+ if configElement.IsNil() {
+ configElement.Set(reflect.New(configElement.Type().Elem()))
}
- return mapConfig(value, element.Elem(), format)
+ return mapValueToConfig(value, configElement.Elem(), format)
case reflect.Bool, reflect.Int, reflect.Float64:
- element.Set(reflect.ValueOf(value))
+ configElement.Set(reflect.ValueOf(value))
case reflect.Int64:
switch i := value.(type) {
case int:
- element.SetInt(int64(i))
+ configElement.SetInt(int64(i))
case int64:
- element.SetInt(i)
+ configElement.SetInt(i)
default:
- return fmt.Errorf("cannot unmarshal %v into %v", toTypeName(reflect.ValueOf(value)), toTypeName(element))
+ return fmt.Errorf("cannot unmarshal %v into %v", toTypeName(reflect.ValueOf(value)), toTypeName(configElement))
}
case reflect.String:
if _, ok := value.(string); ok {
- t := element.Type()
+ t := configElement.Type()
if !reflect.TypeOf(value).AssignableTo(t) {
- element.Set(reflect.ValueOf(value).Convert(t))
+ configElement.Set(reflect.ValueOf(value).Convert(t))
} else {
- element.Set(reflect.ValueOf(value))
+ configElement.Set(reflect.ValueOf(value))
}
} else {
var b []byte
@@ -140,55 +239,58 @@ func mapConfig(value interface{}, element reflect.Value, format string) (err err
if err != nil {
return
}
- element.Set(reflect.ValueOf(string(b)))
+ configElement.Set(reflect.ValueOf(string(b)))
}
case reflect.Slice:
v := reflect.ValueOf(value)
if v.Type().Kind() != reflect.Slice {
- ptr := reflect.New(element.Type().Elem())
- err = mapConfig(value, ptr.Elem(), format)
+ ptr := reflect.New(configElement.Type().Elem())
+ err = mapValueToConfig(value, ptr.Elem(), format)
if err != nil {
return
}
- element.Set(reflect.Append(element, ptr.Elem()))
+ configElement.Set(reflect.Append(configElement, ptr.Elem()))
} else {
- arr, ok := value.([]interface{})
+ arr, ok := value.([]any)
if !ok {
return fmt.Errorf("expected array, got: %v", value)
}
+ configElement.Set(reflect.Zero(configElement.Type()))
for _, item := range arr {
- err = mapConfig(item, element, format)
+ err = mapValueToConfig(item, configElement, format)
if err != nil {
return
}
}
}
case reflect.Struct:
- m, ok := value.(map[string]interface{})
+ m, ok := value.(map[string]any)
if !ok {
+ i := configElement.Interface()
+ _ = i
return fmt.Errorf("expected object structure, got: %v", value)
}
for k, v := range m {
- f := getFieldByTag(element, k, format)
+ f := getFieldByTag(configElement, k, format)
if f.IsValid() {
- err = mapConfig(v, f, format)
+ err = mapValueToConfig(v, f, format)
if err != nil {
return
}
continue
}
name := caser.String(k)
- f = element.FieldByNameFunc(func(f string) bool { return f == name })
+ f = configElement.FieldByNameFunc(func(f string) bool { return f == name })
if f.IsValid() {
- err = mapConfig(v, f, format)
+ err = mapValueToConfig(v, f, format)
if err != nil {
return
}
continue
}
- f = getFieldByTag(element, k, "explode")
+ f = getFieldByTag(configElement, k, "explode")
if f.IsValid() {
- err = mapConfig(v, f, format)
+ err = mapValueToConfig(v, f, format)
if err != nil {
return
}
@@ -199,19 +301,19 @@ func mapConfig(value interface{}, element reflect.Value, format string) (err err
if !ok {
return fmt.Errorf("expected object structure, got: %v", value)
}
- if element.IsNil() {
- element.Set(reflect.MakeMap(element.Type()))
+ if configElement.IsNil() {
+ configElement.Set(reflect.MakeMap(configElement.Type()))
}
for k, v := range m {
- ptr := reflect.New(element.Type().Elem())
- err = mapConfig(v, ptr.Elem(), format)
+ ptr := reflect.New(configElement.Type().Elem())
+ err = mapValueToConfig(v, ptr.Elem(), format)
if err != nil {
return
}
- element.SetMapIndex(reflect.ValueOf(k), ptr.Elem())
+ configElement.SetMapIndex(reflect.ValueOf(k), ptr.Elem())
}
default:
- return fmt.Errorf("type not supported: %v", element.Type().Kind())
+ return fmt.Errorf("type not supported: %v", configElement.Type().Kind())
}
return
diff --git a/pkg/cli/flag_bool.go b/pkg/cli/flag_bool.go
index f2c7c2abd..13275ff5b 100644
--- a/pkg/cli/flag_bool.go
+++ b/pkg/cli/flag_bool.go
@@ -5,10 +5,16 @@ import (
)
type boolFlag struct {
- value bool
+ value bool
+ isSet bool
+ source Source
}
-func (b *boolFlag) Set(values []string) error {
+func (b *boolFlag) Set(values []string, source Source) error {
+ if b.source > source {
+ return nil
+ }
+
if len(values) == 0 {
b.value = true
} else {
@@ -21,6 +27,8 @@ func (b *boolFlag) Set(values []string) error {
return fmt.Errorf("flag '%s' is not a bool", s)
}
}
+ b.isSet = true
+ b.source = source
return nil
}
@@ -28,24 +36,29 @@ func (b *boolFlag) Value() any {
return b.value
}
+func (b *boolFlag) IsSet() bool {
+ return b.isSet
+}
+
func (b *boolFlag) String() string {
return fmt.Sprintf("%v", b.value)
}
-func (fs *FlagSet) Bool(name string, defaultValue bool, usage string) {
- fs.BoolShort(name, "", defaultValue, usage)
+func (fs *FlagSet) Bool(name string, defaultValue bool, doc FlagDoc) *FlagBuilder {
+ return fs.BoolShort(name, "", defaultValue, doc)
}
-func (fs *FlagSet) BoolShort(name string, short string, defaultValue bool, usage string) {
+func (fs *FlagSet) BoolShort(name string, short string, defaultValue bool, doc FlagDoc) *FlagBuilder {
v := &boolFlag{value: defaultValue}
- f := &Flag{Value: &boolFlag{}, Name: name, Shorthand: short, Usage: usage, DefaultValue: v.String()}
+ f := &Flag{Value: v, Name: name, Shorthand: short, DefaultValue: defaultValue, FlagDoc: doc, Type: "bool"}
fs.setFlag(f)
+ return &FlagBuilder{flag: f}
}
func (fs *FlagSet) GetBool(name string) bool {
- v, err := fs.GetValue(name)
- if err != nil {
- panic(err)
+ v, ok := fs.GetValue(name)
+ if !ok {
+ panic(FlagNotFound{Name: name})
}
b, ok := v.(bool)
if !ok {
diff --git a/pkg/cli/flag_bool_test.go b/pkg/cli/flag_bool_test.go
new file mode 100644
index 000000000..a624fa6cb
--- /dev/null
+++ b/pkg/cli/flag_bool_test.go
@@ -0,0 +1,102 @@
+package cli_test
+
+import (
+ "mokapi/pkg/cli"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestFlagBool(t *testing.T) {
+ testcases := []struct {
+ name string
+ cmd func() *cli.Command
+ args []string
+ test func(t *testing.T, cmd *cli.Command, args []string, err error)
+ }{
+ {
+ name: "--foo",
+ cmd: func() *cli.Command {
+ c := &cli.Command{}
+ c.Flags().Bool("foo", false, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--foo"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, true, cmd.Flags().GetBool("foo"))
+ },
+ },
+ {
+ name: "default is used",
+ cmd: func() *cli.Command {
+ c := &cli.Command{}
+ c.Flags().Bool("foo", true, cli.FlagDoc{})
+ return c
+ },
+ args: []string{""},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, true, cmd.Flags().GetBool("foo"))
+ },
+ },
+ {
+ name: "--no-foo",
+ cmd: func() *cli.Command {
+ c := &cli.Command{}
+ c.Flags().Bool("foo", true, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--no-foo"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, false, cmd.Flags().GetBool("foo"))
+ },
+ },
+ {
+ name: "--no-foo false",
+ cmd: func() *cli.Command {
+ c := &cli.Command{}
+ c.Flags().Bool("foo", true, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--no-foo false"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, true, cmd.Flags().GetBool("foo"))
+ },
+ },
+ {
+ name: "--no-foo=false",
+ cmd: func() *cli.Command {
+ c := &cli.Command{}
+ c.Flags().Bool("foo", true, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--no-foo=false"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, true, cmd.Flags().GetBool("foo"))
+ },
+ },
+ }
+
+ for _, tc := range testcases {
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ var cmd *cli.Command
+ var args []string
+ root := tc.cmd()
+ root.SetArgs(tc.args)
+ root.Run = func(c *cli.Command, a []string) error {
+ cmd = c
+ args = a
+ return nil
+ }
+
+ err := root.Execute()
+
+ tc.test(t, cmd, args, err)
+ })
+ }
+}
diff --git a/pkg/cli/flag_file.go b/pkg/cli/flag_file.go
index 12ddf5d90..de0f9b2b6 100644
--- a/pkg/cli/flag_file.go
+++ b/pkg/cli/flag_file.go
@@ -3,12 +3,21 @@ package cli
import "fmt"
type fileFlag struct {
- value string
+ value string
+ isSet bool
+ setConfigFile func(string)
+ source Source
}
-func (f *fileFlag) Set(values []string) error {
+func (f *fileFlag) Set(values []string, source Source) error {
+ if f.source > source {
+ return nil
+ }
+
if len(values) > 0 {
f.value = values[0]
+ f.setConfigFile(f.value)
+ f.source = source
}
return nil
}
@@ -17,24 +26,17 @@ func (f *fileFlag) Value() any {
return f.value
}
+func (f *fileFlag) IsSet() bool {
+ return f.isSet
+}
+
func (f *fileFlag) String() string {
return fmt.Sprintf("%v", f.value)
}
-func (fs *FlagSet) File(name string, defaultValue string, usage string) {
- v := &fileFlag{value: defaultValue}
- f := &Flag{Name: name, Value: &boolFlag{}, Usage: usage, DefaultValue: v.String()}
+func (fs *FlagSet) File(name string, doc FlagDoc) *FlagBuilder {
+ v := &fileFlag{setConfigFile: fs.setConfigFile}
+ f := &Flag{Name: name, Value: v, FlagDoc: doc, Type: "file"}
fs.setFlag(f)
-}
-
-func (fs *FlagSet) GetFile(name string) string {
- v, err := fs.GetValue(name)
- if err != nil {
- panic(err)
- }
- s, ok := v.(string)
- if !ok {
- panic(fmt.Sprintf("flag '%s' is not a file", name))
- }
- return s
+ return &FlagBuilder{flag: f}
}
diff --git a/pkg/cli/flag_file_test.go b/pkg/cli/flag_file_test.go
index fd01b6560..45f32537e 100644
--- a/pkg/cli/flag_file_test.go
+++ b/pkg/cli/flag_file_test.go
@@ -1,9 +1,8 @@
package cli_test
import (
- "fmt"
- "io/fs"
"mokapi/pkg/cli"
+ "mokapi/pkg/cli/clitest"
"os"
"path/filepath"
"testing"
@@ -13,7 +12,7 @@ import (
func TestFileDecoder_Decode(t *testing.T) {
newCmd := func(args []string, cfg any) *cli.Command {
- c := &cli.Command{EnvPrefix: "Mokapi_"}
+ c := &cli.Command{Name: "foo"}
c.SetArgs(args)
c.Config = cfg
c.Run = func(cmd *cli.Command, args []string) error {
@@ -27,43 +26,39 @@ func TestFileDecoder_Decode(t *testing.T) {
test func(t *testing.T)
}{
{
- name: "file in folder mokapi in etc",
+ name: "read existing file",
test: func(t *testing.T) {
s := &struct{ Name string }{}
- f := func(path string) ([]byte, error) {
- // if test is executed on windows we get second path
- if path == "/etc/mokapi/mokapi.yaml" || path == "\\etc\\mokapi\\mokapi.yaml" {
- return []byte("name: foobar"), nil
- }
- return nil, fs.ErrNotExist
- }
- cli.SetReadFileFS(f)
+ cli.SetFileReader(&clitest.TestFileReader{Files: map[string][]byte{
+ "/etc/foo/foo.yaml": []byte("name: foobar"),
+ }})
c := newCmd([]string{}, &s)
- c.Flags().String("name", "", "")
+ c.SetConfigPath("/etc/foo")
+ c.Flags().String("name", "", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, "foobar", s.Name)
},
},
{
- name: "file does not exist",
+ name: "file does not exist should not return error when not file flag is set",
test: func(t *testing.T) {
s := &struct{ Name string }{}
- f := func(path string) ([]byte, error) { return []byte(""), fmt.Errorf("file not found") }
- cli.SetReadFileFS(f)
+ cli.SetFileReader(&clitest.TestFileReader{Files: map[string][]byte{}})
c := newCmd([]string{}, &s)
+ c.SetConfigPath("/etc/foo")
err := c.Execute()
- require.Error(t, err)
+ require.NoError(t, err)
},
},
{
name: "empty file",
test: func(t *testing.T) {
s := &struct{ Name string }{}
- f := func(path string) ([]byte, error) { return []byte(""), nil }
- cli.SetReadFileFS(f)
+ cli.SetFileReader(&clitest.TestFileReader{Files: map[string][]byte{"/etc/foo": []byte("")}})
c := newCmd([]string{}, &s)
- c.Flags().String("name", "", "")
+ c.SetConfigPath("/etc/foo")
+ c.Flags().String("name", "", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
},
@@ -71,28 +66,40 @@ func TestFileDecoder_Decode(t *testing.T) {
{
name: "yaml schema error",
test: func(t *testing.T) {
- s := &struct{ Name int }{}
- f := func(path string) ([]byte, error) { return []byte("name: {}"), nil }
- cli.SetReadFileFS(f)
+ s := &struct{ Count string }{}
+ cli.SetFileReader(&clitest.TestFileReader{Files: map[string][]byte{"/etc/foo.yaml": []byte("count: foo")}})
c := newCmd([]string{}, &s)
- c.Flags().String("name", "", "")
+ c.SetConfigPath("/etc")
+ c.Flags().Int("count", 0, cli.FlagDoc{})
err := c.Execute()
- require.EqualError(t, err, "parse file 'mokapi.yaml' failed: cannot unmarshal object into int")
+ require.EqualError(t, err, "failed to set flag count: parsing foo: invalid syntax")
},
},
{
- name: "temp file with data",
+ name: "use file flag",
test: func(t *testing.T) {
s := &struct{ Name string }{}
path := createTempFile(t, "test.yml", "name: foobar")
c := newCmd([]string{"--config-file", path}, s)
- c.Flags().String("name", "", "")
+ c.Flags().String("name", "", cli.FlagDoc{})
+ c.Flags().File("config-file", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, "foobar", s.Name)
},
},
+ {
+ name: "file does not exist should return error when file flag is set",
+ test: func(t *testing.T) {
+ s := &struct{ Name string }{}
+ cli.SetFileReader(&clitest.TestFileReader{Files: map[string][]byte{}})
+ c := newCmd([]string{"--config-file", "/etc/foo.yaml"}, s)
+ c.Flags().File("config-file", cli.FlagDoc{})
+ err := c.Execute()
+ require.EqualError(t, err, "read config file '/etc/foo.yaml' failed: file does not exist")
+ },
+ },
{
name: "pascal case",
test: func(t *testing.T) {
@@ -101,8 +108,8 @@ func TestFileDecoder_Decode(t *testing.T) {
}{}
path := createTempFile(t, "test.yml", "installDir: foobar")
c := newCmd([]string{"--config-file", path}, s)
- c.Flags().String("install-dir", "", "")
-
+ c.Flags().String("install-dir", "", cli.FlagDoc{})
+ c.Flags().File("config-file", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, "foobar", s.InstallDir)
@@ -116,8 +123,8 @@ func TestFileDecoder_Decode(t *testing.T) {
}{}
path := createTempFile(t, "test.yml", "values: {foo: bar}")
c := newCmd([]string{"--config-file", path}, s)
- c.Flags().DynamicString("values-", "", "")
-
+ c.Flags().DynamicString("values-", cli.FlagDoc{})
+ c.Flags().File("config-file", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, map[string]string{"foo": "bar"}, s.Values)
@@ -131,8 +138,8 @@ func TestFileDecoder_Decode(t *testing.T) {
}{}
path := createTempFile(t, "test.yml", "key: [bar]")
c := newCmd([]string{"--config-file", path}, s)
- c.Flags().DynamicString("key[]", "", "")
-
+ c.Flags().DynamicString("key[]", cli.FlagDoc{})
+ c.Flags().File("config-file", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, []string{"bar"}, s.Key)
@@ -146,8 +153,8 @@ func TestFileDecoder_Decode(t *testing.T) {
}{}
path := createTempFile(t, "test.yml", "values: {foo: [bar]}")
c := newCmd([]string{"--config-file", path}, s)
- c.Flags().DynamicString("values-[]", "", "")
-
+ c.Flags().DynamicString("values-[]", cli.FlagDoc{})
+ c.Flags().File("config-file", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, map[string][]string{"foo": {"bar"}}, s.Values)
@@ -165,9 +172,9 @@ func TestFileDecoder_Decode(t *testing.T) {
}{}
path := createTempFile(t, "test.yml", "values: {foo: {name: Bob, foo: bar}}")
c := newCmd([]string{"--config-file", path}, s)
- c.Flags().DynamicString("values--name", "", "")
- c.Flags().DynamicString("values--foo", "", "")
-
+ c.Flags().DynamicString("values--name", cli.FlagDoc{})
+ c.Flags().DynamicString("values--foo", cli.FlagDoc{})
+ c.Flags().File("config-file", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, "Bob", s.Values["foo"].Name)
@@ -186,9 +193,9 @@ func TestFileDecoder_Decode(t *testing.T) {
}{}
path := createTempFile(t, "test.yml", "values: {foo: {name: Bob, foo: bar}}")
c := newCmd([]string{"--config-file", path}, s)
- c.Flags().DynamicString("values--name", "", "")
- c.Flags().DynamicString("values--foo", "", "")
-
+ c.Flags().DynamicString("values--name", cli.FlagDoc{})
+ c.Flags().DynamicString("values--foo", cli.FlagDoc{})
+ c.Flags().File("config-file", cli.FlagDoc{})
err := c.Execute()
require.NoError(t, err)
require.Equal(t, "Bob", s.Values["foo"].Name)
@@ -200,7 +207,7 @@ func TestFileDecoder_Decode(t *testing.T) {
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
defer func() {
- cli.SetReadFileFS(os.ReadFile)
+ cli.SetFileReader(&cli.FileReader{})
}()
tc.test(t)
diff --git a/pkg/cli/flag_float.go b/pkg/cli/flag_float.go
index 9b3bd7421..3c9c7d7cc 100644
--- a/pkg/cli/flag_float.go
+++ b/pkg/cli/flag_float.go
@@ -6,10 +6,16 @@ import (
)
type floatFlag struct {
- value float64
+ value float64
+ isSet bool
+ source Source
}
-func (f *floatFlag) Set(values []string) error {
+func (f *floatFlag) Set(values []string, source Source) error {
+ if f.source > source {
+ return nil
+ }
+
if len(values) != 1 {
return fmt.Errorf("expected 1 value, got %d", len(values))
}
@@ -20,6 +26,8 @@ func (f *floatFlag) Set(values []string) error {
return err
}
f.value = v
+ f.isSet = true
+ f.source = source
return nil
}
@@ -27,24 +35,29 @@ func (f *floatFlag) Value() any {
return f.value
}
+func (f *floatFlag) IsSet() bool {
+ return f.isSet
+}
+
func (f *floatFlag) String() string {
return fmt.Sprintf("%f", f.value)
}
-func (fs *FlagSet) Float(name string, defaultValue float64, usage string) {
- fs.FloatShort(name, "", defaultValue, usage)
+func (fs *FlagSet) Float(name string, defaultValue float64, doc FlagDoc) *FlagBuilder {
+ return fs.FloatShort(name, "", defaultValue, doc)
}
-func (fs *FlagSet) FloatShort(name string, short string, defaultValue float64, usage string) {
+func (fs *FlagSet) FloatShort(name string, short string, defaultValue float64, doc FlagDoc) *FlagBuilder {
v := &floatFlag{value: defaultValue}
- f := &Flag{Name: name, Shorthand: short, Value: v, Usage: usage, DefaultValue: v.String()}
+ f := &Flag{Name: name, Shorthand: short, Value: v, DefaultValue: defaultValue, FlagDoc: doc, Type: "float"}
fs.setFlag(f)
+ return &FlagBuilder{flag: f}
}
func (fs *FlagSet) GetFloat(name string) float64 {
- v, err := fs.GetValue(name)
- if err != nil {
- panic(err)
+ v, ok := fs.GetValue(name)
+ if !ok {
+ panic(FlagNotFound{Name: name})
}
b, ok := v.(float64)
if !ok {
diff --git a/pkg/cli/flag_float_test.go b/pkg/cli/flag_float_test.go
new file mode 100644
index 000000000..81a42e9ac
--- /dev/null
+++ b/pkg/cli/flag_float_test.go
@@ -0,0 +1,70 @@
+package cli_test
+
+import (
+ "mokapi/pkg/cli"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestFlagFloat(t *testing.T) {
+ type config struct {
+ Foo float32
+ Bar float64
+ Any interface{}
+ }
+
+ testcases := []struct {
+ name string
+ cmd func() *cli.Command
+ args []string
+ test func(t *testing.T, cmd *cli.Command, args []string, err error)
+ }{
+ {
+ name: "float32 value",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Config: &config{}}
+ c.Flags().Float("foo", 0, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--foo 12.4"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, 12.4, cmd.Flags().GetFloat("foo"))
+ require.Equal(t, &config{Foo: 12.4}, cmd.Config)
+ },
+ },
+ {
+ name: "float64 value",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Config: &config{}}
+ c.Flags().Float("bar", 0, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--bar 12.4"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, 12.4, cmd.Flags().GetFloat("bar"))
+ require.Equal(t, &config{Bar: 12.4}, cmd.Config)
+ },
+ },
+ }
+ for _, tc := range testcases {
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ var cmd *cli.Command
+ var args []string
+ root := tc.cmd()
+ root.SetArgs(tc.args)
+ root.Run = func(c *cli.Command, a []string) error {
+ cmd = c
+ args = a
+ return nil
+ }
+
+ err := root.Execute()
+
+ tc.test(t, cmd, args, err)
+ })
+ }
+}
diff --git a/pkg/cli/flag_int.go b/pkg/cli/flag_int.go
index 60fbb823b..7d20693d3 100644
--- a/pkg/cli/flag_int.go
+++ b/pkg/cli/flag_int.go
@@ -1,15 +1,22 @@
package cli
import (
+ "errors"
"fmt"
"strconv"
)
type intFlag struct {
- value int
+ value int
+ isSet bool
+ source Source
}
-func (f *intFlag) Set(values []string) error {
+func (f *intFlag) Set(values []string, source Source) error {
+ if f.source > source {
+ return nil
+ }
+
if len(values) != 1 {
return fmt.Errorf("expected 1 value, got %d", len(values))
}
@@ -20,9 +27,12 @@ func (f *intFlag) Set(values []string) error {
s := values[0]
v, err := strconv.Atoi(s)
if err != nil {
- return err
+ err = errors.Unwrap(err)
+ return fmt.Errorf("parsing %s: %w", s, err)
}
f.value = v
+ f.isSet = true
+ f.source = source
return nil
}
@@ -30,24 +40,29 @@ func (f *intFlag) Value() any {
return f.value
}
+func (f *intFlag) IsSet() bool {
+ return f.isSet
+}
+
func (f *intFlag) String() string {
return fmt.Sprintf("%d", f.value)
}
-func (fs *FlagSet) Int(name string, defaultValue int, usage string) {
- fs.IntShort(name, "", defaultValue, usage)
+func (fs *FlagSet) Int(name string, defaultValue int, doc FlagDoc) *FlagBuilder {
+ return fs.IntShort(name, "", defaultValue, doc)
}
-func (fs *FlagSet) IntShort(name string, short string, defaultValue int, usage string) {
+func (fs *FlagSet) IntShort(name string, short string, defaultValue int, doc FlagDoc) *FlagBuilder {
v := &intFlag{value: defaultValue}
- f := &Flag{Name: name, Shorthand: short, Value: v, Usage: usage, DefaultValue: v.String()}
+ f := &Flag{Name: name, Shorthand: short, Value: v, DefaultValue: defaultValue, FlagDoc: doc, Type: "int"}
fs.setFlag(f)
+ return &FlagBuilder{flag: f}
}
func (fs *FlagSet) GetInt(name string) int {
- v, err := fs.GetValue(name)
- if err != nil {
- panic(err)
+ v, ok := fs.GetValue(name)
+ if !ok {
+ panic(FlagNotFound{Name: name})
}
b, ok := v.(int)
if !ok {
diff --git a/pkg/cli/flag_int_test.go b/pkg/cli/flag_int_test.go
new file mode 100644
index 000000000..ae0b5ec8c
--- /dev/null
+++ b/pkg/cli/flag_int_test.go
@@ -0,0 +1,96 @@
+package cli_test
+
+import (
+ "mokapi/pkg/cli"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestFlagInt(t *testing.T) {
+ type config struct {
+ Foo int
+ Bar int64
+ Any interface{}
+ }
+
+ testcases := []struct {
+ name string
+ cmd func() *cli.Command
+ args []string
+ test func(t *testing.T, cmd *cli.Command, args []string, err error)
+ }{
+ {
+ name: "int value",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo", Config: &config{}}
+ c.Flags().Int("foo", 0, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--foo 12"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, 12, cmd.Flags().GetInt("foo"))
+ require.Equal(t, &config{Foo: 12}, cmd.Config)
+ },
+ },
+ {
+ name: "float value",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo", Config: &config{}}
+ c.Flags().Int("foo", 0, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--foo 12.4"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.EqualError(t, err, "failed to set flag foo: parsing 12.4: invalid syntax")
+ },
+ },
+ {
+ name: "bind to int64",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo", Config: &config{}}
+ c.Flags().Int("bar", 0, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--bar 12"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, 12, cmd.Flags().GetInt("bar"))
+ require.Equal(t, &config{Bar: 12}, cmd.Config)
+ },
+ },
+ {
+ name: "bind to interface{}",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo", Config: &config{}}
+ c.Flags().Int("any", 0, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--any 12"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, 12, cmd.Flags().GetInt("any"))
+ require.Equal(t, &config{Any: 12}, cmd.Config)
+ },
+ },
+ }
+ for _, tc := range testcases {
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ var cmd *cli.Command
+ var args []string
+ root := tc.cmd()
+ root.SetArgs(tc.args)
+ root.Run = func(c *cli.Command, a []string) error {
+ cmd = c
+ args = a
+ return nil
+ }
+
+ err := root.Execute()
+
+ tc.test(t, cmd, args, err)
+ })
+ }
+}
diff --git a/pkg/cli/flag_slice.go b/pkg/cli/flag_slice.go
index 408f41611..36a57aa69 100644
--- a/pkg/cli/flag_slice.go
+++ b/pkg/cli/flag_slice.go
@@ -8,14 +8,33 @@ import (
type stringSliceFlag struct {
value []string
explode bool
+ isSet bool
+ source Source
}
-func (f *stringSliceFlag) Set(values []string) error {
- if !f.explode && len(values) == 1 {
- f.value = splitArrayItems(values[0])
+func (f *stringSliceFlag) Set(values []string, source Source) error {
+ if f.source > source {
+ return nil
+ }
+
+ if !f.isSet {
+ f.value = nil
+ }
+
+ if len(values) == 1 {
+ if !f.explode {
+ values = splitArrayItems(values[0])
+ }
+ if len(values) == 1 {
+ f.value = append(f.value, values[0])
+ } else {
+ f.value = values
+ }
} else {
f.value = values
}
+ f.isSet = true
+ f.source = source
return nil
}
@@ -23,24 +42,29 @@ func (f *stringSliceFlag) Value() any {
return f.value
}
+func (f *stringSliceFlag) IsSet() bool {
+ return f.isSet
+}
+
func (f *stringSliceFlag) String() string {
return strings.Join(f.value, ",")
}
-func (fs *FlagSet) StringSlice(name string, defaultValue []string, usage string, explode bool) {
- fs.StringSliceShort(name, "", defaultValue, usage, explode)
+func (fs *FlagSet) StringSlice(name string, defaultValue []string, explode bool, doc FlagDoc) *FlagBuilder {
+ return fs.StringSliceShort(name, "", defaultValue, explode, doc)
}
-func (fs *FlagSet) StringSliceShort(name string, short string, defaultValue []string, usage string, explode bool) {
+func (fs *FlagSet) StringSliceShort(name string, short string, defaultValue []string, explode bool, doc FlagDoc) *FlagBuilder {
v := &stringSliceFlag{value: defaultValue, explode: explode}
- f := &Flag{Name: name, Shorthand: short, Value: v, Usage: usage, DefaultValue: v.String()}
+ f := &Flag{Name: name, Shorthand: short, Value: v, DefaultValue: defaultValue, FlagDoc: doc, Type: "list"}
fs.setFlag(f)
+ return &FlagBuilder{flag: f}
}
func (fs *FlagSet) GetStringSlice(name string) []string {
- v, err := fs.GetValue(name)
- if err != nil {
- panic(err)
+ v, ok := fs.GetValue(name)
+ if !ok {
+ panic(FlagNotFound{Name: name})
}
s, ok := v.([]string)
if !ok {
diff --git a/pkg/cli/flag_slice_test.go b/pkg/cli/flag_slice_test.go
new file mode 100644
index 000000000..3c9056645
--- /dev/null
+++ b/pkg/cli/flag_slice_test.go
@@ -0,0 +1,111 @@
+package cli_test
+
+import (
+ "mokapi/pkg/cli"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestFlagSlice(t *testing.T) {
+ type config struct {
+ Foo []string
+ Explodes []string `explode:"explode"`
+ }
+
+ testcases := []struct {
+ name string
+ cmd func() *cli.Command
+ args []string
+ test func(t *testing.T, cmd *cli.Command, args []string, err error)
+ }{
+ {
+ name: "no default",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo", Config: &config{}}
+ c.Flags().StringSlice("foo", nil, false, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--foo a b c"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, []string{"a", "b", "c"}, cmd.Flags().GetStringSlice("foo"))
+ require.Equal(t, &config{Foo: []string{"a", "b", "c"}}, cmd.Config)
+ },
+ },
+ {
+ name: "with default",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo", Config: &config{}}
+ c.Flags().StringSlice("foo", []string{"zzz"}, false, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--foo a b c"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, []string{"a", "b", "c"}, cmd.Flags().GetStringSlice("foo"))
+ require.Equal(t, &config{Foo: []string{"a", "b", "c"}}, cmd.Config)
+ },
+ },
+ {
+ name: "value should be split",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo", Config: &config{}}
+ c.Flags().StringSlice("foo", []string{"zzz"}, false, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--foo", "a,b,c"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, []string{"a", "b", "c"}, cmd.Flags().GetStringSlice("foo"))
+ require.Equal(t, &config{Foo: []string{"a", "b", "c"}}, cmd.Config)
+ },
+ },
+ {
+ name: "explode",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo", Config: &config{}}
+ c.Flags().StringSlice("foo", nil, true, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--foo", "a", "--foo", "b", "--foo", "c"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, []string{"a", "b", "c"}, cmd.Flags().GetStringSlice("foo"))
+ require.Equal(t, &config{Foo: []string{"a", "b", "c"}}, cmd.Config)
+ },
+ },
+ {
+ name: "explode tag",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Name: "foo", Config: &config{}}
+ c.Flags().StringSlice("explode", nil, true, cli.FlagDoc{})
+ return c
+ },
+ args: []string{"--explode", "a", "--explode", "b", "--explode", "c"},
+ test: func(t *testing.T, cmd *cli.Command, args []string, err error) {
+ require.NoError(t, err)
+ require.Equal(t, []string{"a", "b", "c"}, cmd.Flags().GetStringSlice("explode"))
+ require.Equal(t, &config{Explodes: []string{"a", "b", "c"}}, cmd.Config)
+ },
+ },
+ }
+ for _, tc := range testcases {
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ var cmd *cli.Command
+ var args []string
+ root := tc.cmd()
+ root.SetArgs(tc.args)
+ root.Run = func(c *cli.Command, a []string) error {
+ cmd = c
+ args = a
+ return nil
+ }
+
+ err := root.Execute()
+
+ tc.test(t, cmd, args, err)
+ })
+ }
+}
diff --git a/pkg/cli/flag_string.go b/pkg/cli/flag_string.go
index dc4ab8cb3..580559173 100644
--- a/pkg/cli/flag_string.go
+++ b/pkg/cli/flag_string.go
@@ -5,15 +5,23 @@ import (
)
type stringFlag struct {
- value string
+ value string
+ isSet bool
+ source Source
}
-func (f *stringFlag) Set(values []string) error {
+func (f *stringFlag) Set(values []string, source Source) error {
+ if f.source > source {
+ return nil
+ }
+
if len(values) != 1 {
return fmt.Errorf("expected 1 value, got %d", len(values))
}
f.value = values[0]
+ f.isSet = true
+ f.source = source
return nil
}
@@ -25,20 +33,23 @@ func (f *stringFlag) String() string {
return f.value
}
-func (fs *FlagSet) String(name string, defaultValue string, usage string) {
- fs.StringShort(name, "", defaultValue, usage)
+func (f *stringFlag) IsSet() bool { return f.isSet }
+
+func (fs *FlagSet) String(name string, defaultValue string, doc FlagDoc) *FlagBuilder {
+ return fs.StringShort(name, "", defaultValue, doc)
}
-func (fs *FlagSet) StringShort(name string, short string, defaultValue string, usage string) {
+func (fs *FlagSet) StringShort(name string, short string, defaultValue string, doc FlagDoc) *FlagBuilder {
v := &stringFlag{value: defaultValue}
- f := &Flag{Name: name, Shorthand: short, Value: v, Usage: usage, DefaultValue: defaultValue}
+ f := &Flag{Name: name, Shorthand: short, Value: v, DefaultValue: defaultValue, FlagDoc: doc, Type: "string"}
fs.setFlag(f)
+ return &FlagBuilder{flag: f}
}
func (fs *FlagSet) GetString(name string) string {
- v, err := fs.GetValue(name)
- if err != nil {
- panic(err)
+ v, ok := fs.GetValue(name)
+ if !ok {
+ panic(FlagNotFound{Name: name})
}
s, ok := v.(string)
if !ok {
diff --git a/pkg/cli/flag_string_test.go b/pkg/cli/flag_string_test.go
new file mode 100644
index 000000000..e9a0f62c3
--- /dev/null
+++ b/pkg/cli/flag_string_test.go
@@ -0,0 +1,61 @@
+package cli_test
+
+import (
+ "mokapi/pkg/cli"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestFlagString(t *testing.T) {
+ type config struct {
+ Foo string
+ }
+
+ testcases := []struct {
+ name string
+ args []string
+ test func(t *testing.T)
+ }{
+ {
+ name: "string value",
+ test: func(t *testing.T) {
+ c := cli.Command{Config: &config{}, Run: func(cmd *cli.Command, args []string) error {
+ return nil
+ }}
+ c.Flags().String("foo", "", cli.FlagDoc{})
+ c.SetArgs([]string{"--foo bar"})
+
+ err := c.Execute()
+
+ require.NoError(t, err)
+ require.Equal(t, "bar", c.Flags().GetString("foo"))
+ require.Equal(t, &config{Foo: "bar"}, c.Config)
+ },
+ },
+ {
+ name: "file",
+ test: func(t *testing.T) {
+ path := createTempFile(t, "test.yml", "foobar")
+
+ c := cli.Command{Config: &config{}, Run: func(cmd *cli.Command, args []string) error {
+ return nil
+ }}
+ c.Flags().String("foo", "", cli.FlagDoc{})
+ c.SetArgs([]string{"--foo file:" + path})
+
+ err := c.Execute()
+
+ require.NoError(t, err)
+ require.Equal(t, "file:"+path, c.Flags().GetString("foo"))
+ require.Equal(t, &config{Foo: "foobar"}, c.Config)
+ },
+ },
+ }
+ for _, tc := range testcases {
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ tc.test(t)
+ })
+ }
+}
diff --git a/pkg/cli/flags.go b/pkg/cli/flags.go
index 2a9b822c3..702bc7ea6 100644
--- a/pkg/cli/flags.go
+++ b/pkg/cli/flags.go
@@ -3,35 +3,62 @@ package cli
import (
"fmt"
"regexp"
+ "slices"
"strings"
)
+type Source int
+
+const (
+ SourceDefault Source = iota
+ SourceFile
+ SourceEnv
+ SourceCli
+)
+
+type SourceMap map[string]Source
+
type FlagSet struct {
- flags map[string]*Flag
- dynamic []*DynamicFlag
+ flags map[string]*Flag
+ dynamic []*DynamicFlag
+ orderedFlags map[string]int
+ setConfigFile func(string)
}
type Flag struct {
+ FlagDoc
+
Name string
Shorthand string
- Usage string
Value Value
- DefaultValue string
+ DefaultValue any
+ Aliases []string
+ Type string
}
type DynamicFlag struct {
Flag
- pattern *regexp.Regexp
+ Name string
+
+ pattern *regexp.Regexp
+ setValue func(name string, value []string, source Source) error
}
type FlagNotFound struct {
Name string
}
+type FlagDoc struct {
+ Short string
+ Long string
+ Examples []Example
+}
+
type Value interface {
- Set([]string) error
+ Set([]string, Source) error
Value() any
String() string
+ IsSet() bool
}
func (fs *FlagSet) setFlag(f *Flag) {
@@ -42,20 +69,31 @@ func (fs *FlagSet) setFlag(f *Flag) {
if f.Shorthand != "" {
fs.flags[f.Shorthand] = f
}
+ fs.orderedFlags[f.Name] = len(fs.flags)
}
-func (fs *FlagSet) setValue(name string, value []string) error {
+func (fs *FlagSet) setValue(name string, value []string, source Source) error {
// backwards compatibility
name = strings.ReplaceAll(name, ".", "-")
if fs.flags != nil {
f, ok := fs.flags[name]
if ok {
- return f.Value.Set(value)
+ err := f.Value.Set(value, source)
+ if err != nil {
+ return fmt.Errorf("failed to set flag %s: %w", name, err)
+ }
+ fs.orderedFlags[name] = len(fs.orderedFlags)
+ return nil
}
}
for _, flag := range fs.dynamic {
if flag.isValidFlag(name) {
- return flag.Value.Set(value)
+ err := flag.setValue(name, value, source)
+ if err != nil {
+ return fmt.Errorf("failed to set flag %s: %w", name, err)
+ }
+ fs.orderedFlags[name] = len(fs.orderedFlags)
+ return nil
}
}
return fmt.Errorf("unknown flag '%v'", name)
@@ -76,12 +114,80 @@ func (fs *FlagSet) IsValidFlag(name string) bool {
return false
}
-func (fs *FlagSet) GetValue(name string) (any, error) {
+func (fs *FlagSet) GetValue(name string) (any, bool) {
+ f, ok := fs.flags[name]
+ if !ok {
+ return nil, false
+ }
+ return f.Value.Value(), true
+}
+
+func (fs *FlagSet) Alias(name, alias string) {
f, ok := fs.flags[name]
if !ok {
- return nil, &FlagNotFound{Name: name}
+ panic(fmt.Sprintf("flag '%v' does not exist", name))
}
- return f.Value.Value(), nil
+ fs.flags[alias] = f
+ f.Aliases = append(f.Aliases, alias)
+}
+
+func (fs *FlagSet) Visit(fn func(*Flag) error) error {
+ flags := make([]*Flag, 0, len(fs.flags))
+ for _, flag := range fs.flags {
+ flags = append(flags, flag)
+ }
+ // 1. unused flags first, 2. flags in order of set
+ slices.SortStableFunc(flags, func(f1, f2 *Flag) int {
+ if f1.Value.IsSet() != f2.Value.IsSet() {
+ if !f1.Value.IsSet() {
+ return -1
+ }
+ return 1
+ }
+ if d := fs.orderedFlags[f1.Name] - fs.orderedFlags[f2.Name]; d != 0 {
+ return d
+ }
+ return strings.Compare(f1.Name, f2.Name)
+ })
+ for _, flag := range flags {
+ err := fn(flag)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// VisitAll in lexicographical order
+func (fs *FlagSet) VisitAll(fn func(*Flag) error) error {
+ flags := make([]*Flag, 0, len(fs.flags)+len(fs.dynamic))
+ for _, flag := range fs.flags {
+ flags = append(flags, flag)
+ }
+ for _, dyn := range fs.dynamic {
+ f := dyn.Flag
+ f.Name = dyn.Name
+ flags = append(flags, &f)
+ }
+ // 1. unused flags first, 2. flags in order of set
+ slices.SortStableFunc(flags, func(f1, f2 *Flag) int {
+ return strings.Compare(f1.Name, f2.Name)
+ })
+ for _, flag := range flags {
+ err := fn(flag)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (fs *FlagSet) Lookup(name string) *Flag {
+ return fs.flags[name]
+}
+
+func (fs *FlagSet) Len() int {
+ return len(fs.flags)
}
func (d *DynamicFlag) isValidFlag(flag string) bool {
@@ -91,3 +197,34 @@ func (d *DynamicFlag) isValidFlag(flag string) bool {
func (e *FlagNotFound) Error() string {
return fmt.Sprintf("flag '%s' not found", e.Name)
}
+
+type Example struct {
+ Title string
+ Description string
+ Codes []Code
+}
+
+type Code struct {
+ Title string
+ Source string
+ Language string
+}
+
+type FlagBuilder struct {
+ flag *Flag
+}
+
+func (b *FlagBuilder) WithDoc(doc FlagDoc) *FlagBuilder {
+ b.flag.FlagDoc = doc
+ return b
+}
+
+func (b *FlagBuilder) WithExample(example ...Example) *FlagBuilder {
+ b.flag.Examples = append(b.flag.Examples, example...)
+ return b
+}
+
+func (b *FlagBuilder) WithDescription(description string) *FlagBuilder {
+ b.flag.Long = description
+ return b
+}
diff --git a/pkg/cli/help.go b/pkg/cli/help.go
new file mode 100644
index 000000000..9dcbedc4a
--- /dev/null
+++ b/pkg/cli/help.go
@@ -0,0 +1,65 @@
+package cli
+
+import (
+ "fmt"
+ "os"
+ "strings"
+)
+
+func (c *Command) printHelp() {
+ w := c.output
+ if c.output == nil {
+ w = os.Stdout
+ }
+
+ if c.Long != "" {
+ _, _ = fmt.Fprintf(w, "\n\n%s\n", c.Long)
+ } else if c.Short != "" {
+ _, _ = fmt.Fprintf(w, "\n\n%s\n", c.Short)
+ }
+ if c.Use != "" {
+ _, _ = fmt.Fprintf(w, "\nUsage:\n %s\n", c.Use)
+ }
+
+ flags := c.Flags()
+ if flags.Len() > 0 {
+ _, _ = fmt.Fprintf(w, "\nFlags:")
+
+ maxNameLen, hasShort := flagsInfo(flags)
+ _ = flags.Visit(func(flag *Flag) error {
+
+ _, _ = fmt.Fprintln(w)
+ if hasShort {
+ short := flag.Shorthand
+ if short != "" {
+ short = fmt.Sprintf("-%s,", short)
+ } else {
+ short = strings.Repeat(" ", 3)
+ }
+ _, _ = fmt.Fprintf(w, " %s", short)
+ }
+ _, _ = fmt.Fprintf(w, " --%s", flag.Name)
+ if flag.Short != "" {
+ space := strings.Repeat(" ", maxNameLen-len(flag.Name))
+ _, _ = fmt.Fprintf(w, " %s %s", space, flag.Short)
+ }
+ _, _ = fmt.Fprintln(w)
+ return nil
+ })
+ }
+}
+
+func flagsInfo(flags *FlagSet) (int, bool) {
+ maxNameLen := 0
+ hasShort := false
+ _ = flags.Visit(func(f *Flag) error {
+ if len(f.Name) > maxNameLen {
+ maxNameLen = len(f.Name)
+ }
+ if f.Shorthand != "" {
+ hasShort = true
+ }
+ return nil
+ })
+ return maxNameLen, hasShort
+}
diff --git a/pkg/cli/help_test.go b/pkg/cli/help_test.go
new file mode 100644
index 000000000..0d7321250
--- /dev/null
+++ b/pkg/cli/help_test.go
@@ -0,0 +1,55 @@
+package cli_test
+
+import (
+ "mokapi/pkg/cli"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestHelp(t *testing.T) {
+ testcases := []struct {
+ name string
+ cmd *cli.Command
+ test func(t *testing.T, out string)
+ }{
+ {
+ name: "no flags",
+ cmd: func() *cli.Command {
+ c := &cli.Command{}
+ return c
+ }(),
+ test: func(t *testing.T, out string) {
+ require.Equal(t, "\nFlags:\n --help Show help information and exit\n", out)
+ },
+ },
+ {
+ name: "Long description",
+ cmd: func() *cli.Command {
+ c := &cli.Command{Long: "Long Description"}
+ return c
+ }(),
+ test: func(t *testing.T, out string) {
+ require.Equal(t, "\n\nLong Description\n\nFlags:\n --help Show help information and exit\n", out)
+ },
+ },
+ }
+
+ t.Parallel()
+ for _, tc := range testcases {
+ t.Run(tc.name, func(t *testing.T) {
+ t.Parallel()
+
+ root := tc.cmd
+ root.SetArgs([]string{"--help"})
+ var sb strings.Builder
+ root.SetOutput(&sb)
+
+ err := root.Execute()
+ require.NoError(t, err)
+
+ tc.test(t, sb.String())
+ })
+ }
+}
diff --git a/pkg/cli/parse.go b/pkg/cli/parse.go
index c816d0cd8..491299003 100644
--- a/pkg/cli/parse.go
+++ b/pkg/cli/parse.go
@@ -6,48 +6,28 @@ import (
"strings"
)
-func parseFlags(args []string, envNamePrefix string, isValidFlag func(name string) bool) (map[string][]string, error) {
- flags, err := parseArgs(args)
- if err != nil {
- return nil, err
- }
-
- envs := parseEnv(os.Environ(), envNamePrefix)
- // merge maps. env flags does not overwrite cli flags
- for k, v := range envs {
- if _, ok := flags[k]; !ok {
- if !isValidFlag(k) {
- return nil, fmt.Errorf("unknown environment variable '%s' (value '%s')", k, v)
+func parseFlags(args []string, envNamePrefix string, flags *FlagSet) ([]string, error) {
+ // env vars
+ if envNamePrefix != "" {
+ for _, s := range os.Environ() {
+ kv := strings.SplitN(s, "=", 2)
+ if strings.HasPrefix(strings.ToUpper(kv[0]), envNamePrefix) {
+ key := strings.Replace(kv[0], envNamePrefix, "", 1)
+ name := strings.ReplaceAll(strings.ToLower(key), "_", "-")
+ if err := flags.setValue(name, []string{kv[1]}, SourceEnv); err != nil {
+ return nil, fmt.Errorf("unknown environment variable '%s' (value '%s')", kv[0], kv[1])
+ }
}
- flags[k] = []string{v}
}
}
- return flags, nil
-}
-
-func parseEnv(environ []string, envNamePrefix string) map[string]string {
- dictionary := make(map[string]string)
-
- for _, s := range environ {
- kv := strings.SplitN(s, "=", 2)
- if strings.HasPrefix(strings.ToUpper(kv[0]), envNamePrefix) {
- key := strings.Replace(kv[0], envNamePrefix, "", 1)
- name := strings.ReplaceAll(strings.ToLower(key), "_", "-")
- dictionary[name] = kv[1]
- }
- }
-
- return dictionary
-}
-
-func parseArgs(args []string) (map[string][]string, error) {
- dictionary := make(map[string][]string)
+ // CLI args
inPositionalArgs := false
+ var positionalArgs []string
for i := 0; i < len(args); i++ {
s := args[i]
if len(s) < 2 || s[0] != '-' {
- dictionary["args"] = append(dictionary["args"], s)
+ positionalArgs = append(positionalArgs, s)
continue
} else if inPositionalArgs {
// currently, no positional argument with prefix -- are defined
@@ -79,12 +59,22 @@ func parseArgs(args []string) (map[string][]string, error) {
name = name[0:i]
hasValue = true
break
+ } else if name[i] == ' ' {
+ value = name[i+1:]
+ name = name[0:i]
+ break
}
}
param := strings.ToLower(name)
if hasValue {
- dictionary[param] = append(dictionary[param], value)
+ if strings.HasPrefix(param, "no-") {
+ param, value = normalizeNoFlags(param, value)
+ }
+
+ if err := flags.setValue(param, []string{value}, SourceCli); err != nil {
+ return nil, err
+ }
continue
}
@@ -95,13 +85,30 @@ func parseArgs(args []string) (map[string][]string, error) {
break
}
value = args[i]
- dictionary[param] = append(dictionary[param], value)
}
- if len(dictionary[param]) == 0 {
- dictionary[param] = append(dictionary[param], "")
+ if strings.HasPrefix(param, "no-") {
+ param, value = normalizeNoFlags(param, value)
+ }
+
+ if err := flags.setValue(param, []string{value}, SourceCli); err != nil {
+ return nil, err
}
}
- return dictionary, nil
+ return positionalArgs, nil
+}
+
+func normalizeNoFlags(param, value string) (string, string) {
+ param = strings.TrimPrefix(param, "no-")
+ if value != "" {
+ if value == "true" {
+ value = "false"
+ } else {
+ value = "true"
+ }
+ } else {
+ value = "false"
+ }
+ return param, value
}
diff --git a/pkg/cmd/mokapi/config-file_test.go b/pkg/cmd/mokapi/config-file_test.go
new file mode 100644
index 000000000..292a084d1
--- /dev/null
+++ b/pkg/cmd/mokapi/config-file_test.go
@@ -0,0 +1,72 @@
+package mokapi_test
+
+import (
+ "mokapi/config/static"
+ "mokapi/pkg/cli"
+ "mokapi/pkg/cmd/mokapi"
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+type testFileReader struct {
+ files map[string][]byte
+}
+
+func (t *testFileReader) ReadFile(name string) ([]byte, error) {
+ if b, ok := t.files[name]; ok {
+ return b, nil
+ }
+ // if test is executed on windows we get second path
+ name = strings.ReplaceAll(name, "\\", "/")
+ if b, ok := t.files[name]; ok {
+ return b, nil
+ }
+ return nil, os.ErrNotExist
+}
+
+func (t *testFileReader) FileExists(name string) bool {
+ if _, ok := t.files[name]; ok {
+ return true
+ }
+ name = strings.ReplaceAll(name, "\\", "/")
+ _, ok := t.files[name]
+ return ok
+}
+
+func TestFileDecoder_Decode(t *testing.T) {
+ newCmd := func(args []string) *cli.Command {
+ c := mokapi.NewCmdMokapi()
+ c.SetArgs(args)
+ c.Run = func(cmd *cli.Command, args []string) error {
+ return nil
+ }
+ return c
+ }
+
+ testcases := []struct {
+ name string
+ test func(t *testing.T)
+ }{
+ {
+ name: "--config-file",
+ test: func(t *testing.T) {
+ path := createTempFile(t, "test.yml", "")
+
+ c := newCmd([]string{"--config-file", path})
+ err := c.Execute()
+ cfg := c.Config.(*static.Config)
+ require.NoError(t, err)
+ require.Equal(t, path, cfg.ConfigFile)
+ },
+ },
+ }
+
+ for _, tc := range testcases {
+ t.Run(tc.name, func(t *testing.T) {
+ tc.test(t)
+ })
+ }
+}
diff --git a/pkg/cmd/mokapi/flags/api.go b/pkg/cmd/mokapi/flags/api.go
new file mode 100644
index 000000000..9bb12ae49
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/api.go
@@ -0,0 +1,86 @@
+package flags
+
+import "mokapi/pkg/cli"
+
+func RegisterApiFlags(cmd *cli.Command) {
+ cmd.Flags().Int("api-port", 8080, apiPort)
+ cmd.Flags().String("api-path", "", apiPath)
+ cmd.Flags().String("api-base", "", apiBase)
+ cmd.Flags().Bool("api-dashboard", true, apiDashboard)
+ cmd.Flags().Bool("api-search-enabled", true, apiSearch)
+}
+
+var apiPort = cli.FlagDoc{
+ Short: "Port for the API server",
+ Long: `Specifies the TCP port on which the Mokapi API server listens.
+The API server is the central entry point where developers can access all mocked services, events, and configuration data exposed by Mokapi. It also serves the web dashboard when enabled.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--api-port 5000"},
+ {Title: "Env", Source: "MOKAPI_API_PORT=5000"},
+ {Title: "File", Source: "api:\n port: 5000"},
+ },
+ },
+ },
+}
+
+var apiPath = cli.FlagDoc{
+ Short: "Path prefix for the API and dashboard",
+ Long: `Defines a path prefix under which the API and web dashboard are served.
+This is useful when Mokapi is hosted behind a reverse proxy and needs to be accessible under a specific URL path.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--api-path /mokapi/dashboard"},
+ {Title: "Env", Source: "MOKAPI_API_PATH=/mokapi/dashboard"},
+ {Title: "File", Source: "api:\n path: /mokapi/dashboard"},
+ },
+ },
+ },
+}
+
+var apiBase = cli.FlagDoc{
+ Short: "Base path used when the API is behind a reverse proxy",
+ Long: `Specifies the external base path used to access the API when Mokapi is running behind a reverse proxy.
+This value is used to generate correct URLs in responses and in the web dashboard, and may differ from the internal api-path.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--api-base /mokapi/dashboard"},
+ {Title: "Env", Source: "MOKAPI_API_BASE=/mokapi/dashboard"},
+ {Title: "File", Source: "api:\n base: /mokapi/dashboard"},
+ },
+ },
+ },
+}
+
+var apiDashboard = cli.FlagDoc{
+ Short: "Enable the web dashboard",
+ Long: `Enables or disables the Mokapi web dashboard.
+When disabled, the API server continues to run, but the dashboard UI is not exposed.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--api-dashboard true\n--api-dashboard\n--no-api-dashboard"},
+ {Title: "Env", Source: "MOKAPI_API_BASE=/mokapi/dashboard"},
+ {Title: "File", Source: "api:\n base: /mokapi/dashboard"},
+ },
+ },
+ },
+}
+
+var apiSearch = cli.FlagDoc{
+ Short: "Enable search functionality in the dashboard",
+ Long: `Enables search functionality in the web dashboard.
+When enabled, users can search through mocked APIs, resources, and requests directly from the dashboard UI.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--api-search-enabled true\n--api-search-enabled\n--no-api-search-enabled"},
+ {Title: "Env", Source: "MOKAPI_API_SEARCH_ENABLED=true"},
+ {Title: "File", Source: "api:\n search:\n enabled: true"},
+ },
+ },
+ },
+}
diff --git a/pkg/cmd/mokapi/flags/events.go b/pkg/cmd/mokapi/flags/events.go
new file mode 100644
index 000000000..a1be91cde
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/events.go
@@ -0,0 +1,54 @@
+package flags
+
+import "mokapi/pkg/cli"
+
+func RegisterEventStoreFlags(cmd *cli.Command) {
+ cmd.Flags().Int("event-store-default-size", 100, eventStoreDefaultSize)
+ cmd.Flags().String("event-store", "", eventStore)
+ cmd.Flags().DynamicInt("event-store--size", eventStoreName)
+}
+
+var eventStoreDefaultSize = cli.FlagDoc{
+ Short: "Default maximum number of stored events per API",
+ Long: `Defines the default maximum number of events stored per API.
+When the limit is reached, older events are discarded. This helps control memory usage while still allowing recent events to be inspected.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--event-store-default-size 500"},
+ {Title: "Env", Source: "MOKAPI_EVENT_STORE_DEFAULT_SIZE=500"},
+ {Title: "File", Source: "event:\n store:\n default: 500", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var eventStore = cli.FlagDoc{
+ Short: "Configure event store using shorthand syntax",
+ Long: `Configures the event store using a shorthand syntax.
+The event store keeps track of events produced by mocked APIs, allowing them to be inspected via the API server or web dashboard.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--event-store foo={\"size\":250}"},
+ {Title: "Env", Source: "MOKAPI_EVENT_STORE=foo={\"size\":250}"},
+ {Title: "File", Source: "event:\n store:\n foo: 250", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var eventStoreName = cli.FlagDoc{
+ Short: "Sets event store size for a specific API",
+ Long: `Configures the event store.
+The event store keeps track of events produced by mocked APIs, allowing them to be inspected via the API server or web dashboard.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--event-store-foo-size 500"},
+ {Title: "Env", Source: "MOKAPI_EVENT_STORE_FOO=500"},
+ {Title: "File", Source: "event:\n store:\n foo: 250", Language: "yaml"},
+ },
+ },
+ },
+}
diff --git a/pkg/cmd/mokapi/flags/generator.go b/pkg/cmd/mokapi/flags/generator.go
new file mode 100644
index 000000000..a4fb985dc
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/generator.go
@@ -0,0 +1,30 @@
+package flags
+
+import "mokapi/pkg/cli"
+
+func RegisterDataGeneratorFlags(cmd *cli.Command) {
+ cmd.Flags().String("data-gen-optional-properties", "0.85", generatorOptionalProperties)
+}
+
+var generatorOptionalProperties = cli.FlagDoc{
+ Short: "Probability for generating optional properties",
+ Long: `Controls how often optional properties are included when generating example or mock data.
+The value can be specified either as a number between 0 and 1, or as a predefined string:
+
+- always → 1.0
+- often → 0.85
+- sometimes → 0.5
+- rarely → 0.15
+- never → 0.0
+
+Higher values result in more optional properties being present in generated data.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--data-gen-optional-properties 0.9\n--data-gen-optional-properties sometimes"},
+ {Title: "Env", Source: "MOKAPI_DATA_GEN_OPTIONAL_PROPERTIES=0.9"},
+ {Title: "File", Source: "data-gen: optionalProperties: sometimes", Language: "yaml"},
+ },
+ },
+ },
+}
diff --git a/pkg/cmd/mokapi/flags/providers_file.go b/pkg/cmd/mokapi/flags/providers_file.go
new file mode 100644
index 000000000..c6c8b2150
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/providers_file.go
@@ -0,0 +1,135 @@
+package flags
+
+import "mokapi/pkg/cli"
+
+func RegisterFileProvider(cmd *cli.Command) {
+ cmd.Flags().String("providers-file", "", providerFile)
+ cmd.Flags().StringSlice("providers-file-filename", nil, true, providerFileFilename)
+ cmd.Flags().StringSlice("providers-file-filenames", nil, false, providerFileFilenames)
+ cmd.Flags().StringSlice("providers-file-directory", []string{}, true, providerFileDirectory)
+ cmd.Flags().StringSlice("providers-file-directories", []string{}, false, providerFileDirectories)
+ cmd.Flags().StringSlice("providers-file-skip-prefix", []string{"_"}, false, providerFileSkipPrefix)
+ cmd.Flags().StringSlice("providers-file-include", []string{}, false, providerFileInclude)
+ cmd.Flags().DynamicString("providers-file-include[]", providerFileIncludeIndex)
+}
+
+var providerFile = cli.FlagDoc{
+ Short: "Configure a File-based provider using shorthand syntax",
+ Long: `Enables the file provider using a shorthand configuration. This option is useful for quick setups without defining a full configuration block.
+When set, Mokapi loads dynamic configuration files from the specified path. You can further control how files are loaded using additional providers-file-* flags such as include rules, directories, and skip prefixes.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-file directory=/foo,fileSkipPrefix=skip"},
+ {Title: "Env", Source: "MOKAPI_FILE=directory=/foo,fileSkipPrefix=skip"},
+ {Title: "File", Source: "providers:\n file:\n directory: /foo\n fileSkipPrefix: [skip]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerFileFilename = cli.FlagDoc{
+ Short: "Load dynamic configuration from a file",
+ Long: `Specifies a single configuration file to load using the file provider.
+This option can be used multiple times to load additional files.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-file-filename foobar.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_FILE_FILENAME=foobar.yaml"},
+ {Title: "File", Source: "providers:\n file:\n filenames: [foobar.yaml]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerFileFilenames = cli.FlagDoc{
+ Short: "Load dynamic configuration from a file",
+ Long: `Specifies multiple configuration files to load using the file provider.
+This option is equivalent to using providers-file-filename multiple times, but allows defining all files in a single argument`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-file-filenames foo.yaml bar.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_FILE_FILENAMES=foo.yaml bar.yaml"},
+ {Title: "File", Source: "providers:\n file:\n filenames: [foo.yaml, bar.yaml]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerFileDirectory = cli.FlagDoc{
+ Short: "Load the dynamic configuration from directories",
+ Long: `Specifies a directory from which configuration files are loaded.
+All supported configuration files in the directory are processed. The directory is watched for changes, allowing dynamic reloading when files are added, modified, or removed.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-file-directory ./configs"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_FILE_DIRECTORY=./configs"},
+ {Title: "File", Source: "providers:\n file:\n directories: [./configs]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerFileDirectories = cli.FlagDoc{
+ Short: "Load the dynamic configuration from directories",
+ Long: `Specifies multiple directories from which configuration files are loaded.
+All supported configuration files in each directory are processed. Directories are watched for changes, allowing dynamic reloading across all configured paths.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-file-directories ./configs ./data"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_FILE_DIRECTORIES=./configs ./data"},
+ {Title: "File", Source: "providers:\n file:\n directories: [./configs, ./data]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerFileSkipPrefix = cli.FlagDoc{
+ Short: "One or more prefixes that indicate whether a file or directory should be skipped.",
+ Long: `Defines prefixes that cause files or directories to be ignored by the file provider.
+Any file or directory whose name starts with one of the configured prefixes is skipped. This is useful for ignoring temporary files, backups, or disabled configurations.
+By default, files and directories starting with "_" are skipped.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-file-skip-prefix skip_"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_FILE_SKIP_PREFIX=skip_"},
+ {Title: "File", Source: "providers:\n file:\n skipPrefix: [skip_]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerFileInclude = cli.FlagDoc{
+ Short: "One or more patterns that a file must match, except when empty",
+ Long: `Defines include patterns that configuration files must match to be loaded.
+If at least one include pattern is specified, only files matching one of the patterns are processed. When empty, all supported files are included by default.
+Patterns typically follow glob-style matching.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-file-include *.json *.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_FILE_INCLUDE=*.json *.yaml"},
+ {Title: "File", Source: "providers:\n file:\n include: ['*.json', '*.yaml']", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerFileIncludeIndex = cli.FlagDoc{
+ Short: "Set include rule at the specified index",
+ Long: `Sets or overrides an include rule at a specific index in the include list.
+This option is mainly intended for advanced use cases or programmatic configuration where precise control over individual include rules is required.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-file-include[1] *.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_FILE_INCLUDE[1]=*.yaml"},
+ },
+ },
+ },
+}
diff --git a/pkg/cmd/mokapi/flags/providers_git.go b/pkg/cmd/mokapi/flags/providers_git.go
new file mode 100644
index 000000000..4356d7a6c
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/providers_git.go
@@ -0,0 +1,218 @@
+package flags
+
+import "mokapi/pkg/cli"
+
+func RegisterGitProvider(cmd *cli.Command) {
+ cmd.Flags().String("providers-git", "", providerGit)
+ cmd.Flags().StringSlice("providers-git-url", []string{}, true, providerGitUrl)
+ cmd.Flags().StringSlice("providers-git-urls", []string{}, false, providerGitUrls)
+ cmd.Flags().String("providers-git-pull-interval", "3m", providerGitPullInterval)
+ cmd.Flags().String("providers-git-temp-dir", "", providerGitTempDir)
+ cmd.Flags().StringSlice("providers-git-repository", []string{}, true, providerGitRepository)
+ cmd.Flags().StringSlice("providers-git-repositories", []string{}, false, providerGitRepositories)
+
+ // repository
+ cmd.Flags().DynamicString("providers-git-repositories[]", providerGitRepositoriesIndex)
+ cmd.Flags().DynamicString("providers-git-repositories[]-url", providerGitRepositoriesUrl)
+ cmd.Flags().DynamicStringSlice("providers-git-repositories[]-file", true, providerGitRepositoriesFile)
+ cmd.Flags().DynamicStringSlice("providers-git-repositories[]-files", false, providerGitRepositoriesFiles)
+ cmd.Flags().DynamicStringSlice("providers-git-repositories[]-include", false, providerGitRepositoriesInclude)
+ cmd.Flags().DynamicString("providers-git-repositories[]-auth-github", providerGitRepositoriesAuthGitHub)
+ cmd.Flags().DynamicString("providers-git-repositories[]-pull-interval", cli.FlagDoc{Short: "Override pull interval for this repository"})
+}
+
+var providerGit = cli.FlagDoc{
+ Short: "Configure a Git-based provider using shorthand syntax",
+ Long: `Enables the Git provider using a shorthand configuration.
+When enabled, Mokapi clones one or more Git repositories and loads configuration files from them. Repositories are periodically pulled to detect changes and apply updates dynamically.
+Additional flags allow you to control polling behavior, repository selection, authentication, and file filtering.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git pullInterval=10s,tempDir=/tempdir"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT=pullInterval=10s,tempDir=/tempdir"},
+ {Title: "File", Source: "providers:\n git:\n pullInterval: 10s\n tempDir: /tempdir", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitUrl = cli.FlagDoc{
+ Short: "Clone configuration from a Git repository",
+ Long: `Specifies a single Git repository from which configuration is cloned.
+This option can be used multiple times to define additional repositories. Each repository is cloned and periodically pulled to fetch updates.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-url https://github.com/foo/foo.git"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_URL=https://github.com/foo/foo.git"},
+ {Title: "File", Source: "providers:\n git:\n urls: https://github.com/foo/foo.git", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitUrls = cli.FlagDoc{
+ Short: "Clone configuration from Git repositories",
+ Long: `Specifies multiple Git repositories from which configuration is cloned.
+This option is equivalent to using providers-git-url multiple times, but allows defining all repositories in a single argument or configuration block.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-urls https://github.com/foo/foo.git https://github.com/bar/bar.git"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_URLS=https://github.com/foo/foo.git https://github.com/bar/bar.git"},
+ {Title: "File", Source: "providers:\n git:\n urls: [https://github.com/foo/foo.git https://github.com/bar/bar.git]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitPullInterval = cli.FlagDoc{
+ Short: "Interval for pulling updates from Git repositories",
+ Long: `Defines how often Git repositories are pulled to check for updates.
+The value must be a valid duration string, such as "30s", "1m", or "5m". Shorter intervals result in faster updates but may increase network and Git server load.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-pull-interval 10s"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_PULL_INTERVAL=10s"},
+ {Title: "File", Source: "providers:\n git:\n pullInterval: 10s"},
+ },
+ },
+ },
+}
+
+var providerGitTempDir = cli.FlagDoc{
+ Short: "Temporary directory used for Git checkouts",
+ Long: `Specifies the directory used for cloning and checking out Git repositories.
+If not set, Mokapi uses a default temporary directory. Setting this option can be useful for controlling disk usage or for environments with restricted filesystem access.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-temp-dir /tempdir"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_TEMP_DIR=/tempdir"},
+ {Title: "File", Source: "providers:\n git:\n tempDir: /tempdir", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitRepository = cli.FlagDoc{
+ Short: "Configure a Git repository using shorthand syntax",
+ Long: `Configures a single Git repository using a shorthand syntax.
+This option allows defining repository-specific settings such as allowed files, authentication, and pull intervals.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-repository url=https://github.com/foo/foo.git,include=*.json"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_REPOSITORY=url=https://github.com/foo/foo.git,tempDir=/tempdir"},
+ {Title: "File", Source: "providers:\n git:\n repositories:\n - url: https://github.com/foo/foo.git\n include: '*.json'", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitRepositories = cli.FlagDoc{
+ Short: "Configure Git repositories using shorthand syntax",
+ Long: `Configures multiple Git repositories using shorthand syntax.
+This option is equivalent to using providers-git-repository multiple times, but allows defining all repositories in a single argument or configuration block.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-repositories url=https://github.com/foo/foo.git,include=*.json url=https://github.com/bar/bar.git,include=*.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_REPOSITORIES=url=https://github.com/foo/foo.git,include=*.json url=https://github.com/bar/bar.git,include=*.yaml"},
+ {Title: "File", Source: "providers:\n git:\n repositories:\n - url: https://github.com/foo/foo.git\n include: ['*.json']\n - url: https://github.com/bar/bar.git\n include: ['*.yaml']", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitRepositoriesIndex = cli.FlagDoc{
+ Short: "Configure the repository at the specified index using shorthand syntax",
+ Long: `Configures a Git repository at the specified index in the repositories list.
+This option is mainly intended for advanced or programmatic configurations where precise control over individual repositories is required.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-repositories[0] url=https://github.com/foo/foo.git,include=*.json"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_REPOSITORIES[0]=url=https://github.com/foo/foo.git,include=*.json"},
+ {Title: "File", Source: "providers:\n git:\n repositories:\n - url: https://github.com/foo/foo.git\n include: ['*.json']", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitRepositoriesUrl = cli.FlagDoc{
+ Short: "Set the repository URL",
+ Long: `Specifies the Git repository URL.
+The repository is cloned and used as a source for configuration files.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-repositories[0]-url https://github.com/foo/foo.git"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_REPOSITORIES[0]_URL=https://github.com/foo/foo.git"},
+ {Title: "File", Source: "providers:\n git:\n repositories:\n - url: https://github.com/foo/foo.git", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitRepositoriesFile = cli.FlagDoc{
+ Short: "Allow only specific files from the repository",
+ Long: `Restricts configuration loading to specific files within the repository.
+Only the specified files are considered. This option can be used multiple times to allow additional files.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-repositories[0]-file mokapi/api.json"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_REPOSITORIES[0]_FILE=mokapi/api.json"},
+ {Title: "File", Source: "providers:\n git:\n repositories:\n - files: [mokapi/api.json]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitRepositoriesFiles = cli.FlagDoc{
+ Short: "Allow only specific files from the repository",
+ Long: `Specifies multiple files within the repository that are allowed to be loaded.
+This option is equivalent to using providers-git-repositories[]-file multiple times.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-repositories[0]-files mokapi/api.json mokapi/handler.js"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_REPOSITORIES[0]_FILES=mokapi/api.json mokapi/handler.js"},
+ {Title: "File", Source: "providers:\n git:\n repositories:\n - files: [mokapi/api.json mokapi/handler.js]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitRepositoriesInclude = cli.FlagDoc{
+ Short: "Include only matching files or patterns",
+ Long: `Defines include patterns that files must match to be loaded from the repository.
+If at least one include pattern is specified, only files matching one of the patterns are processed. When empty, all supported files are included by default.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-repositories[0]-include mokapi/**/*.json"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_REPOSITORIES[0]_INCLUDE=mokapi/**/*.json"},
+ {Title: "File", Source: "providers:\n git:\n repositories:\n - includes: ['mokapi/**/*.json']", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerGitRepositoriesAuthGitHub = cli.FlagDoc{
+ Short: "Authenticate using GitHub credentials",
+ Long: `Enables authentication using GitHub credentials for the repository.
+This option allows accessing private repositories hosted on GitHub by using credentials provided via environment variables or the GitHub CLI configuration.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-git-repositories[0]-auth-github appId=12345,installationId=123456789,privateKey=2024-2-25.private-key.pem"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_GIT_REPOSITORIES[0]_AUTH_GITHUB=appId=12345,installationId=123456789,privateKey=2024-2-25.private-key.pem"},
+ {Title: "File", Source: "providers:\n git:\n repositories:\n - auth:\n github:\n appId: 12345\n installationId: 12345\n privateKey: 2024-2-25.private-key.pem", Language: "yaml"},
+ },
+ },
+ },
+}
diff --git a/pkg/cmd/mokapi/flags/providers_git_test.go b/pkg/cmd/mokapi/flags/providers_git_test.go
new file mode 100644
index 000000000..91b0e439b
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/providers_git_test.go
@@ -0,0 +1,85 @@
+package flags_test
+
+import (
+ "mokapi/config/static"
+ "mokapi/pkg/cli"
+ "mokapi/pkg/cmd/mokapi"
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestRoot_Providers_Git(t *testing.T) {
+ testcases := []struct {
+ name string
+ cmd *cli.Command
+ test func(t *testing.T, cfg *static.Config, flags *cli.FlagSet)
+ }{
+ {
+ name: "--providers-git-repositories",
+ cmd: func() *cli.Command {
+ cmd := mokapi.NewCmdMokapi()
+ cmd.SetArgs([]string{"--providers-git-repositories url=https://github.com/foo/foo.git,include=*.json url=https://github.com/bar/bar.git,include=*.yaml"})
+ return cmd
+ }(),
+ test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
+ require.Equal(t, []static.GitRepo{
+ {Url: "https://github.com/foo/foo.git", Include: []string{"*.json"}},
+ {Url: "https://github.com/bar/bar.git", Include: []string{"*.yaml"}},
+ }, cfg.Providers.Git.Repositories)
+ },
+ },
+ {
+ name: "env variable using shorthand syntax",
+ cmd: func() *cli.Command {
+ key := "MOKAPI_PROVIDERS_GIT"
+ err := os.Setenv(key, "pullInterval=10s,tempDir=/tempdir")
+ require.NoError(t, err)
+ t.Cleanup(func() {
+ _ = os.Unsetenv(key)
+ })
+
+ cmd := mokapi.NewCmdMokapi()
+ cmd.SetArgs([]string{})
+ return cmd
+ }(),
+ test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
+ require.Equal(t, "10s", cfg.Providers.Git.PullInterval)
+ require.Equal(t, "/tempdir", cfg.Providers.Git.TempDir)
+ },
+ },
+ {
+ name: "index url",
+ cmd: func() *cli.Command {
+ cmd := mokapi.NewCmdMokapi()
+ cmd.SetArgs([]string{"--providers-git-repositories[0]-url https://github.com/foo/foo.git"})
+ return cmd
+ }(),
+ test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
+ require.Equal(t, []static.GitRepo{
+ {Url: "https://github.com/foo/foo.git"},
+ }, cfg.Providers.Git.Repositories)
+ },
+ },
+ }
+
+ for _, tc := range testcases {
+ t.Run(tc.name, func(t *testing.T) {
+ defer func() {
+ cli.SetFileReader(&cli.FileReader{})
+ }()
+
+ cmd := tc.cmd
+ var cfg *static.Config
+ cmd.Run = func(cmd *cli.Command, args []string) error {
+ cfg = cmd.Config.(*static.Config)
+ return nil
+ }
+ err := cmd.Execute()
+ require.NoError(t, err)
+
+ tc.test(t, cfg, cmd.Flags())
+ })
+ }
+}
diff --git a/pkg/cmd/mokapi/flags/providers_http.go b/pkg/cmd/mokapi/flags/providers_http.go
new file mode 100644
index 000000000..466d7fde2
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/providers_http.go
@@ -0,0 +1,136 @@
+package flags
+
+import "mokapi/pkg/cli"
+
+func RegisterHttpProvider(cmd *cli.Command) {
+ cmd.Flags().String("providers-http", "", providerHttp)
+ cmd.Flags().StringSlice("providers-http-url", []string{}, true, providerHttpUrl)
+ cmd.Flags().StringSlice("providers-http-urls", []string{}, false, providerHttpUrls)
+ cmd.Flags().String("providers-http-poll-interval", "3m", providerHttpPollInterval)
+ cmd.Flags().String("providers-http-poll-timeout", "5s", providerHttpPollTimeout)
+ cmd.Flags().String("providers-http-proxy", "", providerHttpProxy)
+ cmd.Flags().Bool("providers-http-tls-skip-verify", false, providerHttpTlsSkipVerify)
+ cmd.Flags().String("providers-http-ca", "", providerHttpCa)
+}
+
+var providerHttp = cli.FlagDoc{
+ Short: "Configure an HTTP-based provider using shorthand syntax",
+ Long: `Enables the HTTP provider using a shorthand configuration.
+When enabled, Mokapi fetches dynamic configuration from one or more HTTP endpoints. The provider periodically polls the configured URLs and applies updates automatically when the remote configuration changes.
+Additional flags allow you to control polling behavior, timeouts, proxy settings, and TLS verification.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-http url=https://foo.bar/file.yaml,proxy=https://proxy.example.com"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_HTTP=url=https://foo.bar/file.yaml,proxy=https://proxy.example.com"},
+ {Title: "File", Source: "providers:\n http:\n urls: https://foo.bar/file.yaml\n proxy: https://proxy.example.com", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerHttpUrl = cli.FlagDoc{
+ Short: "Fetch configuration from an HTTP endpoint",
+ Long: `Specifies a single HTTP endpoint from which configuration is fetched.
+This option can be used multiple times to define additional endpoints. Each endpoint is polled at the configured interval, and changes are applied dynamically.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-http-url https://foo.bar/file.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_HTTP_URL=https://foo.bar/file.yaml"},
+ {Title: "File", Source: "providers:\n http:\n urls: https://foo.bar/file.yaml", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerHttpUrls = cli.FlagDoc{
+ Short: "Fetch configurations from HTTP endpoints",
+ Long: `Specifies multiple HTTP endpoints from which configuration is fetched.
+This option is equivalent to using providers-http-url multiple times, but allows defining all endpoints in a single argument or configuration block.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-http-urls https://foo.bar/file1.yaml https://foo.bar/file2.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_HTTP_URLS=https://foo.bar/file1.yaml https://foo.bar/file2.yaml"},
+ {Title: "File", Source: "providers:\n http:\n urls: [https://foo.bar/file1.yaml https://foo.bar/file2.yaml]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerHttpPollInterval = cli.FlagDoc{
+ Short: "Polling interval for HTTP endpoints",
+ Long: `Defines how often the configured HTTP endpoints are polled for changes.
+The value must be a valid duration string, such as "30s", "1m", or "5m". Shorter intervals result in faster updates but may increase network usage.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-http-poll-interval 10s"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_HTTP_POLL_INTERVAL=10s"},
+ {Title: "File", Source: "providers:\n http:\n pollInterval: 10s", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerHttpPollTimeout = cli.FlagDoc{
+ Short: "Timeout for HTTP polling requests",
+ Long: `Sets the maximum duration allowed for a single HTTP polling request.
+If the request does not complete within this time, it is aborted and retried at the next polling interval.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-http-poll-timeout 10s"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_HTTP_POLL_TIMEOUT=10s"},
+ {Title: "File", Source: "providers:\n http:\n pollTimeout: 10s", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerHttpProxy = cli.FlagDoc{
+ Short: "HTTP proxy URL",
+ Long: `Configures an HTTP proxy used for all requests made by the HTTP provider.
+This is useful in environments where outbound traffic must go through a proxy server.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-http-proxy http://localhost:3128"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_HTTP_PROXY=http://localhost:3128"},
+ {Title: "File", Source: "providers:\n http:\n proxy: http://localhost:3128", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerHttpTlsSkipVerify = cli.FlagDoc{
+ Short: "Skip TLS certificate verification",
+ Long: `Disables TLS certificate verification for HTTPS endpoints.
+This option can be useful in development environments or in enterprise setups where HTTPS traffic is intercepted by a proxy using a custom or internal certificate.
+However, skipping certificate verification is insecure and should be avoided when possible. A safer alternative is to configure a custom certificate authority using providers-http-ca or to install the proxy certificate into the system certification pool.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-http-tls-skip-verify true\n--providers-http-tls-skip-verify"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_HTTP_TLS_SKIP_VERIFY=true"},
+ {Title: "File", Source: "providers:\n http:\n tlsSkipVerify: true", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerHttpCa = cli.FlagDoc{
+ Short: "Custom certificate authority file (default: system certification pool)",
+ Long: `Specifies a custom certificate authority (CA) file used to verify TLS connections.
+When set, the provided CA file is used in addition to, or instead of, the system certificate pool. This is useful when working with internal or self-signed certificates.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-http-ca /path/to/mycert.pem"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_HTTP_CA=/path/to/mycert.pem"},
+ {Title: "File", Source: "providers:\n http:\n ca: /path/to/mycert.pem", Language: "yaml"},
+ },
+ },
+ },
+}
diff --git a/pkg/cmd/mokapi/flags/providers_http_test.go b/pkg/cmd/mokapi/flags/providers_http_test.go
new file mode 100644
index 000000000..8661cceaa
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/providers_http_test.go
@@ -0,0 +1,66 @@
+package flags_test
+
+import (
+ "mokapi/config/static"
+ "mokapi/pkg/cli"
+ "mokapi/pkg/cli/clitest"
+ "mokapi/pkg/cmd/mokapi"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestRoot_Providers_Http(t *testing.T) {
+ testcases := []struct {
+ name string
+ cmd *cli.Command
+ test func(t *testing.T, cfg *static.Config, flags *cli.FlagSet)
+ }{
+ {
+ name: "--providers-http",
+ cmd: func() *cli.Command {
+ cmd := mokapi.NewCmdMokapi()
+ cmd.SetArgs([]string{"--providers-http", "url=https://foo.bar/file.yaml,proxy=https://proxy.example.com"})
+ return cmd
+ }(),
+ test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
+ require.Equal(t, []string{"https://foo.bar/file.yaml"}, cfg.Providers.Http.Urls)
+ require.Equal(t, "https://proxy.example.com", cfg.Providers.Http.Proxy)
+ },
+ },
+ {
+ name: "set urls with single url using YAML file",
+ cmd: func() *cli.Command {
+ cmd := mokapi.NewCmdMokapi()
+ cmd.SetArgs([]string{})
+ cli.SetFileReader(&clitest.TestFileReader{Files: map[string][]byte{
+ "/etc/foo/mokapi.yaml": []byte("providers:\n http:\n urls: https://foo.bar/file.yaml"),
+ }})
+ t.Cleanup(func() {
+ cli.SetFileReader(&cli.FileReader{})
+ })
+ cmd.SetConfigFile("/etc/foo/mokapi.yaml")
+
+ return cmd
+ }(),
+ test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
+ require.Equal(t, []string{"https://foo.bar/file.yaml"}, cfg.Providers.Http.Urls)
+ },
+ },
+ }
+
+ for _, tc := range testcases {
+ t.Run(tc.name, func(t *testing.T) {
+ cmd := tc.cmd
+ var cfg *static.Config
+ cmd.Run = func(cmd *cli.Command, args []string) error {
+ cfg = cmd.Config.(*static.Config)
+ return nil
+ }
+ err := cmd.Execute()
+ require.NoError(t, err)
+
+ tc.test(t, cfg, cmd.Flags())
+ })
+ }
+}
diff --git a/pkg/cmd/mokapi/flags/providers_npm.go b/pkg/cmd/mokapi/flags/providers_npm.go
new file mode 100644
index 000000000..146092ab1
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/providers_npm.go
@@ -0,0 +1,164 @@
+package flags
+
+import "mokapi/pkg/cli"
+
+func RegisterNpmProvider(cmd *cli.Command) {
+ cmd.Flags().String("providers-npm", "", providerNpm)
+ cmd.Flags().StringSlice("providers-npm-global-folder", []string{}, true, providerNpmGlobalFolder)
+ cmd.Flags().StringSlice("providers-npm-global-folders", []string{}, false, providerNpmGlobalFolders)
+ // package
+ cmd.Flags().StringSlice("providers-npm-package", []string{}, true, providerNpmPackage)
+ cmd.Flags().StringSlice("providers-npm-packages", []string{}, false, providerNpmPackages)
+ cmd.Flags().DynamicString("providers-npm-packages[]", providerNpmPackagesIndex)
+ cmd.Flags().DynamicString("providers-npm-packages[]-name", providerNpmPackagesIndexName)
+ cmd.Flags().DynamicStringSlice("providers-npm-packages[]-file", true, providerNpmPackagesIndexFile)
+ cmd.Flags().DynamicStringSlice("providers-npm-packages[]-files", false, providerNpmPackagesIndexFiles)
+ cmd.Flags().DynamicStringSlice("providers-npm-packages[]-include", false, providerNpmPackagesIndexInclude)
+}
+
+var providerNpm = cli.FlagDoc{
+ Short: "Configure an npm-based provider using shorthand syntax",
+ Long: `Enables the npm provider using a shorthand configuration.
+When enabled, Mokapi loads configuration files from npm packages or from globally installed npm folders. This allows distributing configuration alongside npm packages and reusing it across projects.
+Additional flags allow you to control which packages or files are loaded.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm package={\"name\": \"foo-api\"},globalFolders=/npm\n--providers-npm package={\\\"name\\\": \\\"foo-api\\\"},globalFolders=/npm # Windows\n"},
+ {Title: "Env", Source: "MOKAPI__PROVIDERS_NPM=url=https://foo.bar/file.yaml,proxy=https://proxy.example.com"},
+ {Title: "File", Source: "providers:\n npm:\n packages:\n - name: foo-api\n globalFolders: [/npm]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerNpmGlobalFolder = cli.FlagDoc{
+ Short: "Load configuration from a global npm folder",
+ Long: `Adds additional folders where Mokapi looks for npm packages.
+By default, Mokapi resolves npm packages by searching the current working directory and its parent directories, following the same resolution strategy as npm. This option allows you to extend that search path with one or more additional global npm folders.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm-global-folder /npm"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_NPM_GLOBAL_FOLDER=/npm"},
+ {Title: "File", Source: "providers:\n npm:\n globalFolders: [/npm]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerNpmGlobalFolders = cli.FlagDoc{
+ Short: "Load configuration from a global npm folder",
+ Long: `Specifies multiple global npm folders from which configuration files are loaded.
+This option is equivalent to using providers-npm-global-folder multiple times.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm-global-folders /npm /npm2"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_NPM_GLOBAL_FOLDER=/npm /npm2"},
+ {Title: "File", Source: "providers:\n npm:\n globalFolders: [/npm, /npm2]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerNpmPackage = cli.FlagDoc{
+ Short: "Configure an npm package using shorthand syntax",
+ Long: `Configures a single npm package as a source for configuration files.
+The package must be available locally or installed globally. Configuration files are loaded from the package contents.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm-package name=foo-api,file=api.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_NPM_PACKAGE=name=foo-api,file=api.yaml"},
+ {Title: "File", Source: "providers:\n npm:\n packages:\n - name: foo-api\n files: [api.yaml]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerNpmPackages = cli.FlagDoc{
+ Short: "Configure npm packages using shorthand syntax",
+ Long: `Configures multiple npm packages as sources for configuration files.
+This option is equivalent to using providers-npm-package multiple times.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm-packages name=foo-api name=bar-api"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_NPM_PACKAGE=name=foo-api,file=api.yaml"},
+ {Title: "File", Source: "providers:\n npm:\n packages:\n - name: foo-api\n files: [api.yaml]", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var providerNpmPackagesIndex = cli.FlagDoc{
+ Short: "Configure the package at the specified index using shorthand syntax",
+ Long: `Configures an npm package at the specified index in the packages list.
+This option is useful when packages are defined via environment variables or configuration files, but need to be adjusted or overridden using CLI arguments. It allows precise, index-based modification of existing package definitions.
+`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm-packages[0] file=api.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_NPM_PACKAGES[0]=file=api.yaml"},
+ },
+ },
+ },
+}
+
+var providerNpmPackagesIndexName = cli.FlagDoc{
+ Short: "Set the name of the npm package",
+ Long: `Sets or overrides the name of the npm package at the specified index.
+This is commonly used to adjust a package definition that was initially provided via environment variables or configuration files.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm-packages[0]-name bar-api"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_NPM_PACKAGES[0]-name=bar-api"},
+ },
+ },
+ },
+}
+
+var providerNpmPackagesIndexFile = cli.FlagDoc{
+ Short: "Allow only specific files from the package",
+ Long: `Restricts configuration loading to specific files within the npm package at the specified index.
+This option can be used multiple times and is useful for refining or overriding file selection defined via environment variables or configuration files.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm-packages[0]-file dist/model/openapi/complete-api.json"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_NPM_PACKAGES[0]_FILE=dist/model/openapi/complete-api.json"},
+ },
+ },
+ },
+}
+
+var providerNpmPackagesIndexFiles = cli.FlagDoc{
+ Short: "Allow only specific files from the package",
+ Long: `Specifies multiple files within the npm package that are allowed to be loaded.
+This option is equivalent to using providers-npm-packages[]-file multiple times and can be used to override existing package configuration.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm-packages[0]-files api.yaml api2.yaml"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_NPM_PACKAGES[0]_FILES=api.yaml api2.yaml"},
+ },
+ },
+ },
+}
+
+var providerNpmPackagesIndexInclude = cli.FlagDoc{
+ Short: "Include only matching files or patterns from the package",
+ Long: `Defines include patterns that files must match to be loaded from the npm package at the specified index.
+This option is useful for narrowing or overriding file selection rules defined via environment variables or configuration files. When empty, all supported files are included by default.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--providers-npm-packages[0]-include **/api/"},
+ {Title: "Env", Source: "MOKAPI_PROVIDERS_NPM_PACKAGES[0]_FILES=**/api/"},
+ },
+ },
+ },
+}
diff --git a/pkg/cmd/mokapi/flags/providers_npm_test.go b/pkg/cmd/mokapi/flags/providers_npm_test.go
new file mode 100644
index 000000000..fc43bdb9a
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/providers_npm_test.go
@@ -0,0 +1,66 @@
+package flags_test
+
+import (
+ "mokapi/config/static"
+ "mokapi/pkg/cli"
+ "mokapi/pkg/cmd/mokapi"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestRoot_Providers_File(t *testing.T) {
+ testcases := []struct {
+ name string
+ args func(t *testing.T) []string
+ test func(t *testing.T, cfg *static.Config, flags *cli.FlagSet)
+ }{
+ {
+ name: "provider shorthand",
+ args: func(t *testing.T) []string {
+ return []string{"--providers-npm", `package={"name": "foo-api"},globalFolders=/npm`}
+ },
+ test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
+ require.Equal(t, "foo-api", cfg.Providers.Npm.Packages[0].Name)
+ require.Equal(t, "/npm", cfg.Providers.Npm.GlobalFolders[0])
+ },
+ },
+ {
+ name: "package shorthand",
+ args: func(t *testing.T) []string {
+ return []string{"--providers-npm-package", "name=foo-api,file=api.yaml"}
+ },
+ test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
+ require.Equal(t, "foo-api", cfg.Providers.Npm.Packages[0].Name)
+ require.Equal(t, []string{"api.yaml"}, cfg.Providers.Npm.Packages[0].Files)
+ },
+ },
+ {
+ name: "packages shorthand",
+ args: func(t *testing.T) []string {
+ return []string{"--providers-npm-packages", "name=foo-api name=bar-api"}
+ },
+ test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
+ require.Equal(t, "foo-api", cfg.Providers.Npm.Packages[0].Name)
+ require.Equal(t, "bar-api", cfg.Providers.Npm.Packages[1].Name)
+ },
+ },
+ }
+
+ for _, tc := range testcases {
+ t.Run(tc.name, func(t *testing.T) {
+ cmd := mokapi.NewCmdMokapi()
+ cmd.SetArgs(tc.args(t))
+
+ cfg := static.NewConfig()
+ cmd.Run = func(cmd *cli.Command, args []string) error {
+ cfg = cmd.Config.(*static.Config)
+ return nil
+ }
+ err := cmd.Execute()
+ require.NoError(t, err)
+
+ tc.test(t, cfg, cmd.Flags())
+ })
+ }
+}
diff --git a/pkg/cmd/mokapi/flags/tls.go b/pkg/cmd/mokapi/flags/tls.go
new file mode 100644
index 000000000..6f66ca441
--- /dev/null
+++ b/pkg/cmd/mokapi/flags/tls.go
@@ -0,0 +1,38 @@
+package flags
+
+import "mokapi/pkg/cli"
+
+func RegisterTlsFlags(cmd *cli.Command) {
+ cmd.Flags().String("root-ca-cert", "", caCert)
+ cmd.Flags().String("root-ca-key", "", caKey)
+}
+
+var caCert = cli.FlagDoc{
+ Short: "Private key of the root CA",
+ Long: `Specifies the private key corresponding to the root CA certificate.
+The private key is required to sign generated TLS certificates. It must match the certificate provided via root-ca-cert.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--root-ca-key /path/to/caKey.pem"},
+ {Title: "Env", Source: "MOKAPI_ROOT_CA_KEY=/path/to/caKey.pem"},
+ {Title: "File", Source: "rootCaKey: /path/to/caKey.pem", Language: "yaml"},
+ },
+ },
+ },
+}
+
+var caKey = cli.FlagDoc{
+ Short: "Root CA certificate used for signing generated certificates",
+ Long: `Specifies the root certificate authority (CA) certificate used by Mokapi to sign generated TLS certificates.
+This certificate is used when Mokapi dynamically generates certificates for mocked services that require TLS.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--root-ca-cert /path/to/caCert.pem"},
+ {Title: "Env", Source: "MOKAPI_ROOT_CA_CERT=/path/to/caCert.pem"},
+ {Title: "File", Source: "rootCaCert: /path/to/caCert.pem", Language: "yaml"},
+ },
+ },
+ },
+}
diff --git a/pkg/cmd/mokapi/gen-cli.go b/pkg/cmd/mokapi/gen-cli.go
new file mode 100644
index 000000000..dca885a82
--- /dev/null
+++ b/pkg/cmd/mokapi/gen-cli.go
@@ -0,0 +1,20 @@
+package mokapi
+
+import (
+ "mokapi/pkg/cli"
+)
+
+func NewGenCliDocCmd() *cli.Command {
+ cmd := &cli.Command{
+ Name: "generator for CLI documentation",
+ Use: "gen-cli-doc [flags]",
+ Run: func(cmd *cli.Command, args []string) error {
+ c := NewCmdMokapi()
+ return c.GenMarkdown(cmd.Flags().GetString("output-dir"))
+ },
+ }
+
+ cmd.Flags().StringShort("output-dir", "-o", "./docs/configuration/static", cli.FlagDoc{})
+
+ return cmd
+}
diff --git a/pkg/cmd/mokapi/help.go b/pkg/cmd/mokapi/help.go
index d7e0b3d07..a83e90abf 100644
--- a/pkg/cmd/mokapi/help.go
+++ b/pkg/cmd/mokapi/help.go
@@ -2,61 +2,19 @@ package mokapi
import (
"fmt"
- log "github.com/sirupsen/logrus"
- "gopkg.in/yaml.v3"
"mokapi/config/decoders"
"mokapi/config/static"
"reflect"
"strings"
-)
-
-func printHelp() {
- fmt.Print("\nMokapi is an easy, modern and flexible API mocking tool using Go and Javascript.\n")
- fmt.Print("\nUsage:\n mokapi [flags]\n")
- fmt.Print("\nFlags:")
- fmt.Print("\n --log-level (string)\n\tLog level (default: info)")
- fmt.Print("\n --log-format string\n\tLog format (default: text)")
- fmt.Print("\n")
-
- fmt.Print("\n --api-port (integer)\n\tApi port (default: 8080)")
- fmt.Print("\n --api-dashboard | --api-no-dashboard (boolean)\n\tActivate dashboard (default: true)")
- fmt.Print("\n --api-path (string)\n\tThe path prefix where dashboard is served (default: empty)")
- fmt.Print("\n --api-base (string)\n\tThe base path of the dashboard useful in case of url rewriting (default: empty)")
- fmt.Print("\n")
-
- fmt.Print("\n --providers-file-filename (string)\n\tLoad configuration from this URL")
- fmt.Print("\n --providers-file-directory (string)\n\tLoad one or more dynamic configuration from a directory")
- fmt.Print("\n --providers-file-skip-prefix (list)\n\tOne or more prefixes that indicate whether a file or directory should be skipped.")
- fmt.Print("\n\n\t(string)\n\t The prefix of the files to skip")
- fmt.Print("\n --providers-file-include (list)\n\tOne or more patterns that a file must match, except when empty")
- fmt.Print("\n\n\t(string)\n\t The pattern that a file must match")
- fmt.Print("\n")
-
- fmt.Print("\n --providers-http-url (string)\n\tLoad the dynamic configuration from file")
- fmt.Print("\n --providers-http-poll-interval (string)\n\tLPolling interval for URL (default: 3m)")
- fmt.Print("\n --providers-http-poll-timeout (string)\n\tPolling timeout for URL (default is 5s)")
- fmt.Print("\n --providers-http-proxy (string)\n\tSpecifies a proxy server for the request")
- fmt.Print("\n --providers-http-tls-skip-verify (boolean)\n\tSpecifies a proxy server for the request")
- fmt.Print("\n --providers-http-ca (string)\n\tPath to the certificate authority used for secure connection (default: system certification pool)")
- fmt.Print("\n")
- fmt.Print("\n --providers-git-url (string)\n\tLoad one or more dynamic configuration from a GIT repository")
- fmt.Print("\n --providers-git-pull-interval (string)\n\tPulling interval for URL (default: 3m)")
- fmt.Print("\n --providers-git-temp-dir (string)\n\tSpecifies the folder to checkout all GIT repositories")
- fmt.Print("\n")
-
- fmt.Print("\n --providers-npm-package (string)\n\tLoad one or more dynamic configuration from a GIT repository")
- fmt.Print("\n")
-
- fmt.Print("\n --generate-cli-skeleton [string]\n\tGenerates the skeleton configuration file")
-
- fmt.Print("\n\nGet help with Mokapi CLI: https://mokapi.io/docs/configuration/static/cli")
-}
+ log "github.com/sirupsen/logrus"
+ "gopkg.in/yaml.v3"
+)
-func writeSkeleton(cfg *static.Config) {
+func writeSkeleton(section string) {
var skeleton interface{}
- if s, ok := cfg.GenerateSkeleton.(string); ok {
- paths := decoders.ParsePath(s)
+ if section != "" {
+ paths := decoders.ParsePath(section)
current := reflect.ValueOf(static.NewConfig())
for _, path := range paths {
if current.Kind() == reflect.Pointer {
@@ -66,7 +24,7 @@ func writeSkeleton(cfg *static.Config) {
return strings.ToLower(f) == path
})
if !field.IsValid() {
- log.Errorf("unable to find config element: %v", cfg.GenerateSkeleton.(string))
+ log.Errorf("unable to find config element: %v", section)
return
}
current = field
diff --git a/pkg/cmd/mokapi/mokapi.go b/pkg/cmd/mokapi/mokapi.go
index 2bb75f1f3..ac305e582 100644
--- a/pkg/cmd/mokapi/mokapi.go
+++ b/pkg/cmd/mokapi/mokapi.go
@@ -12,6 +12,7 @@ import (
"mokapi/engine"
"mokapi/feature"
"mokapi/pkg/cli"
+ "mokapi/pkg/cmd/mokapi/flags"
"mokapi/providers/asyncapi3"
"mokapi/providers/directory"
mail2 "mokapi/providers/mail"
@@ -30,14 +31,22 @@ import (
const logo = "888b d888 888 d8888 d8b \n8888b d8888 888 d88888 Y8P \n88888b.d88888 888 d88P888 \n888Y88888P888 .d88b. 888 888 d88P 888 88888b. 888 \n888 Y888P 888 d88\"\"88b 888 .88P d88P 888 888 \"88b 888 \n888 Y8P 888 888 888 888888K d88P 888 888 888 888 \n888 \" 888 Y88..88P 888 \"88b d8888888888 888 d88P 888 \n888 888 \"Y88P\" 888 888 d88P 888 88888P\" 888 \n v%s by Marcel Lehmann%s 888 \n https://mokapi.io 888 \n 888 \n"
-func NewCmdMokapi(ctx context.Context) *cli.Command {
+func NewCmdMokapi() *cli.Command {
+ cfg := static.NewConfig()
+
cmd := &cli.Command{
- Name: "mokapi",
- Short: "Start Mokapi and serve mocked APIs",
- Long: `Mokapi is an easy, modern and flexible API mocking tool using Go and Javascript.`,
- Config: &static.Config{},
+ Name: "mokapi",
+ Use: "mokapi [flags] [CONFIG-URL|DIRECTORY|FILE]...",
+ Short: "Start Mokapi and serve mocked APIs",
+ Long: `Mokapi is an easy, modern and flexible API mocking tool using Go and Javascript.`,
+ Config: cfg,
+ Version: version.BuildVersion,
Run: func(cmd *cli.Command, args []string) error {
- return runRoot(cmd.Config.(*static.Config), ctx)
+ cfg := cmd.Config.(*static.Config)
+ if err := applyPositionalArgs(cfg, args); err != nil {
+ return err
+ }
+ return runRoot(cmd, cfg)
},
Commands: []*cli.Command{
NewCmdSampleData(),
@@ -45,110 +54,51 @@ func NewCmdMokapi(ctx context.Context) *cli.Command {
EnvPrefix: "MOKAPI_",
}
- cmd.Flags().BoolShort("version", "v", false, "Show version information and exit")
- cmd.Flags().Bool("generate-cli-skeleton", false, "Generates the skeleton configuration file")
+ cmd.SetConfigPath(".", "/etc/mokapi")
+
+ flags.RegisterFileProvider(cmd)
+ flags.RegisterGitProvider(cmd)
+ flags.RegisterHttpProvider(cmd)
+ flags.RegisterNpmProvider(cmd)
+
+ flags.RegisterApiFlags(cmd)
+ flags.RegisterTlsFlags(cmd)
+ flags.RegisterEventStoreFlags(cmd)
+ flags.RegisterDataGeneratorFlags(cmd)
+
+ cmd.Flags().StringSlice("config", []string{}, true, cli.FlagDoc{Short: "Provide inline configuration data"})
+ cmd.Flags().StringSlice("configs", []string{}, false, cli.FlagDoc{Short: "Provide inline configuration data"})
// config file
- cmd.Flags().String("config", "", "Path to configuration file (aliases: --config-file, --cli-input)")
- cmd.Flags().String("config-file", "", "Alias for --config")
- cmd.Flags().String("cli-input", "", "Alias for --config")
+ cmd.Flags().File("config-file", cliInput)
+ cmd.Flags().Alias("config-file", "cli-input")
// logging
- cmd.Flags().String("log-level", "info", "Mokapi log level (default is info)")
- cmd.Flags().String("log-format", "text", "Mokapi log format: json|text (default is text)")
-
- // file provider
- cmd.Flags().String("providers-file", "", "")
- cmd.Flags().StringSlice("providers-file-filename", []string{}, "Load the dynamic configuration from files", true)
- cmd.Flags().StringSlice("providers-file-filenames", []string{}, "Load the dynamic configuration from files", false)
- cmd.Flags().StringSlice("providers-file-directory", []string{}, "Load the dynamic configuration from directories", true)
- cmd.Flags().StringSlice("providers-file-directories", []string{}, "Load the dynamic configuration from directories", false)
- cmd.Flags().StringSlice("providers-file-skip-prefix", []string{"_"}, "", false)
- cmd.Flags().StringSlice("providers-file-include", []string{}, "", false)
- cmd.Flags().DynamicStringSlice("providers-file-include[]", []string{}, "", false)
-
- // git provider
- cmd.Flags().String("providers-git", "", "")
- cmd.Flags().StringSlice("providers-git-url", []string{}, "", true)
- cmd.Flags().StringSlice("providers-git-urls", []string{}, "", false)
- cmd.Flags().String("providers-git-pull-interval", "3m", "")
- cmd.Flags().String("providers-git-temp-dir", "", "")
- cmd.Flags().StringSlice("providers-git-repository", []string{}, "flag for shorthand syntax", true)
- cmd.Flags().StringSlice("providers-git-repositories", []string{}, "flag for shorthand syntax", false)
- // git repository
- cmd.Flags().DynamicString("providers-git-repositories[]", "", "set indexed repository using shorthand syntax")
- cmd.Flags().DynamicString("providers-git-repositories[]-url", "", "set URL of the repository")
- cmd.Flags().DynamicStringSlice("providers-git-repositories[]-file", []string{}, "Specifies an allow list of files to include in mokapi", true)
- cmd.Flags().DynamicStringSlice("providers-git-repositories[]-files", []string{}, "Specifies an allow list of files to include in mokapi", false)
- cmd.Flags().DynamicStringSlice("providers-git-repositories[]-include", []string{}, "Specifies an array of filenames or pattern to include in mokapi", false)
- cmd.Flags().DynamicString("providers-git-repositories[]-auth-github", "", "Specifies an array of filenames or pattern to include in mokapi")
- cmd.Flags().DynamicString("providers-git-repositories[]-pull-interval", "", "Specifies an array of filenames or pattern to include in mokapi")
-
- // http provider
- cmd.Flags().String("providers-http", "", "")
- cmd.Flags().StringSlice("providers-http-url", []string{}, "", true)
- cmd.Flags().StringSlice("providers-http-urls", []string{}, "", false)
- cmd.Flags().String("providers-http-poll-interval", "3m", "")
- cmd.Flags().String("providers-http-poll-timeout", "5s", "")
- cmd.Flags().String("providers-http-proxy", "", "")
- cmd.Flags().String("providers-http-tls-skip-verify", "", "")
- cmd.Flags().String("providers-http-ca", "", "Certificate authority")
-
- // npm provider
- cmd.Flags().String("providers-npm", "", "")
- cmd.Flags().StringSlice("providers-npm-global-folder", []string{}, "", true)
- cmd.Flags().StringSlice("providers-npm-global-folders", []string{}, "", false)
- // npm package
- cmd.Flags().StringSlice("providers-npm-package", []string{}, "flag for shorthand syntax", true)
- cmd.Flags().StringSlice("providers-npm-packages", []string{}, "flag for shorthand syntax", false)
- cmd.Flags().DynamicString("providers-npm-packages[]", "", "set indexed repository using shorthand syntax")
- cmd.Flags().DynamicString("providers-npm-packages[]-name", "", "set URL of the repository")
- cmd.Flags().DynamicStringSlice("providers-npm-packages[]-file", []string{}, "Specifies an allow list of files to include in mokapi", true)
- cmd.Flags().DynamicStringSlice("providers-npm-packages[]-files", []string{}, "Specifies an allow list of files to include in mokapi", false)
- cmd.Flags().DynamicStringSlice("providers-npm-packages[]-include", []string{}, "Specifies an array of filenames or pattern to include in mokapi", false)
-
- // API
- cmd.Flags().Int("api-port", 8080, "API port (Default 8080). The API is available on the path /api")
- cmd.Flags().String("api-path", "", "The path prefix where dashboard is served (default empty)")
- cmd.Flags().String("api-base", "", "The base path of the dashboard useful in case of url rewriting (default empty)")
- cmd.Flags().Bool("api-dashboard", true, "Activate dashboard (default true). The dashboard is available at the same port as the API but on the path / by default.")
- cmd.Flags().Bool("api-search-enabled", false, "enables search feature")
-
- cmd.Flags().String("root-ca-cert", "", "CA Certificate for signing certificate generated at runtime")
- cmd.Flags().String("root-ca-key", "", "Private Key of CA for signing certificate generated at runtime")
-
- cmd.Flags().Int("event-store-default-size", 100, "Sets the default maximum number of events stored for each event type (e.g., HTTP, Kafka), unless overridden individually. (default 100)")
- cmd.Flags().String("event-store", "", "")
- cmd.Flags().DynamicInt("event-store--size", 100, "Overrides the default event store size for a specific API by name.")
-
- cmd.Flags().String("data-gen-optional-properties", "0.85", "")
-
- cmd.Flags().StringSlice("config", []string{}, "plain configuration data as argument", true)
- cmd.Flags().StringSlice("configs", []string{}, "plain configuration data as argument", false)
-
- cmd.Flags().BoolShort("help", "h", false, "Show help information")
+ cmd.Flags().String("log-level", "info", cli.FlagDoc{Short: "Set log level (debug|info|warn|error)"}).WithExample(
+ cli.Example{
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--log-level warn"},
+ {Title: "Env", Source: "MOKAPI_LOG_LEVEL=warn"},
+ {Title: "File", Source: "log:\n level: warn", Language: "yaml"},
+ },
+ },
+ ).WithDescription("The default level of log messages is info. You can set the log level to one of the following, listed in order of least to most information. The level is cumulative: for the debug level, the log file also includes messages at the info, warn, and error levels.\n- Debug\n- Info\n- Warn\n- Error\n")
+ cmd.Flags().String("log-format", "text", cli.FlagDoc{Short: "Set log output format (text|json)"})
+
+ cmd.Flags().String("generate-cli-skeleton", "", cli.FlagDoc{Short: "Generate a configuration skeleton and exit. If set without a value, generates the full skeleton. " +
+ "If a value is provided, generates only the specified section (e.g. `providers`)."})
return cmd
}
-func runRoot(cfg *static.Config, ctx context.Context) error {
+func runRoot(cmd *cli.Command, cfg *static.Config) error {
versionString := version.BuildVersion
- err := cfg.Parse()
- if err != nil {
- log.Errorf("parse config failed: %v", err)
+ if f := cmd.Flags().Lookup("generate-cli-skeleton"); f != nil && f.Value.IsSet() {
+ writeSkeleton(f.Value.String())
return nil
}
- /*switch {
- case viper.GetBool("version"):
- fmt.Println(versionString)
- return nil
- case viper.GetBool("generate.cli.skeleton"):
- writeSkeleton(cfg)
- return nil
- }*/
-
feature.Enable(cfg.Features)
generator.SetConfig(cfg.DataGen)
@@ -168,7 +118,9 @@ func runRoot(cfg *static.Config, ctx context.Context) error {
}
}()
- <-ctx.Done()
+ if ctx := cmd.Context(); ctx != nil {
+ <-ctx.Done()
+ }
s.Close()
return nil
}
@@ -257,3 +209,51 @@ func registerDynamicTypes() {
return true
}, &mail2.Config{})
}
+
+func applyPositionalArgs(cfg *static.Config, args []string) error {
+ cfg.Args = args
+ err := cfg.Parse()
+ if err != nil {
+ return fmt.Errorf("parse config failed: %w", err)
+ }
+ return nil
+}
+
+var cliInput = cli.FlagDoc{
+ Short: "Read configuration from a file",
+ Long: `Reads configuration from a file provided via the command line.
+The file content is processed as configuration input and merged with other configuration sources such as inline configuration and environment variables.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--cli-input=mokapi.yaml"},
+ },
+ },
+ },
+}
+
+var config = cli.FlagDoc{
+ Short: "Provide inline configuration data",
+ Long: `Provides inline configuration data directly via the command line.
+This option can be used multiple times to supply additional configuration fragments, which are merged with other configuration sources.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--config {\"openapi\": \"3.0\", \"info\": { \"title\": \"foo\" } }\n--config file:/path/to/config.yaml"},
+ },
+ },
+ },
+}
+
+var configs = cli.FlagDoc{
+ Short: "Provide inline configuration data",
+ Long: `Provides inline configuration data directly via the command line.
+This option can be used multiple times to supply additional configuration fragments, which are merged with other configuration sources.`,
+ Examples: []cli.Example{
+ {
+ Codes: []cli.Code{
+ {Title: "CLI", Source: "--configs file:/path/to/config.yaml file:/path/to/config.yaml"},
+ },
+ },
+ },
+}
diff --git a/pkg/cmd/mokapi/mokapi_test.go b/pkg/cmd/mokapi/mokapi_test.go
index 0abcde426..d8c39768b 100644
--- a/pkg/cmd/mokapi/mokapi_test.go
+++ b/pkg/cmd/mokapi/mokapi_test.go
@@ -1,7 +1,6 @@
package mokapi_test
import (
- "context"
"encoding/json"
"fmt"
"mokapi/config/static"
@@ -55,7 +54,7 @@ func TestMain_Flags(t *testing.T) {
test: func(t *testing.T, cfg *static.Config) {
require.Equal(t, "info", cfg.Log.Level)
require.Equal(t, "text", cfg.Log.Format)
- require.Equal(t, "8080", cfg.Api.Port)
+ require.Equal(t, 8080, cfg.Api.Port)
require.Equal(t, true, cfg.Api.Dashboard)
require.Equal(t, []string{"_"}, cfg.Providers.File.SkipPrefix)
require.Equal(t, int64(100), cfg.Event.Store["default"].Size)
@@ -90,6 +89,13 @@ func TestMain_Flags(t *testing.T) {
require.Equal(t, []string{"foo.yaml"}, cfg.Providers.File.Filenames)
},
},
+ {
+ name: "--event-store-default-size 500",
+ args: []string{"--event-store-default-size", "500"},
+ test: func(t *testing.T, cfg *static.Config) {
+ require.Equal(t, static.Store{Size: 500}, cfg.Event.Store["default"])
+ },
+ },
{
name: "--event-store",
args: []string{"--event-store", "foo={\"size\":250}"},
@@ -108,7 +114,7 @@ func TestMain_Flags(t *testing.T) {
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
- cmd := mokapi.NewCmdMokapi(context.Background())
+ cmd := mokapi.NewCmdMokapi()
cmd.SetArgs(tc.args)
cfg := static.NewConfig()
@@ -145,34 +151,6 @@ func TestStaticConfig(t *testing.T) {
require.Equal(t, "debug", cfg.Log.Level)
},
},
- {
- name: "--help",
- args: []string{"--help"},
- test: func(t *testing.T, cfg *static.Config) {
- require.Equal(t, true, cfg.Help)
- },
- },
- {
- name: "-h",
- args: []string{"-h"},
- test: func(t *testing.T, cfg *static.Config) {
- require.Equal(t, true, cfg.Help)
- },
- },
- {
- name: "--version",
- args: []string{"--version"},
- test: func(t *testing.T, cfg *static.Config) {
- require.Equal(t, true, cfg.Version)
- },
- },
- {
- name: "-v",
- args: []string{"-v"},
- test: func(t *testing.T, cfg *static.Config) {
- require.Equal(t, true, cfg.Version)
- },
- },
{
name: "json",
args: []string{`--providers-file={"filename":"foo.yaml","directory":"foo", "skipPrefix":["_"]}`},
@@ -231,7 +209,7 @@ func TestStaticConfig(t *testing.T) {
name: "file provider include",
args: []string{
"--providers-file-include",
- `mokapi/**/*.json mokapi/**/*.yaml "foo bar/**/*.yaml`,
+ `mokapi/**/*.json mokapi/**/*.yaml "foo bar/**/*.yaml"`,
},
test: func(t *testing.T, cfg *static.Config) {
require.Equal(t, []string{"mokapi/**/*.json", "mokapi/**/*.yaml", "foo bar/**/*.yaml"}, cfg.Providers.File.Include)
@@ -261,7 +239,7 @@ func TestStaticConfig(t *testing.T) {
name: "file provider include overwrite",
args: []string{
"--providers-file-include", "foo",
- "--Providers-file-include[0]", "bar",
+ "--providers-file-include[0]", "bar",
},
test: func(t *testing.T, cfg *static.Config) {
require.Equal(t, []string{"bar"}, cfg.Providers.File.Include)
@@ -442,12 +420,13 @@ func TestStaticConfig(t *testing.T) {
for _, tc := range testcases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
- cmd := mokapi.NewCmdMokapi(context.Background())
+ cmd := mokapi.NewCmdMokapi()
cmd.SetArgs(tc.args)
cfg := static.NewConfig()
cmd.Run = func(cmd *cli.Command, args []string) error {
cfg = cmd.Config.(*static.Config)
+ cfg.Args = args
return cfg.Parse()
}
err := cmd.Execute()
@@ -493,7 +472,7 @@ func TestMokapi_Env(t *testing.T) {
"MOKAPI_NOT_SUPPORTED": "foo",
},
test: func(t *testing.T, cfg *static.Config, err error) {
- require.EqualError(t, err, "unknown environment variable 'not-supported' (value 'foo')")
+ require.EqualError(t, err, "unknown environment variable 'MOKAPI_NOT_SUPPORTED' (value 'foo')")
},
},
}
@@ -510,7 +489,7 @@ func TestMokapi_Env(t *testing.T) {
require.NoError(t, err)
}
- cmd := mokapi.NewCmdMokapi(context.Background())
+ cmd := mokapi.NewCmdMokapi()
cmd.SetArgs([]string{})
cfg := static.NewConfig()
@@ -526,7 +505,7 @@ func TestMokapi_Env(t *testing.T) {
func TestMokapi_File(t *testing.T) {
newCmd := func(args []string) (*cli.Command, *static.Config) {
- c := mokapi.NewCmdMokapi(context.Background())
+ c := mokapi.NewCmdMokapi()
c.SetArgs(args)
c.Run = func(cmd *cli.Command, args []string) error {
return nil
@@ -550,11 +529,25 @@ func TestMokapi_File(t *testing.T) {
require.Equal(t, "{\"openapi\": \"3.0\"}", cfg.Configs[0])
},
},
+ {
+ name: "configs parameter with file path as value",
+ test: func(t *testing.T) {
+ path1 := createTempFile(t, "test1.json", `{"openapi": "3.0", "info": {"title": "foo"} }`)
+ path2 := createTempFile(t, "test2.json", `{"openapi": "3.0", "info": {"title": "bar"} }`)
+ c, cfg := newCmd([]string{"--configs", fmt.Sprintf("file:%s file:%s", path1, path2)})
+
+ err := c.Execute()
+ require.NoError(t, err)
+ require.Len(t, cfg.Configs, 2)
+ require.Equal(t, `{"openapi": "3.0", "info": {"title": "foo"} }`, cfg.Configs[0])
+ require.Equal(t, `{"openapi": "3.0", "info": {"title": "bar"} }`, cfg.Configs[1])
+ },
+ },
{
name: "configfile json",
test: func(t *testing.T) {
path := createTempFile(t, "test.json", `{"configs": [ { "openapi": "3.0", "info": { "name": "foo" } } ]}`)
- c, cfg := newCmd([]string{"--configfile", path})
+ c, cfg := newCmd([]string{"--config-file", path})
err := c.Execute()
require.NoError(t, err)
@@ -573,7 +566,7 @@ func TestMokapi_File(t *testing.T) {
},
},
{
- name: "configfile yaml",
+ name: "config-file yaml",
test: func(t *testing.T) {
path := createTempFile(t, "foo.yaml", `
configs:
@@ -581,7 +574,7 @@ configs:
info:
name: foo
`)
- c, cfg := newCmd([]string{"--configfile", path})
+ c, cfg := newCmd([]string{"--config-file", path})
err := c.Execute()
require.NoError(t, err)
@@ -663,7 +656,7 @@ providers:
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
defer func() {
- cli.SetReadFileFS(os.ReadFile)
+ cli.SetFileReader(&cli.FileReader{})
}()
tc.test(t)
@@ -672,12 +665,13 @@ providers:
}
func TestPositionalArg_Error(t *testing.T) {
- cmd := mokapi.NewCmdMokapi(context.Background())
+ cmd := mokapi.NewCmdMokapi()
cmd.SetArgs([]string{"foo://bar"})
cfg := static.NewConfig()
cmd.Run = func(cmd *cli.Command, args []string) error {
cfg = cmd.Config.(*static.Config)
+ cfg.Args = args
return cfg.Parse()
}
err := cmd.Execute()
diff --git a/pkg/cmd/mokapi/providers_test.go b/pkg/cmd/mokapi/providers_test.go
index efd98762c..c841ef703 100644
--- a/pkg/cmd/mokapi/providers_test.go
+++ b/pkg/cmd/mokapi/providers_test.go
@@ -1,14 +1,14 @@
package mokapi_test
import (
- "context"
- "github.com/stretchr/testify/require"
"mokapi/config/static"
"mokapi/pkg/cli"
"mokapi/pkg/cmd/mokapi"
"os"
"path"
"testing"
+
+ "github.com/stretchr/testify/require"
)
func TestRoot_Providers_File(t *testing.T) {
@@ -33,7 +33,7 @@ func TestRoot_Providers_File(t *testing.T) {
return []string{"--providers-file-filename", "foo.yaml,bar.yaml"}
},
test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
- require.Equal(t, []string{"foo.yaml,bar.yaml"}, cfg.Providers.File.Filenames)
+ require.Equal(t, []string{"foo.yaml", "bar.yaml"}, cfg.Providers.File.Filenames)
require.Equal(t, []string{"foo.yaml,bar.yaml"}, flags.GetStringSlice("providers-file-filename"))
},
},
@@ -66,7 +66,7 @@ func TestRoot_Providers_File(t *testing.T) {
return []string{}
},
test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
- require.Equal(t, []string{"foo.yaml,bar.yaml"}, cfg.Providers.File.Filenames)
+ require.Equal(t, []string{"foo.yaml", "bar.yaml"}, cfg.Providers.File.Filenames)
},
},
{
@@ -184,6 +184,16 @@ func TestRoot_Providers_File(t *testing.T) {
require.Equal(t, []string{"/foo", "/bar"}, cfg.Providers.File.SkipPrefix)
},
},
+ {
+ name: "skipPrefix single element appends to default value",
+ args: func(t *testing.T) []string {
+ return []string{"--providers-file-skip-prefix", "foo"}
+ },
+ test: func(t *testing.T, cfg *static.Config, flags *cli.FlagSet) {
+ require.Len(t, cfg.Providers.File.SkipPrefix, 1)
+ require.Contains(t, cfg.Providers.File.SkipPrefix, "foo")
+ },
+ },
{
name: "Include from cli",
args: func(t *testing.T) []string {
@@ -213,7 +223,7 @@ func TestRoot_Providers_File(t *testing.T) {
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
- cmd := mokapi.NewCmdMokapi(context.Background())
+ cmd := mokapi.NewCmdMokapi()
cmd.SetArgs(tc.args(t))
cfg := static.NewConfig()
@@ -451,7 +461,7 @@ func TestRoot_Providers_Git(t *testing.T) {
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
- cmd := mokapi.NewCmdMokapi(context.Background())
+ cmd := mokapi.NewCmdMokapi()
cmd.SetArgs(tc.args(t))
cfg := static.NewConfig()
diff --git a/pkg/cmd/mokapi/sample-data.go b/pkg/cmd/mokapi/sample-data.go
index 1cefd7bbf..017967aa2 100644
--- a/pkg/cmd/mokapi/sample-data.go
+++ b/pkg/cmd/mokapi/sample-data.go
@@ -60,10 +60,10 @@ Supports JSON Schema, OpenAPI Schema, and Avro Schema formats.`,
},
}
- sampleDataCommand.Flags().IntShort("count", "n", 1, "Number of samples to generate (default 1)")
- sampleDataCommand.Flags().String("input-type", "jsonschema", "Type of the input schema: jsonschema|openapi|avro (default: jsonschema)")
+ sampleDataCommand.Flags().IntShort("count", "n", 1, cli.FlagDoc{Short: "Number of samples to generate (default 1)"})
+ sampleDataCommand.Flags().String("input-type", "jsonschema", cli.FlagDoc{Short: "Type of the input schema: jsonschema|openapi|avro (default: jsonschema)"})
sampleDataCommand.Flags().StringShort("output", "o", "application/json",
- "Output format: json, xml, yaml, binary (or full content type, e.g. application/json)")
+ cli.FlagDoc{Short: "Output format: json, xml, yaml, binary (or full content type, e.g. application/json)"})
return sampleDataCommand
}
diff --git a/pkg/cmd/mokapi/sample_data_test.go b/pkg/cmd/mokapi/sample_data_test.go
index 6f07f031d..be149c874 100644
--- a/pkg/cmd/mokapi/sample_data_test.go
+++ b/pkg/cmd/mokapi/sample_data_test.go
@@ -2,15 +2,15 @@ package mokapi_test
import (
"bytes"
- "context"
- "github.com/sirupsen/logrus"
- "github.com/stretchr/testify/require"
"io"
"mokapi/pkg/cmd/mokapi"
"mokapi/schema/json/generator"
"os"
"strings"
"testing"
+
+ "github.com/sirupsen/logrus"
+ "github.com/stretchr/testify/require"
)
func TestMain_SampleData(t *testing.T) {
@@ -116,8 +116,7 @@ func TestMain_SampleData(t *testing.T) {
os.Stderr = stdErr
}()
- ctx := context.Background()
- cmd := mokapi.NewCmdMokapi(ctx)
+ cmd := mokapi.NewCmdMokapi()
cmd.SetArgs(tc.args)
logrus.SetOutput(io.Discard)
diff --git a/providers/asyncapi3/kafka/store/fetch.go b/providers/asyncapi3/kafka/store/fetch.go
index 21a5e7dab..875fa42b7 100644
--- a/providers/asyncapi3/kafka/store/fetch.go
+++ b/providers/asyncapi3/kafka/store/fetch.go
@@ -1,11 +1,12 @@
package store
import (
- log "github.com/sirupsen/logrus"
"math"
"mokapi/kafka"
"mokapi/kafka/fetch"
"time"
+
+ log "github.com/sirupsen/logrus"
)
type fetchData struct {
diff --git a/providers/asyncapi3/kafka/store/fetch_test.go b/providers/asyncapi3/kafka/store/fetch_test.go
index 1c1813f88..a6fa06562 100644
--- a/providers/asyncapi3/kafka/store/fetch_test.go
+++ b/providers/asyncapi3/kafka/store/fetch_test.go
@@ -20,6 +20,19 @@ func TestFetch(t *testing.T) {
name string
test func(t *testing.T, s *store.Store)
}{
+ {
+ name: "fetch no topic",
+ test: func(t *testing.T, s *store.Store) {
+ rr := kafkatest.NewRecorder()
+ s.ServeMessage(rr, kafkatest.NewRequest("kafkatest", 3, &fetch.Request{}))
+
+ res, ok := rr.Message.(*fetch.Response)
+ require.True(t, ok)
+ require.Equal(t, kafka.None, res.ErrorCode)
+ require.Equal(t, 0, len(res.Topics))
+ require.Equal(t, int32(0), res.SessionId)
+ },
+ },
{
name: "topic not exists",
test: func(t *testing.T, s *store.Store) {
diff --git a/providers/openapi/request_body.go b/providers/openapi/request_body.go
index 83d078be0..180672eb5 100644
--- a/providers/openapi/request_body.go
+++ b/providers/openapi/request_body.go
@@ -112,7 +112,23 @@ func readBody(r *http.Request, contentType media.ContentType, mt *MediaType) (*B
return nil, err
}
- return parseBody(data, contentType, mt)
+ b, err := parseBody(data, contentType, mt)
+ if err != nil {
+ prefix := data
+ if len(prefix) > 256 {
+ prefix = prefix[:256]
+ }
+ requestFromProxy := strings.HasPrefix(string(prefix), fmt.Sprintf("%s http", r.Method))
+ if requestFromProxy && contentType.Type == "multipart" {
+ return b, fmt.Errorf(
+ "%w (request body looks like an embedded HTTP request; multipart requests through HTTP proxies are not supported. "+
+ "Disable the proxy or configure NO_PROXY)",
+ err,
+ )
+ }
+ return b, err
+ }
+ return b, nil
}
func parseBody(body []byte, contentType media.ContentType, mt *MediaType) (*Body, error) {
diff --git a/providers/openapi/schema/convert.go b/providers/openapi/schema/convert.go
index e98fa0684..7c351de25 100644
--- a/providers/openapi/schema/convert.go
+++ b/providers/openapi/schema/convert.go
@@ -2,6 +2,8 @@ package schema
import (
"mokapi/schema/json/schema"
+ "slices"
+ "strings"
)
type JsonSchemaConverter struct {
@@ -155,5 +157,19 @@ func (c *JsonSchemaConverter) Convert(s *Schema) *schema.Schema {
}
}
+ n := len(js.Type)
+ js.Type = slices.DeleteFunc(js.Type, func(t string) bool {
+ return strings.ToLower(t) == "file"
+ })
+ if n != len(js.Type) {
+ if js.Format != "" && js.Format != "binary" {
+ js = &schema.Schema{AnyOf: []*schema.Schema{js}}
+ js.AnyOf = append(js.AnyOf, &schema.Schema{Type: schema.Types{"string"}, Format: "binary"})
+ } else {
+ js.Type = append(js.Type, "string")
+ js.Format = "binary"
+ }
+ }
+
return js
}
diff --git a/providers/openapi/schema/convert_test.go b/providers/openapi/schema/convert_test.go
index 6a5831fbc..f92969a07 100644
--- a/providers/openapi/schema/convert_test.go
+++ b/providers/openapi/schema/convert_test.go
@@ -451,6 +451,34 @@ func TestConvert(t *testing.T) {
require.Equal(t, jsonSchema.Types{"string", "null"}, s.Type)
},
},
+ {
+ name: "schema type file",
+ s: schematest.New("file"),
+ test: func(t *testing.T, s *jsonSchema.Schema) {
+ require.Equal(t, jsonSchema.Types{"string"}, s.Type)
+ require.Equal(t, "binary", s.Format)
+ },
+ },
+ {
+ name: "schema type file with format is set",
+ s: schematest.New("file", schematest.WithFormat("custom")),
+ test: func(t *testing.T, s *jsonSchema.Schema) {
+ require.Nil(t, s.Type)
+ require.Len(t, s.AnyOf, 2)
+ require.Equal(t, "custom", s.AnyOf[0].Format)
+ require.Equal(t, jsonSchema.Types{"string"}, s.AnyOf[1].Type)
+ require.Equal(t, "binary", s.AnyOf[1].Format)
+ },
+ },
+ {
+ name: "schema type array of files",
+ s: schematest.New("array", schematest.WithItems("file")),
+ test: func(t *testing.T, s *jsonSchema.Schema) {
+ require.Equal(t, jsonSchema.Types{"array"}, s.Type)
+ require.Equal(t, jsonSchema.Types{"string"}, s.Items.Type)
+ require.Equal(t, "binary", s.Items.Format)
+ },
+ },
}
t.Parallel()
diff --git a/providers/openapi/schema/parse_xml.go b/providers/openapi/schema/parse_xml.go
index 1ce49fc85..91dc3fbdd 100644
--- a/providers/openapi/schema/parse_xml.go
+++ b/providers/openapi/schema/parse_xml.go
@@ -5,6 +5,7 @@ import (
"fmt"
"io"
"mokapi/schema/json/parser"
+ "path"
"strconv"
)
@@ -17,6 +18,7 @@ type node struct {
Attrs []xml.Attr `xml:",any,attr"`
Content []byte `xml:",innerxml"`
Nodes []node `xml:",any"`
+ Path string
}
func NewXmlParser(s *Schema) *XmlParser {
@@ -39,7 +41,7 @@ func (p *XmlParser) Parse(v any) (any, error) {
if err != nil {
return nil, fmt.Errorf("failed to unmarshal XML: %w", err)
}
- data, err := parseXML(n, p.s)
+ data, err := parseXML(n, p.s, "/"+xmlNameAsString(n.XMLName))
if err != nil {
return nil, fmt.Errorf("failed to parse XML: %w", err)
}
@@ -75,10 +77,10 @@ func UnmarshalXML(r io.Reader, s *Schema) (interface{}, error) {
if err != nil {
return nil, fmt.Errorf("failed to unmarshal xml: %w", err)
}
- return parseXML(n, s)
+ return parseXML(n, s, "/"+xmlNameAsString(n.XMLName))
}
-func parseXML(n *node, s *Schema) (any, error) {
+func parseXML(n *node, s *Schema, xpath string) (any, error) {
if len(n.Nodes) == 0 && len(n.Attrs) == 0 {
if len(n.Content) == 0 {
if s.Type.IsObject() {
@@ -88,10 +90,10 @@ func parseXML(n *node, s *Schema) (any, error) {
return []any{}, nil
}
}
- return parseValue(string(n.Content), s)
+ return parseValue(string(n.Content), s, xpath)
}
- if isArray(n) || (s != nil && s.Type.IsArray()) {
+ if isArray(n, s) {
var items *Schema
if s != nil {
items = s.Items
@@ -102,7 +104,7 @@ func parseXML(n *node, s *Schema) (any, error) {
}
n = &n.Nodes[0]
}
- return getItems(n, items)
+ return getItems(n, items, xpath)
}
m := map[string]any{}
@@ -113,7 +115,7 @@ func parseXML(n *node, s *Schema) (any, error) {
if prop != nil && prop.Xml != nil && !prop.Xml.Attribute {
continue
}
- v, err := parseValue(attr.Value, prop)
+ v, err := parseValue(attr.Value, prop, fmt.Sprintf("%s[@%s]", xpath, prop))
if err != nil {
return nil, err
}
@@ -123,20 +125,31 @@ func parseXML(n *node, s *Schema) (any, error) {
for _, child := range n.Nodes {
name, prop := getProperty(child.XMLName, s)
if prop != nil && prop.Xml != nil && prop.Xml.Attribute {
+ if prop.Xml.Attribute && !s.IsFreeForm() {
+ return nil, fmt.Errorf("property '%s' is expected as XML attribute but received as XML node and additionalProperty is not allowed: %v", name, path.Join(xpath, xmlNameAsString(child.XMLName)))
+ }
continue
}
- v, err := parseXML(&child, prop)
- if err != nil {
- return nil, err
- }
- if _, ok := m[name]; ok {
- if arr, isArray := m[name].([]any); isArray {
- m[name] = append(arr, v)
+
+ var v any
+ var err error
+ if prop != nil && (prop.Type.IsArray() || prop.Items != nil) {
+ if _, wrapped := isWrapped(prop); wrapped {
+ m[name], err = parseWrappedArray(&child, prop.Items, xpath)
} else {
- m[name] = []interface{}{m[name], v}
+ v, err = parseXML(&child, prop.Items, xpath)
+ m[name], err = appendOrError(m[name], v, err)
}
} else {
- m[name] = v
+ v, err = parseXML(&child, prop, xpath)
+ if _, ok := m[name]; ok {
+ m[name], err = appendOrError(m[name], v, err)
+ } else {
+ m[name] = v
+ }
+ }
+ if err != nil {
+ return nil, err
}
}
@@ -159,7 +172,7 @@ func parseXML(n *node, s *Schema) (any, error) {
return m, nil
}
-func parseValue(s string, ref *Schema) (interface{}, error) {
+func parseValue(s string, ref *Schema, xpath string) (interface{}, error) {
if ref == nil || ref.Type.IsString() {
return s, nil
}
@@ -186,7 +199,7 @@ func parseValue(s string, ref *Schema) (interface{}, error) {
return s == "true", nil
}
- return nil, fmt.Errorf("unknown type: %v", ref.Type)
+ return nil, fmt.Errorf("expected type '%s' for '%s' but got: '%s'", ref.Type, xpath, s)
}
func getProperty(name xml.Name, s *Schema) (string, *Schema) {
@@ -224,10 +237,10 @@ func getProperty(name xml.Name, s *Schema) (string, *Schema) {
return name.Local, nil
}
-func getItems(n *node, ref *Schema) ([]interface{}, error) {
+func getItems(n *node, items *Schema, xpath string) ([]interface{}, error) {
var r []interface{}
- for _, child := range n.Nodes {
- v, err := parseXML(&child, ref)
+ for i, child := range n.Nodes {
+ v, err := parseXML(&child, items, fmt.Sprintf("%s/%s[%d]", xpath, xmlNameAsString(child.XMLName), i))
if err != nil {
return nil, err
}
@@ -236,17 +249,36 @@ func getItems(n *node, ref *Schema) ([]interface{}, error) {
return r, nil
}
-func isArray(n *node) bool {
- if len(n.Nodes) <= 1 {
- return false
- }
- name := n.Nodes[0].XMLName.Local
- for _, child := range n.Nodes[1:] {
- if child.XMLName.Local != name {
+func isArray(n *node, s *Schema) bool {
+ if s == nil {
+ if len(n.Nodes) <= 1 {
return false
}
+ name := n.Nodes[0].XMLName.Local
+ for _, child := range n.Nodes[1:] {
+ if child.XMLName.Local != name {
+ return false
+ }
+ }
+ return true
+ }
+
+ if s.Type.IsArray() || s.Items != nil {
+ return true
+ }
+ return false
+}
+
+func parseWrappedArray(n *node, items *Schema, xpath string) (any, error) {
+ var list []any
+ for _, item := range n.Nodes {
+ v, err := parseXML(&item, items, path.Join(xpath, xmlNameAsString(n.XMLName)))
+ if err != nil {
+ return nil, err
+ }
+ list = append(list, v)
}
- return true
+ return list, nil
}
func isWrapped(ref *Schema) (string, bool) {
@@ -274,3 +306,26 @@ func (n *node) hasElement(name string) bool {
}
return false
}
+
+func xmlNameAsString(n xml.Name) string {
+ if n.Space != "" {
+ return fmt.Sprintf("%s:%s", n.Space, n.Local)
+ }
+ return n.Local
+}
+
+func appendOrError(slice any, item any, err error) (any, error) {
+ if err != nil {
+ return slice, err
+ }
+ var list []any
+ if slice != nil {
+ var ok bool
+ list, ok = slice.([]any)
+ if !ok {
+ list = []any{slice}
+ }
+ }
+ list = append(list, item)
+ return list, nil
+}
diff --git a/providers/openapi/schema/parse_xml_test.go b/providers/openapi/schema/parse_xml_test.go
index a87f14994..88a8435f5 100644
--- a/providers/openapi/schema/parse_xml_test.go
+++ b/providers/openapi/schema/parse_xml_test.go
@@ -27,7 +27,8 @@ func TestParseXML(t *testing.T) {
),
test: func(t *testing.T, v any, err error) {
require.NoError(t, err)
- // id is defined and shouldn't be treated as an additional property
+ // id is indeed defined as attribute but in the payload as node
+ // so it shouldn't be treated as an additional property
require.Equal(t, map[string]any{}, v)
},
},
@@ -42,8 +43,7 @@ func TestParseXML(t *testing.T) {
schematest.WithFreeForm(false),
),
test: func(t *testing.T, v any, err error) {
- require.NoError(t, err)
- require.Equal(t, map[string]any{}, v)
+ require.EqualError(t, err, "failed to parse XML: property 'id' is expected as XML attribute but received as XML node and additionalProperty is not allowed: /root/id")
},
},
{
@@ -297,7 +297,8 @@ func TestUnmarshalXML(t *testing.T) {
test: func(t *testing.T) {
v, err := schema.UnmarshalXML(strings.NewReader("bob sarah "),
schematest.New("object", schematest.WithProperty("children", schematest.New("array",
- schematest.WithItems("string"),
+ schematest.WithItems("string", schematest.WithXml(&schema.Xml{Name: "name"})),
+ schematest.WithXml(&schema.Xml{Wrapped: true}),
))),
)
require.NoError(t, err)
@@ -355,6 +356,21 @@ func TestUnmarshalXML(t *testing.T) {
require.Equal(t, map[string]interface{}{"id": "15", "author": "J K. Rowling", "title": "Harry Potter", "smp": "https://example.com/schema"}, v)
},
},
+ {
+ name: "books example from swagger",
+ test: func(t *testing.T) {
+ v, err := schema.UnmarshalXML(strings.NewReader(`one two `),
+ schematest.New("object",
+ schematest.WithProperty("foo", schematest.New("object",
+ schematest.WithProperty("books",
+ schematest.New("array", schematest.WithItems("string"))),
+ )),
+ ),
+ )
+ require.NoError(t, err)
+ require.Equal(t, map[string]any{"foo": map[string]any{"books": []any{"one", "two"}}}, v)
+ },
+ },
}
t.Parallel()
diff --git a/version/version.go b/version/version.go
index 25fc1d5e3..c4b28f2e1 100644
--- a/version/version.go
+++ b/version/version.go
@@ -3,13 +3,14 @@ package version
import (
"encoding/json"
"fmt"
- "gopkg.in/yaml.v3"
"strconv"
"strings"
+
+ "gopkg.in/yaml.v3"
)
var (
- BuildVersion = ""
+ BuildVersion = "0.0.0"
BuildTime = ""
)
diff --git a/webui.png b/webui.png
index 83574b7a8..ad9ce430e 100644
Binary files a/webui.png and b/webui.png differ
diff --git a/webui/dist/index.html b/webui/dist/index.html
new file mode 100644
index 000000000..174db7e0d
--- /dev/null
+++ b/webui/dist/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Mokapi UI
+
+
+
+ The UI is not built yet. Run the webui build to generate this folder.
+
+
+
\ No newline at end of file
diff --git a/webui/e2e/dashboard-demo/dashboard.spec.ts b/webui/e2e/dashboard-demo/dashboard.spec.ts
index 074f27a73..9b7a0df39 100644
--- a/webui/e2e/dashboard-demo/dashboard.spec.ts
+++ b/webui/e2e/dashboard-demo/dashboard.spec.ts
@@ -1,4 +1,4 @@
-import { test, expect } from '../models/fixture-dashboard'
+import { test, expect } from '../models/fixture-website'
import { getCellByColumnName } from '../helpers/table'
test.use({ colorScheme: 'light' })
diff --git a/webui/e2e/dashboard-demo/kafka.spec.ts b/webui/e2e/dashboard-demo/kafka.spec.ts
index 8fce5b7e8..9dba22b2c 100644
--- a/webui/e2e/dashboard-demo/kafka.spec.ts
+++ b/webui/e2e/dashboard-demo/kafka.spec.ts
@@ -1,4 +1,4 @@
-import { test, expect } from '../models/fixture-dashboard'
+import { test, expect } from '../models/fixture-website'
import { getCellByColumnName } from '../helpers/table'
test.use({ colorScheme: 'light' })
@@ -95,7 +95,7 @@ test('Visit Kafka Order Service', async ({ page }) => {
await test.step('Verify Configs', async () => {
const table = page.getByRole('table', { name: 'Configs' });
- await expect(await getCellByColumnName(table, 'URL')).toContainText('/webui/scripts/dashboard-demo/demo-configs/asyncapi.yaml');
+ await expect(await getCellByColumnName(table, 'URL')).toContainText('/asyncapi.yaml');
await expect(await getCellByColumnName(table, 'Provider')).toHaveText('File');
});
diff --git a/webui/e2e/dashboard-demo/ldap.spec.ts b/webui/e2e/dashboard-demo/ldap.spec.ts
index c85eee356..974d8178a 100644
--- a/webui/e2e/dashboard-demo/ldap.spec.ts
+++ b/webui/e2e/dashboard-demo/ldap.spec.ts
@@ -1,4 +1,4 @@
-import { test, expect } from '../models/fixture-dashboard'
+import { test, expect } from '../models/fixture-website'
import { getCellByColumnName } from '../helpers/table'
test.use({ colorScheme: 'light' })
@@ -34,7 +34,7 @@ test('Visit LDAP Testserver', async ({ page }) => {
await test.step('Verify Configs', async () => {
const table = page.getByRole('table', { name: 'Configs' });
- await expect(await getCellByColumnName(table, 'URL')).toContainText('/webui/scripts/dashboard-demo/demo-configs/ldap.yaml');
+ await expect(await getCellByColumnName(table, 'URL')).toContainText('/ldap.yaml');
await expect(await getCellByColumnName(table, 'Provider')).toHaveText('File');
});
diff --git a/webui/e2e/dashboard-demo/mail.spec.ts b/webui/e2e/dashboard-demo/mail.spec.ts
index 20e30a134..d12ce670b 100644
--- a/webui/e2e/dashboard-demo/mail.spec.ts
+++ b/webui/e2e/dashboard-demo/mail.spec.ts
@@ -1,4 +1,4 @@
-import { test, expect } from '../models/fixture-dashboard'
+import { test, expect } from '../models/fixture-website'
import { getCellByColumnName } from '../helpers/table'
test.use({ colorScheme: 'light' })
@@ -166,8 +166,11 @@ test('Visit Mail Server', async ({ page }) => {
await test.step('Verify Configs', async () => {
await page.getByRole('tab', { name: 'Configs' }).click();
- const table = page.getByRole('table', { name: 'Configs' });
- await expect(await getCellByColumnName(table, 'URL')).toContainText('/webui/scripts/dashboard-demo/demo-configs/mail.yaml');
+ const panel = page.getByRole('tabpanel', { name: 'Configs' });
+ await panel.waitFor({ state: 'visible' });
+
+ const table = panel.getByRole('table', { name: 'Configs' });
+ await expect(await getCellByColumnName(table, 'URL')).toContainText('/mail.yaml');
await expect(await getCellByColumnName(table, 'Provider')).toHaveText('File');
});
diff --git a/webui/e2e/dashboard-demo/petstore.spec.ts b/webui/e2e/dashboard-demo/petstore.spec.ts
index 3471cf431..0080e31ef 100644
--- a/webui/e2e/dashboard-demo/petstore.spec.ts
+++ b/webui/e2e/dashboard-demo/petstore.spec.ts
@@ -1,4 +1,4 @@
-import { test, expect } from '../models/fixture-dashboard'
+import { test, expect } from '../models/fixture-website'
import { getCellByColumnName } from '../helpers/table'
test.use({ colorScheme: 'light' })
@@ -60,10 +60,10 @@ test('Visit Petstore Demo', async ({ page }) => {
await test.step('Verify Configs', async () => {
const table = page.getByRole('table', { name: 'Configs' });
const rows = table.locator('tbody tr');
- await expect(await getCellByColumnName(table, 'URL', rows.nth(0))).toContainText('/webui/scripts/dashboard-demo/demo-configs/petstore.yaml');
+ await expect(await getCellByColumnName(table, 'URL', rows.nth(0))).toContainText('/petstore.yaml');
await expect(await getCellByColumnName(table, 'Provider', rows.nth(0))).toHaveText('File');
- await expect(await getCellByColumnName(table, 'URL', rows.nth(1))).toContainText('/webui/scripts/dashboard-demo/demo-configs/z.petstore.fix.yaml');
+ await expect(await getCellByColumnName(table, 'URL', rows.nth(1))).toContainText('/z.petstore.fix.yaml');
await expect(await getCellByColumnName(table, 'Provider', rows.nth(1))).toHaveText('File');
});
diff --git a/webui/e2e/documentation/guides.spec.ts b/webui/e2e/documentation/guides.spec.ts
index 760af8e1a..978fd013a 100644
--- a/webui/e2e/documentation/guides.spec.ts
+++ b/webui/e2e/documentation/guides.spec.ts
@@ -45,7 +45,7 @@ test('Visit Guides', async ({ page, home }) => {
await expect(page.getByRole('region', { name: 'HTTP' }).getByRole('link', { name: 'Quick Start' })).toBeVisible()
await page.getByRole('button', { name: 'Get Started'}).click()
- await expect(getStarted.getByRole('link', { name: 'Installation' })).toBeVisible()
+ await expect(getStarted.getByRole('link', { name: 'Installation' })).not.toBeVisible()
})
await test.step('visit HTTP Quick Start page', async () => {
diff --git a/webui/e2e/header.website.spec.ts b/webui/e2e/header.website.spec.ts
index 5c47b8107..9115af3c4 100644
--- a/webui/e2e/header.website.spec.ts
+++ b/webui/e2e/header.website.spec.ts
@@ -1,19 +1,16 @@
import { test, expect } from './models/fixture-dashboard'
-test('header in dashboard', async ({ dashboard }) => {
- await dashboard.open()
+test('header in dashboard', async ({ page }) => {
+ await page.goto('/home')
await test.step("navigation links", async () => {
- const links = dashboard.header.getNavLinks()
- await expect(links.nth(0)).toHaveText('Dashboard')
- await expect(links.nth(1)).toHaveText('Guides')
- await expect(links.nth(2)).toHaveText('Configuration')
- await expect(links.nth(3)).toHaveText('JavaScript API')
- await expect(links.nth(4)).toHaveText('Resources')
- await expect(links.nth(5)).toHaveText('References')
- })
-
- await test.step('version number', async() => {
- await expect(dashboard.header.version).not.toBeVisible();
+ const links = page.getByRole('banner').getByRole('navigation').getByRole('link');
+ await expect(links.nth(0)).toHaveAccessibleDescription('Mokapi home')
+ await expect(links.nth(1)).toHaveText('Dashboard')
+ await expect(links.nth(2)).toHaveText('Guides')
+ await expect(links.nth(3)).toHaveText('Configuration')
+ await expect(links.nth(4)).toHaveText('JavaScript API')
+ await expect(links.nth(5)).toHaveText('Resources')
+ await expect(links.nth(6)).toHaveText('References')
})
})
\ No newline at end of file
diff --git a/webui/e2e/home.spec.ts b/webui/e2e/home.spec.ts
index bd43367ad..00051f622 100644
--- a/webui/e2e/home.spec.ts
+++ b/webui/e2e/home.spec.ts
@@ -4,5 +4,5 @@ test('home overview', async ({ home }) => {
await home.open()
await expect(home.heroTitle).toHaveText('Mock APIs. Test Faster. Ship Better.')
- await expect(home.heroDescription).toHaveText(`Test without external dependencies and build more reliable software.Free, open-source, and fully under your control.`)
+ await expect(home.heroDescription).toHaveText(`Mokapi is your always-on API contract guardian — lightweight, transparent, and spec-driven. Free, open-source, and fully under your control.`)
})
\ No newline at end of file
diff --git a/webui/e2e/models/fixture-website.ts b/webui/e2e/models/fixture-website.ts
index 07ea2e1af..c279cf26c 100644
--- a/webui/e2e/models/fixture-website.ts
+++ b/webui/e2e/models/fixture-website.ts
@@ -8,6 +8,16 @@ type WebsiteFixture = {
export { expect } from '@playwright/test'
export const test = base.extend({
+ context: async ({ context }, use) => {
+ await context.addInitScript(() => {
+ const addNoMotionClass = () => {
+ document.body.classList.add('no-motion');
+ };
+ document.addEventListener('DOMContentLoaded', addNoMotionClass);
+ });
+ await use(context);
+ },
+
home: async ({page}, use) => {
const home = new HomeModel(page)
await use(home)
diff --git a/webui/package-lock.json b/webui/package-lock.json
index ce9cda77b..f1cbdd000 100644
--- a/webui/package-lock.json
+++ b/webui/package-lock.json
@@ -12,12 +12,12 @@
"@ssthouse/vue3-tree-chart": "^0.3.0",
"@types/bootstrap": "^5.2.10",
"@types/mokapi": "^0.29.1",
- "@types/nodemailer": "^7.0.4",
+ "@types/nodemailer": "^7.0.5",
"@types/whatwg-mimetype": "^3.0.2",
"ace-builds": "^1.43.5",
"bootstrap": "^5.3.8",
"bootstrap-icons": "^1.13.1",
- "cors": "^2.8.5",
+ "cors": "^2.8.6",
"dayjs": "^1.11.19",
"del-cli": "^7.0.0",
"express": "^5.2.1",
@@ -25,23 +25,23 @@
"http-status-codes": "^2.3.0",
"js-yaml": "^4.1.1",
"kafkajs": "^2.2.4",
- "ldapts": "^8.1.2",
+ "ldapts": "^8.1.3",
"mime-types": "^3.0.2",
"ncp": "^2.0.0",
"nodemailer": "^7.0.12",
- "vue": "^3.5.26",
+ "vue": "^3.5.27",
"vue-router": "^4.6.4",
"vue3-ace-editor": "^2.2.4",
"vue3-highlightjs": "^1.0.5",
"vue3-markdown-it": "^1.0.10",
- "whatwg-mimetype": "^4.0.0",
+ "whatwg-mimetype": "^5.0.0",
"xml-formatter": "^3.6.7"
},
"devDependencies": {
"@playwright/test": "^1.57.0",
"@rushstack/eslint-patch": "^1.15.0",
"@types/js-yaml": "^4.0.9",
- "@types/node": "^25.0.3",
+ "@types/node": "^25.0.9",
"@vitejs/plugin-vue": "^6.0.3",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/eslint-config-typescript": "^14.6.0",
@@ -49,22 +49,13 @@
"eslint": "^9.39.2",
"eslint-plugin-vue": "^10.6.2",
"npm-run-all": "^4.1.5",
- "prettier": "^3.7.4",
+ "prettier": "^3.8.1",
"typescript": "~5.9.3",
- "vite": "^7.3.0",
- "vue-tsc": "^3.2.1",
+ "vite": "^7.3.1",
+ "vue-tsc": "^3.2.3",
"xml2js": "^0.6.2"
}
},
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/@aws-crypto/sha256-browser": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz",
@@ -191,554 +182,631 @@
}
},
"node_modules/@aws-sdk/client-sesv2": {
- "version": "3.958.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sesv2/-/client-sesv2-3.958.0.tgz",
- "integrity": "sha512-3x3n8IIxIMAkdpt9wy9zS7MO2lqTcJwQTdHMn6BlD7YUohb+r5Q4KCOEQ2uHWd4WIJv2tlbXnfypHaXReO/WXA==",
+ "version": "3.975.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sesv2/-/client-sesv2-3.975.0.tgz",
+ "integrity": "sha512-4R+hR6N2LbvTIf6Y2e9b9PQlVkAD5WmSRMAGslul5L/jCE0LzOYC+4RQ7u5EOv0mERozcYleLPK2Zc0jTn4gTg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/credential-provider-node": "3.958.0",
- "@aws-sdk/middleware-host-header": "3.957.0",
- "@aws-sdk/middleware-logger": "3.957.0",
- "@aws-sdk/middleware-recursion-detection": "3.957.0",
- "@aws-sdk/middleware-user-agent": "3.957.0",
- "@aws-sdk/region-config-resolver": "3.957.0",
- "@aws-sdk/signature-v4-multi-region": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@aws-sdk/util-endpoints": "3.957.0",
- "@aws-sdk/util-user-agent-browser": "3.957.0",
- "@aws-sdk/util-user-agent-node": "3.957.0",
- "@smithy/config-resolver": "^4.4.5",
- "@smithy/core": "^3.20.0",
- "@smithy/fetch-http-handler": "^5.3.8",
- "@smithy/hash-node": "^4.2.7",
- "@smithy/invalid-dependency": "^4.2.7",
- "@smithy/middleware-content-length": "^4.2.7",
- "@smithy/middleware-endpoint": "^4.4.1",
- "@smithy/middleware-retry": "^4.4.17",
- "@smithy/middleware-serde": "^4.2.8",
- "@smithy/middleware-stack": "^4.2.7",
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/node-http-handler": "^4.4.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/smithy-client": "^4.10.2",
- "@smithy/types": "^4.11.0",
- "@smithy/url-parser": "^4.2.7",
+ "@aws-sdk/core": "^3.973.1",
+ "@aws-sdk/credential-provider-node": "^3.972.1",
+ "@aws-sdk/middleware-host-header": "^3.972.1",
+ "@aws-sdk/middleware-logger": "^3.972.1",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.1",
+ "@aws-sdk/middleware-user-agent": "^3.972.2",
+ "@aws-sdk/region-config-resolver": "^3.972.1",
+ "@aws-sdk/signature-v4-multi-region": "3.972.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@aws-sdk/util-endpoints": "3.972.0",
+ "@aws-sdk/util-user-agent-browser": "^3.972.1",
+ "@aws-sdk/util-user-agent-node": "^3.972.1",
+ "@smithy/config-resolver": "^4.4.6",
+ "@smithy/core": "^3.21.1",
+ "@smithy/fetch-http-handler": "^5.3.9",
+ "@smithy/hash-node": "^4.2.8",
+ "@smithy/invalid-dependency": "^4.2.8",
+ "@smithy/middleware-content-length": "^4.2.8",
+ "@smithy/middleware-endpoint": "^4.4.11",
+ "@smithy/middleware-retry": "^4.4.27",
+ "@smithy/middleware-serde": "^4.2.9",
+ "@smithy/middleware-stack": "^4.2.8",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/node-http-handler": "^4.4.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/smithy-client": "^4.10.12",
+ "@smithy/types": "^4.12.0",
+ "@smithy/url-parser": "^4.2.8",
"@smithy/util-base64": "^4.3.0",
"@smithy/util-body-length-browser": "^4.2.0",
"@smithy/util-body-length-node": "^4.2.1",
- "@smithy/util-defaults-mode-browser": "^4.3.16",
- "@smithy/util-defaults-mode-node": "^4.2.19",
- "@smithy/util-endpoints": "^3.2.7",
- "@smithy/util-middleware": "^4.2.7",
- "@smithy/util-retry": "^4.2.7",
+ "@smithy/util-defaults-mode-browser": "^4.3.26",
+ "@smithy/util-defaults-mode-node": "^4.2.29",
+ "@smithy/util-endpoints": "^3.2.8",
+ "@smithy/util-middleware": "^4.2.8",
+ "@smithy/util-retry": "^4.2.8",
"@smithy/util-utf8": "^4.2.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/client-sso": {
- "version": "3.958.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.958.0.tgz",
- "integrity": "sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg==",
+ "version": "3.974.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.974.0.tgz",
+ "integrity": "sha512-ci+GiM0c4ULo4D79UMcY06LcOLcfvUfiyt8PzNY0vbt5O8BfCPYf4QomwVgkNcLLCYmroO4ge2Yy1EsLUlcD6g==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/middleware-host-header": "3.957.0",
- "@aws-sdk/middleware-logger": "3.957.0",
- "@aws-sdk/middleware-recursion-detection": "3.957.0",
- "@aws-sdk/middleware-user-agent": "3.957.0",
- "@aws-sdk/region-config-resolver": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@aws-sdk/util-endpoints": "3.957.0",
- "@aws-sdk/util-user-agent-browser": "3.957.0",
- "@aws-sdk/util-user-agent-node": "3.957.0",
- "@smithy/config-resolver": "^4.4.5",
- "@smithy/core": "^3.20.0",
- "@smithy/fetch-http-handler": "^5.3.8",
- "@smithy/hash-node": "^4.2.7",
- "@smithy/invalid-dependency": "^4.2.7",
- "@smithy/middleware-content-length": "^4.2.7",
- "@smithy/middleware-endpoint": "^4.4.1",
- "@smithy/middleware-retry": "^4.4.17",
- "@smithy/middleware-serde": "^4.2.8",
- "@smithy/middleware-stack": "^4.2.7",
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/node-http-handler": "^4.4.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/smithy-client": "^4.10.2",
- "@smithy/types": "^4.11.0",
- "@smithy/url-parser": "^4.2.7",
+ "@aws-sdk/core": "^3.973.0",
+ "@aws-sdk/middleware-host-header": "^3.972.1",
+ "@aws-sdk/middleware-logger": "^3.972.1",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.1",
+ "@aws-sdk/middleware-user-agent": "^3.972.1",
+ "@aws-sdk/region-config-resolver": "^3.972.1",
+ "@aws-sdk/types": "^3.973.0",
+ "@aws-sdk/util-endpoints": "3.972.0",
+ "@aws-sdk/util-user-agent-browser": "^3.972.1",
+ "@aws-sdk/util-user-agent-node": "^3.972.1",
+ "@smithy/config-resolver": "^4.4.6",
+ "@smithy/core": "^3.21.0",
+ "@smithy/fetch-http-handler": "^5.3.9",
+ "@smithy/hash-node": "^4.2.8",
+ "@smithy/invalid-dependency": "^4.2.8",
+ "@smithy/middleware-content-length": "^4.2.8",
+ "@smithy/middleware-endpoint": "^4.4.10",
+ "@smithy/middleware-retry": "^4.4.26",
+ "@smithy/middleware-serde": "^4.2.9",
+ "@smithy/middleware-stack": "^4.2.8",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/node-http-handler": "^4.4.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/smithy-client": "^4.10.11",
+ "@smithy/types": "^4.12.0",
+ "@smithy/url-parser": "^4.2.8",
"@smithy/util-base64": "^4.3.0",
"@smithy/util-body-length-browser": "^4.2.0",
"@smithy/util-body-length-node": "^4.2.1",
- "@smithy/util-defaults-mode-browser": "^4.3.16",
- "@smithy/util-defaults-mode-node": "^4.2.19",
- "@smithy/util-endpoints": "^3.2.7",
- "@smithy/util-middleware": "^4.2.7",
- "@smithy/util-retry": "^4.2.7",
+ "@smithy/util-defaults-mode-browser": "^4.3.25",
+ "@smithy/util-defaults-mode-node": "^4.2.28",
+ "@smithy/util-endpoints": "^3.2.8",
+ "@smithy/util-middleware": "^4.2.8",
+ "@smithy/util-retry": "^4.2.8",
"@smithy/util-utf8": "^4.2.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/core": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.957.0.tgz",
- "integrity": "sha512-DrZgDnF1lQZv75a52nFWs6MExihJF2GZB6ETZRqr6jMwhrk2kbJPUtvgbifwcL7AYmVqHQDJBrR/MqkwwFCpiw==",
+ "version": "3.973.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.1.tgz",
+ "integrity": "sha512-Ocubx42QsMyVs9ANSmFpRm0S+hubWljpPLjOi9UFrtcnVJjrVJTzQ51sN0e5g4e8i8QZ7uY73zosLmgYL7kZTQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.957.0",
- "@aws-sdk/xml-builder": "3.957.0",
- "@smithy/core": "^3.20.0",
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/signature-v4": "^5.3.7",
- "@smithy/smithy-client": "^4.10.2",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@aws-sdk/xml-builder": "^3.972.1",
+ "@smithy/core": "^3.21.1",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/signature-v4": "^5.3.8",
+ "@smithy/smithy-client": "^4.10.12",
+ "@smithy/types": "^4.12.0",
"@smithy/util-base64": "^4.3.0",
- "@smithy/util-middleware": "^4.2.7",
+ "@smithy/util-middleware": "^4.2.8",
"@smithy/util-utf8": "^4.2.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/credential-provider-env": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.957.0.tgz",
- "integrity": "sha512-475mkhGaWCr+Z52fOOVb/q2VHuNvqEDixlYIkeaO6xJ6t9qR0wpLt4hOQaR6zR1wfZV0SlE7d8RErdYq/PByog==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.1.tgz",
+ "integrity": "sha512-/etNHqnx96phy/SjI0HRC588o4vKH5F0xfkZ13yAATV7aNrb+5gYGNE6ePWafP+FuZ3HkULSSlJFj0AxgrAqYw==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/core": "^3.973.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/credential-provider-http": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.957.0.tgz",
- "integrity": "sha512-8dS55QHRxXgJlHkEYaCGZIhieCs9NU1HU1BcqQ4RfUdSsfRdxxktqUKgCnBnOOn0oD3PPA8cQOCAVgIyRb3Rfw==",
+ "version": "3.972.2",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.2.tgz",
+ "integrity": "sha512-mXgdaUfe5oM+tWKyeZ7Vh/iQ94FrkMky1uuzwTOmFADiRcSk5uHy/e3boEFedXiT/PRGzgBmqvJVK4F6lUISCg==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/fetch-http-handler": "^5.3.8",
- "@smithy/node-http-handler": "^4.4.7",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/smithy-client": "^4.10.2",
- "@smithy/types": "^4.11.0",
- "@smithy/util-stream": "^4.5.8",
+ "@aws-sdk/core": "^3.973.1",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/fetch-http-handler": "^5.3.9",
+ "@smithy/node-http-handler": "^4.4.8",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/smithy-client": "^4.10.12",
+ "@smithy/types": "^4.12.0",
+ "@smithy/util-stream": "^4.5.10",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/credential-provider-ini": {
- "version": "3.958.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.958.0.tgz",
- "integrity": "sha512-u7twvZa1/6GWmPBZs6DbjlegCoNzNjBsMS/6fvh5quByYrcJr/uLd8YEr7S3UIq4kR/gSnHqcae7y2nL2bqZdg==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.1.tgz",
+ "integrity": "sha512-OdbJA3v+XlNDsrYzNPRUwr8l7gw1r/nR8l4r96MDzSBDU8WEo8T6C06SvwaXR8SpzsjO3sq5KMP86wXWg7Rj4g==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/credential-provider-env": "3.957.0",
- "@aws-sdk/credential-provider-http": "3.957.0",
- "@aws-sdk/credential-provider-login": "3.958.0",
- "@aws-sdk/credential-provider-process": "3.957.0",
- "@aws-sdk/credential-provider-sso": "3.958.0",
- "@aws-sdk/credential-provider-web-identity": "3.958.0",
- "@aws-sdk/nested-clients": "3.958.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/credential-provider-imds": "^4.2.7",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/shared-ini-file-loader": "^4.4.2",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/core": "^3.973.0",
+ "@aws-sdk/credential-provider-env": "^3.972.1",
+ "@aws-sdk/credential-provider-http": "^3.972.1",
+ "@aws-sdk/credential-provider-login": "^3.972.1",
+ "@aws-sdk/credential-provider-process": "^3.972.1",
+ "@aws-sdk/credential-provider-sso": "^3.972.1",
+ "@aws-sdk/credential-provider-web-identity": "^3.972.1",
+ "@aws-sdk/nested-clients": "3.974.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/credential-provider-imds": "^4.2.8",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/shared-ini-file-loader": "^4.4.3",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/credential-provider-login": {
- "version": "3.958.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.958.0.tgz",
- "integrity": "sha512-sDwtDnBSszUIbzbOORGh5gmXGl9aK25+BHb4gb1aVlqB+nNL2+IUEJA62+CE55lXSH8qXF90paivjK8tOHTwPA==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.1.tgz",
+ "integrity": "sha512-CccqDGL6ZrF3/EFWZefvKW7QwwRdxlHUO8NVBKNVcNq6womrPDvqB6xc9icACtE0XB0a7PLoSTkAg8bQVkTO2w==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/nested-clients": "3.958.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/shared-ini-file-loader": "^4.4.2",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/core": "^3.973.0",
+ "@aws-sdk/nested-clients": "3.974.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/shared-ini-file-loader": "^4.4.3",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/credential-provider-node": {
- "version": "3.958.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.958.0.tgz",
- "integrity": "sha512-vdoZbNG2dt66I7EpN3fKCzi6fp9xjIiwEA/vVVgqO4wXCGw8rKPIdDUus4e13VvTr330uQs2W0UNg/7AgtquEQ==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.1.tgz",
+ "integrity": "sha512-DwXPk9GfuU/xG9tmCyXFVkCr6X3W8ZCoL5Ptb0pbltEx1/LCcg7T+PBqDlPiiinNCD6ilIoMJDWsnJ8ikzZA7Q==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/credential-provider-env": "3.957.0",
- "@aws-sdk/credential-provider-http": "3.957.0",
- "@aws-sdk/credential-provider-ini": "3.958.0",
- "@aws-sdk/credential-provider-process": "3.957.0",
- "@aws-sdk/credential-provider-sso": "3.958.0",
- "@aws-sdk/credential-provider-web-identity": "3.958.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/credential-provider-imds": "^4.2.7",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/shared-ini-file-loader": "^4.4.2",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/credential-provider-env": "^3.972.1",
+ "@aws-sdk/credential-provider-http": "^3.972.1",
+ "@aws-sdk/credential-provider-ini": "^3.972.1",
+ "@aws-sdk/credential-provider-process": "^3.972.1",
+ "@aws-sdk/credential-provider-sso": "^3.972.1",
+ "@aws-sdk/credential-provider-web-identity": "^3.972.1",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/credential-provider-imds": "^4.2.8",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/shared-ini-file-loader": "^4.4.3",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/credential-provider-process": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.957.0.tgz",
- "integrity": "sha512-/KIz9kadwbeLy6SKvT79W81Y+hb/8LMDyeloA2zhouE28hmne+hLn0wNCQXAAupFFlYOAtZR2NTBs7HBAReJlg==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.1.tgz",
+ "integrity": "sha512-bi47Zigu3692SJwdBvo8y1dEwE6B61stCwCFnuRWJVTfiM84B+VTSCV661CSWJmIZzmcy7J5J3kWyxL02iHj0w==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/shared-ini-file-loader": "^4.4.2",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/core": "^3.973.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/shared-ini-file-loader": "^4.4.3",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/credential-provider-sso": {
- "version": "3.958.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.958.0.tgz",
- "integrity": "sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.1.tgz",
+ "integrity": "sha512-dLZVNhM7wSgVUFsgVYgI5hb5Z/9PUkT46pk/SHrSmUqfx6YDvoV4YcPtaiRqviPpEGGiRtdQMEadyOKIRqulUQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/client-sso": "3.958.0",
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/token-providers": "3.958.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/shared-ini-file-loader": "^4.4.2",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/client-sso": "3.974.0",
+ "@aws-sdk/core": "^3.973.0",
+ "@aws-sdk/token-providers": "3.974.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/shared-ini-file-loader": "^4.4.3",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/credential-provider-web-identity": {
- "version": "3.958.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.958.0.tgz",
- "integrity": "sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.1.tgz",
+ "integrity": "sha512-YMDeYgi0u687Ay0dAq/pFPKuijrlKTgsaB/UATbxCs/FzZfMiG4If5ksywHmmW7MiYUF8VVv+uou3TczvLrN4w==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/nested-clients": "3.958.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/shared-ini-file-loader": "^4.4.2",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/core": "^3.973.0",
+ "@aws-sdk/nested-clients": "3.974.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/shared-ini-file-loader": "^4.4.3",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/middleware-host-header": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.957.0.tgz",
- "integrity": "sha512-BBgKawVyfQZglEkNTuBBdC3azlyqNXsvvN4jPkWAiNYcY0x1BasaJFl+7u/HisfULstryweJq/dAvIZIxzlZaA==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.1.tgz",
+ "integrity": "sha512-/R82lXLPmZ9JaUGSUdKtBp2k/5xQxvBT3zZWyKiBOhyulFotlfvdlrO8TnqstBimsl4lYEYySDL+W6ldFh6ALg==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.957.0",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/middleware-logger": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.957.0.tgz",
- "integrity": "sha512-w1qfKrSKHf9b5a8O76yQ1t69u6NWuBjr5kBX+jRWFx/5mu6RLpqERXRpVJxfosbep7k3B+DSB5tZMZ82GKcJtQ==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.1.tgz",
+ "integrity": "sha512-JGgFl6cHg9G2FHu4lyFIzmFN8KESBiRr84gLC3Aeni0Gt1nKm+KxWLBuha/RPcXxJygGXCcMM4AykkIwxor8RA==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.957.0",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/middleware-recursion-detection": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.957.0.tgz",
- "integrity": "sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.1.tgz",
+ "integrity": "sha512-taGzNRe8vPHjnliqXIHp9kBgIemLE/xCaRTMH1NH0cncHeaPcjxtnCroAAM9aOlPuKvBe2CpZESyvM1+D8oI7Q==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.957.0",
+ "@aws-sdk/types": "^3.973.0",
"@aws/lambda-invoke-store": "^0.2.2",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/middleware-sdk-s3": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.957.0.tgz",
- "integrity": "sha512-5B2qY2nR2LYpxoQP0xUum5A1UNvH2JQpLHDH1nWFNF/XetV7ipFHksMxPNhtJJ6ARaWhQIDXfOUj0jcnkJxXUg==",
+ "version": "3.972.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.0.tgz",
+ "integrity": "sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@aws-sdk/util-arn-parser": "3.957.0",
- "@smithy/core": "^3.20.0",
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/signature-v4": "^5.3.7",
- "@smithy/smithy-client": "^4.10.2",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/core": "3.972.0",
+ "@aws-sdk/types": "3.972.0",
+ "@aws-sdk/util-arn-parser": "3.972.0",
+ "@smithy/core": "^3.20.6",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/signature-v4": "^5.3.8",
+ "@smithy/smithy-client": "^4.10.8",
+ "@smithy/types": "^4.12.0",
"@smithy/util-config-provider": "^4.2.0",
- "@smithy/util-middleware": "^4.2.7",
- "@smithy/util-stream": "^4.5.8",
+ "@smithy/util-middleware": "^4.2.8",
+ "@smithy/util-stream": "^4.5.10",
"@smithy/util-utf8": "^4.2.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/core": {
+ "version": "3.972.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.972.0.tgz",
+ "integrity": "sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.972.0",
+ "@aws-sdk/xml-builder": "3.972.0",
+ "@smithy/core": "^3.20.6",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/signature-v4": "^5.3.8",
+ "@smithy/smithy-client": "^4.10.8",
+ "@smithy/types": "^4.12.0",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-middleware": "^4.2.8",
+ "@smithy/util-utf8": "^4.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": {
+ "version": "3.972.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz",
+ "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/xml-builder": {
+ "version": "3.972.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.0.tgz",
+ "integrity": "sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.12.0",
+ "fast-xml-parser": "5.2.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/middleware-user-agent": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.957.0.tgz",
- "integrity": "sha512-50vcHu96XakQnIvlKJ1UoltrFODjsq2KvtTgHiPFteUS884lQnK5VC/8xd1Msz/1ONpLMzdCVproCQqhDTtMPQ==",
+ "version": "3.972.2",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.2.tgz",
+ "integrity": "sha512-d+Exq074wy0X6wvShg/kmZVtkah+28vMuqCtuY3cydg8LUZOJBtbAolCpEJizSyb8mJJZF9BjWaTANXL4OYnkg==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@aws-sdk/util-endpoints": "3.957.0",
- "@smithy/core": "^3.20.0",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/core": "^3.973.1",
+ "@aws-sdk/types": "^3.973.0",
+ "@aws-sdk/util-endpoints": "3.972.0",
+ "@smithy/core": "^3.21.1",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/nested-clients": {
- "version": "3.958.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.958.0.tgz",
- "integrity": "sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw==",
+ "version": "3.974.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.974.0.tgz",
+ "integrity": "sha512-k3dwdo/vOiHMJc9gMnkPl1BA5aQfTrZbz+8fiDkWrPagqAioZgmo5oiaOaeX0grObfJQKDtcpPFR4iWf8cgl8Q==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/middleware-host-header": "3.957.0",
- "@aws-sdk/middleware-logger": "3.957.0",
- "@aws-sdk/middleware-recursion-detection": "3.957.0",
- "@aws-sdk/middleware-user-agent": "3.957.0",
- "@aws-sdk/region-config-resolver": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@aws-sdk/util-endpoints": "3.957.0",
- "@aws-sdk/util-user-agent-browser": "3.957.0",
- "@aws-sdk/util-user-agent-node": "3.957.0",
- "@smithy/config-resolver": "^4.4.5",
- "@smithy/core": "^3.20.0",
- "@smithy/fetch-http-handler": "^5.3.8",
- "@smithy/hash-node": "^4.2.7",
- "@smithy/invalid-dependency": "^4.2.7",
- "@smithy/middleware-content-length": "^4.2.7",
- "@smithy/middleware-endpoint": "^4.4.1",
- "@smithy/middleware-retry": "^4.4.17",
- "@smithy/middleware-serde": "^4.2.8",
- "@smithy/middleware-stack": "^4.2.7",
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/node-http-handler": "^4.4.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/smithy-client": "^4.10.2",
- "@smithy/types": "^4.11.0",
- "@smithy/url-parser": "^4.2.7",
+ "@aws-sdk/core": "^3.973.0",
+ "@aws-sdk/middleware-host-header": "^3.972.1",
+ "@aws-sdk/middleware-logger": "^3.972.1",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.1",
+ "@aws-sdk/middleware-user-agent": "^3.972.1",
+ "@aws-sdk/region-config-resolver": "^3.972.1",
+ "@aws-sdk/types": "^3.973.0",
+ "@aws-sdk/util-endpoints": "3.972.0",
+ "@aws-sdk/util-user-agent-browser": "^3.972.1",
+ "@aws-sdk/util-user-agent-node": "^3.972.1",
+ "@smithy/config-resolver": "^4.4.6",
+ "@smithy/core": "^3.21.0",
+ "@smithy/fetch-http-handler": "^5.3.9",
+ "@smithy/hash-node": "^4.2.8",
+ "@smithy/invalid-dependency": "^4.2.8",
+ "@smithy/middleware-content-length": "^4.2.8",
+ "@smithy/middleware-endpoint": "^4.4.10",
+ "@smithy/middleware-retry": "^4.4.26",
+ "@smithy/middleware-serde": "^4.2.9",
+ "@smithy/middleware-stack": "^4.2.8",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/node-http-handler": "^4.4.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/smithy-client": "^4.10.11",
+ "@smithy/types": "^4.12.0",
+ "@smithy/url-parser": "^4.2.8",
"@smithy/util-base64": "^4.3.0",
"@smithy/util-body-length-browser": "^4.2.0",
"@smithy/util-body-length-node": "^4.2.1",
- "@smithy/util-defaults-mode-browser": "^4.3.16",
- "@smithy/util-defaults-mode-node": "^4.2.19",
- "@smithy/util-endpoints": "^3.2.7",
- "@smithy/util-middleware": "^4.2.7",
- "@smithy/util-retry": "^4.2.7",
+ "@smithy/util-defaults-mode-browser": "^4.3.25",
+ "@smithy/util-defaults-mode-node": "^4.2.28",
+ "@smithy/util-endpoints": "^3.2.8",
+ "@smithy/util-middleware": "^4.2.8",
+ "@smithy/util-retry": "^4.2.8",
"@smithy/util-utf8": "^4.2.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/region-config-resolver": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.957.0.tgz",
- "integrity": "sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.1.tgz",
+ "integrity": "sha512-voIY8RORpxLAEgEkYaTFnkaIuRwVBEc+RjVZYcSSllPV+ZEKAacai6kNhJeE3D70Le+JCfvRb52tng/AVHY+jQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.957.0",
- "@smithy/config-resolver": "^4.4.5",
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/config-resolver": "^4.4.6",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/signature-v4-multi-region": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.957.0.tgz",
- "integrity": "sha512-t6UfP1xMUigMMzHcb7vaZcjv7dA2DQkk9C/OAP1dKyrE0vb4lFGDaTApi17GN6Km9zFxJthEMUbBc7DL0hq1Bg==",
+ "version": "3.972.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.972.0.tgz",
+ "integrity": "sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/middleware-sdk-s3": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/signature-v4": "^5.3.7",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/middleware-sdk-s3": "3.972.0",
+ "@aws-sdk/types": "3.972.0",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/signature-v4": "^5.3.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": {
+ "version": "3.972.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz",
+ "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/token-providers": {
- "version": "3.958.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.958.0.tgz",
- "integrity": "sha512-UCj7lQXODduD1myNJQkV+LYcGYJ9iiMggR8ow8Hva1g3A/Na5imNXzz6O67k7DAee0TYpy+gkNw+SizC6min8Q==",
+ "version": "3.974.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.974.0.tgz",
+ "integrity": "sha512-cBykL0LiccKIgNhGWvQRTPvsBLPZxnmJU3pYxG538jpFX8lQtrCy1L7mmIHNEdxIdIGEPgAEHF8/JQxgBToqUQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.957.0",
- "@aws-sdk/nested-clients": "3.958.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/shared-ini-file-loader": "^4.4.2",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/core": "^3.973.0",
+ "@aws-sdk/nested-clients": "3.974.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/shared-ini-file-loader": "^4.4.3",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/types": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz",
- "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==",
+ "version": "3.973.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.0.tgz",
+ "integrity": "sha512-jYIdB7a7jhRTvyb378nsjyvJh1Si+zVduJ6urMNGpz8RjkmHZ+9vM2H07XaIB2Cfq0GhJRZYOfUCH8uqQhqBkQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/util-arn-parser": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.957.0.tgz",
- "integrity": "sha512-Aj6m+AyrhWyg8YQ4LDPg2/gIfGHCEcoQdBt5DeSFogN5k9mmJPOJ+IAmNSWmWRjpOxEy6eY813RNDI6qS97M0g==",
+ "version": "3.972.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.0.tgz",
+ "integrity": "sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/util-endpoints": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.957.0.tgz",
- "integrity": "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==",
+ "version": "3.972.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.972.0.tgz",
+ "integrity": "sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.957.0",
- "@smithy/types": "^4.11.0",
- "@smithy/url-parser": "^4.2.7",
- "@smithy/util-endpoints": "^3.2.7",
+ "@aws-sdk/types": "3.972.0",
+ "@smithy/types": "^4.12.0",
+ "@smithy/url-parser": "^4.2.8",
+ "@smithy/util-endpoints": "^3.2.8",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": {
+ "version": "3.972.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz",
+ "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/util-locate-window": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.957.0.tgz",
- "integrity": "sha512-nhmgKHnNV9K+i9daumaIz8JTLsIIML9PE/HUks5liyrjUzenjW/aHoc7WJ9/Td/gPZtayxFnXQSJRb/fDlBuJw==",
+ "version": "3.965.3",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.3.tgz",
+ "integrity": "sha512-FNUqAjlKAGA7GM05kywE99q8wiPHPZqrzhq3wXRga6PRD6A0kzT85Pb0AzYBVTBRpSrKyyr6M92Y6bnSBVp2BA==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws-sdk/util-user-agent-browser": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.957.0.tgz",
- "integrity": "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.1.tgz",
+ "integrity": "sha512-IgF55NFmJX8d9Wql9M0nEpk2eYbuD8G4781FN4/fFgwTXBn86DvlZJuRWDCMcMqZymnBVX7HW9r+3r9ylqfW0w==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.957.0",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/types": "^4.12.0",
"bowser": "^2.11.0",
"tslib": "^2.6.2"
}
},
"node_modules/@aws-sdk/util-user-agent-node": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.957.0.tgz",
- "integrity": "sha512-ycbYCwqXk4gJGp0Oxkzf2KBeeGBdTxz559D41NJP8FlzSej1Gh7Rk40Zo6AyTfsNWkrl/kVi1t937OIzC5t+9Q==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.1.tgz",
+ "integrity": "sha512-oIs4JFcADzoZ0c915R83XvK2HltWupxNsXUIuZse2rgk7b97zTpkxaqXiH0h9ylh31qtgo/t8hp4tIqcsMrEbQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/middleware-user-agent": "3.957.0",
- "@aws-sdk/types": "3.957.0",
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/types": "^4.11.0",
+ "@aws-sdk/middleware-user-agent": "^3.972.1",
+ "@aws-sdk/types": "^3.973.0",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
},
"peerDependencies": {
"aws-crt": ">=1.0.0"
@@ -750,23 +818,23 @@
}
},
"node_modules/@aws-sdk/xml-builder": {
- "version": "3.957.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.957.0.tgz",
- "integrity": "sha512-Ai5iiQqS8kJ5PjzMhWcLKN0G2yasAkvpnPlq2EnqlIMdB48HsizElt62qcktdxp4neRMyGkFq4NzgmDbXnhRiA==",
+ "version": "3.972.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.1.tgz",
+ "integrity": "sha512-6zZGlPOqn7Xb+25MAXGb1JhgvaC5HjZj6GzszuVrnEgbhvzBRFGKYemuHBV4bho+dtqeYKPgaZUv7/e80hIGNg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"fast-xml-parser": "5.2.5",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws/lambda-invoke-store": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz",
- "integrity": "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==",
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
+ "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==",
"license": "Apache-2.0",
"engines": {
"node": ">=18.0.0"
@@ -791,12 +859,12 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
- "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
+ "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.5"
+ "@babel/types": "^7.28.6"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -806,9 +874,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
- "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
+ "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -1261,9 +1329,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
- "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1280,9 +1348,9 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1304,6 +1372,30 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/@eslint/config-helpers": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
@@ -1331,9 +1423,9 @@
}
},
"node_modules/@eslint/eslintrc": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
- "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
+ "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1343,7 +1435,7 @@
"globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
+ "js-yaml": "^4.1.1",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
@@ -1354,6 +1446,30 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/@eslint/js": {
"version": "9.39.2",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz",
@@ -1402,38 +1518,25 @@
}
},
"node_modules/@humanfs/node": {
- "version": "0.16.6",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
- "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@humanfs/core": "^0.19.1",
- "@humanwhocodes/retry": "^0.3.0"
+ "@humanwhocodes/retry": "^0.4.0"
},
"engines": {
"node": ">=18.18.0"
}
},
- "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
- "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": ">=12.22"
},
@@ -1443,9 +1546,9 @@
}
},
"node_modules/@humanwhocodes/retry": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
- "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -1466,6 +1569,7 @@
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
@@ -1478,6 +1582,7 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
"engines": {
"node": ">= 8"
}
@@ -1486,6 +1591,7 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
@@ -1495,26 +1601,26 @@
}
},
"node_modules/@pkgr/core": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
- "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
+ "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
},
"funding": {
- "url": "https://opencollective.com/unts"
+ "url": "https://opencollective.com/pkgr"
}
},
"node_modules/@playwright/test": {
- "version": "1.57.0",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz",
- "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==",
+ "version": "1.58.0",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.0.tgz",
+ "integrity": "sha512-fWza+Lpbj6SkQKCrU6si4iu+fD2dD3gxNHFhUPxsfXBPhnv3rRSQVd0NtBUT9Z/RhF/boCBcuUaMUSTRTopjZg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "playwright": "1.57.0"
+ "playwright": "1.58.0"
},
"bin": {
"playwright": "cli.js"
@@ -1527,6 +1633,7 @@
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
@@ -1540,9 +1647,9 @@
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz",
- "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz",
+ "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==",
"cpu": [
"arm"
],
@@ -1554,9 +1661,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz",
- "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz",
+ "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==",
"cpu": [
"arm64"
],
@@ -1568,9 +1675,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz",
- "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz",
+ "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==",
"cpu": [
"arm64"
],
@@ -1582,9 +1689,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz",
- "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz",
+ "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==",
"cpu": [
"x64"
],
@@ -1596,9 +1703,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz",
- "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz",
+ "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==",
"cpu": [
"arm64"
],
@@ -1610,9 +1717,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz",
- "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz",
+ "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==",
"cpu": [
"x64"
],
@@ -1624,9 +1731,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz",
- "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz",
+ "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==",
"cpu": [
"arm"
],
@@ -1638,9 +1745,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz",
- "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz",
+ "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==",
"cpu": [
"arm"
],
@@ -1652,9 +1759,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz",
- "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz",
+ "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==",
"cpu": [
"arm64"
],
@@ -1666,9 +1773,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz",
- "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz",
+ "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==",
"cpu": [
"arm64"
],
@@ -1679,10 +1786,24 @@
"linux"
]
},
- "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz",
- "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==",
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz",
+ "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz",
+ "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==",
"cpu": [
"loong64"
],
@@ -1694,9 +1815,23 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz",
- "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz",
+ "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz",
+ "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==",
"cpu": [
"ppc64"
],
@@ -1708,9 +1843,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz",
- "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz",
+ "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==",
"cpu": [
"riscv64"
],
@@ -1722,9 +1857,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz",
- "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz",
+ "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==",
"cpu": [
"riscv64"
],
@@ -1736,9 +1871,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz",
- "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz",
+ "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==",
"cpu": [
"s390x"
],
@@ -1750,9 +1885,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz",
- "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz",
+ "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==",
"cpu": [
"x64"
],
@@ -1764,9 +1899,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz",
- "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz",
+ "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==",
"cpu": [
"x64"
],
@@ -1777,10 +1912,38 @@
"linux"
]
},
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz",
+ "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz",
+ "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz",
- "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz",
+ "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==",
"cpu": [
"arm64"
],
@@ -1792,9 +1955,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz",
- "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz",
+ "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==",
"cpu": [
"ia32"
],
@@ -1805,10 +1968,24 @@
"win32"
]
},
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz",
+ "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz",
- "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz",
+ "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==",
"cpu": [
"x64"
],
@@ -1839,12 +2016,12 @@
}
},
"node_modules/@smithy/abort-controller": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.7.tgz",
- "integrity": "sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz",
+ "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -1852,16 +2029,16 @@
}
},
"node_modules/@smithy/config-resolver": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz",
- "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==",
+ "version": "4.4.6",
+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz",
+ "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/types": "^4.12.0",
"@smithy/util-config-provider": "^4.2.0",
- "@smithy/util-endpoints": "^3.2.7",
- "@smithy/util-middleware": "^4.2.7",
+ "@smithy/util-endpoints": "^3.2.8",
+ "@smithy/util-middleware": "^4.2.8",
"tslib": "^2.6.2"
},
"engines": {
@@ -1869,18 +2046,18 @@
}
},
"node_modules/@smithy/core": {
- "version": "3.20.0",
- "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.20.0.tgz",
- "integrity": "sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ==",
+ "version": "3.21.1",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.21.1.tgz",
+ "integrity": "sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/middleware-serde": "^4.2.8",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/middleware-serde": "^4.2.9",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/types": "^4.12.0",
"@smithy/util-base64": "^4.3.0",
"@smithy/util-body-length-browser": "^4.2.0",
- "@smithy/util-middleware": "^4.2.7",
- "@smithy/util-stream": "^4.5.8",
+ "@smithy/util-middleware": "^4.2.8",
+ "@smithy/util-stream": "^4.5.10",
"@smithy/util-utf8": "^4.2.0",
"@smithy/uuid": "^1.1.0",
"tslib": "^2.6.2"
@@ -1890,15 +2067,15 @@
}
},
"node_modules/@smithy/credential-provider-imds": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz",
- "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz",
+ "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/types": "^4.11.0",
- "@smithy/url-parser": "^4.2.7",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/types": "^4.12.0",
+ "@smithy/url-parser": "^4.2.8",
"tslib": "^2.6.2"
},
"engines": {
@@ -1906,14 +2083,14 @@
}
},
"node_modules/@smithy/fetch-http-handler": {
- "version": "5.3.8",
- "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.8.tgz",
- "integrity": "sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg==",
+ "version": "5.3.9",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz",
+ "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/querystring-builder": "^4.2.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/querystring-builder": "^4.2.8",
+ "@smithy/types": "^4.12.0",
"@smithy/util-base64": "^4.3.0",
"tslib": "^2.6.2"
},
@@ -1922,12 +2099,12 @@
}
},
"node_modules/@smithy/hash-node": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz",
- "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz",
+ "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"@smithy/util-buffer-from": "^4.2.0",
"@smithy/util-utf8": "^4.2.0",
"tslib": "^2.6.2"
@@ -1937,12 +2114,12 @@
}
},
"node_modules/@smithy/invalid-dependency": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz",
- "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz",
+ "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -1962,13 +2139,13 @@
}
},
"node_modules/@smithy/middleware-content-length": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz",
- "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz",
+ "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -1976,18 +2153,18 @@
}
},
"node_modules/@smithy/middleware-endpoint": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.1.tgz",
- "integrity": "sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg==",
+ "version": "4.4.11",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.11.tgz",
+ "integrity": "sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/core": "^3.20.0",
- "@smithy/middleware-serde": "^4.2.8",
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/shared-ini-file-loader": "^4.4.2",
- "@smithy/types": "^4.11.0",
- "@smithy/url-parser": "^4.2.7",
- "@smithy/util-middleware": "^4.2.7",
+ "@smithy/core": "^3.21.1",
+ "@smithy/middleware-serde": "^4.2.9",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/shared-ini-file-loader": "^4.4.3",
+ "@smithy/types": "^4.12.0",
+ "@smithy/url-parser": "^4.2.8",
+ "@smithy/util-middleware": "^4.2.8",
"tslib": "^2.6.2"
},
"engines": {
@@ -1995,18 +2172,18 @@
}
},
"node_modules/@smithy/middleware-retry": {
- "version": "4.4.17",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.17.tgz",
- "integrity": "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==",
+ "version": "4.4.27",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.27.tgz",
+ "integrity": "sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/service-error-classification": "^4.2.7",
- "@smithy/smithy-client": "^4.10.2",
- "@smithy/types": "^4.11.0",
- "@smithy/util-middleware": "^4.2.7",
- "@smithy/util-retry": "^4.2.7",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/service-error-classification": "^4.2.8",
+ "@smithy/smithy-client": "^4.10.12",
+ "@smithy/types": "^4.12.0",
+ "@smithy/util-middleware": "^4.2.8",
+ "@smithy/util-retry": "^4.2.8",
"@smithy/uuid": "^1.1.0",
"tslib": "^2.6.2"
},
@@ -2015,13 +2192,13 @@
}
},
"node_modules/@smithy/middleware-serde": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.8.tgz",
- "integrity": "sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w==",
+ "version": "4.2.9",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz",
+ "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2029,12 +2206,12 @@
}
},
"node_modules/@smithy/middleware-stack": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.7.tgz",
- "integrity": "sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz",
+ "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2042,14 +2219,14 @@
}
},
"node_modules/@smithy/node-config-provider": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.7.tgz",
- "integrity": "sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw==",
+ "version": "4.3.8",
+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz",
+ "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/property-provider": "^4.2.7",
- "@smithy/shared-ini-file-loader": "^4.4.2",
- "@smithy/types": "^4.11.0",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/shared-ini-file-loader": "^4.4.3",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2057,15 +2234,15 @@
}
},
"node_modules/@smithy/node-http-handler": {
- "version": "4.4.7",
- "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.7.tgz",
- "integrity": "sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ==",
+ "version": "4.4.8",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz",
+ "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/abort-controller": "^4.2.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/querystring-builder": "^4.2.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/abort-controller": "^4.2.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/querystring-builder": "^4.2.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2073,12 +2250,12 @@
}
},
"node_modules/@smithy/property-provider": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.7.tgz",
- "integrity": "sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz",
+ "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2086,12 +2263,12 @@
}
},
"node_modules/@smithy/protocol-http": {
- "version": "5.3.7",
- "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.7.tgz",
- "integrity": "sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA==",
+ "version": "5.3.8",
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz",
+ "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2099,12 +2276,12 @@
}
},
"node_modules/@smithy/querystring-builder": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.7.tgz",
- "integrity": "sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz",
+ "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"@smithy/util-uri-escape": "^4.2.0",
"tslib": "^2.6.2"
},
@@ -2113,12 +2290,12 @@
}
},
"node_modules/@smithy/querystring-parser": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.7.tgz",
- "integrity": "sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz",
+ "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2126,24 +2303,24 @@
}
},
"node_modules/@smithy/service-error-classification": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz",
- "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz",
+ "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0"
+ "@smithy/types": "^4.12.0"
},
"engines": {
"node": ">=18.0.0"
}
},
"node_modules/@smithy/shared-ini-file-loader": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.2.tgz",
- "integrity": "sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz",
+ "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2151,16 +2328,16 @@
}
},
"node_modules/@smithy/signature-v4": {
- "version": "5.3.7",
- "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.7.tgz",
- "integrity": "sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg==",
+ "version": "5.3.8",
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz",
+ "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/is-array-buffer": "^4.2.0",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/types": "^4.12.0",
"@smithy/util-hex-encoding": "^4.2.0",
- "@smithy/util-middleware": "^4.2.7",
+ "@smithy/util-middleware": "^4.2.8",
"@smithy/util-uri-escape": "^4.2.0",
"@smithy/util-utf8": "^4.2.0",
"tslib": "^2.6.2"
@@ -2170,17 +2347,17 @@
}
},
"node_modules/@smithy/smithy-client": {
- "version": "4.10.2",
- "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.2.tgz",
- "integrity": "sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g==",
+ "version": "4.10.12",
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.12.tgz",
+ "integrity": "sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/core": "^3.20.0",
- "@smithy/middleware-endpoint": "^4.4.1",
- "@smithy/middleware-stack": "^4.2.7",
- "@smithy/protocol-http": "^5.3.7",
- "@smithy/types": "^4.11.0",
- "@smithy/util-stream": "^4.5.8",
+ "@smithy/core": "^3.21.1",
+ "@smithy/middleware-endpoint": "^4.4.11",
+ "@smithy/middleware-stack": "^4.2.8",
+ "@smithy/protocol-http": "^5.3.8",
+ "@smithy/types": "^4.12.0",
+ "@smithy/util-stream": "^4.5.10",
"tslib": "^2.6.2"
},
"engines": {
@@ -2188,9 +2365,9 @@
}
},
"node_modules/@smithy/types": {
- "version": "4.11.0",
- "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.11.0.tgz",
- "integrity": "sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA==",
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz",
+ "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.6.2"
@@ -2200,13 +2377,13 @@
}
},
"node_modules/@smithy/url-parser": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.7.tgz",
- "integrity": "sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz",
+ "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/querystring-parser": "^4.2.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/querystring-parser": "^4.2.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2277,14 +2454,14 @@
}
},
"node_modules/@smithy/util-defaults-mode-browser": {
- "version": "4.3.16",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.16.tgz",
- "integrity": "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==",
+ "version": "4.3.26",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.26.tgz",
+ "integrity": "sha512-vva0dzYUTgn7DdE0uaha10uEdAgmdLnNFowKFjpMm6p2R0XDk5FHPX3CBJLzWQkQXuEprsb0hGz9YwbicNWhjw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/property-provider": "^4.2.7",
- "@smithy/smithy-client": "^4.10.2",
- "@smithy/types": "^4.11.0",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/smithy-client": "^4.10.12",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2292,17 +2469,17 @@
}
},
"node_modules/@smithy/util-defaults-mode-node": {
- "version": "4.2.19",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.19.tgz",
- "integrity": "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==",
+ "version": "4.2.29",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.29.tgz",
+ "integrity": "sha512-c6D7IUBsZt/aNnTBHMTf+OVh+h/JcxUUgfTcIJaWRe6zhOum1X+pNKSZtZ+7fbOn5I99XVFtmrnXKv8yHHErTQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/config-resolver": "^4.4.5",
- "@smithy/credential-provider-imds": "^4.2.7",
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/property-provider": "^4.2.7",
- "@smithy/smithy-client": "^4.10.2",
- "@smithy/types": "^4.11.0",
+ "@smithy/config-resolver": "^4.4.6",
+ "@smithy/credential-provider-imds": "^4.2.8",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/property-provider": "^4.2.8",
+ "@smithy/smithy-client": "^4.10.12",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2310,13 +2487,13 @@
}
},
"node_modules/@smithy/util-endpoints": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.7.tgz",
- "integrity": "sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg==",
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz",
+ "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^4.3.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/node-config-provider": "^4.3.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2336,12 +2513,12 @@
}
},
"node_modules/@smithy/util-middleware": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.7.tgz",
- "integrity": "sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz",
+ "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.11.0",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2349,13 +2526,13 @@
}
},
"node_modules/@smithy/util-retry": {
- "version": "4.2.7",
- "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz",
- "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz",
+ "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/service-error-classification": "^4.2.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/service-error-classification": "^4.2.8",
+ "@smithy/types": "^4.12.0",
"tslib": "^2.6.2"
},
"engines": {
@@ -2363,14 +2540,14 @@
}
},
"node_modules/@smithy/util-stream": {
- "version": "4.5.8",
- "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.8.tgz",
- "integrity": "sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w==",
+ "version": "4.5.10",
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz",
+ "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/fetch-http-handler": "^5.3.8",
- "@smithy/node-http-handler": "^4.4.7",
- "@smithy/types": "^4.11.0",
+ "@smithy/fetch-http-handler": "^5.3.9",
+ "@smithy/node-http-handler": "^4.4.8",
+ "@smithy/types": "^4.12.0",
"@smithy/util-base64": "^4.3.0",
"@smithy/util-buffer-from": "^4.2.0",
"@smithy/util-hex-encoding": "^4.2.0",
@@ -2439,6 +2616,7 @@
"version": "5.2.10",
"resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.10.tgz",
"integrity": "sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==",
+ "license": "MIT",
"dependencies": {
"@popperjs/core": "^2.9.2"
}
@@ -2465,25 +2643,28 @@
"license": "MIT"
},
"node_modules/@types/linkify-it": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
- "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "license": "MIT",
"peer": true
},
"node_modules/@types/markdown-it": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
- "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "license": "MIT",
"peer": true,
"dependencies": {
- "@types/linkify-it": "*",
- "@types/mdurl": "*"
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
}
},
"node_modules/@types/mdurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
- "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "license": "MIT",
"peer": true
},
"node_modules/@types/mokapi": {
@@ -2493,18 +2674,18 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "25.0.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz",
- "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==",
+ "version": "25.0.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz",
+ "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==",
"license": "MIT",
"dependencies": {
"undici-types": "~7.16.0"
}
},
"node_modules/@types/nodemailer": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-7.0.4.tgz",
- "integrity": "sha512-ee8fxWqOchH+Hv6MDDNNy028kwvVnLplrStm4Zf/3uHWw5zzo8FoYYeffpJtGs2wWysEumMH0ZIdMGMY1eMAow==",
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-7.0.5.tgz",
+ "integrity": "sha512-7WtR4MFJUNN2UFy0NIowBRJswj5KXjXDhlZY43Hmots5eGu5q/dTeFd/I6GgJA/qj3RqO6dDy4SvfcV3fOVeIA==",
"license": "MIT",
"dependencies": {
"@aws-sdk/client-sesv2": "^3.839.0",
@@ -2514,17 +2695,24 @@
"node_modules/@types/whatwg-mimetype": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz",
- "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA=="
+ "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==",
+ "license": "MIT"
},
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
- "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz",
+ "integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0"
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.53.1",
+ "@typescript-eslint/type-utils": "8.53.1",
+ "@typescript-eslint/utils": "8.53.1",
+ "@typescript-eslint/visitor-keys": "8.53.1",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2532,31 +2720,58 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.53.1",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/@typescript-eslint/types": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
- "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz",
+ "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.53.1",
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/typescript-estree": "8.53.1",
+ "@typescript-eslint/visitor-keys": "8.53.1",
+ "debug": "^4.4.3"
+ },
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
- "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz",
+ "integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.38.0",
- "eslint-visitor-keys": "^4.2.1"
+ "@typescript-eslint/tsconfig-utils": "^8.53.1",
+ "@typescript-eslint/types": "^8.53.1",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2564,185 +2779,101 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz",
+ "integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/visitor-keys": "8.53.1"
+ },
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@vitejs/plugin-vue": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.3.tgz",
- "integrity": "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==",
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz",
+ "integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@rolldown/pluginutils": "1.0.0-beta.53"
- },
"engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "peerDependencies": {
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0",
- "vue": "^3.2.25"
- }
- },
- "node_modules/@volar/language-core": {
- "version": "2.4.27",
- "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.27.tgz",
- "integrity": "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@volar/source-map": "2.4.27"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/@volar/source-map": {
- "version": "2.4.27",
- "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.27.tgz",
- "integrity": "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@volar/typescript": {
- "version": "2.4.27",
- "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.27.tgz",
- "integrity": "sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==",
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz",
+ "integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@volar/language-core": "2.4.27",
- "path-browserify": "^1.0.1",
- "vscode-uri": "^3.0.8"
- }
- },
- "node_modules/@vue/compiler-core": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.26.tgz",
- "integrity": "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.28.5",
- "@vue/shared": "3.5.26",
- "entities": "^7.0.0",
- "estree-walker": "^2.0.2",
- "source-map-js": "^1.2.1"
- }
- },
- "node_modules/@vue/compiler-core/node_modules/entities": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz",
- "integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==",
- "license": "BSD-2-Clause",
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/typescript-estree": "8.53.1",
+ "@typescript-eslint/utils": "8.53.1",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
+ },
"engines": {
- "node": ">=0.12"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/@vue/compiler-dom": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.26.tgz",
- "integrity": "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==",
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-core": "3.5.26",
- "@vue/shared": "3.5.26"
- }
- },
- "node_modules/@vue/compiler-sfc": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz",
- "integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.28.5",
- "@vue/compiler-core": "3.5.26",
- "@vue/compiler-dom": "3.5.26",
- "@vue/compiler-ssr": "3.5.26",
- "@vue/shared": "3.5.26",
- "estree-walker": "^2.0.2",
- "magic-string": "^0.30.21",
- "postcss": "^8.5.6",
- "source-map-js": "^1.2.1"
- }
- },
- "node_modules/@vue/compiler-ssr": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.26.tgz",
- "integrity": "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==",
- "license": "MIT",
- "dependencies": {
- "@vue/compiler-dom": "3.5.26",
- "@vue/shared": "3.5.26"
- }
- },
- "node_modules/@vue/devtools-api": {
- "version": "6.6.4",
- "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
- "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
- },
- "node_modules/@vue/eslint-config-prettier": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz",
- "integrity": "sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-config-prettier": "^10.0.1",
- "eslint-plugin-prettier": "^5.2.2"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": ">= 8.21.0",
- "prettier": ">= 3.0.0"
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/@vue/eslint-config-typescript": {
- "version": "14.6.0",
- "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.6.0.tgz",
- "integrity": "sha512-UpiRY/7go4Yps4mYCjkvlIbVWmn9YvPGQDxTAlcKLphyaD77LjIu3plH4Y9zNT0GB4f3K5tMmhhtRhPOgrQ/bQ==",
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz",
+ "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==",
"dev": true,
- "dependencies": {
- "@typescript-eslint/utils": "^8.35.1",
- "fast-glob": "^3.3.3",
- "typescript-eslint": "^8.35.1",
- "vue-eslint-parser": "^10.2.0"
- },
+ "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "peerDependencies": {
- "eslint": "^9.10.0",
- "eslint-plugin-vue": "^9.28.0 || ^10.0.0",
- "typescript": ">=4.8.4"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
- "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz",
+ "integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/typescript-estree": "8.38.0"
+ "@typescript-eslint/project-service": "8.53.1",
+ "@typescript-eslint/tsconfig-utils": "8.53.1",
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/visitor-keys": "8.53.1",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2752,27 +2883,20 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
- "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz",
+ "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.38.0",
- "@typescript-eslint/tsconfig-utils": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.53.1",
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/typescript-estree": "8.53.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2782,19 +2906,19 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
- "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz",
+ "integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.38.0",
- "@typescript-eslint/types": "^8.38.0",
- "debug": "^4.3.4"
+ "@typescript-eslint/types": "8.53.1",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2802,240 +2926,168 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
- "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.3.tgz",
+ "integrity": "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "@rolldown/pluginutils": "1.0.0-beta.53"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0",
+ "vue": "^3.2.25"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "node_modules/@volar/language-core": {
+ "version": "2.4.27",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.27.tgz",
+ "integrity": "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 4"
+ "dependencies": {
+ "@volar/source-map": "2.4.27"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "node_modules/@volar/source-map": {
+ "version": "2.4.27",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.27.tgz",
+ "integrity": "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
+ "license": "MIT"
},
- "node_modules/@vue/eslint-config-typescript/node_modules/typescript-eslint": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz",
- "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==",
+ "node_modules/@volar/typescript": {
+ "version": "2.4.27",
+ "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.27.tgz",
+ "integrity": "sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "8.38.0",
- "@typescript-eslint/parser": "8.38.0",
- "@typescript-eslint/typescript-estree": "8.38.0",
- "@typescript-eslint/utils": "8.38.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "@volar/language-core": "2.4.27",
+ "path-browserify": "^1.0.1",
+ "vscode-uri": "^3.0.8"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz",
- "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==",
- "dev": true,
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.27.tgz",
+ "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==",
"license": "MIT",
"dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.38.0",
- "@typescript-eslint/type-utils": "8.38.0",
- "@typescript-eslint/utils": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.38.0",
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "@babel/parser": "^7.28.5",
+ "@vue/shared": "3.5.27",
+ "entities": "^7.0.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz",
- "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==",
- "dev": true,
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz",
+ "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/typescript-estree": "8.38.0",
- "@typescript-eslint/utils": "8.38.0",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "@vue/compiler-core": "3.5.27",
+ "@vue/shared": "3.5.27"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz",
- "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==",
- "dev": true,
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz",
+ "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/typescript-estree": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "@babel/parser": "^7.28.5",
+ "@vue/compiler-core": "3.5.27",
+ "@vue/compiler-dom": "3.5.27",
+ "@vue/compiler-ssr": "3.5.27",
+ "@vue/shared": "3.5.27",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.6",
+ "source-map-js": "^1.2.1"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
- "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
- "dev": true,
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz",
+ "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.38.0",
- "@typescript-eslint/tsconfig-utils": "8.38.0",
- "@typescript-eslint/types": "8.38.0",
- "@typescript-eslint/visitor-keys": "8.38.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "@vue/compiler-dom": "3.5.27",
+ "@vue/shared": "3.5.27"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
- "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/eslint-config-prettier": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz",
+ "integrity": "sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.38.0",
- "@typescript-eslint/types": "^8.38.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "eslint-config-prettier": "^10.0.1",
+ "eslint-plugin-prettier": "^5.2.2"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "eslint": ">= 8.21.0",
+ "prettier": ">= 3.0.0"
}
},
- "node_modules/@vue/eslint-config-typescript/node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
- "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+ "node_modules/@vue/eslint-config-typescript": {
+ "version": "14.6.0",
+ "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.6.0.tgz",
+ "integrity": "sha512-UpiRY/7go4Yps4mYCjkvlIbVWmn9YvPGQDxTAlcKLphyaD77LjIu3plH4Y9zNT0GB4f3K5tMmhhtRhPOgrQ/bQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "^8.35.1",
+ "fast-glob": "^3.3.3",
+ "typescript-eslint": "^8.35.1",
+ "vue-eslint-parser": "^10.2.0"
+ },
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "eslint": "^9.10.0",
+ "eslint-plugin-vue": "^9.28.0 || ^10.0.0",
+ "typescript": ">=4.8.4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
"node_modules/@vue/language-core": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.1.tgz",
- "integrity": "sha512-g6oSenpnGMtpxHGAwKuu7HJJkNZpemK/zg3vZzZbJ6cnnXq1ssxuNrXSsAHYM3NvH8p4IkTw+NLmuxyeYz4r8A==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.3.tgz",
+ "integrity": "sha512-VpN/GnYDzGLh44AI6i1OB/WsLXo6vwnl0EWHBelGc4TyC0yEq6azwNaed/+Tgr8anFlSdWYnMEkyHJDPe7ii7A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3062,53 +3114,53 @@
}
},
"node_modules/@vue/reactivity": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.26.tgz",
- "integrity": "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==",
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.27.tgz",
+ "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==",
"license": "MIT",
"dependencies": {
- "@vue/shared": "3.5.26"
+ "@vue/shared": "3.5.27"
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.26.tgz",
- "integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==",
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.27.tgz",
+ "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.26",
- "@vue/shared": "3.5.26"
+ "@vue/reactivity": "3.5.27",
+ "@vue/shared": "3.5.27"
}
},
"node_modules/@vue/runtime-dom": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.26.tgz",
- "integrity": "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==",
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz",
+ "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.26",
- "@vue/runtime-core": "3.5.26",
- "@vue/shared": "3.5.26",
+ "@vue/reactivity": "3.5.27",
+ "@vue/runtime-core": "3.5.27",
+ "@vue/shared": "3.5.27",
"csstype": "^3.2.3"
}
},
"node_modules/@vue/server-renderer": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.26.tgz",
- "integrity": "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==",
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.27.tgz",
+ "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-ssr": "3.5.26",
- "@vue/shared": "3.5.26"
+ "@vue/compiler-ssr": "3.5.27",
+ "@vue/shared": "3.5.27"
},
"peerDependencies": {
- "vue": "3.5.26"
+ "vue": "3.5.27"
}
},
"node_modules/@vue/shared": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.26.tgz",
- "integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==",
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.27.tgz",
+ "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==",
"license": "MIT"
},
"node_modules/@vue/tsconfig": {
@@ -3144,9 +3196,9 @@
}
},
"node_modules/ace-builds": {
- "version": "1.43.5",
- "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.43.5.tgz",
- "integrity": "sha512-iH5FLBKdB7SVn9GR37UgA/tpQS8OTWIxWAuq3Ofaw+Qbc69FfPXsXd9jeW7KRG2xKpKMqBDnu0tHBrCWY5QI7A==",
+ "version": "1.43.6",
+ "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.43.6.tgz",
+ "integrity": "sha512-L1ddibQ7F3vyXR2k2fg+I8TQTPWVA6CKeDQr/h2+8CeyTp3W6EQL8xNFZRTztuP8xNOAqL3IYPqdzs31GCjDvg==",
"license": "BSD-3-Clause"
},
"node_modules/acorn": {
@@ -3154,6 +3206,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
+ "license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@@ -3166,6 +3219,7 @@
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
@@ -3199,6 +3253,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -3212,13 +3267,67 @@
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
},
"node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -3230,12 +3339,13 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/body-parser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
- "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
"license": "MIT",
"dependencies": {
"bytes": "^3.1.2",
@@ -3244,7 +3354,7 @@
"http-errors": "^2.0.0",
"iconv-lite": "^0.7.0",
"on-finished": "^2.4.1",
- "qs": "^6.14.0",
+ "qs": "^6.14.1",
"raw-body": "^3.0.1",
"type-is": "^2.0.1"
},
@@ -3257,9 +3367,9 @@
}
},
"node_modules/body-parser/node_modules/iconv-lite": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
- "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -3276,7 +3386,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/bootstrap": {
"version": "5.3.8",
@@ -3320,19 +3431,20 @@
"license": "MIT"
},
"node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "balanced-match": "^1.0.0"
}
},
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
"dependencies": {
"fill-range": "^7.1.1"
},
@@ -3350,13 +3462,19 @@
}
},
"node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -3406,6 +3524,7 @@
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -3422,6 +3541,7 @@
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
@@ -3433,7 +3553,8 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/commander": {
"version": "7.2.0",
@@ -3448,7 +3569,8 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/content-disposition": {
"version": "1.0.1",
@@ -3491,9 +3613,9 @@
}
},
"node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
"license": "MIT",
"dependencies": {
"object-assign": "^4",
@@ -3501,6 +3623,10 @@
},
"engines": {
"node": ">= 0.10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/cross-spawn": {
@@ -3743,9 +3869,9 @@
}
},
"node_modules/d3-format": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
- "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
"license": "ISC",
"engines": {
"node": ">=12"
@@ -3938,6 +4064,60 @@
"node": ">=12"
}
},
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/dayjs": {
"version": "1.11.19",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz",
@@ -3965,14 +4145,35 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/define-properties": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
- "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
+ "define-data-property": "^1.0.1",
"has-property-descriptors": "^1.0.0",
"object-keys": "^1.1.1"
},
@@ -4073,61 +4274,88 @@
}
},
"node_modules/entities": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
- "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
}
},
"node_modules/es-abstract": {
- "version": "1.21.1",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
- "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-set-tostringtag": "^2.0.1",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "function.prototype.name": "^1.1.5",
- "get-intrinsic": "^1.1.3",
- "get-symbol-description": "^1.0.0",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.4",
- "is-array-buffer": "^3.0.1",
+ "version": "1.24.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
+ "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
"is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.10",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.12.2",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.4.3",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trimend": "^1.0.6",
- "string.prototype.trimstart": "^1.0.6",
- "typed-array-length": "^1.0.4",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.9"
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
},
"engines": {
"node": ">= 0.4"
@@ -4167,28 +4395,31 @@
}
},
"node_modules/es-set-tostringtag": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
- "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "has-tostringtag": "^1.0.0"
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -4250,6 +4481,7 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -4318,27 +4550,30 @@
}
},
"node_modules/eslint-config-prettier": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz",
- "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==",
+ "version": "10.1.8",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
+ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
"dev": true,
"license": "MIT",
"bin": {
- "eslint-config-prettier": "build/bin/cli.js"
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-config-prettier"
},
"peerDependencies": {
"eslint": ">=7.0.0"
}
},
"node_modules/eslint-plugin-prettier": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz",
- "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==",
+ "version": "5.5.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz",
+ "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "prettier-linter-helpers": "^1.0.0",
- "synckit": "^0.9.1"
+ "prettier-linter-helpers": "^1.0.1",
+ "synckit": "^0.11.12"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -4349,7 +4584,7 @@
"peerDependencies": {
"@types/eslint": ">=8.0.0",
"eslint": ">=8.0.0",
- "eslint-config-prettier": "*",
+ "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0",
"prettier": ">=3.0.0"
},
"peerDependenciesMeta": {
@@ -4362,9 +4597,9 @@
}
},
"node_modules/eslint-plugin-vue": {
- "version": "10.6.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.6.2.tgz",
- "integrity": "sha512-nA5yUs/B1KmKzvC42fyD0+l9Yd+LtEpVhWRbXuDj0e+ZURcTtyRbMDWUeJmTAh2wC6jC83raS63anNM2YT3NPw==",
+ "version": "10.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.7.0.tgz",
+ "integrity": "sha512-r2XFCK4qlo1sxEoAMIoTTX0PZAdla0JJDt1fmYiworZUX67WeEGqm+JbyAg3M+pGiJ5U6Mp5WQbontXWtIW7TA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4398,6 +4633,7 @@
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
"integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
@@ -4414,6 +4650,7 @@
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
@@ -4421,11 +4658,23 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
"node_modules/eslint/node_modules/eslint-visitor-keys": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -4433,11 +4682,25 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/espree": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"acorn": "^8.15.0",
"acorn-jsx": "^5.3.2",
@@ -4455,6 +4718,7 @@
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -4463,9 +4727,9 @@
}
},
"node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -4480,6 +4744,7 @@
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"estraverse": "^5.2.0"
},
@@ -4492,6 +4757,7 @@
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
+ "license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
@@ -4598,6 +4864,7 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -4616,7 +4883,8 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/fast-xml-parser": {
"version": "5.2.5",
@@ -4637,9 +4905,10 @@
}
},
"node_modules/fastq": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
}
@@ -4661,6 +4930,7 @@
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -4694,6 +4964,7 @@
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
@@ -4720,19 +4991,26 @@
}
},
"node_modules/flatted": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
- "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
"dev": true,
"license": "ISC"
},
"node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-callable": "^1.1.3"
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/forwarded": {
@@ -4759,6 +5037,7 @@
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -4777,15 +5056,18 @@
}
},
"node_modules/function.prototype.name": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
- "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0",
- "functions-have-names": "^1.2.2"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
},
"engines": {
"node": ">= 0.4"
@@ -4799,6 +5081,7 @@
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true,
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -4812,6 +5095,16 @@
"node": ">=10"
}
},
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -4850,13 +5143,15 @@
}
},
"node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -4870,6 +5165,7 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"is-glob": "^4.0.3"
},
@@ -4891,12 +5187,14 @@
}
},
"node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "define-properties": "^1.1.3"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -4947,35 +5245,21 @@
}
},
"node_modules/graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
- "dev": true
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
+ "license": "ISC"
},
"node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -4985,27 +5269,33 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.1.1"
+ "es-define-property": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -5026,12 +5316,13 @@
}
},
"node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.2"
+ "has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -5056,10 +5347,18 @@
"version": "10.7.3",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
"integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "license": "BSD-3-Clause",
"engines": {
"node": "*"
}
},
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/http-errors": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
@@ -5083,7 +5382,8 @@
"node_modules/http-status-codes": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz",
- "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA=="
+ "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==",
+ "license": "MIT"
},
"node_modules/iconv-lite": {
"version": "0.6.3",
@@ -5129,6 +5429,7 @@
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.8.19"
}
@@ -5140,14 +5441,15 @@
"license": "ISC"
},
"node_modules/internal-slot": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
- "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.2.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -5172,14 +5474,18 @@
}
},
"node_modules/is-array-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
- "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-typed-array": "^1.1.10"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -5189,28 +5495,54 @@
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-bigints": "^1.0.1"
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -5224,6 +5556,7 @@
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
"integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -5232,24 +5565,48 @@
}
},
"node_modules/is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has": "^1.0.3"
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -5262,14 +5619,52 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -5277,11 +5672,25 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -5293,17 +5702,20 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -5342,14 +5754,63 @@
"integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
"license": "MIT"
},
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -5358,25 +5819,32 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "which-typed-array": "^1.1.16"
},
"engines": {
"node": ">= 0.4"
@@ -5385,14 +5853,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
"dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -5400,17 +5866,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
- "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -5419,23 +5882,36 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/js-yaml": {
"version": "4.1.1",
@@ -5460,7 +5936,8 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
@@ -5473,7 +5950,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/kafkajs": {
"version": "2.2.4",
@@ -5495,9 +5973,9 @@
}
},
"node_modules/ldapts": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/ldapts/-/ldapts-8.1.2.tgz",
- "integrity": "sha512-QQAYM0fVzBcNzdo1VssKj9+v+BpjuyUqpgVjIUn1rWLdDj5cx60TtYoUWR5Ch9IMct1+jY92ES3G5fOoQaN34Q==",
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/ldapts/-/ldapts-8.1.3.tgz",
+ "integrity": "sha512-kEU3GDh48ZymnyLGsFprai2v4r7Gyxe6niBlUUw3xnOGpq5O+XODmXJ8gBwbPIg35qt5cnYVC80NNSdAkb2dJg==",
"license": "MIT",
"dependencies": {
"strict-event-emitter-types": "2.0.0",
@@ -5512,6 +5990,7 @@
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
@@ -5524,6 +6003,7 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "license": "MIT",
"dependencies": {
"uc.micro": "^1.0.1"
}
@@ -5533,6 +6013,7 @@
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
"integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"graceful-fs": "^4.1.2",
"parse-json": "^4.0.0",
@@ -5548,6 +6029,7 @@
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"p-locate": "^5.0.0"
},
@@ -5561,13 +6043,15 @@
"node_modules/lodash.flow": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz",
- "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw=="
+ "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==",
+ "license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/magic-string": {
"version": "0.30.21",
@@ -5582,6 +6066,7 @@
"version": "12.3.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
"integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "license": "MIT",
"dependencies": {
"argparse": "^2.0.1",
"entities": "~2.1.0",
@@ -5596,12 +6081,14 @@
"node_modules/markdown-it-abbr": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz",
- "integrity": "sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg=="
+ "integrity": "sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg==",
+ "license": "MIT"
},
"node_modules/markdown-it-anchor": {
"version": "8.6.7",
"resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
"integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
+ "license": "Unlicense",
"peerDependencies": {
"@types/markdown-it": "*",
"markdown-it": "*"
@@ -5610,31 +6097,36 @@
"node_modules/markdown-it-deflist": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz",
- "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg=="
+ "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==",
+ "license": "MIT"
},
"node_modules/markdown-it-emoji": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz",
- "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ=="
+ "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==",
+ "license": "MIT"
},
"node_modules/markdown-it-footnote": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz",
- "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w=="
+ "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==",
+ "license": "MIT"
},
"node_modules/markdown-it-highlightjs": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/markdown-it-highlightjs/-/markdown-it-highlightjs-3.6.0.tgz",
"integrity": "sha512-ex+Lq3cVkprh0GpGwFyc53A/rqY6GGzopPCG1xMsf8Ya3XtGC8Uw9tChN1rWbpyDae7tBBhVHVcMM29h4Btamw==",
+ "license": "Unlicense",
"dependencies": {
"highlight.js": "^11.3.1",
"lodash.flow": "^3.5.0"
}
},
"node_modules/markdown-it-highlightjs/node_modules/highlight.js": {
- "version": "11.7.0",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz",
- "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==",
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
+ "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=12.0.0"
}
@@ -5642,32 +6134,47 @@
"node_modules/markdown-it-ins": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz",
- "integrity": "sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw=="
+ "integrity": "sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==",
+ "license": "MIT"
},
"node_modules/markdown-it-mark": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz",
- "integrity": "sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A=="
+ "integrity": "sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==",
+ "license": "MIT"
},
"node_modules/markdown-it-sub": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz",
- "integrity": "sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q=="
+ "integrity": "sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q==",
+ "license": "MIT"
},
"node_modules/markdown-it-sup": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz",
- "integrity": "sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ=="
+ "integrity": "sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ==",
+ "license": "MIT"
},
"node_modules/markdown-it-task-lists": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz",
- "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA=="
+ "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==",
+ "license": "ISC"
},
"node_modules/markdown-it-toc-done-right": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/markdown-it-toc-done-right/-/markdown-it-toc-done-right-4.2.0.tgz",
- "integrity": "sha512-UB/IbzjWazwTlNAX0pvWNlJS8NKsOQ4syrXZQ/C72j+jirrsjVRT627lCaylrKJFBQWfRsPmIVQie8x38DEhAQ=="
+ "integrity": "sha512-UB/IbzjWazwTlNAX0pvWNlJS8NKsOQ4syrXZQ/C72j+jirrsjVRT627lCaylrKJFBQWfRsPmIVQie8x38DEhAQ==",
+ "license": "MIT"
+ },
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
@@ -5681,7 +6188,8 @@
"node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+ "license": "MIT"
},
"node_modules/media-typer": {
"version": "1.1.0",
@@ -5729,6 +6237,7 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
"engines": {
"node": ">= 8"
}
@@ -5737,6 +6246,7 @@
"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",
"picomatch": "^2.3.1"
@@ -5771,15 +6281,19 @@
}
},
"node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "brace-expansion": "^2.0.1"
},
"engines": {
- "node": "*"
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/ms": {
@@ -5817,12 +6331,14 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/ncp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
"integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==",
+ "license": "MIT",
"bin": {
"ncp": "bin/ncp"
}
@@ -5840,7 +6356,8 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/nodemailer": {
"version": "7.0.12",
@@ -5851,11 +6368,35 @@
"node": ">=6.0.0"
}
},
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
"node_modules/npm-run-all": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
"integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^3.2.1",
"chalk": "^2.4.1",
@@ -5881,6 +6422,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"color-convert": "^1.9.0"
},
@@ -5888,11 +6430,23 @@
"node": ">=4"
}
},
+ "node_modules/npm-run-all/node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
"node_modules/npm-run-all/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
@@ -5907,6 +6461,7 @@
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"color-name": "1.1.3"
}
@@ -5915,7 +6470,8 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/npm-run-all/node_modules/cross-spawn": {
"version": "6.0.6",
@@ -5939,6 +6495,7 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.8.0"
}
@@ -5948,15 +6505,30 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
},
+ "node_modules/npm-run-all/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/npm-run-all/node_modules/path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
"integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -5966,6 +6538,7 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver"
}
@@ -5975,6 +6548,7 @@
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"shebang-regex": "^1.0.0"
},
@@ -5987,6 +6561,7 @@
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
"integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -5996,6 +6571,7 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-flag": "^3.0.0"
},
@@ -6008,6 +6584,7 @@
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
@@ -6020,6 +6597,7 @@
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0"
},
@@ -6053,19 +6631,23 @@
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
"object-keys": "^1.1.1"
},
"engines": {
@@ -6097,27 +6679,47 @@
}
},
"node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
}
},
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"yocto-queue": "^0.1.0"
},
@@ -6133,6 +6735,7 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"p-limit": "^3.0.2"
},
@@ -6144,9 +6747,9 @@
}
},
"node_modules/p-map": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz",
- "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==",
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz",
+ "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==",
"license": "MIT",
"engines": {
"node": ">=18"
@@ -6173,6 +6776,7 @@
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"error-ex": "^1.3.1",
"json-parse-better-errors": "^1.0.1"
@@ -6202,6 +6806,7 @@
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -6220,7 +6825,8 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/path-to-regexp": {
"version": "8.3.0",
@@ -6247,12 +6853,14 @@
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
"engines": {
"node": ">=8.6"
},
@@ -6265,6 +6873,7 @@
"resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
"integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
"dev": true,
+ "license": "MIT",
"bin": {
"pidtree": "bin/pidtree.js"
},
@@ -6277,18 +6886,19 @@
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/playwright": {
- "version": "1.57.0",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz",
- "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==",
+ "version": "1.58.0",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.0.tgz",
+ "integrity": "sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "playwright-core": "1.57.0"
+ "playwright-core": "1.58.0"
},
"bin": {
"playwright": "cli.js"
@@ -6301,9 +6911,9 @@
}
},
"node_modules/playwright-core": {
- "version": "1.57.0",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz",
- "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==",
+ "version": "1.58.0",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0.tgz",
+ "integrity": "sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -6313,6 +6923,16 @@
"node": ">=18"
}
},
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
@@ -6360,6 +6980,7 @@
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.8.0"
}
@@ -6377,9 +6998,9 @@
}
},
"node_modules/prettier": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz",
- "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"dev": true,
"license": "MIT",
"bin": {
@@ -6393,9 +7014,9 @@
}
},
"node_modules/prettier-linter-helpers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
- "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz",
+ "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6459,7 +7080,8 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ]
+ ],
+ "license": "MIT"
},
"node_modules/range-parser": {
"version": "1.2.1",
@@ -6486,9 +7108,9 @@
}
},
"node_modules/raw-body/node_modules/iconv-lite": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
- "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -6506,6 +7128,7 @@
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
"integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"load-json-file": "^4.0.0",
"normalize-package-data": "^2.3.2",
@@ -6515,29 +7138,12 @@
"node": ">=4"
}
},
- "node_modules/read-pkg/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "node_modules/read-pkg/node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
"node_modules/read-pkg/node_modules/path-type": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
"integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"pify": "^3.0.0"
},
@@ -6545,24 +7151,42 @@
"node": ">=4"
}
},
- "node_modules/read-pkg/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
"dev": true,
- "bin": {
- "semver": "bin/semver"
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/regexp.prototype.flags": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
- "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "functions-have-names": "^1.2.2"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -6574,21 +7198,26 @@
"node_modules/resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
- "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
+ "license": "MIT"
},
"node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-core-module": "^2.9.0",
+ "is-core-module": "^2.16.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -6604,9 +7233,10 @@
}
},
"node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
@@ -6619,9 +7249,9 @@
"license": "Unlicense"
},
"node_modules/rollup": {
- "version": "4.46.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz",
- "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==",
+ "version": "4.56.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz",
+ "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6635,26 +7265,31 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.46.2",
- "@rollup/rollup-android-arm64": "4.46.2",
- "@rollup/rollup-darwin-arm64": "4.46.2",
- "@rollup/rollup-darwin-x64": "4.46.2",
- "@rollup/rollup-freebsd-arm64": "4.46.2",
- "@rollup/rollup-freebsd-x64": "4.46.2",
- "@rollup/rollup-linux-arm-gnueabihf": "4.46.2",
- "@rollup/rollup-linux-arm-musleabihf": "4.46.2",
- "@rollup/rollup-linux-arm64-gnu": "4.46.2",
- "@rollup/rollup-linux-arm64-musl": "4.46.2",
- "@rollup/rollup-linux-loongarch64-gnu": "4.46.2",
- "@rollup/rollup-linux-ppc64-gnu": "4.46.2",
- "@rollup/rollup-linux-riscv64-gnu": "4.46.2",
- "@rollup/rollup-linux-riscv64-musl": "4.46.2",
- "@rollup/rollup-linux-s390x-gnu": "4.46.2",
- "@rollup/rollup-linux-x64-gnu": "4.46.2",
- "@rollup/rollup-linux-x64-musl": "4.46.2",
- "@rollup/rollup-win32-arm64-msvc": "4.46.2",
- "@rollup/rollup-win32-ia32-msvc": "4.46.2",
- "@rollup/rollup-win32-x64-msvc": "4.46.2",
+ "@rollup/rollup-android-arm-eabi": "4.56.0",
+ "@rollup/rollup-android-arm64": "4.56.0",
+ "@rollup/rollup-darwin-arm64": "4.56.0",
+ "@rollup/rollup-darwin-x64": "4.56.0",
+ "@rollup/rollup-freebsd-arm64": "4.56.0",
+ "@rollup/rollup-freebsd-x64": "4.56.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.56.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.56.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.56.0",
+ "@rollup/rollup-linux-arm64-musl": "4.56.0",
+ "@rollup/rollup-linux-loong64-gnu": "4.56.0",
+ "@rollup/rollup-linux-loong64-musl": "4.56.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.56.0",
+ "@rollup/rollup-linux-ppc64-musl": "4.56.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.56.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.56.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.56.0",
+ "@rollup/rollup-linux-x64-gnu": "4.56.0",
+ "@rollup/rollup-linux-x64-musl": "4.56.0",
+ "@rollup/rollup-openbsd-x64": "4.56.0",
+ "@rollup/rollup-openharmony-arm64": "4.56.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.56.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.56.0",
+ "@rollup/rollup-win32-x64-gnu": "4.56.0",
+ "@rollup/rollup-win32-x64-msvc": "4.56.0",
"fsevents": "~2.3.2"
}
},
@@ -6692,25 +7327,67 @@
"url": "https://feross.org/support"
}
],
+ "license": "MIT",
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
- "node_modules/rw": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
- "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
- "license": "BSD-3-Clause"
+ "node_modules/rw": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -6723,17 +7400,21 @@
"license": "MIT"
},
"node_modules/sax": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
- "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz",
+ "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==",
"dev": true,
- "license": "ISC"
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
},
"node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -6786,6 +7467,55 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -6816,10 +7546,14 @@
}
},
"node_modules/shell-quote": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
- "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==",
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -6912,41 +7646,46 @@
"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"
}
},
"node_modules/spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
}
},
"node_modules/spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true,
+ "license": "CC-BY-3.0"
},
"node_modules/spdx-expression-parse": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
"node_modules/spdx-license-ids": {
- "version": "3.0.12",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
- "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
- "dev": true
+ "version": "3.0.22",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz",
+ "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==",
+ "dev": true,
+ "license": "CC0-1.0"
},
"node_modules/statuses": {
"version": "2.0.2",
@@ -6957,6 +7696,20 @@
"node": ">= 0.8"
}
},
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/strict-event-emitter-types": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz",
@@ -6964,14 +7717,38 @@
"license": "ISC"
},
"node_modules/string.prototype.padend": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz",
- "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==",
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz",
+ "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -6981,28 +7758,37 @@
}
},
"node_modules/string.prototype.trimend": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
- "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/string.prototype.trimstart": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
- "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -7013,6 +7799,7 @@
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
"integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -7047,6 +7834,7 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -7059,6 +7847,7 @@
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -7067,20 +7856,19 @@
}
},
"node_modules/synckit": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
- "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
+ "version": "0.11.12",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
+ "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@pkgr/core": "^0.1.0",
- "tslib": "^2.6.2"
+ "@pkgr/core": "^0.2.9"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"funding": {
- "url": "https://opencollective.com/unts"
+ "url": "https://opencollective.com/synckit"
}
},
"node_modules/tinyglobby": {
@@ -7135,6 +7923,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
@@ -7164,10 +7953,11 @@
}
},
"node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
+ "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=18.12"
},
@@ -7186,6 +7976,7 @@
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1"
},
@@ -7207,15 +7998,79 @@
"node": ">= 0.6"
}
},
- "node_modules/typed-array-length": {
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
+ "call-bind": "^1.0.7",
"for-each": "^0.3.3",
- "is-typed-array": "^1.1.9"
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -7235,21 +8090,50 @@
"node": ">=14.17"
}
},
+ "node_modules/typescript-eslint": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.1.tgz",
+ "integrity": "sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.53.1",
+ "@typescript-eslint/parser": "8.53.1",
+ "@typescript-eslint/typescript-estree": "8.53.1",
+ "@typescript-eslint/utils": "8.53.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
"node_modules/uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
- "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+ "license": "MIT"
},
"node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
+ "call-bound": "^1.0.3",
"has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -7304,6 +8188,7 @@
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
@@ -7319,9 +8204,9 @@
}
},
"node_modules/vite": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz",
- "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
+ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7417,6 +8302,7 @@
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -7446,16 +8332,16 @@
"license": "MIT"
},
"node_modules/vue": {
- "version": "3.5.26",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz",
- "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.27.tgz",
+ "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.26",
- "@vue/compiler-sfc": "3.5.26",
- "@vue/runtime-dom": "3.5.26",
- "@vue/server-renderer": "3.5.26",
- "@vue/shared": "3.5.26"
+ "@vue/compiler-dom": "3.5.27",
+ "@vue/compiler-sfc": "3.5.27",
+ "@vue/runtime-dom": "3.5.27",
+ "@vue/server-renderer": "3.5.27",
+ "@vue/shared": "3.5.27"
},
"peerDependencies": {
"typescript": "*"
@@ -7471,6 +8357,7 @@
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz",
"integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "^4.4.0",
"eslint-scope": "^8.2.0",
@@ -7490,9 +8377,9 @@
}
},
"node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -7518,14 +8405,14 @@
}
},
"node_modules/vue-tsc": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.1.tgz",
- "integrity": "sha512-I23Rk8dkQfmcSbxDO0dmg9ioMLjKA1pjlU3Lz6Jfk2pMGu3Uryu9810XkcZH24IzPbhzPCnkKo2rEMRX0skSrw==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.3.tgz",
+ "integrity": "sha512-1RdRB7rQXGFMdpo0aXf9spVzWEPGAk7PEb/ejHQwVrcuQA/HsGiixIc3uBQeqY2YjeEEgvr2ShQewBgcN4c1Cw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/typescript": "2.4.27",
- "@vue/language-core": "3.2.1"
+ "@vue/language-core": "3.2.3"
},
"bin": {
"vue-tsc": "bin/vue-tsc.js"
@@ -7538,6 +8425,7 @@
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/vue3-ace-editor/-/vue3-ace-editor-2.2.4.tgz",
"integrity": "sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==",
+ "license": "MIT",
"dependencies": {
"resize-observer-polyfill": "^1.5.1"
},
@@ -7550,6 +8438,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/vue3-highlightjs/-/vue3-highlightjs-1.0.5.tgz",
"integrity": "sha512-Q4YNPXu0X5VMBnwPVOk+IQf1Ohp9jFdMitEAmzaz8qVVefcQpN6Dx4BnDGKxja3TLDVF+EgL136wC8YzmoCX9w==",
+ "license": "ISC",
"dependencies": {
"highlight.js": "^10.3.2"
},
@@ -7561,6 +8450,7 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/vue3-markdown-it/-/vue3-markdown-it-1.0.10.tgz",
"integrity": "sha512-mTvHu0zl7jrh7ojgaZ+tTpCLiS4CVg4bTgTu4KGhw/cRRY5YgIG8QgFAPu6kCzSW6Znc9a52Beb6hFvF4hSMkQ==",
+ "license": "MIT",
"dependencies": {
"markdown-it": "^12.3.2",
"markdown-it-abbr": "^1.0.4",
@@ -7578,20 +8468,21 @@
}
},
"node_modules/webidl-conversions": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz",
- "integrity": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz",
+ "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=20"
}
},
"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==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz",
+ "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==",
+ "license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">=20"
}
},
"node_modules/whatwg-url": {
@@ -7624,33 +8515,86 @@
}
},
"node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-typed-array": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
- "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.10"
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -7659,6 +8603,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -7682,6 +8636,7 @@
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
"integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": ">=12"
}
@@ -7724,6 +8679,7 @@
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
diff --git a/webui/package.json b/webui/package.json
index c7b9656c2..bdca98ea3 100644
--- a/webui/package.json
+++ b/webui/package.json
@@ -21,12 +21,12 @@
"@ssthouse/vue3-tree-chart": "^0.3.0",
"@types/bootstrap": "^5.2.10",
"@types/mokapi": "^0.29.1",
- "@types/nodemailer": "^7.0.4",
+ "@types/nodemailer": "^7.0.5",
"@types/whatwg-mimetype": "^3.0.2",
"ace-builds": "^1.43.5",
"bootstrap": "^5.3.8",
"bootstrap-icons": "^1.13.1",
- "cors": "^2.8.5",
+ "cors": "^2.8.6",
"dayjs": "^1.11.19",
"del-cli": "^7.0.0",
"express": "^5.2.1",
@@ -34,23 +34,23 @@
"http-status-codes": "^2.3.0",
"js-yaml": "^4.1.1",
"kafkajs": "^2.2.4",
- "ldapts": "^8.1.2",
+ "ldapts": "^8.1.3",
"mime-types": "^3.0.2",
"ncp": "^2.0.0",
"nodemailer": "^7.0.12",
- "vue": "^3.5.26",
+ "vue": "^3.5.27",
"vue-router": "^4.6.4",
"vue3-ace-editor": "^2.2.4",
"vue3-highlightjs": "^1.0.5",
"vue3-markdown-it": "^1.0.10",
- "whatwg-mimetype": "^4.0.0",
+ "whatwg-mimetype": "^5.0.0",
"xml-formatter": "^3.6.7"
},
"devDependencies": {
"@playwright/test": "^1.57.0",
"@rushstack/eslint-patch": "^1.15.0",
"@types/js-yaml": "^4.0.9",
- "@types/node": "^25.0.3",
+ "@types/node": "^25.0.9",
"@vitejs/plugin-vue": "^6.0.3",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/eslint-config-typescript": "^14.6.0",
@@ -58,10 +58,10 @@
"eslint": "^9.39.2",
"eslint-plugin-vue": "^10.6.2",
"npm-run-all": "^4.1.5",
- "prettier": "^3.7.4",
+ "prettier": "^3.8.1",
"typescript": "~5.9.3",
- "vite": "^7.3.0",
- "vue-tsc": "^3.2.1",
+ "vite": "^7.3.1",
+ "vue-tsc": "^3.2.3",
"xml2js": "^0.6.2"
}
}
diff --git a/webui/playwright.config.ts b/webui/playwright.config.ts
index cef9e554e..6158261f9 100644
--- a/webui/playwright.config.ts
+++ b/webui/playwright.config.ts
@@ -155,7 +155,7 @@ const config: PlaywrightTestConfig = {
* Use the preview server on CI for more realistic testing.
Playwright will re-use the local server if there is already a dev-server running.
*/
- command: process.env.CI ? 'vite preview --mode dashboard --port 5173' : 'vite dev',
+ command: process.env.CI ? 'vite preview --port 5173' : 'vite dev',
port: 5173,
reuseExistingServer: !process.env.CI
}
diff --git a/webui/public/.htaccess b/webui/public/.htaccess
index 96a51e425..42118ce05 100644
--- a/webui/public/.htaccess
+++ b/webui/public/.htaccess
@@ -1,6 +1,3 @@
-# Disable automatic Apache slash redirects
-DirectorySlash Off
-
Options -MultiViews
@@ -35,27 +32,28 @@ DirectorySlash Off
# Redirect anything under /docs/guides/smtp to /docs/guides/mail/
RewriteRule ^docs/guides/smtp/?(.*)$ /docs/guides/mail/$1 [R=301,L]
+ # rewrite for bots
+ RewriteCond %{HTTP_USER_AGENT} googlebot|bingbot|Seobility|yandex|baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest\/0\.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp|redditbot|applebot|flipboard|tumblr|bitlybot|skypeuripreview|nuzzel|discordbot|google\ page\ speed|qwantify|bitrix\ link\ preview|xing-contenttabreceiver|google-inspectiontool|chrome-lighthouse|telegrambot|amazonbot [NC]
+ RewriteCond %{REQUEST_URI} !\.(html|css|js|less|jpg|png|gif|svg|woff2|xml)$
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteCond %{REQUEST_FILENAME} !-d
+ # Only rewrite for bots IF the .html file exists
+ RewriteCond %{REQUEST_FILENAME}.html -f
+ RewriteRule ^(.+)$ $1.html [L]
+
# rewrite for bots if tailing /
RewriteCond %{HTTP_USER_AGENT} googlebot|bingbot|Seobility|yandex|baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest\/0\.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp|redditbot|applebot|flipboard|tumblr|bitlybot|skypeuripreview|nuzzel|discordbot|google\ page\ speed|qwantify|bitrix\ link\ preview|xing-contenttabreceiver|google-inspectiontool|chrome-lighthouse|telegrambot|amazonbot [NC]
- RewriteCond %{REQUEST_FILENAME} !^$
+ RewriteCond %{REQUEST_FILENAME} -d
# url ends with a slash
RewriteCond %{REQUEST_FILENAME} /$
# Rewrite /about/ → /about/index.html
RewriteRule ^(.+)/$ $1/index.html [L]
- # rewrite to /index.html ff the request is a directory but has no trailing slash
+ # rewrite to /index.html if the request is a directory but has no trailing slash
RewriteCond %{HTTP_USER_AGENT} googlebot|bingbot|Seobility|yandex|baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest\/0\.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp|redditbot|applebot|flipboard|tumblr|bitlybot|skypeuripreview|nuzzel|discordbot|google\ page\ speed|qwantify|bitrix\ link\ preview|xing-contenttabreceiver|google-inspectiontool|chrome-lighthouse|telegrambot|amazonbot [NC]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/index.html [L]
- # rewrite for bots
- RewriteCond %{HTTP_USER_AGENT} googlebot|bingbot|Seobility|yandex|baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest\/0\.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp|redditbot|applebot|flipboard|tumblr|bitlybot|skypeuripreview|nuzzel|discordbot|google\ page\ speed|qwantify|bitrix\ link\ preview|xing-contenttabreceiver|google-inspectiontool|chrome-lighthouse|telegrambot|amazonbot [NC]
- RewriteCond %{REQUEST_URI} !\.(html|css|js|less|jpg|png|gif|svg|woff2|xml)$
- RewriteCond %{REQUEST_FILENAME} !^$
- # Only rewrite for bots IF the .html file exists
- RewriteCond %{REQUEST_FILENAME}.html -f
- RewriteRule ^(.+)$ $1.html [L]
-
# rewrite for bots for root page
RewriteCond %{HTTP_USER_AGENT} googlebot|bingbot|Seobility|yandex|baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest\/0\.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp|redditbot|applebot|flipboard|tumblr|bitlybot|skypeuripreview|nuzzel|discordbot|google\ page\ speed|qwantify|bitrix\ link\ preview|xing-contenttabreceiver|google-inspectiontool|chrome-lighthouse|telegrambot|amazonbot [NC]
RewriteCond %{DOCUMENT_ROOT}/home.html -f
diff --git a/webui/public/dashboard-ldap-mock.png b/webui/public/dashboard-ldap-mock.png
index cd27ae661..1f09959e2 100644
Binary files a/webui/public/dashboard-ldap-mock.png and b/webui/public/dashboard-ldap-mock.png differ
diff --git a/webui/public/dashboard-overview-mock-api.jpg b/webui/public/dashboard-overview-mock-api.jpg
deleted file mode 100644
index e69c54617..000000000
Binary files a/webui/public/dashboard-overview-mock-api.jpg and /dev/null differ
diff --git a/webui/public/dashboard-overview-mock-api.png b/webui/public/dashboard-overview-mock-api.png
new file mode 100644
index 000000000..ad9ce430e
Binary files /dev/null and b/webui/public/dashboard-overview-mock-api.png differ
diff --git a/webui/public/dashboard-smtp.png b/webui/public/dashboard-smtp.png
index c81c00758..7bded895e 100644
Binary files a/webui/public/dashboard-smtp.png and b/webui/public/dashboard-smtp.png differ
diff --git a/webui/public/kafka-dashboard.png b/webui/public/kafka-dashboard.png
index 83725c797..c93ceaec6 100644
Binary files a/webui/public/kafka-dashboard.png and b/webui/public/kafka-dashboard.png differ
diff --git a/webui/src/assets/dashboard.css b/webui/src/assets/dashboard.css
index 1f224b3d0..d178ca78a 100644
--- a/webui/src/assets/dashboard.css
+++ b/webui/src/assets/dashboard.css
@@ -83,8 +83,9 @@
margin: 0 0 0.3rem;
}
.dashboard {
- width: 90%;
- margin: 0 auto auto;
+ padding: 0 2rem;
+ max-width: 1800px;
+ margin: 0 auto;
}
.header-demo {
position: fixed;
diff --git a/webui/src/assets/github-dark.css b/webui/src/assets/github-dark.css
index 52db74c0b..2f42b0a8d 100644
--- a/webui/src/assets/github-dark.css
+++ b/webui/src/assets/github-dark.css
@@ -1,7 +1,6 @@
-:root[data-theme="dark"] {
+/*:root[data-theme="dark"] {*/
pre code.hljs {
display: block;
- padding: 12px;
line-height: 1.4;
}
@@ -9,12 +8,12 @@
padding: 3px 5px
}
pre:has(code.hljs) {
- background: #0d1117;
+ background: var(--code-background);
}
.hljs {
- color: #BBBBBB;
- background: #0d1117
+ color: #e6edf3;
+ background: var(--code-background)
}
.hljs-doctag,
@@ -103,4 +102,4 @@
color: #ffdcd7;
background-color: #67060c
}
-}
+/*}*/
diff --git a/webui/src/assets/github.css b/webui/src/assets/github.css
index 5d136ccb1..00c1c4217 100644
--- a/webui/src/assets/github.css
+++ b/webui/src/assets/github.css
@@ -9,12 +9,12 @@
padding: 3px 5px
}
pre:has(code.hljs) {
- background: #f6f8fa;
+ background: var(--code-background);
}
.hljs {
color: #24292e;
- background: #f6f8fa;
+ background: var(--code-background);
}
.hljs-doctag,
diff --git a/webui/src/assets/home.css b/webui/src/assets/home.css
index ba4552883..37993b962 100644
--- a/webui/src/assets/home.css
+++ b/webui/src/assets/home.css
@@ -31,6 +31,7 @@
.home .hero-title .description {
margin-bottom: 1.5rem;
font-size: 1.2rem;
+ max-width: 42rem;
}
.home .hero-title img {
max-width: 70%;
@@ -45,7 +46,7 @@
background-color: rgb(8, 109, 215);
color: white;
}
-.home .tab {
+.home .tab, .home .code {
max-width: 700px;
margin: 0 auto auto;
}
@@ -54,11 +55,6 @@
margin-bottom: 0.2rem;
}
.home .code-tabs button {
- padding: 0.3rem;
- margin-right: 0.5rem;
- margin-left: 0.5rem;
- padding-right: 0.8rem;
- padding-left: 0.8rem;
font-size: 1rem;
}
.home pre {
@@ -111,6 +107,7 @@
.card-inner {
position: relative;
z-index: 1;
+ height: 100%;
}
/* Scale only the background "shell" */
.card.accented::before {
@@ -138,13 +135,13 @@
position: relative;
bottom:2px;
}
-.home .card.accented .cta i.hover {
+.home .card.accented .cta span.hover {
display: none;
}
-.home .card:hover.accented .cta i.hover {
+.home .card:hover.accented .cta span.hover {
display: inline;
}
-.home .card:hover.accented .cta i:not(.hover) {
+.home .card:hover.accented .cta span:not(.hover) {
display: none;
}
@@ -213,4 +210,24 @@ footer a {
.home code {
font-size: 14px;
font-family: Menlo,Monaco,Consolas,"Courier New",monospace !important;
+}
+
+.github-meta {
+ font-size: 0.85rem;
+ color: #6c757d;
+ padding-top: 12px;
+}
+.github-meta a {
+ color: inherit;
+ text-decoration: none;
+}
+.github-meta a:hover {
+ color: #24292f;
+}
+.github-meta .bi.release {
+ margin-right: 0.25rem;
+}
+
+.home img:not(.no-dialog) {
+ cursor: pointer;
}
\ No newline at end of file
diff --git a/webui/src/assets/main.css b/webui/src/assets/main.css
index 9bd9fd781..eb7caa39a 100644
--- a/webui/src/assets/main.css
+++ b/webui/src/assets/main.css
@@ -7,7 +7,6 @@
@import './nav.css';
@import './home.css';
@import 'ace-mokapi.css';
-@import 'github.css';
@import 'github-dark.css';
body {
@@ -33,6 +32,10 @@ body {
min-height: 100%;
}
+#app:has(header .promo-banner) {
+ --header-height: calc(4rem + 22px);
+}
+
main {
flex: 1;
}
@@ -40,6 +43,8 @@ main {
h1 {
font-size: 2.3rem;
font-weight: 700;
+ margin-top: 32px;
+ margin-bottom: 18px;
}
h2 {
@@ -47,11 +52,15 @@ h2 {
font-weight: 700;
margin-block-start: 2.5rem;
margin-block-end: 1rem;
+ margin-top: 28px;
+ margin-bottom: 16px;
}
h3 {
font-size: 1.25rem;
font-weight: 700;
+ margin-top: 24px;
+ margin-bottom: 14px;
}
h4 {
@@ -95,10 +104,6 @@ pre{
background-color: var(--color-doc-link);
}
-[data-theme="light"] .doc .content .hljs{
- background-color: #f6f8fa;
-}
-
pre {
box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0.25rem 0.5rem rgba(0, 0, 0, 0.05);
}
@@ -116,4 +121,15 @@ i.icon {
.form-select:focus {
border-color: var(--form-color-border-active);
box-shadow: 0 0 0 0.2rem rgba(234, 186, 171, 0.25)
+}
+/* class to disable all animations for Playwright tests */
+.no-motion {
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0s !important;
+ transition-duration: 0s !important;
+ animation: none !important;
+ transition: none !important;
+ }
}
\ No newline at end of file
diff --git a/webui/src/assets/tabs.css b/webui/src/assets/tabs.css
index 377239ea5..0cdf5b51e 100644
--- a/webui/src/assets/tabs.css
+++ b/webui/src/assets/tabs.css
@@ -70,34 +70,59 @@
padding: 0.8rem;
padding-top: 1.6rem;
}
- .code-tabs {
- margin-left: 5px;
- }
- .code-tabs button {
+.code {
+ background-color: var(--code-background);
+ color: var(--code-color);
+ border-radius: 6px;
+}
+.code-tabs {
+ margin: 0;
+ padding: 16px 16px 0;
+}
+.code .code-tabs button {
font-size: 0.9rem;
- padding-bottom: 5px;
- padding-right: 10px;
- padding-left: 10px;
- color: var(--code-tabs-color);
+ padding: 0 10px 4px;
background-color: transparent;
border: 0;
- margin-right: 5px;
+ z-index: 2;
+ color: var(--code-tabs-color);
}
-.code-tabs button.active {
- font-size: 0.9rem;
- border: 0;
+.code-tabs button[role="tab"].active, .code .code-tabs button[role="tab"]:hover {
color: var(--code-tabs-color-active);
+ border-color: var(--code-tabs-border-color-active);
border-bottom-width: 3px;
border-bottom-style: solid;
margin-bottom: -3px;
}
-.code-tabs button.active:only-child {
+.code-tabs button[role="tab"].active:only-child {
border: 0;
}
+.code .code-tabs button.control {
+ margin-left: auto;
+ margin-right: 0;
+}
+.code .code-tabs button.control:hover {
+ color: var(--code-control-color-active);
+}
+.code .code-tabs button.control.copied {
+ color: var(--bs-success);
+}
+.code .code-tabs button.control.copied .bi-copy::before {
+ content: "\f26a"; /* bi-check */
+}
.code-tabs button.disabled {
color: var(--color-disabled);
}
+.tab-content.code {
+ padding: 16px;
+}
.tab-content.code .tab-pane {
padding: 0;
- margin-bottom: 4rem;
- }
\ No newline at end of file
+ margin: 0;
+}
+.tabs-border {
+ width: 100%;
+ height: 3px;
+ background-color: var(--code-tab-border-color);
+ margin: 0 auto;
+}
\ No newline at end of file
diff --git a/webui/src/assets/vars.css b/webui/src/assets/vars.css
index fc7ce2906..5af3b12ad 100644
--- a/webui/src/assets/vars.css
+++ b/webui/src/assets/vars.css
@@ -1,4 +1,6 @@
:root{
+ --header-height: 4rem;
+
--color-background: #323743;
--color-background-mute: #2e2e31;
--color-background-soft: rgb(40,43,51);
@@ -34,6 +36,7 @@
--color-button-link: #eabaabff;
--color-button-link-active: #a5899fff;
+ --color-button-link-inactive: #a0a1a7;
--color-button-text-hover: #353e5bff;
--color-button-border-hover: #a5899fff;
@@ -75,9 +78,6 @@
--accentedCardScale: 1.05;
--accentedCardShadow: 0;
- --code-tabs-color: #d3d4d5;
- --code-tabs-color-active: #eabaabff;
-
--table-header-color: var(--color-text);
--table-border-color: rgba(255, 255, 255, 0.1);
@@ -98,6 +98,14 @@
--badge-background: #eabaabff;
+ --code-background: #0d1117;
+ --code-color: #fff;
+ --code-tabs-color: #d3d4d5;
+ --code-tabs-color-active: #eabaabff;
+ --code-tabs-border-color-active: #eabaabff;
+ --code-tab-border-color: #3c424b;
+ --code-control-color-active: #eabaabff;
+
--footer-background: #282b33;
}
@@ -123,6 +131,7 @@
--color-button-link: rgb(2, 101, 210);
--color-button-link-active: rgb(8, 109, 215);
+ --color-button-link-inactive: rgb(101, 109, 118);
--color-button-text-hover: #fff;
--color-button-border-hover: rgb(8, 109, 215);
@@ -149,9 +158,6 @@
--card-border-active: rgba(0,0,0,0.3);
--accentedCardShadow: 0 6px 20px rgba(0, 0, 0, 0.12);
- --code-tabs-color: rgb(36, 36, 36);
- --code-tabs-color-active: rgb(8, 109, 215);
-
--table-header-color: var(--color-text);
--table-border-color: rgba(0, 0, 0, 0.1);
@@ -174,5 +180,13 @@
--badge-background: rgb(8, 109, 215);
+ --code-background: #0d1117;
+ --code-color: rgb(255, 255, 255);;
+ --code-tabs-color: rgb(255,255,255);
+ --code-tabs-color-active: rgb(255, 255, 255);
+ --code-tabs-border-color-active: rgb(8, 109, 215);
+ --code-tab-border-color: #3c424b;
+ --code-control-color-active: rgb(8, 109, 215);
+
--footer-background: rgb(244 244 246);
}
\ No newline at end of file
diff --git a/webui/src/components/Header.vue b/webui/src/components/Header.vue
index 4d6efb0cf..f6de75a69 100644
--- a/webui/src/components/Header.vue
+++ b/webui/src/components/Header.vue
@@ -205,16 +205,16 @@ function navigateAndClose(params: Record) {
-
+