From a727d2456c0412c005c230deac35e565af63d0c6 Mon Sep 17 00:00:00 2001 From: Pulkit Kathuria Date: Sat, 20 Jan 2024 12:53:37 +0900 Subject: [PATCH] self host, test setup, embed setup and db setup --- .github/workflows/build.yml | 46 + .github/workflows/coveritup.yml | 137 + .github/workflows/release.yml | 39 + .gitignore | 5 +- .goreleaser.yaml | 41 + action.yml | 13 +- app/.air.toml | 44 + app/db/cache.go | 38 + app/db/database.go | 132 + app/favicon.ico | Bin 0 -> 119346 bytes app/frontend/.env.example | 1 + app/frontend/.gitignore | 19 + app/frontend/.vscode/extensions.json | 4 + app/frontend/.vscode/launch.json | 11 + app/frontend/astro.config.mjs | 7 + app/frontend/package-lock.json | 7413 +++++++++++++++++ app/frontend/package.json | 24 + app/frontend/public/favicon.ico | Bin 0 -> 119346 bytes app/frontend/public/logo.png | Bin 0 -> 13437 bytes app/frontend/src/assets/barchart.svg | 44 + app/frontend/src/assets/linechart.svg | 1 + app/frontend/src/assets/medium.svg | 3 + app/frontend/src/assets/octocat.svg | 3 + app/frontend/src/assets/piechart.svg | 1 + app/frontend/src/assets/radarchart.svg | 1 + app/frontend/src/assets/sun.svg | 21 + app/frontend/src/components/BarChart.astro | 64 + app/frontend/src/components/Compare.astro | 52 + app/frontend/src/components/FinalAction.astro | 55 + app/frontend/src/components/Footer.astro | 16 + app/frontend/src/components/Hero.astro | 79 + app/frontend/src/components/Layout.astro | 82 + app/frontend/src/components/LineChart.astro | 59 + .../src/components/MultipleOutputs.astro | 59 + app/frontend/src/components/Nav.astro | 30 + app/frontend/src/components/PieChart.astro | 59 + app/frontend/src/components/RadarChart.astro | 57 + app/frontend/src/components/SelfHosting.astro | 55 + app/frontend/src/components/Themes.astro | 31 + app/frontend/src/env.d.ts | 1 + app/frontend/src/pages/index.astro | 39 + app/frontend/tailwind.config.mjs | 8 + app/frontend/tsconfig.json | 10 + app/go.mod | 78 + app/go.sum | 351 + app/install.sh | 57 + app/main.go | 84 + app/models/coverage.go | 577 ++ app/models/model.go | 5 + app/models/org.go | 45 + app/models/repo.go | 47 + app/models/type.go | 83 + app/models/user.go | 49 + app/pkg/badge.go | 92 + app/pkg/badge_handler.go | 59 + app/pkg/badge_handler_test.go | 51 + app/pkg/chart.go | 161 + app/pkg/chart_handler.go | 98 + app/pkg/destroy.go | 21 + app/pkg/destroy_handler.go | 52 + app/pkg/echo.go | 84 + app/pkg/favicon_handler.go | 31 + app/pkg/github.go | 95 + app/pkg/index_handler.go | 21 + app/pkg/logger.go | 28 + app/pkg/middlewares.go | 22 + app/pkg/migrations/00001_schema.sql | 121 + app/pkg/pr.go | 131 + app/pkg/pr_handler.go | 59 + app/pkg/readme.go | 88 + app/pkg/readme_handler.go | 44 + app/pkg/request.go | 95 + app/pkg/robots_handler.go | 23 + app/pkg/routes.go | 70 + app/pkg/setup_test.go | 25 + app/pkg/upload.go | 82 + app/pkg/upload_handler.go | 56 + app/pkg/utils.go | 54 + app/pkg/validator.go | 38 + 79 files changed, 11871 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/coveritup.yml create mode 100644 .github/workflows/release.yml create mode 100644 .goreleaser.yaml create mode 100644 app/.air.toml create mode 100644 app/db/cache.go create mode 100644 app/db/database.go create mode 100644 app/favicon.ico create mode 100644 app/frontend/.env.example create mode 100644 app/frontend/.gitignore create mode 100644 app/frontend/.vscode/extensions.json create mode 100644 app/frontend/.vscode/launch.json create mode 100644 app/frontend/astro.config.mjs create mode 100644 app/frontend/package-lock.json create mode 100644 app/frontend/package.json create mode 100644 app/frontend/public/favicon.ico create mode 100644 app/frontend/public/logo.png create mode 100644 app/frontend/src/assets/barchart.svg create mode 100644 app/frontend/src/assets/linechart.svg create mode 100644 app/frontend/src/assets/medium.svg create mode 100644 app/frontend/src/assets/octocat.svg create mode 100644 app/frontend/src/assets/piechart.svg create mode 100644 app/frontend/src/assets/radarchart.svg create mode 100644 app/frontend/src/assets/sun.svg create mode 100644 app/frontend/src/components/BarChart.astro create mode 100644 app/frontend/src/components/Compare.astro create mode 100644 app/frontend/src/components/FinalAction.astro create mode 100644 app/frontend/src/components/Footer.astro create mode 100644 app/frontend/src/components/Hero.astro create mode 100644 app/frontend/src/components/Layout.astro create mode 100644 app/frontend/src/components/LineChart.astro create mode 100644 app/frontend/src/components/MultipleOutputs.astro create mode 100644 app/frontend/src/components/Nav.astro create mode 100644 app/frontend/src/components/PieChart.astro create mode 100644 app/frontend/src/components/RadarChart.astro create mode 100644 app/frontend/src/components/SelfHosting.astro create mode 100644 app/frontend/src/components/Themes.astro create mode 100644 app/frontend/src/env.d.ts create mode 100644 app/frontend/src/pages/index.astro create mode 100644 app/frontend/tailwind.config.mjs create mode 100644 app/frontend/tsconfig.json create mode 100644 app/go.mod create mode 100644 app/go.sum create mode 100755 app/install.sh create mode 100644 app/main.go create mode 100644 app/models/coverage.go create mode 100644 app/models/model.go create mode 100644 app/models/org.go create mode 100644 app/models/repo.go create mode 100644 app/models/type.go create mode 100644 app/models/user.go create mode 100644 app/pkg/badge.go create mode 100644 app/pkg/badge_handler.go create mode 100644 app/pkg/badge_handler_test.go create mode 100644 app/pkg/chart.go create mode 100644 app/pkg/chart_handler.go create mode 100644 app/pkg/destroy.go create mode 100644 app/pkg/destroy_handler.go create mode 100644 app/pkg/echo.go create mode 100644 app/pkg/favicon_handler.go create mode 100644 app/pkg/github.go create mode 100644 app/pkg/index_handler.go create mode 100644 app/pkg/logger.go create mode 100644 app/pkg/middlewares.go create mode 100644 app/pkg/migrations/00001_schema.sql create mode 100644 app/pkg/pr.go create mode 100644 app/pkg/pr_handler.go create mode 100644 app/pkg/readme.go create mode 100644 app/pkg/readme_handler.go create mode 100644 app/pkg/request.go create mode 100644 app/pkg/robots_handler.go create mode 100644 app/pkg/routes.go create mode 100644 app/pkg/setup_test.go create mode 100644 app/pkg/upload.go create mode 100644 app/pkg/upload_handler.go create mode 100644 app/pkg/utils.go create mode 100644 app/pkg/validator.go diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..7bf13b2 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,46 @@ +on: + push: + paths: + - '**/*.go' + - '**/*.mod' + - '**/*.sum' + - '**/*.yml' +name: CI +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} +jobs: + build: + strategy: + matrix: + go-version: [latest] + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: kevincobain2000/action-gobrew@v2 + with: + version: ${{ matrix.go-version }} + - name: Setup Node.js ${{ matrix.node-versions }} + uses: actions/setup-node@v2 + with: + node-version: 20 + + - name: Build Dist for Embed + working-directory: app/frontend + run: | + npm install + npm run build + - name: Build + working-directory: app + run: go build main.go + + - name: Install Tools + run: | + go install github.com/securego/gosec/v2/cmd/gosec@latest + - name: Lint + working-directory: app + run: | + gosec ./... + go vet -all . + diff --git a/.github/workflows/coveritup.yml b/.github/workflows/coveritup.yml new file mode 100644 index 0000000..c26f804 --- /dev/null +++ b/.github/workflows/coveritup.yml @@ -0,0 +1,137 @@ +on: + pull_request: + paths: + - '**/*.go' + - '**/*.mod' + - '**/*.sum' + - '**/*.yml' + push: + paths: + - '**/*.go' + - '**/*.mod' + - '**/*.sum' + - '**/*.yml' + +name: "Cover It Up" +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} +jobs: + coveritup: + strategy: + matrix: + go-version: [latest] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: kevincobain2000/action-gobrew@v2 + with: + version: ${{ matrix.go-version }} + - name: Setup Node.js ${{ matrix.node-versions }} + uses: actions/setup-node@v2 + with: + node-version: 20 + + - name: Install Tools + run: | + go install github.com/securego/gosec/v2/cmd/gosec@latest + go install github.com/axw/gocov/gocov@latest + go install github.com/AlekSi/gocov-xml@latest + - name: Setup Node.js ${{ matrix.node-versions }} + uses: actions/setup-node@v2 + with: + node-version: 20 + - uses: shogo82148/actions-setup-mysql@v1 + with: + mysql-version: "8.0" + + - name: Build Dist for Embed + working-directory: app/frontend + run: | + npm install + npm run build + - name: test + working-directory: app + run: | + go mod tidy + go test ./... -count=1 + + # - name: NPM Install + # working-directory: app/frontend + # run: | + # START=$SECONDS + # npm install + # echo SCORE=$(($SECONDS-START)) >> "$GITHUB_ENV" + # - uses: kevincobain2000/action-coveritup@v1 + # with: + # type: npm-install-time + + # - name: NPM Build + # working-directory: app/frontend + # run: | + # START=$SECONDS + # npm run build + # echo SCORE=$(($SECONDS-START)) >> "$GITHUB_ENV" + # - uses: kevincobain2000/action-coveritup@v1 + # with: + # type: npm-build-time + + # - name: Go Build + # working-directory: app + # run: | + # START=$SECONDS + # go build -ldflags '-s -w' -o main main.go + # echo SCORE=$(($SECONDS-START)) >> "$GITHUB_ENV" + # - uses: kevincobain2000/action-coveritup@v1 + # with: + # type: go-build-time + + # - name: Test + # working-directory: app + # run: | + # START=$SECONDS + # go test -race -v ./... -count=1 -coverprofile=coverage.out + # echo SCORE=$(($SECONDS-START)) >> "$GITHUB_ENV" + # - uses: kevincobain2000/action-coveritup@v1 + # with: + # type: unit-test-run-time + + # - name: Coverage + # working-directory: app + # run: | + # go tool cover -html=coverage.out -o coverage.html + # gocov convert coverage.out | gocov-xml > coverage.xml + # - name: Coveritup + # run: | + # curl -sLk https://raw.githubusercontent.com/kevincobain2000/cover-totalizer/master/install.sh | sh + # echo SCORE=`./cover-totalizer coverage.xml` >> "$GITHUB_ENV" + # - uses: kevincobain2000/action-coveritup@v1 + # with: + # type: coverage + + # - name: Go Binary Size + # working-directory: app + # run: | + # echo SCORE=`du -sk main | awk '{print $1}'` >> "$GITHUB_ENV" + # - uses: kevincobain2000/action-coveritup@v1 + # with: + # type: go-binary-size + + # - name: Number of dependencies + # working-directory: app + # run: echo SCORE=`go list -m all|wc -l|awk '{$1=$1};1'` >> "$GITHUB_ENV" + # - uses: kevincobain2000/action-coveritup@v1 + # with: + # type: go-mod-dependencies + + # - name: Number of GO Sec issues + # working-directory: app + # run: echo SCORE=`gosec -no-fail --quiet ./...|grep Issues | tail -1 |awk '{print $3}'` >> "$GITHUB_ENV" + # - uses: kevincobain2000/action-coveritup@v1 + # with: + # type: go-sec-issues + + # - uses: kevincobain2000/action-coveritup@v1 + # with: + # pr_comment: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..406d15b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,39 @@ +name: goreleaser + +on: + push: + tags: + - '*' + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: kevincobain2000/action-gobrew@v2 + with: + version: 'mod' + - name: Setup Node.js ${{ matrix.node-versions }} + uses: actions/setup-node@v2 + with: + node-version: 20 + + - name: Build Dist for Embed + working-directory: app/frontend + run: | + npm install + npm run build + echo "You are running MIT License version" > dist/index.html + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v3 + with: + distribution: goreleaser + version: latest + args: release --clean --skip-validate + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index a93bec3..86c0681 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out -# diskcache directory +# diskcache directory cache/* vendor/* @@ -17,4 +17,5 @@ tmp/ .env *.pid dist/ -bin/ \ No newline at end of file +bin/ +main \ No newline at end of file diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..7326121 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,41 @@ +before: + hooks: + - go mod tidy +builds: + - + main: ./app/main.go + env: + - CGO_ENABLED=0 + goos: + - linux + - darwin + # - windows + - freebsd + goarch: + - amd64 + - arm64 + - arm + ignore: + - goos: windows + goarch: arm64 + - goos: freebsd + goarch: arm64 + - goos: windows + goarch: arm + - goos: freebsd + goarch: arm + - goos: darwin + goarch: arm +archives: + - + format: binary + name_template: "{{ .ProjectName }}-{{ .Os }}-{{ .Arch }}" +snapshot: + name_template: "{{ incpatch .Version }}-next" +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' + - '^bin' diff --git a/action.yml b/action.yml index 051267a..4521775 100644 --- a/action.yml +++ b/action.yml @@ -1,6 +1,6 @@ name: "action-coveritup" author: "kevincobain2000" -description: "All in one action to publish code coverage, build and other metrics, comment on pull requests" +description: "All in one code coverage solution, build times and custom metrics, comment on pull requests" branding: icon: 'activity' color: 'red' @@ -95,11 +95,10 @@ runs: "score": "${{ env.SCORE }}", "user": "${{ github.actor }}", "branch": "${{ steps.branch-name.outputs.current_branch }}", - "base_branch": "${{ steps.branch-name.outputs.base_ref_branch }}", "pr": "${{ steps.find-pull-request.outputs.number }}", "branches": "${{ env.CIU_ACTIVE_BRANCHES }}" }' \ - "${{inputs.host}}/api/upload" + "${{inputs.host}}/upload" # Prepare comment on PR if it is a pull req - name: Prepare comment on PR if it is a pull req @@ -133,17 +132,15 @@ runs: shell: bash run: | curl -sLk \ - -X PUT \ + -X POST \ -H 'Content-Type: application/json' \ -H 'Authorization: ${{ github.token }}' \ -d '{ "org": "${{github.repository_owner}}", "repo": "${{ github.event.repository.name }}", - "commit": "${{ github.sha }}", - "type": "${{ inputs.type }}", - "branches": "" + "type": "${{ inputs.type }}" }' \ - "${{inputs.host}}/api/upload" + "${{inputs.host}}/destroy" ### End ### ### Compliance ### diff --git a/app/.air.toml b/app/.air.toml new file mode 100644 index 0000000..5ca5f18 --- /dev/null +++ b/app/.air.toml @@ -0,0 +1,44 @@ +# .air.conf +# Config file for [Air](https://github.com/cosmtrek/air) in TOML format + +# Working directory +# . or absolute path, please note that the directories following must be under root. +root = "." +tmp_dir = "tmp" + +[build] +# Just plain old shell command. You could use `make` as well. +cmd = "go mod tidy && go build -o ./tmp/main main.go" +# Binary file yields from `cmd`. +bin = "tmp/main" +# Customize binary. +full_bin = "PP_USER=air ./tmp/main" +# Watch these filename extensions. +include_ext = ["go", "tpl", "tmpl", "html", "env", "conf"] +# Ignore these filename extensions or directories. +exclude_dir = ["assets", "tmp", "vendor", "dist", "node_modules", "public", "frontend"] +# Watch these directories if you specified. +include_dir = [] +# Exclude files. +exclude_file = [] +# It's not necessary to trigger build each time file changes if it's too frequent. +delay = 1000 # ms +# Stop to run old binary when build errors occur. +stop_on_error = true +# This log file places in your tmp_dir. +log = "air_errors.log" + +[log] +# Show log time +time = false + +[color] +# Customize each part's color. If no color found, use the raw app log. +main = "magenta" +watcher = "cyan" +build = "yellow" +runner = "green" + +[misc] +# Delete tmp directory on exit +clean_on_exit = true \ No newline at end of file diff --git a/app/db/cache.go b/app/db/cache.go new file mode 100644 index 0000000..900792b --- /dev/null +++ b/app/db/cache.go @@ -0,0 +1,38 @@ +package db + +import ( + _ "embed" + "sync" + + "github.com/coocood/freecache" +) + +var ( + cacheOnce sync.Once + cache *freecache.Cache +) + +func SetupCache() { + syncCache() +} + +func Cache() *freecache.Cache { + return cache +} + +func syncCache() *freecache.Cache { + if cache != nil { + return cache + } + cacheOnce.Do(func() { + cacheSize := 32 * 1024 * 1024 // 32 MB + cache := freecache.NewCache(cacheSize) + configureCache(cache) + }) + + return cache +} + +func configureCache(fc *freecache.Cache) { + +} diff --git a/app/db/database.go b/app/db/database.go new file mode 100644 index 0000000..4e07cb9 --- /dev/null +++ b/app/db/database.go @@ -0,0 +1,132 @@ +package db + +import ( + "context" + "database/sql" + "embed" + _ "embed" + "log" + "os" + "sync" + "time" + + "github.com/pressly/goose/v3" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +var ( + dbOnce sync.Once + db *gorm.DB +) + +func SetupDatabase() { + syncDb() +} + +func Db() *gorm.DB { + return db +} + +func syncDb() *gorm.DB { + if db != nil { + return db + } + dbOnce.Do(func() { + dsn := os.Getenv("DATABASE_DSN") + dbn := os.Getenv("DATABASE_NAME") + fdsn := dsn + dbn + "?charset=utf8mb4&parseTime=True&loc=Local" + + var err error + db, err = gorm.Open(mysql.Open(fdsn), &gorm.Config{ + Logger: logger.Default.LogMode(logger.LogLevel(1)), + }) + if err != nil { + log.Fatal("cannot connect to database") + } + sqlDb, err := db.DB() + if err != nil { + log.Fatal("cannot get database intance") + } + configureSQL(sqlDb) + }) + + return db +} + +func configureSQL(sqlDB *sql.DB) { + // SetMaxIdleConns sets the maximum number of connections in the idle connection pool. + sqlDB.SetMaxIdleConns(30) + // SetMaxOpenConns sets the maximum number of open connections to the database. + sqlDB.SetMaxOpenConns(30) + // SetConnMaxLifetime sets the maximum amount of time a connection may be reused. + // Default DB close on mysql is 8 hours, so we set way before that (1 min) + // This can be increased to 1 hour as well + sqlDB.SetConnMaxLifetime(time.Hour * time.Duration(1)) +} + +func Migrate(command string, embedMigrations embed.FS) error { + if command == "create" { + create() + return nil + } + if command == "drop" { + drop() + return nil + } + driver, err := Db().DB() + + // donot close the connection if you want to add it to part of the app or tests + // the connection is closed on cli exit anyways + // defer func() { + // err := driver.Close() + // if err != nil { + // panic(err) + // } + // }() + if err != nil { + panic(err) + } + ctx := context.Background() + err = goose.SetDialect("mysql") + if err != nil { + panic(err) + } + goose.SetBaseFS(embedMigrations) + err = goose.RunContext(ctx, command, driver, "migrations") + if err != nil { + panic(err) + } + return nil +} + +func create() { + dsn := os.Getenv("DATABASE_DSN") + dbn := os.Getenv("DATABASE_NAME") + db, err := sql.Open("mysql", dsn) + if err != nil { + panic(err) + } + defer db.Close() + + _, err = db.Exec("CREATE DATABASE IF NOT EXISTS " + dbn) + if err != nil { + panic(err) + } +} + +func drop() { + dsn := os.Getenv("DATABASE_DSN") + dbn := os.Getenv("DATABASE_NAME") + db, err := sql.Open("mysql", dsn) + if err != nil { + panic(err) + } + defer db.Close() + + _, err = db.Exec("DROP DATABASE IF EXISTS " + dbn) + if err != nil { + panic(err) + } +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..50aaf8b7ac52abfae6a211e710523283fc9fab20 GIT binary patch literal 119346 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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@astrojs/check": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.3.4.tgz", + "integrity": "sha512-Wi4KwW38J3GCd/U6LH2UuU4uc4P/K1WYaqhoKm2o7rVoGhQfO+RWrSO26rUPRXYbmae8JugAgpCmsHC8bt5RlA==", + "dependencies": { + "@astrojs/language-server": "^2.5.5", + "chokidar": "^3.5.3", + "fast-glob": "^3.3.1", + "kleur": "^4.1.5", + "yargs": "^17.7.2" + }, + "bin": { + "astro-check": "dist/bin.js" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.3.4.tgz", + "integrity": "sha512-33/YtWoBCE0cBUNy1kh78FCDXBoBANX87ShgATlAHECYbG2+buNTAgq4Xgz4t5NgnEHPN21GIBC2Mvvwisoutw==" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.2.1.tgz", + "integrity": "sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==" + }, + "node_modules/@astrojs/language-server": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.5.5.tgz", + "integrity": "sha512-hk7a8S7bpf//BOA6mMjiYqi/eiYtGPfUfw59eVXdutdRFdwDHtu4jcsLu43ZaId56pAcE8qFjIvJxySvzcxiUA==", + "dependencies": { + "@astrojs/compiler": "^2.2.2", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@volar/kit": "~1.10.9", + "@volar/language-core": "~1.10.9", + "@volar/language-server": "~1.10.9", + "@volar/language-service": "~1.10.9", + "@volar/source-map": "~1.10.9", + "@volar/typescript": "~1.10.9", + "fast-glob": "^3.2.12", + "muggle-string": "^0.3.1", + "volar-service-css": "0.0.16", + "volar-service-emmet": "0.0.16", + "volar-service-html": "0.0.16", + "volar-service-prettier": "0.0.16", + "volar-service-typescript": "0.0.16", + "volar-service-typescript-twoslash-queries": "0.0.16", + "vscode-html-languageservice": "^5.1.0", + "vscode-uri": "^3.0.8" + }, + "bin": { + "astro-ls": "bin/nodeServer.js" + }, + "peerDependencies": { + "prettier": "^3.0.0", + "prettier-plugin-astro": ">=0.11.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + } + } + }, + "node_modules/@astrojs/markdown-remark": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-4.0.1.tgz", + "integrity": "sha512-RU4ESnqvyLpj8WZs0n5elS6idaDdtIIm7mIpMaRNPCebpxMjfcfdwcmBwz83ktAj5d2eO5bC3z92TcGdli+lRw==", + "dependencies": { + "@astrojs/prism": "^3.0.0", + "github-slugger": "^2.0.0", + "import-meta-resolve": "^4.0.0", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.0", + "remark-gfm": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "remark-smartypants": "^2.0.0", + "shikiji": "^0.6.13", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.1" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.0.0.tgz", + "integrity": "sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==", + "dependencies": { + "prismjs": "^1.29.0" + }, + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@astrojs/tailwind": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-5.1.0.tgz", + "integrity": "sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==", + "dependencies": { + "autoprefixer": "^10.4.15", + "postcss": "^8.4.28", + "postcss-load-config": "^4.0.2" + }, + "peerDependencies": { + "astro": "^3.0.0 || ^4.0.0", + "tailwindcss": "^3.0.24" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.4.tgz", + "integrity": "sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==", + "dependencies": { + "ci-info": "^3.8.0", + "debug": "^4.3.4", + "dlv": "^1.1.3", + "dset": "^3.1.2", + "is-docker": "^3.0.0", + "is-wsl": "^3.0.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@astrojs/telemetry/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emmetio/abbreviation": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", + "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/css-abbreviation": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", + "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==" + }, + "node_modules/@emnapi/runtime": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.44.0.tgz", + "integrity": "sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.1.tgz", + "integrity": "sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.1.tgz", + "integrity": "sha512-YrnuB3bXuWdG+hJlXtq7C73lF8ampkhU3tMxg5Hh+E7ikxbUVOU9nlNtVTloDXz6pRHt2y2oKJq7DY/yt+UXYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.0.tgz", + "integrity": "sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.0.tgz", + "integrity": "sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.0.tgz", + "integrity": "sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.0.tgz", + "integrity": "sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.0.tgz", + "integrity": "sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.0.tgz", + "integrity": "sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.0.tgz", + "integrity": "sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.0.tgz", + "integrity": "sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.1.tgz", + "integrity": "sha512-Ii4X1vnzzI4j0+cucsrYA5ctrzU9ciXERfJR633S2r39CiD8npqH2GMj63uFZRCFt3E687IenAdbwIpQOJ5BNA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.1.tgz", + "integrity": "sha512-59B5GRO2d5N3tIfeGHAbJps7cLpuWEQv/8ySd9109ohQ3kzyCACENkFVAnGPX00HwPTQcaBNF7HQYEfZyZUFfw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.1.tgz", + "integrity": "sha512-tRGrb2pHnFUXpOAj84orYNxHADBDIr0J7rrjwQrTNMQMWA4zy3StKmMvwsI7u3dEZcgwuMMooIIGWEWOjnmG8A==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.1.tgz", + "integrity": "sha512-4y8osC0cAc1TRpy02yn5omBeloZZwS62fPZ0WUAYQiLhSFSpWJfY/gMrzKzLcHB9ulUV6ExFiu2elMaixKDbeg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.1.tgz", + "integrity": "sha512-D3lV6clkqIKUizNS8K6pkuCKNGmWoKlBGh5p0sLO2jQERzbakhu4bVX1Gz+RS4vTZBprKlWaf+/Rdp3ni2jLfA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.1.tgz", + "integrity": "sha512-LOGKNu5w8uu1evVqUAUKTix2sQu1XDRIYbsi5Q0c/SrXhvJ4QyOx+GaajxmOg5PZSsSnCYPSmhjHHsRBx06/wQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.1.tgz", + "integrity": "sha512-vWI/sA+0p+92DLkpAMb5T6I8dg4z2vzCUnp8yvxHlwBpzN8CIcO3xlSXrLltSvK6iMsVMNswAv+ub77rsf25lA==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^0.44.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.1.tgz", + "integrity": "sha512-/xhYkylsKL05R+NXGJc9xr2Tuw6WIVl2lubFJaFYfW4/MQ4J+dgjIo/T4qjNRizrqs/szF/lC9a5+updmY9jaQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.1.tgz", + "integrity": "sha512-XaM69X0n6kTEsp9tVYYLhXdg7Qj32vYJlAKRutxUsm1UlgQNx6BOhHwZPwukCGXBU2+tH87ip2eV1I/E8MQnZg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz", + "integrity": "sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz", + "integrity": "sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz", + "integrity": "sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz", + "integrity": "sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz", + "integrity": "sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz", + "integrity": "sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz", + "integrity": "sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz", + "integrity": "sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.1.tgz", + "integrity": "sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz", + "integrity": "sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz", + "integrity": "sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz", + "integrity": "sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz", + "integrity": "sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/hast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", + "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/nlcst": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-1.0.4.tgz", + "integrity": "sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/nlcst/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@volar/kit": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-1.10.10.tgz", + "integrity": "sha512-V2SyUPCPUhueqH8j5t48LJ0QsjExGSXzTv/XOdkUHV7hJ/ekyRGFqKxcfBtMq/nK6Tgu2G1ba+6u0d7e6wKcQw==", + "dependencies": { + "@volar/language-service": "1.10.10", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/language-core": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.10.tgz", + "integrity": "sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==", + "dependencies": { + "@volar/source-map": "1.10.10" + } + }, + "node_modules/@volar/language-server": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-1.10.10.tgz", + "integrity": "sha512-F2PRBU+CRjT7L9qe8bjof/uz/LbAXVmgwNU2gOSX2y1bUl3E8DHmD0dB6pwIVublvkx+Ivg/0r3Z6oyxfPPruQ==", + "dependencies": { + "@volar/language-core": "1.10.10", + "@volar/language-service": "1.10.10", + "@volar/typescript": "1.10.10", + "@vscode/l10n": "^0.0.16", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/language-service": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-1.10.10.tgz", + "integrity": "sha512-P4fiPWDI6fLGO6BghlksCVHs1nr9gvWAMDyma3Bca4aowxXusxjUVTsnJq0EVorIN5uIr1Xel4B/tNdXt/IKyw==", + "dependencies": { + "@volar/language-core": "1.10.10", + "@volar/source-map": "1.10.10", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/source-map": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.10.tgz", + "integrity": "sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==", + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.10.tgz", + "integrity": "sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==", + "dependencies": { + "@volar/language-core": "1.10.10", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vscode/emmet-helper": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.9.2.tgz", + "integrity": "sha512-MaGuyW+fa13q3aYsluKqclmh62Hgp0BpKIqS66fCxfOaBcVQ1OnMQxRRgQUYnCkxFISAQlkJ0qWWPyXjro1Qrg==", + "dependencies": { + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^2.1.2" + } + }, + "node_modules/@vscode/emmet-helper/node_modules/vscode-uri": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", + "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==" + }, + "node_modules/@vscode/l10n": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.16.tgz", + "integrity": "sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "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==" + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astro": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/astro/-/astro-4.0.8.tgz", + "integrity": "sha512-LwbYUfdrfys5mtI6cA5V8UvPRUVVTRQ68uF1ylrEge6BkPcHHJ7qCYLNdjnNPxZDR9bWi1awILJESB6j+w0P4w==", + "dependencies": { + "@astrojs/compiler": "^2.3.4", + "@astrojs/internal-helpers": "0.2.1", + "@astrojs/markdown-remark": "4.0.1", + "@astrojs/telemetry": "3.0.4", + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/parser": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "@types/babel__core": "^7.20.4", + "acorn": "^8.11.2", + "boxen": "^7.1.1", + "chokidar": "^3.5.3", + "ci-info": "^4.0.0", + "clsx": "^2.0.0", + "common-ancestor-path": "^1.0.1", + "cookie": "^0.6.0", + "debug": "^4.3.4", + "deterministic-object-hash": "^2.0.1", + "devalue": "^4.3.2", + "diff": "^5.1.0", + "dlv": "^1.1.3", + "dset": "^3.1.3", + "es-module-lexer": "^1.4.1", + "esbuild": "^0.19.6", + "estree-walker": "^3.0.3", + "execa": "^8.0.1", + "fast-glob": "^3.3.2", + "flattie": "^1.1.0", + "github-slugger": "^2.0.0", + "gray-matter": "^4.0.3", + "html-escaper": "^3.0.3", + "http-cache-semantics": "^4.1.1", + "js-yaml": "^4.1.0", + "kleur": "^4.1.4", + "magic-string": "^0.30.3", + "mdast-util-to-hast": "13.0.2", + "mime": "^3.0.0", + "ora": "^7.0.1", + "p-limit": "^5.0.0", + "p-queue": "^8.0.1", + "path-to-regexp": "^6.2.1", + "preferred-pm": "^3.1.2", + "probe-image-size": "^7.2.3", + "prompts": "^2.4.2", + "rehype": "^13.0.1", + "resolve": "^1.22.4", + "semver": "^7.5.4", + "server-destroy": "^1.0.1", + "shikiji": "^0.6.13", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0", + "tsconfck": "^3.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.1", + "vite": "^5.0.10", + "vitefu": "^0.2.5", + "which-pm": "^2.1.1", + "yargs-parser": "^21.1.1", + "zod": "^3.22.4" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": ">=18.14.1", + "npm": ">=6.14.0" + }, + "optionalDependencies": { + "sharp": "^0.33.1" + } + }, + "node_modules/astro-single-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/astro-single-file/-/astro-single-file-1.1.0.tgz", + "integrity": "sha512-x33yQVzbA6RSNoph1DSXK4tDcbhdENIcizs/6Npvn8w8OKCcQ+qGj+vxMSytkV1WWegXgGRo5k3h6r1r5ZZxyA==" + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001572", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz", + "integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "optional": true + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", + "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dset": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.616", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz", + "integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==" + }, + "node_modules/emmet": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.6.tgz", + "integrity": "sha512-dJfbdY/hfeTyf/Ef7Y7ubLYzkBvPQ912wPaeVYpAxvFxkEBf/+hJu4H6vhAvFN6HlxqedlfVn2x1S44FfQ97pg==", + "dependencies": { + "@emmetio/abbreviation": "^2.3.3", + "@emmetio/css-abbreviation": "^2.1.8" + } + }, + "node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + }, + "node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "node_modules/flattie": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.0.tgz", + "integrity": "sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", + "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", + "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^9.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "optional": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/load-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/load-yaml-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==" + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", + "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", + "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nlcst-to-string": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", + "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", + "dependencies": { + "@types/nlcst": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse-latin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", + "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", + "dependencies": { + "nlcst-to-string": "^3.0.0", + "unist-util-modify-children": "^3.0.0", + "unist-util-visit-children": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/preferred-pm": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", + "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", + "dependencies": { + "find-up": "^5.0.0", + "find-yarn-workspace-root2": "1.2.16", + "path-exists": "^4.0.0", + "which-pm": "2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/preferred-pm/node_modules/which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "dependencies": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8.15" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/probe-image-size": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "dependencies": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", + "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rehype": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", + "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", + "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", + "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz", + "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-2.0.0.tgz", + "integrity": "sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==", + "dependencies": { + "retext": "^8.1.0", + "retext-smartypants": "^5.1.0", + "unist-util-visit": "^4.1.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-smartypants/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/remark-smartypants/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/request-light": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/retext": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-8.1.0.tgz", + "integrity": "sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "retext-latin": "^3.0.0", + "retext-stringify": "^3.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-3.1.0.tgz", + "integrity": "sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "parse-latin": "^5.0.0", + "unherit": "^3.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/retext-latin/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-5.2.0.tgz", + "integrity": "sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "nlcst-to-string": "^3.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/retext-smartypants/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-3.1.0.tgz", + "integrity": "sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "nlcst-to-string": "^3.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/retext-stringify/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/retext/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.2.tgz", + "integrity": "sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.2", + "@rollup/rollup-android-arm64": "4.9.2", + "@rollup/rollup-darwin-arm64": "4.9.2", + "@rollup/rollup-darwin-x64": "4.9.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.2", + "@rollup/rollup-linux-arm64-gnu": "4.9.2", + "@rollup/rollup-linux-arm64-musl": "4.9.2", + "@rollup/rollup-linux-riscv64-gnu": "4.9.2", + "@rollup/rollup-linux-x64-gnu": "4.9.2", + "@rollup/rollup-linux-x64-musl": "4.9.2", + "@rollup/rollup-win32-arm64-msvc": "4.9.2", + "@rollup/rollup-win32-ia32-msvc": "4.9.2", + "@rollup/rollup-win32-x64-msvc": "4.9.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz", + "integrity": "sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, + "node_modules/sharp": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.1.tgz", + "integrity": "sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + }, + "engines": { + "libvips": ">=8.15.0", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.1", + "@img/sharp-darwin-x64": "0.33.1", + "@img/sharp-libvips-darwin-arm64": "1.0.0", + "@img/sharp-libvips-darwin-x64": "1.0.0", + "@img/sharp-libvips-linux-arm": "1.0.0", + "@img/sharp-libvips-linux-arm64": "1.0.0", + "@img/sharp-libvips-linux-s390x": "1.0.0", + "@img/sharp-libvips-linux-x64": "1.0.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", + "@img/sharp-libvips-linuxmusl-x64": "1.0.0", + "@img/sharp-linux-arm": "0.33.1", + "@img/sharp-linux-arm64": "0.33.1", + "@img/sharp-linux-s390x": "0.33.1", + "@img/sharp-linux-x64": "0.33.1", + "@img/sharp-linuxmusl-arm64": "0.33.1", + "@img/sharp-linuxmusl-x64": "0.33.1", + "@img/sharp-wasm32": "0.33.1", + "@img/sharp-win32-ia32": "0.33.1", + "@img/sharp-win32-x64": "0.33.1" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shikiji": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/shikiji/-/shikiji-0.6.13.tgz", + "integrity": "sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==", + "dependencies": { + "hast-util-to-html": "^9.0.0" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "dependencies": { + "debug": "2" + } + }, + "node_modules/stream-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stream-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", + "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tsconfck": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.0.tgz", + "integrity": "sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typesafe-path": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==" + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-auto-import-cache": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.2.tgz", + "integrity": "sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==", + "dependencies": { + "semver": "^7.3.8" + } + }, + "node_modules/unherit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", + "integrity": "sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz", + "integrity": "sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==", + "dependencies": { + "@types/unist": "^2.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz", + "integrity": "sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz", + "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==", + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/volar-service-css": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.16.tgz", + "integrity": "sha512-gK/XD35t/P3SQrUuS8LMlCnE2ItIk+kXI6gPvBYl1NZ7O+tLH8rUWXA32YgpwNoITxYrm/G1seaq08zs4aiPvg==", + "dependencies": { + "vscode-css-languageservice": "^6.2.10", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~1.10.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-emmet": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.16.tgz", + "integrity": "sha512-8sWWywzVJOD+PWDArOXDWbiRlM7+peydFhXJT71i4X1WPW32RyPxn6FypvciO+amqpfZP2rXfB9eibIJ+EofSQ==", + "dependencies": { + "@vscode/emmet-helper": "^2.9.2", + "volar-service-html": "0.0.16" + }, + "peerDependencies": { + "@volar/language-service": "~1.10.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-html": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.16.tgz", + "integrity": "sha512-/oEXXgry++1CnTXQBUNf9B8MZfTlYZuJfZA7Zx9MN7WS4ZPxk3BFOdal/cXH6RNR2ruNEYr5QTW9rsqtoUscag==", + "dependencies": { + "vscode-html-languageservice": "^5.1.0", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~1.10.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-prettier": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.16.tgz", + "integrity": "sha512-Kj2ZdwJGEvfYbsHW8Sjrew/7EB4PgRoas4f8yAJzUUVxIC/kvhUwLDxQc8+N2IibomN76asJGWe+i6VZZvgIkw==", + "peerDependencies": { + "@volar/language-service": "~1.10.0", + "prettier": "^2.2 || ^3.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + }, + "prettier": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.16.tgz", + "integrity": "sha512-k/qFKM2oxs/3fhbr/vcBSHnCLZ1HN3Aeh+bGvV9Lc9qIhrNyCVsDFOUJN1Qp4dI72+Y+eFSIDCLHmFEZdsP2EA==", + "dependencies": { + "path-browserify": "^1.0.1", + "semver": "^7.5.4", + "typescript-auto-import-cache": "^0.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-nls": "^5.2.0", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~1.10.0", + "@volar/typescript": "~1.10.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript-twoslash-queries": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.16.tgz", + "integrity": "sha512-0gPrkDTD2bMj2AnSNykOKhfmPnBFE2LS1lF3LWA7qu1ChRnJF0sodwCCbbeNYJ9+yth956ApoU1BVQ8UrMg+yw==", + "peerDependencies": { + "@volar/language-service": "~1.10.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/vscode-css-languageservice": { + "version": "6.2.11", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.2.11.tgz", + "integrity": "sha512-qn49Wa6K94LnizpVxmlYrcPf1Cb36gq1nNueW0COhi4shylXBzET5wuDbH8ZWQlJD0HM5Mmnn7WE9vQVVs+ULA==", + "dependencies": { + "@vscode/l10n": "^0.0.16", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/vscode-html-languageservice": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.1.1.tgz", + "integrity": "sha512-JenrspIIG/Q+93R6G3L6HdK96itSisMynE0glURqHpQbL3dKAKzdm8L40lAHNkwJeBg+BBPpAshZKv/38onrTQ==", + "dependencies": { + "@vscode/l10n": "^0.0.16", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "node_modules/vscode-nls": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-pm": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.1.1.tgz", + "integrity": "sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==", + "dependencies": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8.15" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/app/frontend/package.json b/app/frontend/package.json new file mode 100644 index 0000000..a0ffe74 --- /dev/null +++ b/app/frontend/package.json @@ -0,0 +1,24 @@ +{ + "name": "instachart-frontend", + "type": "module", + "version": "1.0.0", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro check && astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/check": "^0.3.4", + "@astrojs/tailwind": "^5.1.0", + "astro": "^4.0.8", + "astro-single-file": "^1.1.0", + "html-minifier-terser": "^7.2.0", + "tailwindcss": "^3.4.0", + "typescript": "^5.3.3" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.6.1" + } +} diff --git a/app/frontend/public/favicon.ico b/app/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..50aaf8b7ac52abfae6a211e710523283fc9fab20 GIT binary patch literal 119346 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 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/frontend/src/assets/linechart.svg b/app/frontend/src/assets/linechart.svg new file mode 100644 index 0000000..c9c9cb3 --- /dev/null +++ b/app/frontend/src/assets/linechart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/frontend/src/assets/medium.svg b/app/frontend/src/assets/medium.svg new file mode 100644 index 0000000..9264ab0 --- /dev/null +++ b/app/frontend/src/assets/medium.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/frontend/src/assets/octocat.svg b/app/frontend/src/assets/octocat.svg new file mode 100644 index 0000000..e4ed644 --- /dev/null +++ b/app/frontend/src/assets/octocat.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/frontend/src/assets/piechart.svg b/app/frontend/src/assets/piechart.svg new file mode 100644 index 0000000..55462a1 --- /dev/null +++ b/app/frontend/src/assets/piechart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/frontend/src/assets/radarchart.svg b/app/frontend/src/assets/radarchart.svg new file mode 100644 index 0000000..8374cdb --- /dev/null +++ b/app/frontend/src/assets/radarchart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/frontend/src/assets/sun.svg b/app/frontend/src/assets/sun.svg new file mode 100644 index 0000000..32e8441 --- /dev/null +++ b/app/frontend/src/assets/sun.svg @@ -0,0 +1,21 @@ + + + moon + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/frontend/src/components/BarChart.astro b/app/frontend/src/components/BarChart.astro new file mode 100644 index 0000000..7a3f1ea --- /dev/null +++ b/app/frontend/src/components/BarChart.astro @@ -0,0 +1,64 @@ +--- +import barchart from "@assets/barchart.svg?raw"; +--- + + +
+ +
+

+ Amazing + + Bar Charts + +

+

+ +

+ Calculate Max and Average values automatically. +

+

+ +
+ + +
+

+ Apply your own customization and create bar charts as images. +

+ +
+
+ +
+
+
+
+ diff --git a/app/frontend/src/components/Compare.astro b/app/frontend/src/components/Compare.astro new file mode 100644 index 0000000..0723b94 --- /dev/null +++ b/app/frontend/src/components/Compare.astro @@ -0,0 +1,52 @@ +--- + +--- + + +
+ +
+

+ Compare with + + other services - free plans + +

+ +
+
+ Image-Charts: Quota 60 charts per minute +
+ InstaChart: Free +

+ QuickChart: Rate limits enforced +
+ InstaChart: Free +
+
+
+ + +
+ +

+ Extremely fast on response on 512 MB RAM and Single Core CPU. +
+ Written in Go and fully scalable. Zero overheads. +

+
+
+ diff --git a/app/frontend/src/components/FinalAction.astro b/app/frontend/src/components/FinalAction.astro new file mode 100644 index 0000000..3bf4fb4 --- /dev/null +++ b/app/frontend/src/components/FinalAction.astro @@ -0,0 +1,55 @@ +--- + +--- + +
+ +
+

+ Start Using + + it Now! + +

+

+ Github Actions available for free to use. +

+ +
+
+ +

Self hosting solutions available

+ Start recording your coverages now! +
+ + +
+
+ + +
diff --git a/app/frontend/src/components/Footer.astro b/app/frontend/src/components/Footer.astro new file mode 100644 index 0000000..a34d266 --- /dev/null +++ b/app/frontend/src/components/Footer.astro @@ -0,0 +1,16 @@ +--- + +--- + + +
+ © 2023 + - CoverItUp by + kevincobain2000 +
+ diff --git a/app/frontend/src/components/Hero.astro b/app/frontend/src/components/Hero.astro new file mode 100644 index 0000000..dbd22e3 --- /dev/null +++ b/app/frontend/src/components/Hero.astro @@ -0,0 +1,79 @@ +--- + +--- + +
+
+

+ Cover + + ItUp + +
+ + All your favourite covers in one place. + +

+

+ Record what is important for your project. +

+ +
+
+ +

+ Don't just record code coverage.
+ Take complete control over your coverage reports and badges. +

+
+ +
+

Find us on Product Hunt!

+ CoverItUp - All in one code coverage and badges tool. | Product Hunt +
+
+
+ +
+ +
+ +
diff --git a/app/frontend/src/components/Layout.astro b/app/frontend/src/components/Layout.astro new file mode 100644 index 0000000..97a823c --- /dev/null +++ b/app/frontend/src/components/Layout.astro @@ -0,0 +1,82 @@ +--- +interface Props { + title: string; + description: string; +} +const measurementID = import.meta.env.PUBLIC_GOOGLE_ANALYTICS_ID + +const { title, description } = Astro.props; +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {title} + {measurementID && ( + + + )} + + + + + + + + diff --git a/app/frontend/src/components/LineChart.astro b/app/frontend/src/components/LineChart.astro new file mode 100644 index 0000000..794502a --- /dev/null +++ b/app/frontend/src/components/LineChart.astro @@ -0,0 +1,59 @@ +--- +import linechart from "@assets/linechart.svg?raw"; +--- + + +
+ +
+

+ Beautiful + + Line Charts + +

+

+ + + Your go-to online tool for effortlessly creating, customizing, and sharing + professional charts as images. +

+ +
+
+ +
+
+
+ + +
+ +
+
+ diff --git a/app/frontend/src/components/MultipleOutputs.astro b/app/frontend/src/components/MultipleOutputs.astro new file mode 100644 index 0000000..52bc94d --- /dev/null +++ b/app/frontend/src/components/MultipleOutputs.astro @@ -0,0 +1,59 @@ +--- + +--- + + +
+ +
+

+ + SVG + + or + + PNG + +

+ +
+
+ + SVG: Vector based, can be scaled to any size +
+ PNG: With custom dimensions +

+ Choose the right format for your use case. +
+ Images are generated on the fly and cached. +
+
+ {`Under 4kb for SVG`} +
+ {`Under 12kb for PNG`} +

+
+
+
+ + +
+ +
+
+ diff --git a/app/frontend/src/components/Nav.astro b/app/frontend/src/components/Nav.astro new file mode 100644 index 0000000..668f192 --- /dev/null +++ b/app/frontend/src/components/Nav.astro @@ -0,0 +1,30 @@ +--- +import octocat from '@assets/octocat.svg?raw' +import medium from '@assets/medium.svg?raw' +--- + + + diff --git a/app/frontend/src/components/PieChart.astro b/app/frontend/src/components/PieChart.astro new file mode 100644 index 0000000..30a8bf5 --- /dev/null +++ b/app/frontend/src/components/PieChart.astro @@ -0,0 +1,59 @@ +--- +import piechart from "@assets/piechart.svg?raw"; +--- + + +
+ +
+

+ Piece by Piece + + Pie Charts + +

+ + A Slice of Insight: Revealing the Whole Picture, Piece by Piece. +

+

+ +
+ + +
+

+ Apply your own customization and create bar charts as images. +

+ +
+
+ +
+
+
+
+ diff --git a/app/frontend/src/components/RadarChart.astro b/app/frontend/src/components/RadarChart.astro new file mode 100644 index 0000000..5a8a655 --- /dev/null +++ b/app/frontend/src/components/RadarChart.astro @@ -0,0 +1,57 @@ +--- +import radarchart from "@assets/radarchart.svg?raw"; +--- + + +
+ +
+

+ Easy + + Radar Charts + +

+

+ + + Navigating Data Depths: Plotting Points to Connect the Dots. +

+ +
+
+ +
+
+
+ + +
+ +
+
+ diff --git a/app/frontend/src/components/SelfHosting.astro b/app/frontend/src/components/SelfHosting.astro new file mode 100644 index 0000000..5c84e8b --- /dev/null +++ b/app/frontend/src/components/SelfHosting.astro @@ -0,0 +1,55 @@ +--- + +--- + +
+ +
+

+ Free! + + With + + Self Hosted Options. +

+

+ Convert charts to images for free. +

+ +
+
+ +
+ + +
+
+ + +
diff --git a/app/frontend/src/components/Themes.astro b/app/frontend/src/components/Themes.astro new file mode 100644 index 0000000..d97d691 --- /dev/null +++ b/app/frontend/src/components/Themes.astro @@ -0,0 +1,31 @@ +--- +import sun from "@assets/sun.svg?raw"; +--- + +
+

+ Multiple Themes +

+

+ Choose from multiple themes to suit your needs to embed metrics charts in README +

+ +

Light

+
+ +
+

Dark

+

+ +

+
+ +
+
+ diff --git a/app/frontend/src/env.d.ts b/app/frontend/src/env.d.ts new file mode 100644 index 0000000..f964fe0 --- /dev/null +++ b/app/frontend/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/app/frontend/src/pages/index.astro b/app/frontend/src/pages/index.astro new file mode 100644 index 0000000..030dd02 --- /dev/null +++ b/app/frontend/src/pages/index.astro @@ -0,0 +1,39 @@ +--- +import Layout from "@components/Layout.astro"; +import Nav from "@components/Nav.astro"; +import LineChart from "@components/LineChart.astro"; +import Themes from "@components/Themes.astro"; +import Hero from "@components/Hero.astro"; +import BarChart from "@components/BarChart.astro"; +import RadarChart from "@components/RadarChart.astro"; +import SelfHosting from "@components/SelfHosting.astro"; +import FinalAction from "@components/FinalAction.astro"; +import Compare from "@components/Compare.astro"; +import MultipleOutputs from "@components/MultipleOutputs.astro"; +import PieChart from "@components/PieChart.astro"; +import Footer from "@components/Footer.astro"; +--- + + +
+
+
+ + diff --git a/app/frontend/tailwind.config.mjs b/app/frontend/tailwind.config.mjs new file mode 100644 index 0000000..19f0614 --- /dev/null +++ b/app/frontend/tailwind.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/app/frontend/tsconfig.json b/app/frontend/tsconfig.json new file mode 100644 index 0000000..50ca026 --- /dev/null +++ b/app/frontend/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "astro/tsconfigs/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@components/*": ["src/components/*"], + "@assets/*": ["src/assets/*"] + } + } +} \ No newline at end of file diff --git a/app/go.mod b/app/go.mod new file mode 100644 index 0000000..0d51a04 --- /dev/null +++ b/app/go.mod @@ -0,0 +1,78 @@ +module github.com/kevincobain2000/action-coveritup + +go 1.21.3 + +require ( + github.com/coocood/freecache v1.2.4 + github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6 + github.com/go-echarts/statsview v0.3.4 + github.com/go-playground/validator v9.31.0+incompatible + github.com/go-spectest/markdown v0.0.7 + github.com/kevincobain2000/instachart v1.0.10 + github.com/labstack/echo/v4 v4.11.3 + github.com/mcuadros/go-defaults v1.2.0 + github.com/narqo/go-badge v0.0.0-20230821190521-c9a75c019a59 + github.com/pressly/goose/v3 v3.17.0 + github.com/sirupsen/logrus v1.9.3 + github.com/soulteary/go-counting-stars v0.0.0-20230506171455-895778e076b0 + github.com/stretchr/testify v1.8.4 + gorm.io/driver/mysql v1.5.2 + gorm.io/gorm v1.25.5 +) + +replace github.com/narqo/go-badge => github.com/kevincobain2000/go-badge v0.0.0-20240117034316-e85a7d8fbe8c + +require ( + github.com/andybalholm/brotli v1.0.6 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cloudflare/circl v1.3.3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/gaukas/godicttls v0.0.4 // indirect + github.com/go-echarts/go-echarts/v2 v2.2.3 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-sql-driver/mysql v1.7.1 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/imroc/req/v3 v3.42.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/karrick/godirwalk v1.17.0 // indirect + github.com/klauspost/compress v1.17.2 // indirect + github.com/labstack/gommon v0.4.0 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/onsi/ginkgo/v2 v2.12.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/quic-go/qpack v0.4.0 // indirect + github.com/quic-go/qtls-go1-20 v0.3.3 // indirect + github.com/quic-go/quic-go v0.38.1 // indirect + github.com/refraction-networking/utls v1.5.3 // indirect + github.com/rs/cors v1.7.0 // indirect + github.com/sethvargo/go-retry v0.2.4 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/vicanso/go-charts/v2 v2.6.3 // indirect + github.com/wcharczuk/go-chart/v2 v2.1.1 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect + golang.org/x/image v0.11.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.4.0 // indirect + golang.org/x/tools v0.15.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/app/go.sum b/app/go.sum new file mode 100644 index 0000000..08df0f4 --- /dev/null +++ b/app/go.sum @@ -0,0 +1,351 @@ +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/ClickHouse/ch-go v0.58.2 h1:jSm2szHbT9MCAB1rJ3WuCJqmGLi5UTjlNu+f530UTS0= +github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw= +github.com/ClickHouse/clickhouse-go/v2 v2.16.0 h1:rhMfnPewXPnY4Q4lQRGdYuTLRBRKJEIEYHtbUMrzmvI= +github.com/ClickHouse/clickhouse-go/v2 v2.16.0/go.mod h1:J7SPfIxwR+x4mQ+o8MLSe0oY50NNntEqCIjFe/T1VPM= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/blend/go-sdk v1.20220411.3 h1:GFV4/FQX5UzXLPwWV03gP811pj7B8J2sbuq+GJQofXc= +github.com/blend/go-sdk v1.20220411.3/go.mod h1:7lnH8fTi6U4i1fArEXRyOIY2E1X4MALg09qsQqY1+ak= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/coocood/freecache v1.2.4 h1:UdR6Yz/X1HW4fZOuH0Z94KwG851GWOSknua5VUbb/5M= +github.com/coocood/freecache v1.2.4/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/cli v24.0.7+incompatible h1:wa/nIwYFW7BVTGa7SWPVyyXU9lgORqUb1xfI36MSkFg= +github.com/docker/cli v24.0.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/elastic/go-sysinfo v1.11.2 h1:mcm4OSYVMyws6+n2HIVMGkln5HOpo5Ie1ZmbbNn0jg4= +github.com/elastic/go-sysinfo v1.11.2/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ= +github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= +github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= +github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6 h1:6VSn3hB5U5GeA6kQw4TwWIWbOhtvR2hmbBJnTOtqTWc= +github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6/go.mod h1:YxOVT5+yHzKvwhsiSIWmbAYM3Dr9AEEbER2dVayfBkg= +github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk= +github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI= +github.com/go-echarts/go-echarts/v2 v2.2.3 h1:H8oPdUpzuiV2K8S4xYZa1JRNjP3U0h7HVqvhPrmCk1A= +github.com/go-echarts/go-echarts/v2 v2.2.3/go.mod h1:6TOomEztzGDVDkOSCFBq3ed7xOYfbOqhaBzD0YV771A= +github.com/go-echarts/statsview v0.3.4 h1:CCuytRAutdnF901NrR4BzSjHXjUp8OyA3/iopgG/1/Y= +github.com/go-echarts/statsview v0.3.4/go.mod h1:AehKjL9cTFMeIo5QdV8sQO43vFmfY65X5GMWa3XMciY= +github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= +github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= +github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI= +github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+Jpi2LAyY= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator v9.31.0+incompatible h1:UA72EPEogEnq76ehGdEDp4Mit+3FDh548oRqwVgNsHA= +github.com/go-playground/validator v9.31.0+incompatible/go.mod h1:yrEkQXlcI+PugkyDjY2bRrL/UBU4f3rvrgkN3V8JEig= +github.com/go-spectest/markdown v0.0.7 h1:Pr+A/YBCtEruReeMMzBKQ4ftvNtlWuaiWRqgNaETA8Q= +github.com/go-spectest/markdown v0.0.7/go.mod h1:OaFedfVlu5+eqe5tI2j3+LD/39T7k5JZAklxTul98EQ= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= +github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/imroc/req/v3 v3.42.2 h1:/BwrKXGR7X1/ptccaQAiziDCeZ7T6ye55g3ZhiLy1fc= +github.com/imroc/req/v3 v3.42.2/go.mod h1:W7dOrfQORA9nFoj+CafIZ6P5iyk+rWdbp2sffOAvABU= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.1 h1:5I9etrGkLrN+2XPCsi6XLlV5DITbSL/xBZdmAxFcXPI= +github.com/jackc/pgx/v5 v5.5.1/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI= +github.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kevincobain2000/go-badge v0.0.0-20240117034316-e85a7d8fbe8c h1:msfnxRHRG6UTP1WLoAVQS6Tm7c5hx14MfU1FMre/My0= +github.com/kevincobain2000/go-badge v0.0.0-20240117034316-e85a7d8fbe8c/go.mod h1:m9BzkaxwU4IfPQi9ko23cmuFltayFe8iS0dlRlnEWiM= +github.com/kevincobain2000/instachart v1.0.10 h1:8nodAdeNfIuB8mk0WR/y/Wok0G0N4qf6CxD4KUVCGU0= +github.com/kevincobain2000/instachart v1.0.10/go.mod h1:/i6SO13yqvGVt0x+EMpNP3azl91yW2TlOhAUTO1ZRiU= +github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.11.3 h1:Upyu3olaqSHkCjs1EJJwQ3WId8b8b1hxbogyommKktM= +github.com/labstack/echo/v4 v4.11.3/go.mod h1:UcGuQ8V6ZNRmSweBIJkPvGfwCMIlFmiqrPqiEBfPYws= +github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mcuadros/go-defaults v1.2.0 h1:FODb8WSf0uGaY8elWJAkoLL0Ri6AlZ1bFlenk56oZtc= +github.com/mcuadros/go-defaults v1.2.0/go.mod h1:WEZtHEVIGYVDqkKSWBdWKUVdRyKlMfulPaGDWIVeCWY= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= +github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= +github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/runc v1.1.10 h1:EaL5WeO9lv9wmS6SASjszOeQdSctvpbu0DdBQBizE40= +github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= +github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= +github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= +github.com/paulmach/orb v0.10.0 h1:guVYVqzxHE/CQ1KpfGO077TR0ATHSNjp4s6XGLn3W9s= +github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pressly/goose/v3 v3.17.0 h1:fT4CL3LRm4kfyLuPWzDFAoxjR5ZHjeJ6uQhibQtBaIs= +github.com/pressly/goose/v3 v3.17.0/go.mod h1:22aw7NpnCPlS86oqkO/+3+o9FuCaJg4ZVWRUO3oGzHQ= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= +github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= +github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= +github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= +github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE= +github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= +github.com/refraction-networking/utls v1.5.3 h1:Ds5Ocg1+MC1ahNx5iBEcHe0jHeLaA/fLey61EENm7ro= +github.com/refraction-networking/utls v1.5.3/go.mod h1:SPuDbBmgLGp8s+HLNc83FuavwZCFoMmExj+ltUHiHUw= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= +github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= +github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= +github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/soulteary/go-counting-stars v0.0.0-20230506171455-895778e076b0 h1:73ilaJPrZbbZxeirSXCy5eHQAtoPTP3ZBXy2b0h0qEo= +github.com/soulteary/go-counting-stars v0.0.0-20230506171455-895778e076b0/go.mod h1:4stRGw54fLF4wcNjw6dOV/Qer4aoiMzV2EyRaZLFB/E= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= +github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= +github.com/vicanso/go-charts/v2 v2.6.3 h1:AP+zVZw27nt7kjxY5js70M3YfroDRCodrpdqW/Gdxh4= +github.com/vicanso/go-charts/v2 v2.6.3/go.mod h1:Ii2KDI3udTG1wPtiTnntzjlUBJVJTqNscMzh3oYHzUk= +github.com/wcharczuk/go-chart/v2 v2.1.1 h1:2u7na789qiD5WzccZsFz4MJWOJP72G+2kUuJoSNqWnE= +github.com/wcharczuk/go-chart/v2 v2.1.1/go.mod h1:CyCAUt2oqvfhCl6Q5ZvAZwItgpQKZOkCJGb+VGv6l14= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd h1:dzWP1Lu+A40W883dK/Mr3xyDSM/2MggS8GtHT0qgAnE= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= +github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2 h1:E0yUuuX7UmPxXm92+yQCjMveLFO3zfvYFIJVuAqsVRA= +github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2/go.mod h1:fjBLQ2TdQNl4bMjuWl9adoTGBypwUTPoGC+EqYqiIcU= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc= +go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs= +go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ= +go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo= +golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/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.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs= +gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8= +gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= +gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= +howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/libc v1.32.0 h1:yXatHTrACp3WaKNRCoZwUK7qj5V8ep1XyY0ka4oYcNc= +modernc.org/libc v1.32.0/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/app/install.sh b/app/install.sh new file mode 100755 index 0000000..85c0726 --- /dev/null +++ b/app/install.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +BIN_DIR=$(pwd) + +THE_ARCH_BIN='' +THIS_PROJECT_NAME='coveritup' + +THISOS=$(uname -s) +ARCH=$(uname -m) + +case $THISOS in + Linux*) + case $ARCH in + arm64) + THE_ARCH_BIN="$THIS_PROJECT_NAME-linux-arm64" + ;; + aarch64) + THE_ARCH_BIN="$THIS_PROJECT_NAME-linux-arm64" + ;; + armv6l) + THE_ARCH_BIN="$THIS_PROJECT_NAME-linux-arm" + ;; + armv7l) + THE_ARCH_BIN="$THIS_PROJECT_NAME-linux-arm" + ;; + *) + THE_ARCH_BIN="$THIS_PROJECT_NAME-linux-amd64" + ;; + esac + ;; + Darwin*) + case $ARCH in + arm64) + THE_ARCH_BIN="$THIS_PROJECT_NAME-darwin-arm64" + ;; + *) + THE_ARCH_BIN="$THIS_PROJECT_NAME-darwin-amd64" + ;; + esac + ;; + Windows|MINGW64_NT*) + THE_ARCH_BIN="$THIS_PROJECT_NAME-windows-amd64.exe" + THIS_PROJECT_NAME="$THIS_PROJECT_NAME.exe" + ;; +esac + +if [ -z "$THE_ARCH_BIN" ]; then + echo "This script is not supported on $THISOS and $ARCH" + exit 1 +fi + +curl -kL --progress-bar https://github.com/kevincobain2000/$THIS_PROJECT_NAME/releases/latest/download/$THE_ARCH_BIN -o $BIN_DIR/$THIS_PROJECT_NAME + +chmod +x $BIN_DIR/$THIS_PROJECT_NAME + +echo "Installed successfully to: $BIN_DIR/$THIS_PROJECT_NAME" + diff --git a/app/main.go b/app/main.go new file mode 100644 index 0000000..9fcbb95 --- /dev/null +++ b/app/main.go @@ -0,0 +1,84 @@ +package main + +import ( + "embed" + "flag" + "fmt" + "os" + + "github.com/kevincobain2000/action-coveritup/db" + "github.com/kevincobain2000/action-coveritup/pkg" +) + +//go:embed favicon.ico +var favicon embed.FS + +//go:embed all:frontend/dist/* +var publicDir embed.FS + +//go:embed pkg/migrations/*.sql +var embedMigrations embed.FS + +type Flags struct { + host string + port string + baseUrl string + databaseDSN string + databaseName string + migrate string + githubAPI string +} + +var f Flags +var version = "dev" + +func main() { + if len(os.Args) > 1 && os.Args[1] == "version" { + fmt.Println(version) + return + } + + SetupFlags() + db.SetupCache() + db.SetupDatabase() + + if f.migrate != "" { + err := db.Migrate(f.migrate, embedMigrations) + if err != nil { + pkg.Logger().Error(err) + } + return + } + + pkg.GracefulServerWithPid(pkg.NewEcho(f.baseUrl, publicDir, favicon), f.host, f.port) +} + +func SetupFlags() { + flag.StringVar(&f.host, "host", "localhost", "host to serve") + flag.StringVar(&f.port, "port", "3002", "port to serve") + flag.StringVar(&f.baseUrl, "base-url", "/", "base url with slash") + flag.StringVar(&f.databaseDSN, "db-dsn", "root:@tcp(127.0.0.1:3306)/", "databaseURL url") + flag.StringVar(&f.databaseName, "db-name", "coveritup", "database name") + flag.StringVar(&f.migrate, "migrate", "", "migrate up, down or redo") + flag.StringVar(&f.githubAPI, "github-api", "https://api.github.com", "github api url") + flag.Parse() + + if f.databaseDSN != "" { + err := os.Setenv("DATABASE_DSN", f.databaseDSN) + if err != nil { + pkg.Logger().Error(err) + } + } + if f.databaseName != "" { + err := os.Setenv("DATABASE_NAME", f.databaseName) + if err != nil { + pkg.Logger().Error(err) + } + } + if f.githubAPI != "" { + err := os.Setenv("GITHUB_API", f.githubAPI) + if err != nil { + pkg.Logger().Error(err) + } + } +} diff --git a/app/models/coverage.go b/app/models/coverage.go new file mode 100644 index 0000000..bb55cd1 --- /dev/null +++ b/app/models/coverage.go @@ -0,0 +1,577 @@ +package models + +import ( + "database/sql" + "strings" + "time" + + "github.com/kevincobain2000/action-coveritup/db" +) + +const ( + SAFE_LIMIT_BRANCHES = 100 +) + +type Coverage struct { + ID int64 `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"` + OrgID int64 `gorm:"column:org_id;NOT NULL" json:"org_id"` + RepoID int64 `gorm:"column:repo_id;NOT NULL" json:"repo_id"` + UserID int64 `gorm:"column:user_id;NOT NULL" json:"user_id"` + TypeID int64 `gorm:"column:type_id;NOT NULL" json:"type_id"` + PrNum int64 `gorm:"column:pr_num;NOT NULL" json:"pr_num"` + BranchName string `gorm:"column:branch_name;NOT NULL;size:255" json:"branch_name"` + Commit string `gorm:"column:commit;NOT NULL;size:255" json:"commit"` + Score float32 `gorm:"column:score;NOT NULL" json:"score"` + CreatedAt *time.Time `gorm:"column;created_at;type:timestamp;default:CURRENT_TIMESTAMP;NOT NULL" json:"created_at"` + DeletedAt *time.Time `gorm:"column;deleted_at;type:timestamp;" json:"deleted_at"` +} + +func (Coverage) TableName() string { + return "coverages" +} + +func (c *Coverage) GetByBranchName(branchName string) ([]Coverage, error) { + var ret []Coverage + err := db.Db().Raw("SELECT * FROM coverages WHERE branch_name = @branchName", sql.Named("branchName", branchName)).Scan(&ret).Error + return ret, err +} + +func (c *Coverage) GetNumberOfContributors(orgName string, repoName string) (int, error) { + var ret int + query := ` + SELECT + COUNT(DISTINCT c.user_id) AS num + FROM + coverages c + INNER JOIN + orgs o ON c.org_id = o.id + INNER JOIN + repos r ON c.repo_id = r.id + WHERE + o.name = @orgName + AND + r.name = @repoName + ` + err := db.Db().Raw( + query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName)). + Scan(&ret).Error + return ret, err +} + +func (c *Coverage) GetAveragePRDays(orgName string, repoName string) (int, error) { + var ret float64 + query := ` + SELECT + COALESCE(AVG(duration_in_days), 0) AS avg + FROM ( + SELECT + c.pr_num, + DATEDIFF( + MAX(c.created_at), + MIN(c.created_at) + ) AS duration_in_days + FROM + coverages c + INNER JOIN + orgs o ON c.org_id = o.id + INNER JOIN + repos r ON c.repo_id = r.id + WHERE + o.name = @orgName + AND r.name = @repoName + AND c.pr_num != 0 + GROUP BY + c.pr_num + ) AS durations +` + err := db.Db().Raw( + query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName)). + Scan(&ret).Error + return int(ret), err +} + +type LatestBranchScore struct { + BranchName string `json:"branch_name"` + Score float64 `json:"score"` + TypeName string `json:"type_name"` + Metric string `json:"metric"` + CreatedAt string `json:"created_at"` +} + +func (c *Coverage) GetAllBranches(orgName string, repoName string, typeName string) ([]string, error) { + var ret []string + query := ` + SELECT + DISTINCT c.branch_name + FROM + coverages c + LEFT JOIN + orgs o ON c.org_id = o.id + LEFT JOIN + repos r ON c.repo_id = r.id + LEFT JOIN + types t ON c.type_id = t.id + WHERE + r.name = @repoName + AND + o.name = @orgName + AND + t.name = @typeName + ORDER BY FIELD(c.branch_name, 'develop', 'master', 'main') DESC + LIMIT @limit; + ` + err := db.Db().Raw( + query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName), + sql.Named("typeName", typeName), + sql.Named("limit", SAFE_LIMIT_BRANCHES)). + Scan(&ret).Error + if err != nil { + return ret, err + } + + return ret, err + +} +func (c *Coverage) GetLatestBranchScore(orgName string, repoName string, branchName string, typeName string) (LatestBranchScore, error) { + + var ret LatestBranchScore + query := ` + SELECT + c.branch_name, + Round(c.score, 1) as score, + t.name as type_name, + t.metric, + DATE_FORMAT(c.created_at, '%Y/%m/%d') as created_at + FROM + coverages c + LEFT JOIN + orgs o ON c.org_id = o.id + LEFT JOIN + repos r ON c.repo_id = r.id + LEFT JOIN + types t ON c.type_id = t.id + WHERE + r.name = @repoName + AND + o.name = @orgName + AND + c.branch_name = @branchName + AND + t.name = @typeName + ORDER BY + c.created_at DESC + LIMIT 1; + ` + err := db.Db().Raw( + query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName), + sql.Named("branchName", branchName), + sql.Named("typeName", typeName)). + Scan(&ret).Error + if err != nil { + return ret, err + } + ret.Metric = strings.TrimSpace(ret.Metric) + + return ret, err +} + +type LatestBranchScorePR struct { + BranchName string `json:"branch_name"` + Score float64 `json:"score"` + TypeName string `json:"type_name"` + Metric string `json:"metric"` + PRNum int64 `json:"pr_num"` + CreatedAt string `json:"created_at"` +} + +// GetLatestBranchScoresByLimit is same as GetLatestBranchScore but with limit and PR +func (c *Coverage) GetLatestBranchScoresWithPR(orgName string, repoName string, branchName string, typeName string, limit int) ([]LatestBranchScorePR, error) { + + var ret []LatestBranchScorePR + query := ` + SELECT + c.branch_name, + c.pr_num, + Round(c.score, 1) as score, + t.name as type_name, + t.metric, + DATE_FORMAT(c.created_at, '%Y/%m/%d') as created_at + FROM + coverages c + LEFT JOIN + orgs o ON c.org_id = o.id + LEFT JOIN + repos r ON c.repo_id = r.id + LEFT JOIN + types t ON c.type_id = t.id + WHERE + r.name = @repoName + AND + o.name = @orgName + AND + c.branch_name = @branchName + AND + t.name = @typeName + ORDER BY + c.created_at DESC + LIMIT @limit; + ` + err := db.Db().Raw( + query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName), + sql.Named("branchName", branchName), + sql.Named("typeName", typeName), + sql.Named("limit", limit)). + Scan(&ret).Error + if err != nil { + return ret, err + } + + return ret, err +} + +func (c *Coverage) GetLatestBranchScores(orgName string, repoName string, branchName string, typeName string) ([]LatestBranchScore, error) { + var ret []LatestBranchScore + query := ` + SELECT + c.branch_name, + DATE_FORMAT(MAX(c.created_at), '%Y/%m/%d') as created_at, + Round(c.score, 1) as score + FROM coverages c + LEFT JOIN + orgs o ON c.org_id = o.id + LEFT JOIN + repos r ON c.repo_id = r.id + LEFT JOIN + types t ON c.type_id = t.id + WHERE + o.name = @orgName + AND + r.name = @repoName + AND + c.branch_name = @branchName + AND + t.name = @typeName + GROUP BY + c.branch_name, DATE_FORMAT(c.created_at, '%Y/%m/%d') + ORDER BY + MAX(c.created_at) DESC + LIMIT 150; + ` + err := db.Db().Raw( + query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName), + sql.Named("branchName", branchName), + sql.Named("typeName", typeName)). + Scan(&ret).Error + if err != nil { + return ret, err + } + return ret, err +} + +type LatestUserScore struct { + UserName string `json:"user_name"` + Score float64 `json:"score"` + TypeName string `json:"type_name"` + Metric string `json:"metric"` + CreatedAt string `json:"created_at"` +} + +func (c *Coverage) GetAllUsers(orgName string, repoName string, typeName string) ([]string, error) { + var ret []string + query := ` + SELECT + DISTINCT u.name as user_name + FROM + coverages c + LEFT JOIN + orgs o ON c.org_id = o.id + LEFT JOIN + users u ON c.user_id = u.id + LEFT JOIN + repos r ON c.repo_id = r.id + LEFT JOIN + types t ON c.type_id = t.id + WHERE + r.name = @repoName + AND + o.name = @orgName + AND + t.name = @typeName + LIMIT @limit; + ` + err := db.Db().Raw( + query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName), + sql.Named("typeName", typeName), + sql.Named("limit", SAFE_LIMIT_USERS)). + Scan(&ret).Error + if err != nil { + return ret, err + } + + return ret, err +} + +func (c *Coverage) GetLatestUserScore(orgName string, repoName string, userName string, typeName string) (LatestUserScore, error) { + var ret LatestUserScore + query := ` + SELECT + u.name as user_name, + Round(c.score, 1) as score, + t.name as type_name, + t.metric, + DATE_FORMAT(c.created_at, '%Y/%m/%d') as created_at + FROM + coverages c + LEFT JOIN + orgs o ON c.org_id = o.id + LEFT JOIN + users u ON c.user_id = u.id + LEFT JOIN + repos r ON c.repo_id = r.id + LEFT JOIN + types t ON c.type_id = t.id + WHERE + r.name = @repoName + AND + o.name = @orgName + AND + u.name = @userName + AND + t.name = @typeName + ORDER BY + c.created_at DESC + LIMIT 1; + ` + err := db.Db().Raw( + query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName), + sql.Named("userName", userName), + sql.Named("typeName", typeName)). + Scan(&ret).Error + if err != nil { + return ret, err + } + ret.Metric = strings.TrimSpace(ret.Metric) + + return ret, err +} + +func (c *Coverage) GetLatestUserScores(orgName string, repoName string, userName string, typeName string) ([]LatestUserScore, error) { + var ret []LatestUserScore + query := ` + SELECT + c.branch_name, + DATE_FORMAT(MAX(c.created_at), '%Y/%m/%d') as created_at, + Round(c.score, 1) as score + FROM coverages c + LEFT JOIN + orgs o ON c.org_id = o.id + LEFT JOIN + repos r ON c.repo_id = r.id + LEFT JOIN + types t ON c.type_id = t.id + LEFT JOIN + users u ON c.user_id = u.id + WHERE + o.name = @orgName + AND + r.name = @repoName + AND + u.name = @userName + AND + t.name = @typeName + GROUP BY + c.branch_name, DATE_FORMAT(c.created_at, '%Y/%m/%d') + ORDER BY + MAX(c.created_at) DESC + LIMIT 150; + ` + err := db.Db().Raw( + query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName), + sql.Named("userName", userName), + sql.Named("typeName", typeName)). + Scan(&ret).Error + if err != nil { + return ret, err + } + + return ret, err +} + +func (c *Coverage) DeleteCoveragesByType(org string, repo string, typeName string) error { + org = strings.TrimSpace(org) + repo = strings.TrimSpace(repo) + typeName = strings.TrimSpace(typeName) + + query := ` + DELETE c + FROM + coverages c + LEFT JOIN + orgs o ON c.org_id = o.id + LEFT JOIN + repos r ON c.repo_id = r.id + LEFT JOIN + types t ON c.type_id = t.id + WHERE + r.name = @repoName + AND + o.name = @orgName + AND + t.name = @typeName + ` + err := db.Db().Exec( + query, + sql.Named("orgName", org), + sql.Named("repoName", repo), + sql.Named("typeName", typeName)). + Error + return err +} + +func (c *Coverage) DeleteCoverages(org string, repo string) error { + org = strings.TrimSpace(org) + repo = strings.TrimSpace(repo) + query := ` + DELETE c + FROM + coverages c + LEFT JOIN + orgs o ON c.org_id = o.id + LEFT JOIN + repos r ON c.repo_id = r.id + WHERE + r.name = @repoName + AND + o.name = @orgName + ` + err := db.Db().Exec( + query, + sql.Named("orgName", org), + sql.Named("repoName", repo)). + Error + + if err != nil { + return err + } + query = ` + DELETE r + FROM + repos r + LEFT JOIN + orgs o ON r.org_id = o.id + WHERE + r.name = @repoName + AND + o.name = @orgName + ` + err = db.Db().Exec( + query, + sql.Named("orgName", org), + sql.Named("repoName", repo)). + Error + + if err != nil { + return err + } + query = ` + DELETE o + FROM + orgs o + WHERE + o.name = @orgName + AND + (SELECT COUNT(*) FROM repos r WHERE r.org_id = o.id) = 0 + ` + err = db.Db().Exec( + query, + sql.Named("orgName", org)). + Error + + return err +} + +func (c *Coverage) Create( + orgID int64, + repoID int64, + userID int64, + typeID int64, + branchName string, + prNum int64, + commit string, + score float32) (*Coverage, error) { + var ret Coverage + + query := `INSERT INTO + coverages ( + org_id, + repo_id, + user_id, + type_id, + pr_num, + commit, + branch_name, + score + ) + VALUES ( + @org_id, + @repo_id, + @user_id, + @type_id, + @pr_num, + @commit, + @branch_name, + @score + )` + err := db.Db().Raw( + query, + sql.Named("org_id", orgID), + sql.Named("repo_id", repoID), + sql.Named("user_id", userID), + sql.Named("type_id", typeID), + sql.Named("pr_num", prNum), + sql.Named("commit", commit), + sql.Named("branch_name", branchName), + sql.Named("score", score)). + Scan(&ret).Error + + return &ret, err +} +func (c *Coverage) SoftDeleteCoverages(orgID int64, repoID int64, branches string) error { + query := ` + UPDATE + coverages + SET + deleted_at = NOW() + WHERE + org_id = @org_id + AND + repo_id = @repo_id + AND + branch_name IN (@branches) + ` + err := db.Db().Exec( + query, + sql.Named("org_id", orgID), + sql.Named("repo_id", repoID), + sql.Named("branches", branches)). + Error + return err +} diff --git a/app/models/model.go b/app/models/model.go new file mode 100644 index 0000000..7ffa131 --- /dev/null +++ b/app/models/model.go @@ -0,0 +1,5 @@ +package models + +const ( + SAFE_LIMIT_TYPES = 100 +) diff --git a/app/models/org.go b/app/models/org.go new file mode 100644 index 0000000..a38eef7 --- /dev/null +++ b/app/models/org.go @@ -0,0 +1,45 @@ +package models + +import ( + "database/sql" + "strings" + "time" + + "github.com/kevincobain2000/action-coveritup/db" +) + +type Org struct { + ID int64 `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"` + Name string `gorm:"column:name;NOT NULL;size:255" json:"name"` + CreatedAt *time.Time `gorm:"column;created_at;type:timestamp;default:CURRENT_TIMESTAMP;NOT NULL" json:"created_at"` +} + +func (Org) TableName() string { + return "orgs" +} + +func (o *Org) Get(name string) (Org, error) { + var ret Org + + query := `SELECT * FROM orgs WHERE name = @name LIMIT 1` + err := db.Db().Raw( + query, + sql.Named("name", name)). + Scan(&ret).Error + + ret.Name = strings.TrimSpace(ret.Name) + + return ret, err +} + +func (o *Org) Create(name string) (Org, error) { + var ret Org + + query := `INSERT INTO orgs (name) VALUES (@name)` + err := db.Db().Raw( + query, + sql.Named("name", name)). + Scan(&ret).Error + + return ret, err +} diff --git a/app/models/repo.go b/app/models/repo.go new file mode 100644 index 0000000..5eb74f8 --- /dev/null +++ b/app/models/repo.go @@ -0,0 +1,47 @@ +package models + +import ( + "database/sql" + "strings" + "time" + + "github.com/kevincobain2000/action-coveritup/db" +) + +type Repo struct { + ID int64 `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"` + OrgID int64 `gorm:"column:org_id;NOT NULL" json:"org_id"` + Name string `gorm:"column:name;NOT NULL;size:255" json:"name"` + CreatedAt *time.Time `gorm:"column;created_at;type:timestamp;default:CURRENT_TIMESTAMP;NOT NULL" json:"created_at"` +} + +func (Repo) TableName() string { + return "repos" +} +func (r *Repo) Get(orgID int64, name string) (Repo, error) { + var ret Repo + + query := `SELECT * FROM repos WHERE org_id = @org_id AND name = @name LIMIT 1` + err := db.Db().Raw( + query, + sql.Named("org_id", orgID), + sql.Named("name", name)). + Scan(&ret).Error + + ret.Name = strings.TrimSpace(ret.Name) + + return ret, err +} + +func (r *Repo) Create(orgID int64, name string) (Repo, error) { + var ret Repo + + query := `INSERT INTO repos (org_id, name) VALUES (@org_id, @name)` + err := db.Db().Raw( + query, + sql.Named("org_id", orgID), + sql.Named("name", name)). + Scan(&ret).Error + + return ret, err +} diff --git a/app/models/type.go b/app/models/type.go new file mode 100644 index 0000000..2976fce --- /dev/null +++ b/app/models/type.go @@ -0,0 +1,83 @@ +package models + +import ( + "database/sql" + "strings" + + "github.com/kevincobain2000/action-coveritup/db" +) + +type Type struct { + ID int64 `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"` + Name string `gorm:"column:name;NOT NULL;size:255" json:"name"` + Metric string `gorm:"column:metric;NOT NULL;size:32" json:"metric"` +} + +func (Type) TableName() string { + return "types" +} + +const ( + TYPE_AVERAGE_PR_DAYS = "average-pr-days" + TYPE_NUMBER_OF_CONTRIBUTORS = "number-of-contributors" +) + +func (t *Type) Get(name string) (Type, error) { + var ret Type + + query := `SELECT * FROM types WHERE name = @name LIMIT 1` + err := db.Db().Raw( + query, + sql.Named("name", name)). + Scan(&ret).Error + + ret.Metric = strings.TrimSpace(ret.Metric) + ret.Name = strings.TrimSpace(ret.Name) + + return ret, err +} + +func (t *Type) Create(name string, metric string) (Type, error) { + var ret Type + query := `INSERT INTO types (name, metric) VALUES (@name, @metric)` + err := db.Db().Raw( + query, + sql.Named("name", name), + sql.Named("metric", metric)). + Scan(&ret).Error + + return ret, err +} + +func (t *Type) GetTypesFor(orgName string, repoName string) ([]Type, error) { + var ret []Type + + query := `SELECT t.* FROM types t + LEFT JOIN + coverages c ON t.id = c.type_id + LEFT JOIN + repos r ON c.repo_id = r.id + LEFT JOIN + orgs o ON c.org_id = o.id + WHERE + o.name = @orgName + AND + r.name = @repoName + GROUP BY t.id + LIMIT @limit` + + err := db.Db().Raw(query, + sql.Named("orgName", orgName), + sql.Named("repoName", repoName), + sql.Named("limit", SAFE_LIMIT_TYPES)). + Scan(&ret).Error + if err != nil { + return ret, err + } + for i := range ret { + ret[i].Name = strings.TrimSpace(ret[i].Name) + ret[i].Metric = strings.TrimSpace(ret[i].Metric) + } + + return ret, err +} diff --git a/app/models/user.go b/app/models/user.go new file mode 100644 index 0000000..08c2eee --- /dev/null +++ b/app/models/user.go @@ -0,0 +1,49 @@ +package models + +import ( + "database/sql" + "strings" + "time" + + "github.com/kevincobain2000/action-coveritup/db" +) + +const ( + SAFE_LIMIT_USERS = 100 +) + +type User struct { + ID int64 `gorm:"column:id;primary_key;AUTO_INCREMENT"` + Name string `gorm:"column:name;NOT NULL;size:255" json:"name"` + CreatedAt *time.Time `gorm:"column;created_at;type:timestamp;default:CURRENT_TIMESTAMP;NOT NULL" json:"created_at"` +} + +func (User) TableName() string { + return "users" +} + +func (u *User) Get(name string) (User, error) { + var ret User + + query := `SELECT * FROM users WHERE name = @name LIMIT 1` + err := db.Db().Raw( + query, + sql.Named("name", name)). + Scan(&ret).Error + + ret.Name = strings.TrimSpace(ret.Name) + + return ret, err +} + +func (u *User) Create(name string) (User, error) { + var ret User + + query := `INSERT INTO users (name) VALUES (@name)` + err := db.Db().Raw( + query, + sql.Named("name", name)). + Scan(&ret).Error + + return ret, err +} diff --git a/app/pkg/badge.go b/app/pkg/badge.go new file mode 100644 index 0000000..01e0627 --- /dev/null +++ b/app/pkg/badge.go @@ -0,0 +1,92 @@ +package pkg + +import ( + "strconv" + "strings" + + "github.com/kevincobain2000/action-coveritup/models" + "github.com/narqo/go-badge" + stars "github.com/soulteary/go-counting-stars/pkg/go-badge" +) + +type Badge struct { + coverageModel *models.Coverage + typeModel *models.Type +} + +func NewBadge() *Badge { + return &Badge{} +} + +func (b *Badge) Get(req *BadgeRequest, t models.Type) ([]byte, error) { + + if t.Name == models.TYPE_AVERAGE_PR_DAYS { + num, err := b.coverageModel.GetAveragePRDays(req.Org, req.Repo) + if err != nil { + return nil, err + } + numStr := strconv.Itoa(num) + badge, err := stars.RenderBytes("social", models.TYPE_AVERAGE_PR_DAYS, numStr, "") + return badge, err + } + + if t.Name == models.TYPE_NUMBER_OF_CONTRIBUTORS { + num, err := b.coverageModel.GetNumberOfContributors(req.Org, req.Repo) + if err != nil { + return nil, err + } + numStr := strconv.Itoa(num) + badge, err := stars.RenderBytes("social", models.TYPE_NUMBER_OF_CONTRIBUTORS, numStr, "") + return badge, err + } + + ret, err := b.coverageModel.GetLatestBranchScore(req.Org, req.Repo, req.Branch, t.Name) + + if err != nil { + return nil, err + } + scoreStr := F64NumberToK(&ret.Score) + label := t.Name + " | " + req.Branch + + if t.Metric == "" { + return stars.RenderBytes("social", label, scoreStr, "") + } + + scoreStr += ret.Metric + badgeColor, labelColor, color := b.getBadgeColors(t.Metric) + return badge.RenderBytes(label, scoreStr, badgeColor, labelColor, color) +} + +func (b *Badge) Get404(req *BadgeRequest) ([]byte, error) { + return badge.RenderBytes(req.Branch+"|"+req.Type, "404", "#fff", "white", "red") +} + +func (b *Badge) GetType(name string) (models.Type, error) { + if (name == models.TYPE_AVERAGE_PR_DAYS) || (name == models.TYPE_NUMBER_OF_CONTRIBUTORS) { + return models.Type{ + Name: name, + }, nil + } + return b.typeModel.Get(name) +} + +func (e *Badge) getBadgeColors(metric string) (badge.Color, badge.Color, badge.Color) { + metric = strings.ToLower(metric) + if metric == "%" { + return "#fff", "#fff", "blue" + } + if metric == "kb" || metric == "mb" || metric == "gb" { + return "#fff", "gray", "#F8C8DC" + } + if metric == "ms" || + metric == "s" || + metric == "sec" || + metric == "min" || + metric == "days" || + metric == "d" || + metric == "h" || + metric == "hr" { + return "#fff", "gray", "#FFFF00" + } + return "#bbb", "#fff", "gray" +} diff --git a/app/pkg/badge_handler.go b/app/pkg/badge_handler.go new file mode 100644 index 0000000..7483075 --- /dev/null +++ b/app/pkg/badge_handler.go @@ -0,0 +1,59 @@ +package pkg + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/mcuadros/go-defaults" +) + +type BadgeHandler struct { + Badge *Badge +} + +func NewBadgeHandler() *BadgeHandler { + return &BadgeHandler{ + Badge: NewBadge(), + } +} + +type BadgeRequest struct { + Org string `json:"org" query:"org" validate:"required,ascii,excludes=/" message:"org is required"` + Repo string `json:"repo" query:"repo" validate:"required,ascii,excludes=/" message:"repo is required"` + Branch string `json:"branch" query:"branch" validate:"required,ascii,excludes=/" message:"ascii branch is required"` + Type string `json:"type" query:"type" validate:"ascii,required,excludes=/" message:"ascii type is required"` + Style string `json:"style" query:"style" default:"badge" validate:"oneof=badge chart table" message:"style must be badge or chart"` + Color string `json:"color" query:"color" default:"blue" validate:"oneof=blue red green orange" message:"color must be blue, red, green or orange"` +} + +func (h *BadgeHandler) Get(c echo.Context) error { + req := new(BadgeRequest) + if err := BindRequest(c, req); err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, err) + } + defaults.SetDefaults(req) + + msgs, err := ValidateRequest(req) + if err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) + } + + t, err := h.Badge.GetType(req.Type) + if err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) + } + if t.Name == "" { + res, err := h.Badge.Get404(req) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + return ResponseSVG(c, res) + } + + res, err := h.Badge.Get(req, t) + + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + return ResponseSVG(c, res) +} diff --git a/app/pkg/badge_handler_test.go b/app/pkg/badge_handler_test.go new file mode 100644 index 0000000..cc3ed46 --- /dev/null +++ b/app/pkg/badge_handler_test.go @@ -0,0 +1,51 @@ +package pkg + +import ( + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/labstack/echo/v4" + "github.com/stretchr/testify/assert" +) + +func TestGetBadge(t *testing.T) { + e := echo.New() + + BeforeEach() + defer AfterEach() + + e.GET("/badge", func(c echo.Context) error { + return NewBadgeHandler().Get(c) + }) + + server := httptest.NewServer(e) + defer server.Close() + + type TestCase struct { + Name string + Query string + ExpectedStatus int + ExpectedResponseContains string + } + testCases := []TestCase{ + { + Name: "404", + Query: `?org=org&repo=repo&branch=branch&type=type`, + ExpectedStatus: http.StatusOK, + ExpectedResponseContains: `404`, + }, + } + + for _, tc := range testCases { + url := server.URL + "/badge" + tc.Query + resp, err := http.Get(url) + data, _ := io.ReadAll(resp.Body) + + assert.NoError(t, err) + assert.Contains(t, string(data), tc.ExpectedResponseContains) + assert.Equal(t, tc.ExpectedStatus, resp.StatusCode) + assert.Equal(t, "image/svg+xml", resp.Header.Get("Content-Type")) + } +} diff --git a/app/pkg/chart.go b/app/pkg/chart.go new file mode 100644 index 0000000..650285a --- /dev/null +++ b/app/pkg/chart.go @@ -0,0 +1,161 @@ +package pkg + +import ( + "strings" + + "github.com/kevincobain2000/action-coveritup/models" + instachart "github.com/kevincobain2000/instachart/pkg" + "github.com/sirupsen/logrus" +) + +const ( + STYLE_CHART = "chart" + STYLE_TABLE = "table" +) + +type Chart struct { + coverageModel *models.Coverage + typeModel *models.Type + log *logrus.Logger +} + +func NewChart() *Chart { + return &Chart{ + log: Logger(), + } +} + +func (e *Chart) GetType(name string) (models.Type, error) { + return e.typeModel.Get(name) +} + +func (e *Chart) GetInstaChartForBranch(req *ChartRequest, t models.Type) ([]byte, error) { + cReq := e.makeChartRequest(req, t) + line := instachart.NewLineChart() + xData := []string{} + yData := []float64{} + yyData := [][]float64{} + + names := []string{t.Name} + ret, err := e.coverageModel.GetLatestBranchScores(req.Org, req.Repo, req.Branch, t.Name) + if err != nil { + return nil, err + } + + for i := len(ret) - 1; i >= 0; i-- { + r := ret[i] + xData = append(xData, r.CreatedAt) + yData = append(yData, r.Score) + yyData = append(yyData, yData) + } + + return line.Get(xData, yyData, names, cReq) +} +func (e *Chart) GetInstaChartForUser(req *ChartRequest, t models.Type) ([]byte, error) { + cReq := e.makeChartRequest(req, t) + line := instachart.NewLineChart() + xData := []string{} + yData := []float64{} + yyData := [][]float64{} + + names := []string{t.Name} + ret, err := e.coverageModel.GetLatestUserScores(req.Org, req.Repo, req.User, t.Name) + if err != nil { + return nil, err + } + + for i := len(ret) - 1; i >= 0; i-- { + r := ret[i] + xData = append(xData, r.CreatedAt) + yData = append(yData, r.Score) + yyData = append(yyData, yData) + } + + return line.Get(xData, yyData, names, cReq) +} +func (e *Chart) GetInstaChartForBranches(req *ChartRequest, t models.Type) ([]byte, error) { + cReq := e.makeChartRequest(req, t) + bar := instachart.NewBarChart() + + if req.Branches == "all" { + bs, err := e.coverageModel.GetAllBranches(req.Org, req.Repo, t.Name) + if err != nil { + return nil, err + } + req.Branches = strings.Join(bs, ",") + } + + xData := []string{} + yData := []float64{} + zData := []float64{} + names := []string{t.Name} + branches := strings.Split(req.Branches, ",") + var hasErr error + for _, branch := range branches { + ret, err := e.coverageModel.GetLatestBranchScore(req.Org, req.Repo, branch, t.Name) + if err != nil { + hasErr = err + break + } + xData = append(xData, ret.BranchName) + yData = append(yData, ret.Score) + zData = append(zData, ret.Score) + } + if hasErr != nil { + return nil, hasErr + } + yyData := [][]float64{yData} + zzData := [][]float64{zData} + + return bar.GetStacked(xData, yyData, zzData, names, cReq) +} +func (e *Chart) GetInstaChartForUsers(req *ChartRequest, t models.Type) ([]byte, error) { + cReq := e.makeChartRequest(req, t) + bar := instachart.NewBarChart() + + if req.Users == "all" { + us, err := e.coverageModel.GetAllUsers(req.Org, req.Repo, t.Name) + if err != nil { + return nil, err + } + req.Users = strings.Join(us, ",") + } + + xData := []string{} + yData := []float64{} + zData := []float64{} + names := []string{t.Name} + users := strings.Split(req.Users, ",") + var hasErr error + for _, user := range users { + ret, err := e.coverageModel.GetLatestUserScore(req.Org, req.Repo, user, t.Name) + if err != nil { + hasErr = err + break + } + xData = append(xData, ret.UserName) + yData = append(yData, ret.Score) + zData = append(zData, ret.Score) + } + if hasErr != nil { + return nil, hasErr + } + yyData := [][]float64{yData} + zzData := [][]float64{zData} + + return bar.GetStacked(xData, yyData, zzData, names, cReq) +} + +func (e *Chart) makeChartRequest(req *ChartRequest, t models.Type) *instachart.ChartRequest { + cReq := &instachart.ChartRequest{ + Output: req.Output, + Metric: t.Metric, + ChartTitle: req.Org + "/" + req.Repo, + ChartSubtitle: req.Branch, + Theme: req.Theme, + Width: req.Width, + Height: req.Height, + Line: req.Line, + } + return cReq +} diff --git a/app/pkg/chart_handler.go b/app/pkg/chart_handler.go new file mode 100644 index 0000000..9ba3e1d --- /dev/null +++ b/app/pkg/chart_handler.go @@ -0,0 +1,98 @@ +package pkg + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/mcuadros/go-defaults" +) + +type ChartHandler struct { + Chart *Chart +} + +func NewChartHandler() *ChartHandler { + return &ChartHandler{ + Chart: NewChart(), + } +} + +type ChartRequest struct { + Org string `json:"org" query:"org" validate:"required,ascii,excludes=/" message:"org is required"` + Repo string `json:"repo" query:"repo" validate:"required,ascii,excludes=/" message:"repo is required"` + Branch string `json:"branch" query:"branch" validate:"ascii" message:"ascii branch is required"` + User string `json:"user" query:"user" validate:"ascii,excludes=/" message:"ascii user is required"` + BaseBranch string `json:"base_branch" query:"base_branch" validate:"ascii" message:"ascii base_branch is required"` + Type string `json:"type" query:"type" validate:"ascii,required,excludes=/" message:"ascii type is required"` + Branches string `json:"branches" query:"branches" validate:"ascii" message:"ascii branches is required"` + Users string `json:"users" query:"users" validate:"ascii" message:"ascii users is required"` + + Output string `json:"output" query:"output" default:"png" validate:"oneof=svg png" message:"output must be svg or png"` + Theme string `json:"theme" query:"theme" default:"light" validate:"oneof=light dark" message:"theme must be light or dark"` + Width int `json:"width" query:"width" default:"1024" validate:"min=1,max=2048" message:"width must be between 1 and 2048"` + Height int `json:"height" query:"height" default:"512" validate:"min=1,max=2048" message:"height must be between 1 and 2048"` + Line string `json:"line" query:"line" default:"nofill" validate:"oneof=nofill fill" message:"line must be fill or nofill"` +} + +func (h *ChartHandler) Get(c echo.Context) error { + req := new(ChartRequest) + if err := BindRequest(c, req); err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, err) + } + defaults.SetDefaults(req) + + msgs, err := ValidateRequest(req) + if err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) + } + + t, err := h.Chart.GetType(req.Type) + if err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) + } + if t.ID == 0 { + return echo.NewHTTPError(http.StatusNotFound, "type not found") + } + + if req.Branches == "" && req.Users == "" && req.Branch == "" && req.User == "" { + return echo.NewHTTPError(http.StatusUnprocessableEntity, "branches, users, branch or user, branch or base_branch are required") + } + + if req.Branch != "" && req.BaseBranch == "" { + buf, err := h.Chart.GetInstaChartForBranch(req, t) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + return ResponseMedia(c, buf, req.Output) + } + if req.Branch != "" && req.BaseBranch != "" { + req.Branches = req.BaseBranch + "," + req.Branch + buf, err := h.Chart.GetInstaChartForBranches(req, t) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + return ResponseMedia(c, buf, req.Output) + } + if req.User != "" { + buf, err := h.Chart.GetInstaChartForUser(req, t) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + return ResponseMedia(c, buf, req.Output) + } + if req.Branches != "" { + buf, err := h.Chart.GetInstaChartForBranches(req, t) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + return ResponseMedia(c, buf, req.Output) + } + if req.Users != "" { + buf, err := h.Chart.GetInstaChartForUsers(req, t) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + return ResponseMedia(c, buf, req.Output) + } + return echo.NewHTTPError(http.StatusBadRequest, "Client went wrong") +} diff --git a/app/pkg/destroy.go b/app/pkg/destroy.go new file mode 100644 index 0000000..19b7dcb --- /dev/null +++ b/app/pkg/destroy.go @@ -0,0 +1,21 @@ +package pkg + +import ( + "github.com/kevincobain2000/action-coveritup/models" +) + +type Destroy struct { + coverage *models.Coverage +} + +func NewDestroy() *Destroy { + return &Destroy{} +} + +func (c *Destroy) Delete(req DestroyRequest) error { + if req.Type != "" { + return c.coverage.DeleteCoveragesByType(req.Org, req.Repo, req.Type) + } + + return c.coverage.DeleteCoverages(req.Org, req.Repo) +} diff --git a/app/pkg/destroy_handler.go b/app/pkg/destroy_handler.go new file mode 100644 index 0000000..52dbd83 --- /dev/null +++ b/app/pkg/destroy_handler.go @@ -0,0 +1,52 @@ +package pkg + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/mcuadros/go-defaults" +) + +type DestroyHandler struct { + Destroy *Destroy + github *Github +} + +func NewDestroyHandler() *DestroyHandler { + return &DestroyHandler{ + Destroy: NewDestroy(), + github: NewGithub(), + } +} + +type DestroyRequest struct { + Org string `json:"org" form:"org" validate:"required,ascii,excludes=/" message:"org is required"` + Repo string `json:"repo" form:"repo" validate:"required,ascii,excludes=/" message:"repo is required"` + Type string `json:"type" form:"type" validate:"ascii,excludes=/" message:"ascii type is required"` +} + +func (h *DestroyHandler) Post(c echo.Context) error { + + req := new(DestroyRequest) + if err := BindRequest(c, req); err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, err) + } + defaults.SetDefaults(req) + + msgs, err := ValidateRequest(req) + if err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) + } + + // if err := h.github.VerifyGithubToken(c.Request().Header.Get("Authorization"), req.Org, req.Repo, req.Type); err != nil { + // return echo.NewHTTPError(http.StatusUnauthorized, err.Error()) + // } + + err = h.Destroy.Delete(*req) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + + SetHeadersResponseJSON(c.Response().Header()) + return c.JSON(http.StatusOK, `{"status": "destroyed"}`) +} diff --git a/app/pkg/echo.go b/app/pkg/echo.go new file mode 100644 index 0000000..174c47d --- /dev/null +++ b/app/pkg/echo.go @@ -0,0 +1,84 @@ +package pkg + +import ( + "embed" + "net/http" + "os" + "path/filepath" + "strconv" + + "github.com/fvbock/endless" + "github.com/go-echarts/statsview" + "github.com/go-echarts/statsview/viewer" + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" +) + +func NewEcho(baseURL string, publicDir embed.FS, favicon embed.FS) *echo.Echo { + viewer.SetConfiguration(viewer.WithTheme(viewer.ThemeWesteros), viewer.WithAddr("localhost:8082")) + mgr := statsview.New() + _ = mgr + // go mgr.Start() + // mgr.Stop() + + e := echo.New() + + e.HTTPErrorHandler = HTTPErrorHandler + e.Use(middleware.Recover()) + e.Use(middleware.Gzip()) + e.Pre(middleware.RemoveTrailingSlash()) + e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ + Format: "REQUEST[${time_custom}] ${method} ${uri} (${latency_human}) ${status} ${remote_ip}\n", + CustomTimeFormat: "2006-01-02 15:04:05", + })) + SetupRoutes(e, baseURL, publicDir, favicon) + + return e +} + +// GracefulServerWithPid reloads server with pid +// kill -HUP when binary is changed +// kill -9 when want to kill the process and make the application dead and want to restart +// kill -9 is NOT FOR FAINT HEARTED and must not be done on prod unless SOUT +func GracefulServerWithPid(e *echo.Echo, host string, port string) { + log := Logger() + server := endless.NewServer(host+":"+port, e) + server.BeforeBegin = func(add string) { + pidFile := filepath.Join(port + ".pid") + _ = os.Remove(pidFile) + err := os.WriteFile(pidFile, []byte(strconv.Itoa(os.Getpid())), 0600) + if err != nil { + log.Error("write pid file error: ", err) + } + log.Info("started server on localhost:", port) + } + if err := server.ListenAndServe(); err != nil { + log.Error("graceful error: ", err) + } +} + +// HTTPErrorResponse is the response for HTTP errors +type HTTPErrorResponse struct { + Error interface{} `json:"error"` +} + +// HTTPErrorHandler handles HTTP errors for entire application +func HTTPErrorHandler(err error, c echo.Context) { + SetHeadersResponseJSON(c.Response().Header()) + code := http.StatusInternalServerError + var message interface{} + if he, ok := err.(*echo.HTTPError); ok { + code = he.Code + message = he.Message + } else { + message = err.Error() + } + + Logger().Error(message) + if code == http.StatusInternalServerError { + message = "Internal Server Error" + } + if err = c.JSON(code, &HTTPErrorResponse{Error: message}); err != nil { + Logger().Error(err) + } +} diff --git a/app/pkg/favicon_handler.go b/app/pkg/favicon_handler.go new file mode 100644 index 0000000..f791de1 --- /dev/null +++ b/app/pkg/favicon_handler.go @@ -0,0 +1,31 @@ +package pkg + +import ( + "embed" + "net/http" + + "github.com/labstack/echo/v4" +) + +type FaviconHandler struct { + favicon *embed.FS + filename string +} + +func NewFaviconHandler(favicon *embed.FS) *FaviconHandler { + return &FaviconHandler{ + favicon: favicon, + filename: FAVICON_FILE, + } +} + +func (h *FaviconHandler) Get(c echo.Context) error { + SetHeadersResponsePNG(c.Response().Header()) + content, err := h.favicon.ReadFile(h.filename) + if err != nil { + return err + } + SetHeadersResponsePNG(c.Response().Header()) + return c.Blob(http.StatusOK, "image/x-icon", content) + +} diff --git a/app/pkg/github.go b/app/pkg/github.go new file mode 100644 index 0000000..8fb0e35 --- /dev/null +++ b/app/pkg/github.go @@ -0,0 +1,95 @@ +package pkg + +import ( + "bytes" + "errors" + "fmt" + "net/http" + "os" + + "github.com/coocood/freecache" + "github.com/kevincobain2000/action-coveritup/db" + "github.com/sirupsen/logrus" +) + +type Github struct { + body *bytes.Buffer + log *logrus.Logger + client *http.Client + api string + cache *freecache.Cache +} + +func NewGithub() *Github { + return &Github{ + body: bytes.NewBuffer([]byte(`{"state":"success", "context": "coveritup", "description": "authenticated"}`)), + log: Logger(), + client: &http.Client{}, + api: os.Getenv("GITHUB_API"), + cache: db.Cache(), + } +} + +// VerifyGithubToken verifies the github token +// /repos/:owner/:repo/statuses/commit_hash +func (g *Github) VerifyGithubToken(token, orgName, repoName, commitHash string) error { + if token == "" { + err := errors.New("token is empty") + g.log.Error(err) + return err + } + + // look up cache, don't call Github API if it's already authenticated + cacheKey := []byte(fmt.Sprintf("%s/%s/%s", orgName, repoName, token)) + ret, err := g.cache.Get(cacheKey) + if err == nil && string(ret) == "true" { + return nil + } + + url := g.getEndpoint(g.api, orgName, repoName, commitHash) + + req, err := http.NewRequest("POST", url, g.body) + if err != nil { + g.log.Error(err) + return err + } + g.setHeader(req, token) + + resp, err := g.request(req) + if err != nil { + g.log.Error(err) + return err + } + if resp.StatusCode != http.StatusCreated { + err := fmt.Errorf("github auth response code is %d", resp.StatusCode) + g.log.Error(err) + return err + } + err = g.cache.Set(cacheKey, []byte("true"), 60*60*24*7) + + return err +} + +func (g *Github) getEndpoint(api, orgName, repoName, commitHash string) string { + return fmt.Sprintf("%s/repos/%s/%s/statuses/%s", api, orgName, repoName, commitHash) +} + +func (g *Github) setHeader(req *http.Request, token string) { + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) + req.Header.Set("Accept", "application/vnd.github+json") + req.Header.Set("X-Github-Api-Version", "2022-11-28") +} + +func (g *Github) request(req *http.Request) (*http.Response, error) { + resp, err := g.client.Do(req) + if err != nil { + g.log.Error(err) + return nil, err + } + defer func() { + if err := resp.Body.Close(); err != nil { + g.log.Info(err) + } + }() + return resp, nil +} diff --git a/app/pkg/index_handler.go b/app/pkg/index_handler.go new file mode 100644 index 0000000..cdc7bc2 --- /dev/null +++ b/app/pkg/index_handler.go @@ -0,0 +1,21 @@ +package pkg + +import ( + "net/http" + + "github.com/labstack/echo/v4" +) + +type IndexHandler struct { + url string +} + +func NewIndexHandler() *IndexHandler { + return &IndexHandler{ + url: DOCS_URL, + } +} + +func (h *IndexHandler) Get(c echo.Context) error { + return c.Redirect(http.StatusMovedPermanently, h.url) +} diff --git a/app/pkg/logger.go b/app/pkg/logger.go new file mode 100644 index 0000000..c8ff678 --- /dev/null +++ b/app/pkg/logger.go @@ -0,0 +1,28 @@ +package pkg + +import ( + "fmt" + "sync" + + "github.com/sirupsen/logrus" +) + +var ( + loggerOnce sync.Once + log *logrus.Logger +) + +func Logger() *logrus.Logger { + loggerOnce.Do(func() { + fmt.Println("Logger initialized") + log = logrus.New() + log.SetFormatter(&logrus.TextFormatter{ + DisableColors: false, + FullTimestamp: true, + TimestampFormat: "2006-01-02 15:04:05", + }) + log.SetReportCaller(false) + log.SetLevel(logrus.InfoLevel) + }) + return log +} diff --git a/app/pkg/middlewares.go b/app/pkg/middlewares.go new file mode 100644 index 0000000..bd63548 --- /dev/null +++ b/app/pkg/middlewares.go @@ -0,0 +1,22 @@ +package pkg + +import ( + "github.com/labstack/echo/v4" +) + +// HasAuthorizationHeader is a middleware to allow access to fail server +func HasAuthorizationHeader() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + if c.Request().Header.Get("Authorization") == "" { + return echo.NewHTTPError(401, "Authorization header is required") + } + + if err := next(c); err != nil { + return err + } + + return nil + } + } +} diff --git a/app/pkg/migrations/00001_schema.sql b/app/pkg/migrations/00001_schema.sql new file mode 100644 index 0000000..aadf342 --- /dev/null +++ b/app/pkg/migrations/00001_schema.sql @@ -0,0 +1,121 @@ +-- +goose Up + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `coverages` +-- + +-- SET FOREIGN_KEY_CHECKS=0; +-- DROP DATABASE IF EXISTS `coveritup`; +-- CREATE DATABASE IF NOT EXISTS `coveritup` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci */; +-- SET FOREIGN_KEY_CHECKS=1; +-- USE `coveritup`; + +-- +-- Table structure for table `orgs` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `orgs` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `repos` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `repos` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `org_id` bigint NOT NULL, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_name` (`name`), + KEY `fk_repos_org` (`org_id`), + CONSTRAINT `fk_repos_org` FOREIGN KEY (`org_id`) REFERENCES `orgs` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `types` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `types` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `metric` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `users` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; + + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `coverages` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `org_id` bigint NOT NULL, + `repo_id` bigint NOT NULL, + `user_id` bigint NOT NULL, + `type_id` bigint NOT NULL, + `pr_num` int NOT NULL, + `branch_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `commit` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `score` float NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `deleted_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk_coverages_org` (`org_id`), + KEY `fk_coverages_repo` (`repo_id`), + KEY `fk_coverages_user_id` (`user_id`), + KEY `fk_coverages_type_id` (`type_id`), + KEY `idx_branch_name` (`branch_name`), + KEY `idx_created_at` (`created_at`), + CONSTRAINT `fk_coverages_org` FOREIGN KEY (`org_id`) REFERENCES `orgs` (`id`), + CONSTRAINT `fk_coverages_repo` FOREIGN KEY (`repo_id`) REFERENCES `repos` (`id`), + CONSTRAINT `fk_coverages_type_id` FOREIGN KEY (`type_id`) REFERENCES `types` (`id`), + CONSTRAINT `fk_coverages_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + + +-- +goose Down +DROP TABLE IF EXISTS `coverages`; +DROP TABLE IF EXISTS `repos`; +DROP TABLE IF EXISTS `orgs`; +DROP TABLE IF EXISTS `users`; +DROP TABLE IF EXISTS `types`; diff --git a/app/pkg/pr.go b/app/pkg/pr.go new file mode 100644 index 0000000..22649c6 --- /dev/null +++ b/app/pkg/pr.go @@ -0,0 +1,131 @@ +package pkg + +import ( + "encoding/json" + "fmt" + "os" + + md "github.com/go-spectest/markdown" + "github.com/kevincobain2000/action-coveritup/models" +) + +const () + +type PR struct { + coverageModel *models.Coverage + typeModel *models.Type +} + +func NewPR() *PR { + return &PR{} +} + +func (p *PR) Get(req *PRRequest, types []models.Type) (string, error) { + mdText := md.NewMarkdown(os.Stdout) + mdTable := md.TableSet{ + Header: []string{"Type", req.BaseBranch, req.Branch}, + Rows: [][]string{}, + } + urls := []string{} + mdText.H4("CoverItUp Report") + mdText.PlainText("") + + for _, t := range types { + y := make([]float64, 2) + row := make([]string, 3) + row[0] = t.Name + + sb, err := p.coverageModel.GetLatestBranchScore(req.Org, req.Repo, req.BaseBranch, t.Name) + if err != nil { + y[0] = 0 + row[1] = "" + } else { + y[0] = sb.Score + row[1] = F64NumberToK(&sb.Score) + " " + t.Metric + } + + s, err := p.coverageModel.GetLatestBranchScore(req.Org, req.Repo, req.Branch, t.Name) + if err != nil { + y[1] = 0 + row[2] = "" + } else { + y[1] = s.Score + row[2] = F64NumberToK(&s.Score) + " " + t.Metric + p.UpOrDown(&sb.Score, &s.Score) + } + mdTable.Rows = append(mdTable.Rows, row) + + data := struct { + X []string `json:"x"` + Y [][]float64 `json:"y"` + Z [][]float64 `json:"z"` + N []string `json:"names"` + }{ + X: []string{req.BaseBranch, req.Branch}, + Y: [][]float64{}, + Z: [][]float64{}, + N: []string{t.Name}, + } + data.Y = append(data.Y, y) + data.Z = append(data.Z, y) + + u := fmt.Sprintf("%s://%s/bar?title=%s&metric=%s&width=%s&height=%s&output=%s&theme=%s", + req.scheme, req.host, req.Org+"/"+req.Repo, t.Metric, "385", "320", "svg", "dark") + + jsonData, err := json.Marshal(data) + if err != nil { + return "", err + } + u = u + "&data=" + string(jsonData) + urls = append(urls, u) + } + mdText.Table(mdTable) + for _, u := range urls { + mdText.PlainTextf(md.Image("chart", u)) + } + + mdText.PlainText("") + readmeLink := fmt.Sprintf("%s://%s/README.md?org=%s&repo=%s&branch=%s", + req.scheme, req.host, req.Org, req.Repo, req.Branch) + mdText.PlainTextf(md.Link("Add to Readme", readmeLink)) + + return mdText.String(), nil +} + +func (p *PR) UpOrDown(baseScore *float64, branchScore *float64) string { + if *baseScore > *branchScore { + return "+" + } + if *baseScore < *branchScore { + return "-" + } + return "" +} + +func (p *PR) TypesChangedSince(req *PRRequest) ([]models.Type, error) { + typesChanged := []models.Type{} + types, err := p.typeModel.GetTypesFor(req.Org, req.Repo) + if err != nil { + return typesChanged, err + } + for _, t := range types { + sbs, err := p.coverageModel.GetLatestBranchScoresWithPR(req.Org, req.Repo, req.Branch, t.Name, 2) + if err != nil { + typesChanged = append(typesChanged, t) + continue + } + if len(sbs) < 2 { + typesChanged = append(typesChanged, t) + continue + } + + if float64(sbs[0].PRNum) != float64(sbs[1].PRNum) { + typesChanged = append(typesChanged, t) + continue + } + if sbs[0].Score != sbs[1].Score { + typesChanged = append(typesChanged, t) + continue + } + } + return typesChanged, nil +} diff --git a/app/pkg/pr_handler.go b/app/pkg/pr_handler.go new file mode 100644 index 0000000..10654c3 --- /dev/null +++ b/app/pkg/pr_handler.go @@ -0,0 +1,59 @@ +package pkg + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/mcuadros/go-defaults" +) + +type PRHandler struct { + PR *PR +} + +func NewPRHandler() *PRHandler { + return &PRHandler{ + PR: NewPR(), + } +} + +type PRRequest struct { + Org string `json:"org" query:"org" validate:"required,ascii,excludes=/" message:"org is required"` + Repo string `json:"repo" query:"repo" validate:"required,ascii,excludes=/" message:"repo is required"` + Branch string `json:"branch" query:"branch" validate:"required,ascii,excludes=/" message:"ascii branch is required"` + BaseBranch string `json:"base_branch" query:"base_branch" validate:"required,ascii,excludes=/" message:"ascii base_branch is required"` + + host string + scheme string +} + +func (h *PRHandler) Get(c echo.Context) error { + req := new(PRRequest) + + if err := BindRequest(c, req); err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, err) + } + defaults.SetDefaults(req) + + msgs, err := ValidateRequest(req) + if err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) + } + + req.host = c.Request().Host + req.scheme = c.Scheme() + + types, err := h.PR.TypesChangedSince(req) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + if len(types) == 0 { + return c.String(http.StatusConflict, "No change since last PR") + } + prComment, err := h.PR.Get(req, types) + + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + return c.String(http.StatusCreated, prComment) +} diff --git a/app/pkg/readme.go b/app/pkg/readme.go new file mode 100644 index 0000000..c03fdbd --- /dev/null +++ b/app/pkg/readme.go @@ -0,0 +1,88 @@ +package pkg + +import ( + "fmt" + "os" + + md "github.com/go-spectest/markdown" + "github.com/kevincobain2000/action-coveritup/models" +) + +type Readme struct { + typeModel *models.Type +} + +func NewReadme() *Readme { + return &Readme{} +} + +func (r *Readme) Get(req *ReadmeRequest) (string, error) { + types, err := r.typeModel.GetTypesFor(req.Org, req.Repo) + if err != nil { + return "", err + } + mdText := md.NewMarkdown(os.Stdout) + + mdText.H1("CoverItUp Report"). + PlainText(""). + H2("Badges"). + PlainText("") + + for _, t := range types { + u := fmt.Sprintf("%s://%s/badge?org=%s&repo=%s&type=%s&branch=%s", + req.scheme, req.host, req.Org, req.Repo, t.Name, req.Branch) + mdText.PlainTextf(md.Image(t.Name, u)) + } + + mdText.PlainText(""). + H2("Charts"). + PlainText("") + mdText.H3("Branch"). + PlainText("") + if req.Branch != "" { + + mdText.H4("Single"). + PlainText("") + + for _, t := range types { + u := fmt.Sprintf("%s://%s/chart?org=%s&repo=%s&type=%s&branch=%s", + req.scheme, req.host, req.Org, req.Repo, t.Name, req.Branch) + mdText.PlainTextf(md.Image(t.Name, u)) + } + mdText.PlainText("") + } + + mdText.H4("All").PlainText("") + for _, t := range types { + u := fmt.Sprintf("%s://%s/chart?org=%s&repo=%s&type=%s&branches=all", + req.scheme, req.host, req.Org, req.Repo, t.Name) + mdText.PlainTextf(md.Image(t.Name, u)) + } + mdText.PlainText("") + + mdText.H3("User").PlainText("") + + if req.User != "" { + mdText.H3("User"). + PlainText("") + mdText.H4("Single"). + PlainText("") + + for _, t := range types { + u := fmt.Sprintf("%s://%s/chart?org=%s&repo=%s&type=%s&user=%s", + req.scheme, req.host, req.Org, req.Repo, t.Name, req.User) + mdText.PlainTextf(md.Image(t.Name, u)) + } + + mdText.PlainText("") + } + + mdText.H3("All"). + PlainText("") + for _, t := range types { + u := fmt.Sprintf("%s://%s/chart?org=%s&repo=%s&type=%s&users=all", + req.scheme, req.host, req.Org, req.Repo, t.Name) + mdText.PlainTextf(md.Image(t.Name, u)) + } + return mdText.String(), nil +} diff --git a/app/pkg/readme_handler.go b/app/pkg/readme_handler.go new file mode 100644 index 0000000..2d07d78 --- /dev/null +++ b/app/pkg/readme_handler.go @@ -0,0 +1,44 @@ +package pkg + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/mcuadros/go-defaults" +) + +type ReadmeHandler struct { + Readme *Readme +} + +func NewReadmeHandler() *ReadmeHandler { + return &ReadmeHandler{ + Readme: NewReadme(), + } +} + +type ReadmeRequest struct { + Org string `json:"org" query:"org" validate:"required,ascii,excludes=/" message:"org is required"` + Repo string `json:"repo" query:"repo" validate:"required,ascii,excludes=/" message:"repo is required"` + Branch string `json:"branch" query:"branch" validate:"ascii,excludes=/" message:"ascii branch is required"` + User string `json:"user" query:"user" validate:"ascii,excludes=/" message:"ascii user is required"` + + host string + scheme string +} + +func (h *ReadmeHandler) Get(c echo.Context) error { + req := new(ReadmeRequest) + if err := BindRequest(c, req); err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, err) + } + defaults.SetDefaults(req) + req.host = c.Request().Host + req.scheme = c.Scheme() + str, err := h.Readme.Get(req) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + return c.String(http.StatusOK, str) + +} diff --git a/app/pkg/request.go b/app/pkg/request.go new file mode 100644 index 0000000..a7be358 --- /dev/null +++ b/app/pkg/request.go @@ -0,0 +1,95 @@ +package pkg + +import ( + "net/http" + + "github.com/labstack/echo/v4" +) + +const () + +type Request struct { +} + +func NewRequest() *Request { + return &Request{} +} + +func SetHeaderResponseText(header http.Header) { + header.Set("Cache-Control", "max-age=0") + header.Set("Expires", "0") + header.Set("Content-Type", "text/plain") + // security headers + header.Set("X-Content-Type-Options", "nosniff") + header.Set("X-Frame-Options", "DENY") + header.Set("X-XSS-Protection", "1; mode=block") + // content policy + header.Set("Content-Security-Policy", "default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; connect-src 'self'; script-src 'self';") +} +func SetHeadersResponsePNG(header http.Header) { + header.Set("Cache-Control", "max-age=0") + header.Set("Expires", "0") + header.Set("Content-Type", "image/png") + // security headers + header.Set("X-Content-Type-Options", "nosniff") + header.Set("X-Frame-Options", "DENY") + header.Set("X-XSS-Protection", "1; mode=block") + // content policy + header.Set("Content-Security-Policy", "default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; connect-src 'self'; script-src 'self';") +} +func SetHeadersResponseSvg(header http.Header) { + header.Set("Cache-Control", "max-age=0") + header.Set("Expires", "0") + header.Set("Content-Type", "image/svg+xml") + // security headers + header.Set("X-Content-Type-Options", "nosniff") + header.Set("X-Frame-Options", "DENY") + header.Set("X-XSS-Protection", "1; mode=block") + // // content policy + // header.Set("Content-Security-Policy", "default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; connect-src 'self'; script-src 'self';") +} +func SetHeadersResponseJSON(header http.Header) { + header.Set("Cache-Control", "max-age=0") + header.Set("Expires", "0") + header.Set("Content-Type", "application/json") + // security headers + header.Set("X-Content-Type-Options", "nosniff") + header.Set("X-Frame-Options", "DENY") + header.Set("X-XSS-Protection", "1; mode=block") + // content policy + header.Set("Content-Security-Policy", "default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self'; connect-src 'self'; script-src 'self';") +} + +func SetHeadersResponseHTML(header http.Header) { + header.Set("Cache-Control", "max-age=86400") + header.Set("Expires", "86400") + header.Set("Content-Type", "text/html; charset=utf-8") + // security headers + header.Set("X-Content-Type-Options", "nosniff") + header.Set("X-Frame-Options", "DENY") + header.Set("X-XSS-Protection", "1; mode=block") +} + +func ResponseMedia(c echo.Context, b []byte, media string) error { + if media == "svg" { + return ResponseSVG(c, b) + } + if media == "png" { + return ResponsePNG(c, b) + } + return ResponsePNG(c, b) +} +func ResponseSVG(c echo.Context, b []byte) error { + SetHeadersResponseSvg(c.Response().Header()) + return c.Blob(http.StatusOK, "image/svg+xml", b) +} + +func ResponsePNG(c echo.Context, b []byte) error { + SetHeadersResponsePNG(c.Response().Header()) + return c.Blob(http.StatusOK, "image/png", b) +} + +func ResponseHTML(c echo.Context, b []byte) error { + SetHeadersResponseHTML(c.Response().Header()) + return c.Blob(http.StatusOK, "text/html", b) +} diff --git a/app/pkg/robots_handler.go b/app/pkg/robots_handler.go new file mode 100644 index 0000000..b7b7948 --- /dev/null +++ b/app/pkg/robots_handler.go @@ -0,0 +1,23 @@ +package pkg + +import ( + "net/http" + + "github.com/labstack/echo/v4" +) + +type RobotsHandler struct { + text string +} + +func NewRobotsHandler() *RobotsHandler { + return &RobotsHandler{ + text: ROBOTS_TXT, + } +} + +func (h *RobotsHandler) Get(c echo.Context) error { + SetHeaderResponseText(c.Response().Header()) + return c.String(http.StatusOK, h.text) + +} diff --git a/app/pkg/routes.go b/app/pkg/routes.go new file mode 100644 index 0000000..1a3af84 --- /dev/null +++ b/app/pkg/routes.go @@ -0,0 +1,70 @@ +package pkg + +import ( + "embed" + "fmt" + "net/http" + + instachart "github.com/kevincobain2000/instachart/pkg" + "github.com/labstack/echo/v4" +) + +const ( + DIST_DIR = "frontend/dist" + DOCS_URL = "https://github.com/kevincobain2000/action-coveritup" + FAVICON_FILE = "favicon.ico" + ROBOTS_FILE = "robots.txt" + ROBOTS_TXT = `User-agent: * +Allow: / +Disallow: /upload +Disallow: /chart +Disallow: /badge +Disallow: /destroy +Disallow: /pr +Disallow: /README.md` +) + +func SetupRoutes(e *echo.Echo, baseURL string, publicDir embed.FS, favicon embed.FS) { + + e.GET(baseURL+"", func(c echo.Context) error { + filename := fmt.Sprintf("%s/%s", DIST_DIR, "index.html") + content, err := publicDir.ReadFile(filename) + if err != nil { + return c.String(http.StatusNotFound, "404") + } + return ResponseHTML(c, content) + }) + + // /robots.txt + e.GET(baseURL+ROBOTS_FILE, NewRobotsHandler().Get) + + // /favicon.ico + e.GET(baseURL+FAVICON_FILE, NewFaviconHandler(&favicon).Get) + + // /upload to post new coverage for a branch + e.POST(baseURL+"upload", NewUploadHandler().Post, HasAuthorizationHeader()) + + // /destroy + e.POST(baseURL+"destroy", NewDestroyHandler().Post, HasAuthorizationHeader()) + + // /README.md to return markdown for embedings of badge and charts + e.GET(baseURL+"README.md", NewReadmeHandler().Get) + + // /badge to return badges + e.GET(baseURL+"badge", NewBadgeHandler().Get) + + // /bar + e.GET(baseURL+"bar", func(c echo.Context) error { + img, err := instachart.NewBarChartHandler("").Get(c) + if err != nil { + return err + } + return c.Blob(http.StatusOK, "", img) + }) + + // /chart to return charts + e.GET(baseURL+"chart", NewChartHandler().Get) + + // /pr to return pr comment for a branch and base branch + e.GET(baseURL+"pr", NewPRHandler().Get) +} diff --git a/app/pkg/setup_test.go b/app/pkg/setup_test.go new file mode 100644 index 0000000..a301283 --- /dev/null +++ b/app/pkg/setup_test.go @@ -0,0 +1,25 @@ +package pkg + +import ( + "embed" + "os" + + "github.com/kevincobain2000/action-coveritup/db" +) + +//go:embed migrations/*.sql +var embedMigrations embed.FS + +func BeforeEach() { + os.Setenv("DATABASE_DSN", "root:@tcp(127.0.0.1:3306)/") + os.Setenv("DATABASE_NAME", "coverituptest") + db.Migrate("create", embedMigrations) + + db.SetupDatabase() + db.Migrate("up", embedMigrations) +} +func AfterEach() { + os.Setenv("DATABASE_DSN", "root:@tcp(127.0.0.1:3306)/") + os.Setenv("DATABASE_NAME", "coverituptest") + db.Migrate("drop", embedMigrations) +} diff --git a/app/pkg/upload.go b/app/pkg/upload.go new file mode 100644 index 0000000..7ed1513 --- /dev/null +++ b/app/pkg/upload.go @@ -0,0 +1,82 @@ +package pkg + +import ( + "github.com/kevincobain2000/action-coveritup/models" +) + +type Upload struct { + coverage *models.Coverage + repo *models.Repo + org *models.Org + user *models.User + typeModel *models.Type +} + +func NewUpload() *Upload { + return &Upload{} +} + +func (c *Upload) Post(req *UploadRequest) (*models.Coverage, error) { + t, err := c.typeModel.Get(req.Type) + if err != nil { + return nil, err + } + + if t.ID == 0 { + t, err = c.typeModel.Create(req.Type, req.Metric) + if err != nil { + return nil, err + } + } + + o, err := c.org.Get(req.Org) + if err != nil { + return nil, err + } + if o.ID == 0 { + o, err = c.org.Create(req.Org) + if err != nil { + return nil, err + } + } + + r, err := c.repo.Get(o.ID, req.Repo) + if err != nil { + return nil, err + } + if r.ID == 0 { + r, err = c.repo.Create(o.ID, req.Repo) + if err != nil { + return nil, err + } + } + + u, err := c.user.Get(req.User) + if err != nil { + return nil, err + } + if u.ID == 0 { + u, err = c.user.Create(req.User) + if err != nil { + return nil, err + } + } + + err = c.coverage.SoftDeleteCoverages(o.ID, r.ID, req.Branches) + if err != nil { + return nil, err + } + nc, err := c.coverage.Create(o.ID, + r.ID, + u.ID, + t.ID, + req.Branch, + StringToInt(req.PRNum), + TakeFirst(req.Commit, 7), + SToF32(req.Score)) + if err != nil { + return nil, err + } + + return nc, nil +} diff --git a/app/pkg/upload_handler.go b/app/pkg/upload_handler.go new file mode 100644 index 0000000..d871955 --- /dev/null +++ b/app/pkg/upload_handler.go @@ -0,0 +1,56 @@ +package pkg + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/mcuadros/go-defaults" +) + +type UploadHandler struct { + upload *Upload +} + +func NewUploadHandler() *UploadHandler { + return &UploadHandler{ + upload: NewUpload(), + } +} + +type UploadRequest struct { + Org string `json:"org" query:"org" validate:"required,ascii,excludes=/,max=255" message:"org is required"` + Repo string `json:"repo" query:"repo" validate:"required,ascii,excludes=/,max=255" message:"repo is required"` + User string `json:"user" query:"user" validate:"required,ascii,excludes=/,max=255" message:"user is required"` + Type string `json:"type" query:"type" validate:"required,ascii,required,excludes=/,max=32" message:"ascii type is required"` + Metric string `json:"metric" query:"metric" validate:"ascii,max=3" message:"ascii metric is required"` + Branch string `json:"branch" query:"branch" validate:"required,ascii,max=255" message:"ascii branch is required"` + Commit string `json:"commit" query:"commit" validate:"ascii,excludes=/,max=255" message:"ascii commit is required"` + Score string `json:"score" query:"score" validate:"ascii,excludes=/,max=12" message:"ascii score is required"` + Branches string `json:"branches" query:"branches" validate:"ascii" message:"ascii branches is required"` + PRNum string `json:"pr_num" query:"pr_num" validate:"ascii,excludes=/,max=4" message:"ascii pr_num is required"` +} + +func (h *UploadHandler) Post(c echo.Context) error { + + req := new(UploadRequest) + if err := BindRequest(c, req); err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, err) + } + defaults.SetDefaults(req) + msgs, err := ValidateRequest(req) + if err != nil { + return echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) + } + + // if err := h.github.VerifyGithubToken(c.Request().Header.Get("Authorization"), req.Org, req.Repo, req.Type); err != nil { + // return echo.NewHTTPError(http.StatusUnauthorized, err.Error()) + // } + + res, err := h.upload.Post(req) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + + SetHeadersResponseJSON(c.Response().Header()) + return c.JSON(http.StatusOK, res) +} diff --git a/app/pkg/utils.go b/app/pkg/utils.go new file mode 100644 index 0000000..17ea500 --- /dev/null +++ b/app/pkg/utils.go @@ -0,0 +1,54 @@ +package pkg + +import ( + "strconv" +) + +func F64ToS(f *float64) string { + return strconv.FormatFloat(*f, 'f', 0, 64) +} + +func F64NumberToK(num *float64) string { + if num == nil { + return "0" + } + + if *num < 1000 { + return strconv.FormatFloat(*num, 'f', -1, 64) + } + + if *num < 1000000 { + return strconv.FormatFloat(*num/1000, 'f', 1, 64) + "k" + } + + return strconv.FormatFloat(*num/1000000, 'f', 1, 64) + "m" +} + +// float64 to one decimal place +func F64To1DecimalF64(num *float64) float64 { + if num == nil { + return 0 + } + return float64(int(*num*10)) / 10 +} + +func StringToInt(s string) int64 { + i, _ := strconv.Atoi(s) + return int64(i) +} + +func SToF32(s string) float32 { + i, _ := strconv.ParseFloat(s, 32) + return float32(i) +} +func SToF64(s string) float64 { + i, _ := strconv.ParseFloat(s, 64) + return float64(i) +} + +func TakeFirst(s string, n int) string { + if len(s) < n { + return s + } + return s[:n] +} diff --git a/app/pkg/validator.go b/app/pkg/validator.go new file mode 100644 index 0000000..663f064 --- /dev/null +++ b/app/pkg/validator.go @@ -0,0 +1,38 @@ +package pkg + +import ( + "net/http" + "reflect" + + "github.com/go-playground/validator" + "github.com/labstack/echo/v4" +) + +func ValidateRequest[T any](request T) (map[string]string, error) { + errs := validator.New().Struct(request) + msgs := make(map[string]string) + if errs != nil { + for _, err := range errs.(validator.ValidationErrors) { + field, _ := reflect.TypeOf(request).Elem().FieldByName(err.Field()) + queryTag := getStructTag(field, "query") + message := getStructTag(field, "message") + msgs[queryTag] = message + } + return msgs, errs + } + return nil, nil +} + +// getStructTag returns the value of the tag with the given name +func getStructTag(f reflect.StructField, tagName string) string { + return string(f.Tag.Get(tagName)) +} + +func BindRequest[T any](c echo.Context, request T) error { + err := c.Bind(request) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, err.Error()) + } + + return nil +}