diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 828957d3e..110fd177f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,6 +68,8 @@ jobs: run: make check-req - name: Generate codes run: make generate + - name: Build + run: make build - name: Lint run: make lint - name: Generate dependencies licenses diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index 94db8db5e..c823da3fb 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -85,7 +85,8 @@ jobs: if: github.ref != 'refs/heads/main' # Only build docker image on PR(Push image when pushed to main branch) run: | make docker.build || make docker.build - make -C test/docker build | make -C test/docker build + BINARYTYPE=slim make -C banyand docker || BINARYTYPE=slim make -C banyand docker + make -C test/docker build || make -C test/docker build docker image ls - name: Log in to the Container registry uses: docker/login-action@v1.10.0 @@ -97,5 +98,6 @@ jobs: - name: Push docker image if: github.ref == 'refs/heads/main' run: | - PLATFROMS=linux/amd64,linux/arm64,windows/amd64 make docker.push || make docker.push - make -C test/docker push | make -C test/docker push \ No newline at end of file + PLATFORMS=linux/amd64,linux/arm64,windows/amd64 make docker.push || PLATFROMS=linux/amd64,linux/arm64,windows/amd64 make docker.push + PLATFORMS=linux/amd64,linux/arm64,windows/amd64 BINARYTYPE=slim make -C banyand docker.push || PLATFORMS=linux/amd64,linux/arm64,windows/amd64 BINARYTYPE=slim make -C banyand docker.push + make -C test/docker push || make -C test/docker push \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2de36378a..1ce4f12fe 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,7 +25,7 @@ on: timeout-minutes: required: false type: number - default: 30 + default: 60 jobs: test: @@ -72,6 +72,8 @@ jobs: run: GOPROXY=https://proxy.golang.org go mod download - name: Generate mocks run: make generate + - name: Build + run: make build - name: Test integration and banyand run: TEST_CI_OPTS="--cover --covermode atomic --coverprofile=coverage.out ${{ inputs.options }}" make test-ci - name: Upload coverage to Codecov diff --git a/.golangci.yml b/.golangci.yml index ddd2d8bdf..5c6e14338 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -29,7 +29,6 @@ linters: - exhaustive # TODO:// enable this lint # - exhaustruct - - exportloopref - gci - goconst - gocritic @@ -88,7 +87,7 @@ linters-settings: sections: - standard - default - - prefix(github.com/apache/skywalking-banyandb/) + - prefix(github.com/apache/skywalking-banyandb/) gocritic: enabled-checks: - appendCombine @@ -116,6 +115,9 @@ linters-settings: # toplevel - for top level comments; # all - for all comments. scope: toplevel + gosec: + excludes: + - G115 # integer overflow conversion (TODO: verify these) staticcheck: checks: ["all", "-ST1000", "-ST1016", "-ST1020", "-ST1021", "-ST1022"] exhaustive: @@ -129,7 +131,7 @@ linters-settings: - 'cobra\.Command$' run: - go: "1.22" + go: "1.23" issues: exclude-rules: - path: ".*\\.pb\\.go" diff --git a/CHANGES.md b/CHANGES.md index 4cafc211c..bc5f17de3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -26,6 +26,9 @@ Release Notes. - Add liaison, remote queue, storage(rotation), time-series tables, metadata cache and scheduler metrics. - Add HTTP health check endpoint for the data node. - Add slow query log for the distributed query and local query. +- Support applying the index rule to the tag belonging to the entity. +- Add search analyzer "url" which breaks test into tokens at any non-letter and non-digit character. +- Introduce "match_option" to the "match" query. ### Bugs @@ -42,6 +45,7 @@ Release Notes. - Fix several "sync.Pool" leak issues by adding a tracker to the pool. - Fix panic when removing a expired segment. - Fix panic when reading a disorder block of measure. This block's versions are not sorted in descending order. +- Fix the bug that the etcd client doesn't reconnect when facing the context timeout in the startup phase. ### Documentation @@ -60,8 +64,10 @@ Release Notes. - Separate the monolithic Docker image into two images: banyand and bydbctl. - Update CI to publish linux/amd64 and linux/arm64 Docker images. - Make the build system compiles the binary based on the platform which is running on. -- Push "skywalking-banyandb-test" image for e2e and stress test. This image contains bydbctl to do a health check. -- Set etcd-client log level to "error" and etcd-server log level to "error". +- Push "skywalking-banyandb:-testing" image for e2e and stress test. This image contains bydbctl to do a health check. +- Set etcd-client log level to "error" and etcd-server log level to "warn". +- Push "skywalking-banyandb:-slim" image for the production environment. This image doesn't contain bydbctl and Web UI. +- Bump go to 1.23. ## 0.6.1 @@ -121,6 +127,7 @@ Release Notes. - Bump all dependencies of Go and Node. - Combine banyand and bydbctl Dockerfile. - Update readme for bydbctl +- Introduce the go vulnerability check to "pre-push" task. ## 0.5.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d2a0c5dfd..4a30330fb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,7 @@ Once we've discussed your changes and you've got your code ready, make sure that Users who want to build a binary from sources have to set up: -* Go 1.22 +* Go 1.23 * Node 20.12 * Git >= 2.30 * Linux, macOS or Windows + WSL2 diff --git a/Makefile b/Makefile index c8389e229..0d6a17477 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,9 @@ clean: default ## Clean artifacts in all projects rm -f .env rm -f *.out +clean-build: TARGET=clean-build +clean-build: default ## Clean build artifacts in all projects + generate: TARGET=generate generate: PROJECTS:=api $(PROJECTS) pkg generate: default ## Generate API codes @@ -100,6 +103,11 @@ check-req: ## Check the requirements @$(MAKE) -C scripts/ci/check test @$(MAKE) -C ui check-version +include scripts/build/vuln.mk + +vuln-check: $(GOVULNCHECK) + $(GOVULNCHECK) -show color,verbose ./... + check: ## Check that the status is consistent with CI $(MAKE) license-check $(MAKE) format @@ -120,6 +128,7 @@ pre-push: ## Check source files before pushing to the remote repo $(MAKE) lint $(MAKE) license-dep $(MAKE) check + $(MAKE) vuln-check ##@ License targets @@ -177,7 +186,7 @@ RELEASE_SCRIPTS := $(mk_dir)/scripts/release.sh release-binary: release-source ## Package binary archive ${RELEASE_SCRIPTS} -b -release-source: clean ## Package source archive +release-source: ## Package source archive ${RELEASE_SCRIPTS} -s release-sign: ## Sign artifacts @@ -187,7 +196,11 @@ release-sign: ## Sign artifacts release-assembly: release-binary release-sign ## Generate release package +PUSH_RELEASE_SCRIPTS := $(mk_dir)/scripts/push-release.sh +release-push-candidate: ## Push release candidate + ${PUSH_RELEASE_SCRIPTS} + .PHONY: all $(PROJECTS) clean build default nuke .PHONY: lint check tidy format pre-push .PHONY: test test-race test-coverage test-ci diff --git a/api/proto/banyandb/database/v1/schema.proto b/api/proto/banyandb/database/v1/schema.proto index b390acf53..db7f2d503 100644 --- a/api/proto/banyandb/database/v1/schema.proto +++ b/api/proto/banyandb/database/v1/schema.proto @@ -168,19 +168,16 @@ message IndexRule { Type type = 3 [(validate.rules).enum.defined_only = true]; // updated_at indicates when the IndexRule is updated google.protobuf.Timestamp updated_at = 4; - enum Analyzer { - ANALYZER_UNSPECIFIED = 0; - // Keyword analyzer is a “noop” analyzer which returns the entire input string as a single token. - ANALYZER_KEYWORD = 1; - // Standard analyzer provides grammar based tokenization - ANALYZER_STANDARD = 2; - // Simple analyzer breaks text into tokens at any non-letter character, - // such as numbers, spaces, hyphens and apostrophes, discards non-letter characters, - // and changes uppercase to lowercase. - ANALYZER_SIMPLE = 3; - } + // analyzer analyzes tag value to support the full-text searching for TYPE_INVERTED indices. - Analyzer analyzer = 5; + // available analyzers are: + // - "standard" provides grammar based tokenization + // - "simple" breaks text into tokens at any non-letter character, + // such as numbers, spaces, hyphens and apostrophes, discards non-letter characters, + // and changes uppercase to lowercase. + // - "keyword" is a “noop” analyzer which returns the entire input string as a single token. + // - "url" breaks test into tokens at any non-letter and non-digit character. + string analyzer = 5; // no_sort indicates whether the index is not for sorting. bool no_sort = 6; } diff --git a/api/proto/banyandb/model/v1/query.proto b/api/proto/banyandb/model/v1/query.proto index 2b650ec33..16a3219ae 100644 --- a/api/proto/banyandb/model/v1/query.proto +++ b/api/proto/banyandb/model/v1/query.proto @@ -67,6 +67,16 @@ message Condition { string name = 1; BinaryOp op = 2; TagValue value = 3; + message MatchOption { + string analyzer = 1; + enum Operator { + OPERATOR_UNSPECIFIED = 0; + OPERATOR_AND = 1; + OPERATOR_OR = 2; + } + Operator operator = 2; + } + MatchOption match_option = 4; } // tag_families are indexed. diff --git a/api/proto/banyandb/property/v1/rpc.proto b/api/proto/banyandb/property/v1/rpc.proto index a7955fd7e..06a5d35a7 100644 --- a/api/proto/banyandb/property/v1/rpc.proto +++ b/api/proto/banyandb/property/v1/rpc.proto @@ -103,7 +103,7 @@ service PropertyService { rpc List(ListRequest) returns (ListResponse) { option (google.api.http) = { get: "/v1/property/lists/{container.group}/{container.name}/{ids}/{tags}" - additional_bindings {get: "/v1/property/lists/{container.group}"} + additional_bindings: {get: "/v1/property/lists/{container.group}"} }; } rpc KeepAlive(KeepAliveRequest) returns (KeepAliveResponse) { diff --git a/api/proto/buf.yaml b/api/proto/buf.yaml index ab813a9a1..8e07822b3 100644 --- a/api/proto/buf.yaml +++ b/api/proto/buf.yaml @@ -24,7 +24,7 @@ deps: - buf.build/envoyproxy/protoc-gen-validate lint: use: - - DEFAULT + - STANDARD breaking: use: - - FILE \ No newline at end of file + - FILE diff --git a/banyand/Dockerfile b/banyand/Dockerfile index 5ba61d7c5..42db44e58 100644 --- a/banyand/Dockerfile +++ b/banyand/Dockerfile @@ -21,8 +21,9 @@ RUN apk add --no-cache ca-certificates && update-ca-certificates FROM busybox:stable-glibc AS build-linux ARG TARGETARCH +ARG BINARYTYPE -COPY build/bin/linux/${TARGETARCH}/banyand-server-static /banyand +COPY build/bin/linux/${TARGETARCH}/banyand-server-${BINARYTYPE} /banyand COPY --from=certs /etc/ssl/certs /etc/ssl/certs FROM mcr.microsoft.com/windows/servercore:ltsc2022 AS build-windows diff --git a/banyand/Makefile b/banyand/Makefile index 0ccedd6dd..f39cf0ee8 100644 --- a/banyand/Makefile +++ b/banyand/Makefile @@ -17,8 +17,7 @@ # NAME := banyand -SERVER := $(NAME)-server -BINARIES := $(SERVER) +BINARIES := $(NAME)-server IMG_NAME := skywalking-banyandb @@ -34,7 +33,4 @@ include ../scripts/build/help.mk prepare-build: generate -docker.dev: - @echo "Building $(IMG) with platform $(PLATFORMS)" - @pwd - time docker buildx build $(DOCKER_BUILD_ARGS) --platform $(PLATFORMS) --load --no-cache -t $(IMG) -f Dockerfile.dev --provenance=false . \ No newline at end of file +release: $(STATIC_BINARIES) $(SLIM_BINARIES) \ No newline at end of file diff --git a/banyand/liaison/http/rpath_empty.go b/banyand/liaison/http/rpath_empty.go new file mode 100644 index 000000000..d126093de --- /dev/null +++ b/banyand/liaison/http/rpath_empty.go @@ -0,0 +1,25 @@ +//go:build slim +// +build slim + +// Licensed to Apache Software Foundation (ASF) under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Apache Software Foundation (ASF) licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package http + +func (p *server) setRootPath() error { + return nil +} diff --git a/banyand/liaison/http/rpath_ui.go b/banyand/liaison/http/rpath_ui.go new file mode 100644 index 000000000..460239a29 --- /dev/null +++ b/banyand/liaison/http/rpath_ui.go @@ -0,0 +1,40 @@ +//go:build !slim +// +build !slim + +// Licensed to Apache Software Foundation (ASF) under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Apache Software Foundation (ASF) licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package http + +import ( + "io/fs" + "net/http" + + "github.com/apache/skywalking-banyandb/ui" +) + +func (p *server) setRootPath() error { + fSys, err := fs.Sub(ui.DistContent, "dist") + if err != nil { + return err + } + httpFS := http.FS(fSys) + fileServer := http.FileServer(http.FS(fSys)) + serveIndex := serveFileContents("index.html", httpFS) + p.mux.Mount("/", intercept404(fileServer, serveIndex)) + return nil +} diff --git a/banyand/liaison/http/server.go b/banyand/liaison/http/server.go index 5fa460b71..576b8289a 100644 --- a/banyand/liaison/http/server.go +++ b/banyand/liaison/http/server.go @@ -21,7 +21,6 @@ package http import ( "context" "fmt" - "io/fs" "net" "net/http" "strconv" @@ -43,7 +42,6 @@ import ( "github.com/apache/skywalking-banyandb/pkg/healthcheck" "github.com/apache/skywalking-banyandb/pkg/logger" "github.com/apache/skywalking-banyandb/pkg/run" - "github.com/apache/skywalking-banyandb/ui" ) var ( @@ -137,14 +135,9 @@ func (p *server) PreRun(_ context.Context) error { p.l = logger.GetLogger(p.Name()) p.mux = chi.NewRouter() - fSys, err := fs.Sub(ui.DistContent, "dist") - if err != nil { + if err := p.setRootPath(); err != nil { return err } - httpFS := http.FS(fSys) - fileServer := http.FileServer(http.FS(fSys)) - serveIndex := serveFileContents("index.html", httpFS) - p.mux.Mount("/", intercept404(fileServer, serveIndex)) p.srv = &http.Server{ Addr: p.listenAddr, Handler: p.mux, diff --git a/banyand/measure/block.go b/banyand/measure/block.go index b95329a18..d6808bd3b 100644 --- a/banyand/measure/block.go +++ b/banyand/measure/block.go @@ -258,7 +258,7 @@ func (b *block) unmarshalTagFamilyFromSeqReaders(decoder *encoding.BytesBlockDec func (b *block) uncompressedSizeBytes() uint64 { dataPointsCount := uint64(b.Len()) - n := dataPointsCount * 8 + n := dataPointsCount * (8 + 8) // 8 bytes for timestamp and 8 bytes for version tff := b.tagFamilies for i := range tff { diff --git a/banyand/measure/block_reader_test.go b/banyand/measure/block_reader_test.go index cd576b78d..0cd0cf9d5 100644 --- a/banyand/measure/block_reader_test.go +++ b/banyand/measure/block_reader_test.go @@ -45,40 +45,40 @@ func Test_blockReader_nextBlock(t *testing.T) { name: "Test with single part", dpsList: []*dataPoints{dpsTS1}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, }, }, { name: "Test with multiple parts with different ts", dpsList: []*dataPoints{dpsTS1, dpsTS2}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, }, }, { name: "Test with a single part with same ts", dpsList: []*dataPoints{duplicatedDps}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 32}, }, }, { name: "Test with multiple parts with same ts", dpsList: []*dataPoints{dpsTS1, dpsTS1}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, }, }, } diff --git a/banyand/measure/merger_policy.go b/banyand/measure/merger_policy.go index 750122ef2..d9d07678c 100644 --- a/banyand/measure/merger_policy.go +++ b/banyand/measure/merger_policy.go @@ -38,7 +38,7 @@ func newDefaultMergePolicy() *mergePolicy { } func newDefaultMergePolicyForTesting() *mergePolicy { - return newMergePolicy(4, 1.7, run.Bytes(math.MaxInt64)) + return newMergePolicy(3, 1, run.Bytes(math.MaxInt64)) } // NewMergePolicy creates a MergePolicy with given parameters. diff --git a/banyand/measure/merger_test.go b/banyand/measure/merger_test.go index b3983407d..b8a8ff50c 100644 --- a/banyand/measure/merger_test.go +++ b/banyand/measure/merger_test.go @@ -260,43 +260,43 @@ func Test_mergeParts(t *testing.T) { name: "Test with single part", dpsList: []*dataPoints{dpsTS1}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, }, }, { name: "Test with multiple parts with different ts", dpsList: []*dataPoints{dpsTS1, dpsTS2, dpsTS2}, want: []blockMetadata{ - {seriesID: 1, count: 2, uncompressedSizeBytes: 3352}, - {seriesID: 2, count: 2, uncompressedSizeBytes: 110}, - {seriesID: 3, count: 2, uncompressedSizeBytes: 48}, + {seriesID: 1, count: 2, uncompressedSizeBytes: 3368}, + {seriesID: 2, count: 2, uncompressedSizeBytes: 126}, + {seriesID: 3, count: 2, uncompressedSizeBytes: 64}, }, }, { name: "Test with multiple parts with same ts", dpsList: []*dataPoints{dpsTS11, dpsTS1}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, }, }, { name: "Test with multiple parts with a large quantity of different ts", dpsList: []*dataPoints{generateHugeDps(1, 5000, 1), generateHugeDps(5001, 10000, 2)}, want: []blockMetadata{ - {seriesID: 1, count: 1265, uncompressedSizeBytes: 2120140}, - {seriesID: 1, count: 1265, uncompressedSizeBytes: 2120140}, - {seriesID: 1, count: 1265, uncompressedSizeBytes: 2120140}, - {seriesID: 1, count: 2470, uncompressedSizeBytes: 4139720}, - {seriesID: 1, count: 2470, uncompressedSizeBytes: 4139720}, - {seriesID: 1, count: 2470, uncompressedSizeBytes: 4139720}, - {seriesID: 1, count: 2410, uncompressedSizeBytes: 4039160}, - {seriesID: 1, count: 1205, uncompressedSizeBytes: 2019580}, - {seriesID: 2, count: 2, uncompressedSizeBytes: 110}, - {seriesID: 3, count: 2, uncompressedSizeBytes: 48}, + {seriesID: 1, count: 1265, uncompressedSizeBytes: 2130260}, + {seriesID: 1, count: 1265, uncompressedSizeBytes: 2130260}, + {seriesID: 1, count: 1265, uncompressedSizeBytes: 2130260}, + {seriesID: 1, count: 2470, uncompressedSizeBytes: 4159480}, + {seriesID: 1, count: 2470, uncompressedSizeBytes: 4159480}, + {seriesID: 1, count: 2470, uncompressedSizeBytes: 4159480}, + {seriesID: 1, count: 2410, uncompressedSizeBytes: 4058440}, + {seriesID: 1, count: 1205, uncompressedSizeBytes: 2029220}, + {seriesID: 2, count: 2, uncompressedSizeBytes: 126}, + {seriesID: 3, count: 2, uncompressedSizeBytes: 64}, }, }, } diff --git a/banyand/measure/part.go b/banyand/measure/part.go index 36a72eb84..f4b6b812e 100644 --- a/banyand/measure/part.go +++ b/banyand/measure/part.go @@ -163,16 +163,14 @@ func (mp *memPart) mustInitFromDataPoints(dps *dataPoints) { continue } tsPrev = dps.timestamps[i] - } else { - tsPrev = 0 } if uncompressedBlockSizeBytes >= maxUncompressedBlockSize || (i-indexPrev) > maxBlockLength || sid != sidPrev { bsw.MustWriteDataPoints(sidPrev, dps.timestamps[indexPrev:i], dps.versions[indexPrev:i], dps.tagFamilies[indexPrev:i], dps.fields[indexPrev:i]) sidPrev = sid - tsPrev = 0 indexPrev = i + tsPrev = dps.timestamps[indexPrev] uncompressedBlockSizeBytes = 0 } uncompressedBlockSizeBytes += uncompressedDataPointSizeBytes(i, dps) @@ -271,6 +269,13 @@ func (pw *partWrapper) ID() uint64 { return pw.p.partMetadata.ID } +func (pw *partWrapper) String() string { + if pw.mp != nil { + return fmt.Sprintf("mem part %v", pw.mp.partMetadata) + } + return fmt.Sprintf("part %v", pw.p.partMetadata) +} + func mustOpenFilePart(id uint64, root string, fileSystem fs.FileSystem) *part { var p part partPath := partPath(root, id) diff --git a/banyand/measure/tstable_test.go b/banyand/measure/tstable_test.go index eff1cc283..8b011bd03 100644 --- a/banyand/measure/tstable_test.go +++ b/banyand/measure/tstable_test.go @@ -30,12 +30,10 @@ import ( "github.com/apache/skywalking-banyandb/api/common" "github.com/apache/skywalking-banyandb/pkg/convert" "github.com/apache/skywalking-banyandb/pkg/fs" - "github.com/apache/skywalking-banyandb/pkg/logger" pbv1 "github.com/apache/skywalking-banyandb/pkg/pb/v1" "github.com/apache/skywalking-banyandb/pkg/query/model" "github.com/apache/skywalking-banyandb/pkg/run" "github.com/apache/skywalking-banyandb/pkg/test" - "github.com/apache/skywalking-banyandb/pkg/timestamp" "github.com/apache/skywalking-banyandb/pkg/watcher" ) @@ -194,9 +192,9 @@ func Test_tstIter(t *testing.T) { minTimestamp: 1, maxTimestamp: 1, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, }, }, { @@ -206,22 +204,24 @@ func Test_tstIter(t *testing.T) { minTimestamp: 1, maxTimestamp: 2, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, }, }, { name: "Test with a single part with same ts", - dpsList: []*dataPoints{duplicatedDps}, - sids: []common.SeriesID{1}, + dpsList: []*dataPoints{duplicatedDps1}, + sids: []common.SeriesID{1, 2, 3}, minTimestamp: 1, maxTimestamp: 1, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 16}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 16}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, }, }, { @@ -231,12 +231,12 @@ func Test_tstIter(t *testing.T) { minTimestamp: 1, maxTimestamp: 2, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 1684}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 32}, }, }, } @@ -263,141 +263,6 @@ func Test_tstIter(t *testing.T) { }) } }) - - t.Run("file snapshot", func(t *testing.T) { - tests := []testCtx{ - { - name: "Test with no data points", - dpsList: []*dataPoints{}, - sids: []common.SeriesID{1, 2, 3}, - minTimestamp: 1, - maxTimestamp: 1, - }, - { - name: "Test with single part", - dpsList: []*dataPoints{dpsTS1}, - sids: []common.SeriesID{1, 2, 3}, - minTimestamp: 1, - maxTimestamp: 1, - want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, - }, - }, - { - name: "Test with multiple parts with different ts, the block will be merged", - dpsList: []*dataPoints{dpsTS1, dpsTS2}, - sids: []common.SeriesID{1, 2, 3}, - minTimestamp: 1, - maxTimestamp: 2, - want: []blockMetadata{ - {seriesID: 1, count: 2, uncompressedSizeBytes: 3352}, - {seriesID: 2, count: 2, uncompressedSizeBytes: 110}, - {seriesID: 3, count: 2, uncompressedSizeBytes: 48}, - }, - }, - { - name: "Test with multiple parts with same ts, duplicated blocks will be merged", - dpsList: []*dataPoints{dpsTS1, dpsTS1}, - sids: []common.SeriesID{1, 2, 3}, - minTimestamp: 1, - maxTimestamp: 2, - want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 1676}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 24}, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Run("merging on the fly", func(t *testing.T) { - tmpPath, defFn := test.Space(require.New(t)) - fileSystem := fs.NewLocalFileSystem() - defer defFn() - - tst, err := newTSTable(fileSystem, tmpPath, common.Position{}, - logger.GetLogger("test"), timestamp.TimeRange{}, option{flushTimeout: 0, mergePolicy: newDefaultMergePolicyForTesting()}, nil) - require.NoError(t, err) - for i, dps := range tt.dpsList { - tst.mustAddDataPoints(dps) - for { - snp := tst.currentSnapshot() - if snp == nil { - t.Logf("waiting for snapshot %d to be introduced", i) - time.Sleep(100 * time.Millisecond) - continue - } - if snp.creator != snapshotCreatorMemPart { - snp.decRef() - break - } - t.Logf("waiting for snapshot %d to be flushed or merged: current creator:%d, parts: %+v", - i, snp.creator, snp.parts) - snp.decRef() - time.Sleep(100 * time.Millisecond) - } - } - // wait until some parts are merged - if len(tt.dpsList) > 0 { - for { - snp := tst.currentSnapshot() - if snp == nil { - time.Sleep(100 * time.Millisecond) - continue - } - if len(snp.parts) == 1 { - snp.decRef() - break - } - t.Logf("waiting for snapshot to be merged: current creator:%d, parts: %+v", snp.creator, snp.parts) - snp.decRef() - time.Sleep(100 * time.Millisecond) - } - } - verify(t, tt, tst) - }) - - t.Run("merging on close", func(t *testing.T) { - t.Skip("the test is flaky due to unpredictable merge loop schedule.") - tmpPath, defFn := test.Space(require.New(t)) - fileSystem := fs.NewLocalFileSystem() - defer defFn() - - tst, err := newTSTable(fileSystem, tmpPath, common.Position{}, - logger.GetLogger("test"), timestamp.TimeRange{}, option{flushTimeout: defaultFlushTimeout, mergePolicy: newDefaultMergePolicyForTesting()}, &metrics{}) - require.NoError(t, err) - for _, dps := range tt.dpsList { - tst.mustAddDataPoints(dps) - time.Sleep(100 * time.Millisecond) - } - // wait until the introducer is done - if len(tt.dpsList) > 0 { - for { - snp := tst.currentSnapshot() - if snp == nil { - time.Sleep(100 * time.Millisecond) - continue - } - if len(snp.parts) == len(tt.dpsList) { - snp.decRef() - tst.Close() - break - } - snp.decRef() - time.Sleep(100 * time.Millisecond) - } - } - // reopen the table - tst, err = newTSTable(fileSystem, tmpPath, common.Position{}, - logger.GetLogger("test"), timestamp.TimeRange{}, option{flushTimeout: defaultFlushTimeout, mergePolicy: newDefaultMergePolicyForTesting()}, nil) - require.NoError(t, err) - verify(t, tt, tst) - }) - }) - } - }) } var tagProjections = map[int][]model.TagProjection{ @@ -630,6 +495,34 @@ var duplicatedDps = &dataPoints{ }, } +var duplicatedDps1 = &dataPoints{ + seriesIDs: []common.SeriesID{2, 2, 2, 1, 1, 1, 3, 3, 3}, + timestamps: []int64{1, 1, 1, 1, 1, 1, 1, 1, 1}, + versions: []int64{1, 2, 3, 3, 2, 1, 2, 1, 3}, + tagFamilies: [][]nameValues{ + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + }, + fields: []nameValues{ + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + }, +} + func generateHugeDps(startTimestamp, endTimestamp, timestamp int64) *dataPoints { hugeDps := &dataPoints{ seriesIDs: []common.SeriesID{}, diff --git a/banyand/metadata/client.go b/banyand/metadata/client.go index 61ba8164f..94a7f1bd8 100644 --- a/banyand/metadata/client.go +++ b/banyand/metadata/client.go @@ -19,6 +19,9 @@ package metadata import ( "context" + "os" + "os/signal" + "syscall" "time" "github.com/pkg/errors" @@ -68,6 +71,7 @@ type clientService struct { etcdTLSCertFile string etcdTLSKeyFile string endpoints []string + registryTimeout time.Duration forceRegisterNode bool } @@ -84,6 +88,7 @@ func (s *clientService) FlagSet() *run.FlagSet { fs.StringVar(&s.etcdTLSCAFile, flagEtcdTLSCAFile, "", "Trusted certificate authority") fs.StringVar(&s.etcdTLSCertFile, flagEtcdTLSCertFile, "", "Etcd client certificate") fs.StringVar(&s.etcdTLSKeyFile, flagEtcdTLSKeyFile, "", "Private key for the etcd client certificate.") + fs.DurationVar(&s.registryTimeout, "node-registry-timeout", 2*time.Minute, "The timeout for the node registry") return fs } @@ -95,17 +100,50 @@ func (s *clientService) Validate() error { } func (s *clientService) PreRun(ctx context.Context) error { - var err error - s.schemaRegistry, err = schema.NewEtcdSchemaRegistry( - schema.Namespace(s.namespace), - schema.ConfigureServerEndpoints(s.endpoints), - schema.ConfigureEtcdUser(s.etcdUsername, s.etcdPassword), - schema.ConfigureEtcdTLSCAFile(s.etcdTLSCAFile), - schema.ConfigureEtcdTLSCertAndKey(s.etcdTLSCertFile, s.etcdTLSKeyFile), - ) - if err != nil { + stopCh := make(chan struct{}) + sn := make(chan os.Signal, 1) + l := logger.GetLogger(s.Name()) + signal.Notify(sn, + syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) + go func() { + select { + case si := <-sn: + logger.GetLogger(s.Name()).Info().Msgf("signal received: %s", si) + close(stopCh) + case <-s.closer.CloseNotify(): + close(stopCh) + } + }() + + for { + var err error + s.schemaRegistry, err = schema.NewEtcdSchemaRegistry( + schema.Namespace(s.namespace), + schema.ConfigureServerEndpoints(s.endpoints), + schema.ConfigureEtcdUser(s.etcdUsername, s.etcdPassword), + schema.ConfigureEtcdTLSCAFile(s.etcdTLSCAFile), + schema.ConfigureEtcdTLSCertAndKey(s.etcdTLSCertFile, s.etcdTLSKeyFile), + ) + if errors.Is(err, context.DeadlineExceeded) { + select { + case <-stopCh: + return errors.New("pre-run interrupted") + case <-time.After(s.registryTimeout): + return errors.New("pre-run timeout") + case <-s.closer.CloseNotify(): + return errors.New("pre-run interrupted") + default: + l.Warn().Strs("etcd-endpoints", s.endpoints).Msg("the schema registry init timeout, retrying...") + time.Sleep(time.Second) + continue + } + } + if err == nil { + break + } return err } + val := ctx.Value(common.ContextNodeKey) if val == nil { return errors.New("node id is empty") @@ -116,7 +154,6 @@ func (s *clientService) PreRun(ctx context.Context) error { return errors.New("node roles is empty") } nodeRoles := val.([]databasev1.Role) - l := logger.GetLogger(s.Name()) nodeInfo := &databasev1.Node{ Metadata: &commonv1.Metadata{ Name: node.NodeID, @@ -126,15 +163,26 @@ func (s *clientService) PreRun(ctx context.Context) error { Roles: nodeRoles, CreatedAt: timestamppb.Now(), } + var cancel context.CancelFunc for { - ctxRegister, cancel := context.WithTimeout(ctx, time.Second*10) - err = s.schemaRegistry.RegisterNode(ctxRegister, nodeInfo, s.forceRegisterNode) + ctx, cancel = context.WithTimeout(ctx, time.Second*10) + err := s.schemaRegistry.RegisterNode(ctx, nodeInfo, s.forceRegisterNode) cancel() if errors.Is(err, schema.ErrGRPCAlreadyExists) { return errors.Wrapf(err, "node[%s] already exists in etcd", node.NodeID) } else if errors.Is(err, context.DeadlineExceeded) { - l.Warn().Strs("etcd-endpoints", s.endpoints).Msg("register node timeout, retrying...") - continue + select { + case <-stopCh: + return errors.New("register node interrupted") + case <-time.After(s.registryTimeout): + return errors.New("register node timeout") + case <-s.closer.CloseNotify(): + return errors.New("register node interrupted") + default: + l.Warn().Strs("etcd-endpoints", s.endpoints).Msg("register node timeout, retrying...") + time.Sleep(time.Second) + continue + } } if err == nil { l.Info().Stringer("info", nodeInfo).Msg("register node successfully") diff --git a/banyand/metadata/schema/property.go b/banyand/metadata/schema/property.go index fae0e27c3..8c87ef029 100644 --- a/banyand/metadata/schema/property.go +++ b/banyand/metadata/schema/property.go @@ -19,6 +19,7 @@ package schema import ( "context" + "math" "path" "time" @@ -180,11 +181,27 @@ func (e *etcdSchemaRegistry) replaceProperty(ctx context.Context, key string, pr if err != nil { return false, 0, 0, err } - return true, uint32(len(property.Tags)), leaseID, nil + var tagCount uint32 + if tagCount, err = tagLen(property); err != nil { + return false, 0, 0, err + } + return true, tagCount, leaseID, nil +} + +func tagLen(property *propertyv1.Property) (uint32, error) { + tagsCount := len(property.Tags) + if tagsCount < 0 || uint64(tagsCount) > math.MaxUint32 { + return 0, errors.New("integer overflow: tags count exceeds uint32 range") + } + tagsNum := uint32(tagsCount) + return tagsNum, nil } func (e *etcdSchemaRegistry) mergeProperty(ctx context.Context, key string, property *propertyv1.Property, ttl int64) (bool, uint32, int64, error) { - tagsNum := uint32(len(property.Tags)) + tagCount, err := tagLen(property) + if err != nil { + return false, 0, 0, err + } existed, err := e.GetProperty(ctx, property.Metadata, nil) if errors.Is(err, ErrGRPCResourceNotFound) { return e.replaceProperty(ctx, key, property, ttl) @@ -199,7 +216,7 @@ func (e *etcdSchemaRegistry) mergeProperty(ctx context.Context, key string, prop } merge := func(existed *propertyv1.Property) (*propertyv1.Property, error) { tags := make([]*modelv1.Tag, 0) - for i := 0; i < int(tagsNum); i++ { + for i := 0; i < int(tagCount); i++ { t := property.Tags[i] tagExisted := false for _, et := range existed.Tags { @@ -262,7 +279,7 @@ func (e *etcdSchemaRegistry) mergeProperty(ctx context.Context, key string, prop if prevLeaseID > 0 { _, _ = e.client.Revoke(ctx, clientv3.LeaseID(prevLeaseID)) } - return false, tagsNum, leaseID, nil + return false, tagCount, leaseID, nil } func (e *etcdSchemaRegistry) grant(ctx context.Context, ttl int64) (int64, error) { diff --git a/banyand/queue/pub/client.go b/banyand/queue/pub/client.go index 14e252760..83eed90b4 100644 --- a/banyand/queue/pub/client.go +++ b/banyand/queue/pub/client.go @@ -124,7 +124,7 @@ func (p *pub) OnAddOrUpdate(md schema.Metadata) { if _, ok := p.evictable[name]; ok { return } - conn, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultServiceConfig(retryPolicy)) + conn, err := grpc.NewClient(address, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultServiceConfig(retryPolicy)) if err != nil { p.log.Error().Err(err).Msg("failed to connect to grpc server") return @@ -248,7 +248,7 @@ func (p *pub) checkClientHealthAndReconnect(conn *grpc.ClientConn, md schema.Met for { select { case <-time.After(backoff): - connEvict, errEvict := grpc.Dial(node.GrpcAddress, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultServiceConfig(retryPolicy)) + connEvict, errEvict := grpc.NewClient(node.GrpcAddress, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultServiceConfig(retryPolicy)) if errEvict == nil && p.healthCheck(en.n, connEvict) { func() { p.mu.Lock() diff --git a/banyand/queue/sub/server.go b/banyand/queue/sub/server.go index 89bddbc38..aa3db29d6 100644 --- a/banyand/queue/sub/server.go +++ b/banyand/queue/sub/server.go @@ -70,7 +70,7 @@ type server struct { log *logger.Logger ser *grpclib.Server listeners map[bus.Topic]bus.MessageListener - *clusterv1.UnimplementedServiceServer + clusterv1.UnimplementedServiceServer metrics *metrics clientCloser context.CancelFunc host string diff --git a/banyand/stream/benchmark_test.go b/banyand/stream/benchmark_test.go index d4f149d69..0bb418e50 100644 --- a/banyand/stream/benchmark_test.go +++ b/banyand/stream/benchmark_test.go @@ -105,8 +105,8 @@ func (dbs *databaseSupplier) SupplyTSDB() io.Closer { return nil } -func generateRandomNumber(max int64) int { - n, _ := rand.Int(rand.Reader, big.NewInt(max)) +func generateRandomNumber(maxValue int64) int { + n, _ := rand.Int(rand.Reader, big.NewInt(maxValue)) return int(n.Int64()) + 1 } diff --git a/banyand/stream/block.go b/banyand/stream/block.go index e6e7b964a..3b65e88e5 100644 --- a/banyand/stream/block.go +++ b/banyand/stream/block.go @@ -233,7 +233,7 @@ func (b *block) unmarshalTagFamilyFromSeqReaders(decoder *encoding.BytesBlockDec func (b *block) uncompressedSizeBytes() uint64 { elementsCount := uint64(b.Len()) - n := elementsCount * 8 + n := elementsCount * (8 + 8) // 8 bytes for timestamp and 8 bytes for elementID tff := b.tagFamilies for i := range tff { diff --git a/banyand/stream/block_reader_test.go b/banyand/stream/block_reader_test.go index 154fdd21f..ae9a3fc11 100644 --- a/banyand/stream/block_reader_test.go +++ b/banyand/stream/block_reader_test.go @@ -45,39 +45,39 @@ func Test_blockReader_nextBlock(t *testing.T) { name: "Test with single part", esList: []*elements{esTS1}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, }, }, { name: "Test with multiple parts with different ts", esList: []*elements{esTS1, esTS2}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, }, }, { name: "Test with multiple parts with same ts", esList: []*elements{esTS1, esTS1}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - verify := func(pp []*part) { + verify := func(t *testing.T, pp []*part) { var pii []*partMergeIter for _, p := range pp { pmi := &partMergeIter{} @@ -116,7 +116,7 @@ func Test_blockReader_nextBlock(t *testing.T) { } } - t.Run("memory parts", func(_ *testing.T) { + t.Run("memory parts", func(t *testing.T) { var mpp []*memPart defer func() { for _, mp := range mpp { @@ -130,7 +130,7 @@ func Test_blockReader_nextBlock(t *testing.T) { mp.mustInitFromElements(es) pp = append(pp, openMemPart(mp)) } - verify(pp) + verify(t, pp) }) t.Run("file parts", func(t *testing.T) { @@ -158,7 +158,7 @@ func Test_blockReader_nextBlock(t *testing.T) { fpp = append(fpp, filePW) pp = append(pp, filePW.p) } - verify(pp) + verify(t, pp) }) }) } diff --git a/banyand/stream/merger_policy.go b/banyand/stream/merger_policy.go index e694f8047..ad881e581 100644 --- a/banyand/stream/merger_policy.go +++ b/banyand/stream/merger_policy.go @@ -38,7 +38,7 @@ func newDefaultMergePolicy() *mergePolicy { } func newDefaultMergePolicyForTesting() *mergePolicy { - return newMergePolicy(4, 1.7, run.Bytes(math.MaxInt64)) + return newMergePolicy(3, 1, run.Bytes(math.MaxInt64)) } func newDisabledMergePolicyForTesting() *mergePolicy { diff --git a/banyand/stream/merger_test.go b/banyand/stream/merger_test.go index 310d164b5..3128decee 100644 --- a/banyand/stream/merger_test.go +++ b/banyand/stream/merger_test.go @@ -248,40 +248,40 @@ func Test_mergeParts(t *testing.T) { name: "Test with single part", esList: []*elements{esTS1}, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, }, }, { name: "Test with multiple parts with different ts", esList: []*elements{esTS1, esTS2, esTS2}, want: []blockMetadata{ - {seriesID: 1, count: 3, uncompressedSizeBytes: 2643}, - {seriesID: 2, count: 3, uncompressedSizeBytes: 165}, - {seriesID: 3, count: 3, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 3, uncompressedSizeBytes: 2667}, + {seriesID: 2, count: 3, uncompressedSizeBytes: 189}, + {seriesID: 3, count: 3, uncompressedSizeBytes: 48}, }, }, { name: "Test with multiple parts with same ts", esList: []*elements{esTS1, esTS1, esTS1}, want: []blockMetadata{ - {seriesID: 1, count: 3, uncompressedSizeBytes: 2643}, - {seriesID: 2, count: 3, uncompressedSizeBytes: 165}, - {seriesID: 3, count: 3, uncompressedSizeBytes: 24}, + {seriesID: 1, count: 3, uncompressedSizeBytes: 2667}, + {seriesID: 2, count: 3, uncompressedSizeBytes: 189}, + {seriesID: 3, count: 3, uncompressedSizeBytes: 48}, }, }, { name: "Test with multiple parts with a large quantity of different ts", esList: []*elements{generateHugeEs(1, 5000, 1), generateHugeEs(5001, 10000, 2)}, want: []blockMetadata{ - {seriesID: 1, count: 2448, uncompressedSizeBytes: 2156688}, - {seriesID: 1, count: 2448, uncompressedSizeBytes: 2156688}, - {seriesID: 1, count: 2552, uncompressedSizeBytes: 2248312}, - {seriesID: 1, count: 2448, uncompressedSizeBytes: 2156688}, - {seriesID: 1, count: 104, uncompressedSizeBytes: 91624}, - {seriesID: 2, count: 2, uncompressedSizeBytes: 110}, - {seriesID: 3, count: 2, uncompressedSizeBytes: 16}, + {seriesID: 1, count: 2448, uncompressedSizeBytes: 2176272}, + {seriesID: 1, count: 2448, uncompressedSizeBytes: 2176272}, + {seriesID: 1, count: 2552, uncompressedSizeBytes: 2268728}, + {seriesID: 1, count: 2448, uncompressedSizeBytes: 2176272}, + {seriesID: 1, count: 104, uncompressedSizeBytes: 92456}, + {seriesID: 2, count: 2, uncompressedSizeBytes: 126}, + {seriesID: 3, count: 2, uncompressedSizeBytes: 32}, }, }, } diff --git a/banyand/stream/part.go b/banyand/stream/part.go index b4ad9d47f..d0dce1f90 100644 --- a/banyand/stream/part.go +++ b/banyand/stream/part.go @@ -247,6 +247,13 @@ func (pw *partWrapper) ID() uint64 { return pw.p.partMetadata.ID } +func (pw *partWrapper) String() string { + if pw.mp != nil { + return fmt.Sprintf("mem part %v", pw.mp.partMetadata) + } + return fmt.Sprintf("part %v", pw.p.partMetadata) +} + func mustOpenFilePart(id uint64, root string, fileSystem fs.FileSystem) *part { var p part partPath := partPath(root, id) diff --git a/banyand/stream/tstable_test.go b/banyand/stream/tstable_test.go index c8759b9e1..42e2a6eb6 100644 --- a/banyand/stream/tstable_test.go +++ b/banyand/stream/tstable_test.go @@ -31,12 +31,10 @@ import ( "github.com/apache/skywalking-banyandb/api/common" "github.com/apache/skywalking-banyandb/pkg/convert" "github.com/apache/skywalking-banyandb/pkg/fs" - "github.com/apache/skywalking-banyandb/pkg/logger" pbv1 "github.com/apache/skywalking-banyandb/pkg/pb/v1" "github.com/apache/skywalking-banyandb/pkg/query/model" "github.com/apache/skywalking-banyandb/pkg/run" "github.com/apache/skywalking-banyandb/pkg/test" - "github.com/apache/skywalking-banyandb/pkg/timestamp" "github.com/apache/skywalking-banyandb/pkg/watcher" ) @@ -190,9 +188,9 @@ func Test_tstIter(t *testing.T) { minTimestamp: 1, maxTimestamp: 1, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, }, }, { @@ -202,12 +200,12 @@ func Test_tstIter(t *testing.T) { minTimestamp: 1, maxTimestamp: 2, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, }, }, { @@ -217,12 +215,12 @@ func Test_tstIter(t *testing.T) { minTimestamp: 1, maxTimestamp: 2, want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 1, count: 1, uncompressedSizeBytes: 889}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 2, count: 1, uncompressedSizeBytes: 63}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, + {seriesID: 3, count: 1, uncompressedSizeBytes: 16}, }, }, } @@ -251,153 +249,6 @@ func Test_tstIter(t *testing.T) { }) } }) - - t.Run("file snapshot", func(t *testing.T) { - tests := []testCtx{ - { - name: "Test with no data points", - esList: []*elements{}, - sids: []common.SeriesID{1, 2, 3}, - minTimestamp: 1, - maxTimestamp: 1, - }, - { - name: "Test with single part", - esList: []*elements{esTS1}, - sids: []common.SeriesID{1, 2, 3}, - minTimestamp: 1, - maxTimestamp: 1, - want: []blockMetadata{ - {seriesID: 1, count: 1, uncompressedSizeBytes: 881}, - {seriesID: 2, count: 1, uncompressedSizeBytes: 55}, - {seriesID: 3, count: 1, uncompressedSizeBytes: 8}, - }, - }, - { - name: "Test with multiple parts with different ts, the block will be merged", - esList: []*elements{esTS1, esTS2, esTS2}, - sids: []common.SeriesID{1, 2, 3}, - minTimestamp: 1, - maxTimestamp: 2, - want: []blockMetadata{ - {seriesID: 1, count: 3, uncompressedSizeBytes: 2643}, - {seriesID: 2, count: 3, uncompressedSizeBytes: 165}, - {seriesID: 3, count: 3, uncompressedSizeBytes: 24}, - }, - }, - { - name: "Test with multiple parts with same ts, duplicated blocks will be merged", - esList: []*elements{esTS1, esTS1}, - sids: []common.SeriesID{1, 2, 3}, - minTimestamp: 1, - maxTimestamp: 2, - want: []blockMetadata{ - {seriesID: 1, count: 2, uncompressedSizeBytes: 1762}, - {seriesID: 2, count: 2, uncompressedSizeBytes: 110}, - {seriesID: 3, count: 2, uncompressedSizeBytes: 16}, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Run("merging on the fly", func(t *testing.T) { - tmpPath, defFn := test.Space(require.New(t)) - fileSystem := fs.NewLocalFileSystem() - defer defFn() - - tst, err := newTSTable(fileSystem, tmpPath, common.Position{}, - logger.GetLogger("test"), timestamp.TimeRange{}, option{flushTimeout: 0, elementIndexFlushTimeout: 0, mergePolicy: newDefaultMergePolicyForTesting()}, nil) - require.NoError(t, err) - for i, es := range tt.esList { - tst.mustAddElements(es) - for { - snp := tst.currentSnapshot() - if snp == nil { - t.Logf("waiting for snapshot %d to be introduced", i) - time.Sleep(100 * time.Millisecond) - continue - } - if snp.creator != snapshotCreatorMemPart { - snp.decRef() - break - } - t.Logf("waiting for snapshot %d to be flushed or merged: current creator:%d, parts: %+v", - i, snp.creator, snp.parts) - snp.decRef() - time.Sleep(100 * time.Millisecond) - } - } - // wait until some parts are merged - if len(tt.esList) > 0 { - for { - snp := tst.currentSnapshot() - if snp == nil { - time.Sleep(100 * time.Millisecond) - continue - } - if len(snp.parts) == 1 || len(snp.parts) < len(tt.esList) { - snp.decRef() - break - } - t.Logf("waiting for snapshot to be merged: current creator:%d, parts: %+v", snp.creator, snp.parts) - snp.decRef() - time.Sleep(100 * time.Millisecond) - } - } - verify(t, tt, tst) - }) - - t.Run("merging on close", func(t *testing.T) { - t.Skip("the test is flaky due to unpredictable merge loop schedule.") - tmpPath, defFn := test.Space(require.New(t)) - fileSystem := fs.NewLocalFileSystem() - defer defFn() - - tst, err := newTSTable(fileSystem, tmpPath, common.Position{}, - logger.GetLogger("test"), timestamp.TimeRange{}, - option{ - flushTimeout: defaultFlushTimeout, - elementIndexFlushTimeout: defaultFlushTimeout, - mergePolicy: newDefaultMergePolicyForTesting(), - }, nil) - require.NoError(t, err) - for _, es := range tt.esList { - tst.mustAddElements(es) - time.Sleep(100 * time.Millisecond) - } - // wait until the introducer is done - if len(tt.esList) > 0 { - for { - snp := tst.currentSnapshot() - if snp == nil { - time.Sleep(100 * time.Millisecond) - continue - } - if len(snp.parts) == len(tt.esList) { - snp.decRef() - tst.Close() - break - } - snp.decRef() - time.Sleep(100 * time.Millisecond) - } - } else { - tst.Close() - } - // reopen the table - tst, err = newTSTable(fileSystem, tmpPath, common.Position{}, - logger.GetLogger("test"), timestamp.TimeRange{}, - option{ - flushTimeout: defaultFlushTimeout, - elementIndexFlushTimeout: defaultFlushTimeout, - mergePolicy: newDefaultMergePolicyForTesting(), - }, nil) - require.NoError(t, err) - verify(t, tt, tst) - }) - }) - } - }) } var tagProjectionAll = []model.TagProjection{ diff --git a/bydbctl/internal/cmd/measure_test.go b/bydbctl/internal/cmd/measure_test.go index 0f0e65caa..2ded6ba4b 100644 --- a/bydbctl/internal/cmd/measure_test.go +++ b/bydbctl/internal/cmd/measure_test.go @@ -206,7 +206,7 @@ var _ = Describe("Measure Data Query", func() { }) It("query all measure data", func() { - conn, err := grpclib.Dial( + conn, err := grpclib.NewClient( grpcAddr, grpclib.WithTransportCredentials(insecure.NewCredentials()), ) @@ -242,7 +242,7 @@ tagProjection: }) DescribeTable("query measure data with time range flags", func(timeArgs ...string) { - conn, err := grpclib.Dial( + conn, err := grpclib.NewClient( grpcAddr, grpclib.WithTransportCredentials(insecure.NewCredentials()), ) diff --git a/bydbctl/internal/cmd/stream_test.go b/bydbctl/internal/cmd/stream_test.go index f413e1bce..75ad4b7ea 100644 --- a/bydbctl/internal/cmd/stream_test.go +++ b/bydbctl/internal/cmd/stream_test.go @@ -207,7 +207,7 @@ var _ = Describe("Stream Data Query", func() { }) It("query stream all data", func() { - conn, err := grpclib.Dial( + conn, err := grpclib.NewClient( grpcAddr, grpclib.WithTransportCredentials(insecure.NewCredentials()), ) @@ -243,7 +243,7 @@ projection: }) DescribeTable("query stream data with time range flags", func(timeArgs ...string) { - conn, err := grpclib.Dial( + conn, err := grpclib.NewClient( grpcAddr, grpclib.WithTransportCredentials(insecure.NewCredentials()), ) diff --git a/dist/LICENSE b/dist/LICENSE index 2de4f6be3..49b5a45ba 100644 --- a/dist/LICENSE +++ b/dist/LICENSE @@ -183,11 +183,11 @@ Apache-2.0 licenses github.com/blevesearch/vellum v1.0.10 Apache-2.0 github.com/coreos/go-semver v0.3.1 Apache-2.0 github.com/coreos/go-systemd/v22 v22.5.0 Apache-2.0 - github.com/envoyproxy/protoc-gen-validate v1.0.4 Apache-2.0 - github.com/go-logr/logr v1.4.1 Apache-2.0 + github.com/envoyproxy/protoc-gen-validate v1.1.0 Apache-2.0 + github.com/go-logr/logr v1.4.2 Apache-2.0 github.com/go-logr/stdr v1.2.2 Apache-2.0 - github.com/google/btree v1.1.2 Apache-2.0 - github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 Apache-2.0 + github.com/google/btree v1.1.3 Apache-2.0 + github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134 Apache-2.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 Apache-2.0 github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 Apache-2.0 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 Apache-2.0 @@ -200,51 +200,52 @@ Apache-2.0 licenses github.com/modern-go/reflect2 v1.0.2 Apache-2.0 github.com/mschoch/smat v0.2.0 Apache-2.0 github.com/oklog/run v1.1.0 Apache-2.0 - github.com/prometheus/client_golang v1.19.0 Apache-2.0 + github.com/prometheus/client_golang v1.20.3 Apache-2.0 github.com/prometheus/client_model v0.6.1 Apache-2.0 - github.com/prometheus/common v0.53.0 Apache-2.0 - github.com/prometheus/procfs v0.14.0 Apache-2.0 + github.com/prometheus/common v0.59.1 Apache-2.0 + github.com/prometheus/procfs v0.15.1 Apache-2.0 github.com/soheilhy/cmux v0.1.5 Apache-2.0 github.com/spf13/afero v1.11.0 Apache-2.0 - github.com/spf13/cobra v1.8.0 Apache-2.0 + github.com/spf13/cobra v1.8.1 Apache-2.0 github.com/tklauser/numcpus v0.8.0 Apache-2.0 github.com/zinclabs/bluge v1.1.5 Apache-2.0 github.com/zinclabs/bluge_segment_api v1.0.0 Apache-2.0 github.com/zinclabs/ice v1.1.3 Apache-2.0 - go.etcd.io/etcd/api/v3 v3.5.13 Apache-2.0 - go.etcd.io/etcd/client/pkg/v3 v3.5.13 Apache-2.0 - go.etcd.io/etcd/client/v2 v2.305.13 Apache-2.0 - go.etcd.io/etcd/client/v3 v3.5.13 Apache-2.0 - go.etcd.io/etcd/pkg/v3 v3.5.13 Apache-2.0 - go.etcd.io/etcd/raft/v3 v3.5.13 Apache-2.0 - go.etcd.io/etcd/server/v3 v3.5.13 Apache-2.0 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 Apache-2.0 - go.opentelemetry.io/otel v1.26.0 Apache-2.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 Apache-2.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 Apache-2.0 - go.opentelemetry.io/otel/metric v1.26.0 Apache-2.0 - go.opentelemetry.io/otel/sdk v1.26.0 Apache-2.0 - go.opentelemetry.io/otel/trace v1.26.0 Apache-2.0 - go.opentelemetry.io/proto/otlp v1.2.0 Apache-2.0 + go.etcd.io/etcd/api/v3 v3.5.16 Apache-2.0 + go.etcd.io/etcd/client/pkg/v3 v3.5.16 Apache-2.0 + go.etcd.io/etcd/client/v2 v2.305.16 Apache-2.0 + go.etcd.io/etcd/client/v3 v3.5.16 Apache-2.0 + go.etcd.io/etcd/pkg/v3 v3.5.16 Apache-2.0 + go.etcd.io/etcd/raft/v3 v3.5.16 Apache-2.0 + go.etcd.io/etcd/server/v3 v3.5.16 Apache-2.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 Apache-2.0 + go.opentelemetry.io/otel v1.30.0 Apache-2.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 Apache-2.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 Apache-2.0 + go.opentelemetry.io/otel/metric v1.30.0 Apache-2.0 + go.opentelemetry.io/otel/sdk v1.30.0 Apache-2.0 + go.opentelemetry.io/otel/trace v1.30.0 Apache-2.0 + go.opentelemetry.io/proto/otlp v1.3.1 Apache-2.0 go.uber.org/mock v0.4.0 Apache-2.0 - google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be Apache-2.0 - google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be Apache-2.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be Apache-2.0 - google.golang.org/grpc v1.63.2 Apache-2.0 + google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 Apache-2.0 + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 Apache-2.0 + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 Apache-2.0 + google.golang.org/grpc v1.66.1 Apache-2.0 gopkg.in/ini.v1 v1.67.0 Apache-2.0 gopkg.in/yaml.v2 v2.4.0 Apache-2.0 - skywalking.apache.org/repo/goapi v0.0.0-20240227092755-edee3273b361 Apache-2.0 + skywalking.apache.org/repo/goapi v0.0.0-20240604102541-64f9001abe03 Apache-2.0 ======================================================================== Apache-2.0 and BSD-3-Clause licenses ======================================================================== - github.com/RoaringBitmap/roaring v1.9.3 Apache-2.0 and BSD-3-Clause + github.com/RoaringBitmap/roaring v1.9.4 Apache-2.0 and BSD-3-Clause ======================================================================== BSD-2-Clause licenses ======================================================================== + github.com/gorilla/websocket v1.5.3 BSD-2-Clause github.com/magiconair/properties v1.8.7 BSD-2-Clause github.com/pkg/errors v0.9.1 BSD-2-Clause github.com/russross/blackfriday/v2 v2.1.0 BSD-2-Clause @@ -259,7 +260,7 @@ BSD-2-Clause and ISC licenses BSD-3-Clause licenses ======================================================================== - github.com/bits-and-blooms/bitset v1.13.0 BSD-3-Clause + github.com/bits-and-blooms/bitset v1.14.3 BSD-3-Clause github.com/blevesearch/mmap-go v1.0.4 BSD-3-Clause github.com/blevesearch/snowballstem v0.9.0 BSD-3-Clause github.com/fsnotify/fsnotify v1.7.0 BSD-3-Clause @@ -267,32 +268,32 @@ BSD-3-Clause licenses github.com/golang/protobuf v1.5.4 BSD-3-Clause github.com/google/go-cmp v0.6.0 BSD-3-Clause github.com/google/uuid v1.6.0 BSD-3-Clause - github.com/gorilla/websocket v1.5.1 BSD-3-Clause github.com/grpc-ecosystem/grpc-gateway v1.16.0 BSD-3-Clause - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 BSD-3-Clause - github.com/lufia/plan9stats v0.0.0-20240408141607-282e7b5d6b74 BSD-3-Clause + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 BSD-3-Clause + github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 BSD-3-Clause + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 BSD-3-Clause github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 BSD-3-Clause github.com/sagikazarmark/slog-shim v0.1.0 BSD-3-Clause - github.com/shirou/gopsutil/v3 v3.24.3 BSD-3-Clause + github.com/shirou/gopsutil/v3 v3.24.5 BSD-3-Clause github.com/spaolacci/murmur3 v1.1.0 BSD-3-Clause github.com/spf13/pflag v1.0.5 BSD-3-Clause github.com/tklauser/go-sysconf v0.3.14 BSD-3-Clause github.com/xhit/go-str2duration/v2 v2.1.0 BSD-3-Clause - golang.org/x/crypto v0.22.0 BSD-3-Clause - golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f BSD-3-Clause - golang.org/x/mod v0.17.0 BSD-3-Clause - golang.org/x/net v0.24.0 BSD-3-Clause - golang.org/x/sys v0.19.0 BSD-3-Clause - golang.org/x/text v0.14.0 BSD-3-Clause - golang.org/x/time v0.5.0 BSD-3-Clause - golang.org/x/tools v0.20.0 BSD-3-Clause - google.golang.org/protobuf v1.33.0 BSD-3-Clause + golang.org/x/crypto v0.27.0 BSD-3-Clause + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 BSD-3-Clause + golang.org/x/mod v0.21.0 BSD-3-Clause + golang.org/x/net v0.29.0 BSD-3-Clause + golang.org/x/sys v0.25.0 BSD-3-Clause + golang.org/x/text v0.18.0 BSD-3-Clause + golang.org/x/time v0.6.0 BSD-3-Clause + golang.org/x/tools v0.25.0 BSD-3-Clause + google.golang.org/protobuf v1.34.2 BSD-3-Clause ======================================================================== BSD-3-Clause and Apache-2.0 and MIT licenses ======================================================================== - github.com/klauspost/compress v1.17.8 BSD-3-Clause and Apache-2.0 and MIT + github.com/klauspost/compress v1.17.9 BSD-3-Clause and Apache-2.0 and MIT ======================================================================== CC0-1.0 licenses @@ -311,7 +312,7 @@ MIT licenses ======================================================================== github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97 MIT - github.com/axiomhq/hyperloglog v0.0.0-20240319100328-84253e514e02 MIT + github.com/axiomhq/hyperloglog v0.2.0 MIT github.com/beorn7/perks v1.0.1 MIT github.com/blevesearch/go-porterstemmer v1.0.3 MIT github.com/caio/go-tdigest v3.1.0+incompatible MIT @@ -321,9 +322,9 @@ MIT licenses github.com/cpuguy83/go-md2man/v2 v2.0.4 MIT github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140 MIT github.com/dustin/go-humanize v1.0.1 MIT - github.com/go-chi/chi/v5 v5.0.12 MIT + github.com/go-chi/chi/v5 v5.1.0 MIT github.com/go-ole/go-ole v1.3.0 MIT - github.com/go-resty/resty/v2 v2.12.0 MIT + github.com/go-resty/resty/v2 v2.14.0 MIT github.com/go-task/slim-sprig/v3 v3.0.0 MIT github.com/golang-jwt/jwt/v4 v4.5.0 MIT github.com/json-iterator/go v1.1.12 MIT @@ -331,26 +332,26 @@ MIT licenses github.com/mattn/go-isatty v0.0.20 MIT github.com/mitchellh/mapstructure v1.5.0 MIT github.com/montanaflynn/stats v0.7.1 MIT - github.com/onsi/ginkgo/v2 v2.17.2 MIT - github.com/onsi/gomega v1.33.0 MIT - github.com/pelletier/go-toml/v2 v2.2.1 MIT + github.com/onsi/ginkgo/v2 v2.20.2 MIT + github.com/onsi/gomega v1.34.2 MIT + github.com/pelletier/go-toml/v2 v2.2.3 MIT github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 MIT github.com/robfig/cron/v3 v3.0.1 MIT - github.com/rs/zerolog v1.32.0 MIT - github.com/sagikazarmark/locafero v0.4.0 MIT + github.com/rs/zerolog v1.33.0 MIT + github.com/sagikazarmark/locafero v0.6.0 MIT github.com/sirupsen/logrus v1.9.3 MIT github.com/sourcegraph/conc v0.3.0 MIT - github.com/spf13/cast v1.6.0 MIT - github.com/spf13/viper v1.18.2 MIT + github.com/spf13/cast v1.7.0 MIT + github.com/spf13/viper v1.19.0 MIT github.com/stretchr/testify v1.9.0 MIT github.com/subosito/gotenv v1.6.0 MIT github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 MIT - github.com/urfave/cli/v2 v2.27.2 MIT + github.com/urfave/cli/v2 v2.27.4 MIT github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 MIT - github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 MIT + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 MIT github.com/yusufpapurcu/wmi v1.2.4 MIT github.com/zenizh/go-capturer v0.0.0-20211219060012-52ea6c8fed04 MIT - go.etcd.io/bbolt v1.3.9 MIT + go.etcd.io/bbolt v1.3.11 MIT go.uber.org/multierr v1.11.0 MIT go.uber.org/zap v1.27.0 MIT gopkg.in/natefinch/lumberjack.v2 v2.2.1 MIT @@ -406,7 +407,7 @@ BSD-3-Clause licenses ======================================================================== normalize-wheel-es 1.2.0 BSD-3-Clause - source-map-js 1.2.0 BSD-3-Clause + source-map-js 1.2.1 BSD-3-Clause zrender 5.6.0 BSD-3-Clause ======================================================================== @@ -416,58 +417,61 @@ ISC licenses anymatch 3.1.3 ISC glob-parent 5.1.2 ISC graceful-fs 4.2.11 ISC - picocolors 1.0.1 ISC - semver 7.6.2 ISC - yaml 2.4.5 ISC + picocolors 1.1.0 ISC + semver 7.6.3 ISC + yaml 2.5.1 ISC ======================================================================== MIT licenses ======================================================================== - @babel/parser 7.24.7 MIT + @babel/helper-string-parser 7.24.8 MIT + @babel/helper-validator-identifier 7.24.7 MIT + @babel/parser 7.25.6 MIT + @babel/types 7.25.6 MIT @ctrl/tinycolor 3.6.1 MIT @element-plus/icons-vue 2.3.1 MIT - @floating-ui/core 1.6.4 MIT - @floating-ui/dom 1.6.7 MIT - @floating-ui/utils 0.2.4 MIT - @jridgewell/sourcemap-codec 1.4.15 MIT + @floating-ui/core 1.6.7 MIT + @floating-ui/dom 1.6.10 MIT + @floating-ui/utils 0.2.7 MIT + @jridgewell/sourcemap-codec 1.5.0 MIT @popperjs/core 2.11.7 MIT - @types/lodash 4.17.6 MIT + @types/lodash 4.17.7 MIT @types/lodash-es 4.17.12 MIT @types/web-bluetooth 0.0.16 MIT - @vue/compiler-core 3.4.31 MIT - @vue/compiler-dom 3.4.31 MIT - @vue/compiler-sfc 3.4.31 MIT - @vue/compiler-ssr 3.4.31 MIT - @vue/devtools-api 6.6.3 MIT - @vue/reactivity 3.4.31 MIT - @vue/runtime-core 3.4.31 MIT - @vue/runtime-dom 3.4.31 MIT - @vue/server-renderer 3.4.31 MIT - @vue/shared 3.4.31 MIT + @vue/compiler-core 3.5.4 MIT + @vue/compiler-dom 3.5.4 MIT + @vue/compiler-sfc 3.5.4 MIT + @vue/compiler-ssr 3.5.4 MIT + @vue/devtools-api 6.6.4 MIT + @vue/reactivity 3.5.4 MIT + @vue/runtime-core 3.5.4 MIT + @vue/runtime-dom 3.5.4 MIT + @vue/server-renderer 3.5.4 MIT + @vue/shared 3.5.4 MIT @vueuse/core 9.13.0 MIT - @vueuse/core/node_modules/vue-demi 0.14.8 MIT + @vueuse/core/node_modules/vue-demi 0.14.10 MIT @vueuse/metadata 9.13.0 MIT @vueuse/shared 9.13.0 MIT - @vueuse/shared/node_modules/vue-demi 0.14.8 MIT + @vueuse/shared/node_modules/vue-demi 0.14.10 MIT async-validator 4.2.5 MIT asynckit 0.4.0 MIT - axios 1.7.2 MIT + axios 1.7.7 MIT binary-extensions 2.3.0 MIT braces 3.0.3 MIT chokidar 3.6.0 MIT - codemirror 5.65.16 MIT + codemirror 5.65.17 MIT combined-stream 1.0.8 MIT csstype 3.1.3 MIT - dayjs 1.11.11 MIT + dayjs 1.11.13 MIT delayed-stream 1.0.0 MIT - element-plus 2.7.6 MIT + element-plus 2.8.2 MIT escape-html 1.0.3 MIT estree-walker 2.0.2 MIT fill-range 7.1.1 MIT - follow-redirects 1.15.6 MIT + follow-redirects 1.15.9 MIT form-data 4.0.0 MIT - immutable 4.3.6 MIT + immutable 4.3.7 MIT is-binary-path 2.1.0 MIT is-extglob 2.1.1 MIT is-glob 4.0.3 MIT @@ -477,7 +481,7 @@ MIT licenses lodash 4.17.21 MIT lodash-es 4.17.21 MIT lodash-unified 1.0.3 MIT - magic-string 0.30.10 MIT + magic-string 0.30.11 MIT memoize-one 6.0.0 MIT mime-db 1.52.0 MIT mime-types 2.1.35 MIT @@ -485,16 +489,17 @@ MIT licenses nanoid 3.3.7 MIT normalize-path 3.0.0 MIT picomatch 2.3.1 MIT - pinia 2.1.7 MIT - pinia/node_modules/vue-demi 0.14.8 MIT - postcss 8.4.39 MIT + pinia 2.2.2 MIT + pinia/node_modules/vue-demi 0.14.10 MIT + postcss 8.4.45 MIT proxy-from-env 1.1.0 MIT readdirp 3.6.0 MIT - sass 1.77.6 MIT + sass 1.78.0 MIT + to-fast-properties 2.0.0 MIT to-regex-range 5.0.1 MIT universalify 2.0.1 MIT - vue 3.4.31 MIT - vue-router 4.4.0 MIT + vue 3.5.4 MIT + vue-router 4.4.4 MIT ======================================================================== Python-2.0 licenses diff --git a/dist/licenses/license-github.com-go-resty-resty-v2.txt b/dist/licenses/license-github.com-go-resty-resty-v2.txt index 0c2d38a38..de30fea8f 100644 --- a/dist/licenses/license-github.com-go-resty-resty-v2.txt +++ b/dist/licenses/license-github.com-go-resty-resty-v2.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015-2023 Jeevanandam M., https://myjeeva.com +Copyright (c) 2015-2024 Jeevanandam M., https://myjeeva.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/dist/licenses/license-github.com-gorilla-websocket.txt b/dist/licenses/license-github.com-gorilla-websocket.txt index bb9d80bc9..9171c9722 100644 --- a/dist/licenses/license-github.com-gorilla-websocket.txt +++ b/dist/licenses/license-github.com-gorilla-websocket.txt @@ -1,27 +1,22 @@ -Copyright (c) 2023 The Gorilla Authors. All rights reserved. +Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved. Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/dist/licenses/license-github.com-munnerz-goautoneg.txt b/dist/licenses/license-github.com-munnerz-goautoneg.txt new file mode 100644 index 000000000..bbc7b897c --- /dev/null +++ b/dist/licenses/license-github.com-munnerz-goautoneg.txt @@ -0,0 +1,31 @@ +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/dist/licenses/license-golang.org-x-crypto.txt b/dist/licenses/license-golang.org-x-crypto.txt index 6a66aea5e..2a7cf70da 100644 --- a/dist/licenses/license-golang.org-x-crypto.txt +++ b/dist/licenses/license-golang.org-x-crypto.txt @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/dist/licenses/license-golang.org-x-exp.txt b/dist/licenses/license-golang.org-x-exp.txt index 6a66aea5e..2a7cf70da 100644 --- a/dist/licenses/license-golang.org-x-exp.txt +++ b/dist/licenses/license-golang.org-x-exp.txt @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/dist/licenses/license-golang.org-x-mod.txt b/dist/licenses/license-golang.org-x-mod.txt index 6a66aea5e..2a7cf70da 100644 --- a/dist/licenses/license-golang.org-x-mod.txt +++ b/dist/licenses/license-golang.org-x-mod.txt @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/dist/licenses/license-golang.org-x-net.txt b/dist/licenses/license-golang.org-x-net.txt index 6a66aea5e..2a7cf70da 100644 --- a/dist/licenses/license-golang.org-x-net.txt +++ b/dist/licenses/license-golang.org-x-net.txt @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/dist/licenses/license-golang.org-x-sys.txt b/dist/licenses/license-golang.org-x-sys.txt index 6a66aea5e..2a7cf70da 100644 --- a/dist/licenses/license-golang.org-x-sys.txt +++ b/dist/licenses/license-golang.org-x-sys.txt @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/dist/licenses/license-golang.org-x-text.txt b/dist/licenses/license-golang.org-x-text.txt index 6a66aea5e..2a7cf70da 100644 --- a/dist/licenses/license-golang.org-x-text.txt +++ b/dist/licenses/license-golang.org-x-text.txt @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/dist/licenses/license-golang.org-x-time.txt b/dist/licenses/license-golang.org-x-time.txt index 6a66aea5e..2a7cf70da 100644 --- a/dist/licenses/license-golang.org-x-time.txt +++ b/dist/licenses/license-golang.org-x-time.txt @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/dist/licenses/license-golang.org-x-tools.txt b/dist/licenses/license-golang.org-x-tools.txt index 6a66aea5e..2a7cf70da 100644 --- a/dist/licenses/license-golang.org-x-tools.txt +++ b/dist/licenses/license-golang.org-x-tools.txt @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/dist/licenses/ui-licenses/license--babel-helper-string-parser.txt b/dist/licenses/ui-licenses/license--babel-helper-string-parser.txt new file mode 100644 index 000000000..f31575ec7 --- /dev/null +++ b/dist/licenses/ui-licenses/license--babel-helper-string-parser.txt @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/dist/licenses/ui-licenses/license--babel-helper-validator-identifier.txt b/dist/licenses/ui-licenses/license--babel-helper-validator-identifier.txt new file mode 100644 index 000000000..f31575ec7 --- /dev/null +++ b/dist/licenses/ui-licenses/license--babel-helper-validator-identifier.txt @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/dist/licenses/ui-licenses/license--babel-types.txt b/dist/licenses/ui-licenses/license--babel-types.txt new file mode 100644 index 000000000..f31575ec7 --- /dev/null +++ b/dist/licenses/ui-licenses/license--babel-types.txt @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/dist/licenses/ui-licenses/license-picocolors.txt b/dist/licenses/ui-licenses/license-picocolors.txt index 496098c6e..46c9b95d4 100644 --- a/dist/licenses/ui-licenses/license-picocolors.txt +++ b/dist/licenses/ui-licenses/license-picocolors.txt @@ -1,6 +1,6 @@ ISC License -Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov +Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, Anton Verinov Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/dist/licenses/ui-licenses/license-sass.txt b/dist/licenses/ui-licenses/license-sass.txt index 4ddaee78c..be5cee61b 100644 --- a/dist/licenses/ui-licenses/license-sass.txt +++ b/dist/licenses/ui-licenses/license-sass.txt @@ -215,8 +215,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -async, cli_util, collection, mime, source_map_stack_trace, stream_channel and -typed_data license: +async, cli_util, collection, mime, stream_channel and typed_data license: Copyright 2015, the Dart project authors. @@ -583,7 +582,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -convert, crypto, shelf_static and vm_service license: +convert, crypto, shelf_static, source_map_stack_trace and vm_service license: Copyright 2015, the Dart project authors. diff --git a/dist/licenses/ui-licenses/license-to-fast-properties.txt b/dist/licenses/ui-licenses/license-to-fast-properties.txt new file mode 100644 index 000000000..cef79eff9 --- /dev/null +++ b/dist/licenses/ui-licenses/license-to-fast-properties.txt @@ -0,0 +1,10 @@ +MIT License + +Copyright (c) 2014 Petka Antonov + 2015 Sindre Sorhus + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/docs/api-reference.md b/docs/api-reference.md index f50a82f3f..852c7f667 100644 --- a/docs/api-reference.md +++ b/docs/api-reference.md @@ -44,6 +44,7 @@ - [banyandb/model/v1/query.proto](#banyandb_model_v1_query-proto) - [Condition](#banyandb-model-v1-Condition) + - [Condition.MatchOption](#banyandb-model-v1-Condition-MatchOption) - [Criteria](#banyandb-model-v1-Criteria) - [LogicalExpression](#banyandb-model-v1-LogicalExpression) - [QueryOrder](#banyandb-model-v1-QueryOrder) @@ -54,6 +55,7 @@ - [TimeRange](#banyandb-model-v1-TimeRange) - [Condition.BinaryOp](#banyandb-model-v1-Condition-BinaryOp) + - [Condition.MatchOption.Operator](#banyandb-model-v1-Condition-MatchOption-Operator) - [LogicalExpression.LogicalOp](#banyandb-model-v1-LogicalExpression-LogicalOp) - [Sort](#banyandb-model-v1-Sort) @@ -73,7 +75,6 @@ - [CompressionMethod](#banyandb-database-v1-CompressionMethod) - [EncodingMethod](#banyandb-database-v1-EncodingMethod) - [FieldType](#banyandb-database-v1-FieldType) - - [IndexRule.Analyzer](#banyandb-database-v1-IndexRule-Analyzer) - [IndexRule.Type](#banyandb-database-v1-IndexRule-Type) - [TagType](#banyandb-database-v1-TagType) @@ -745,6 +746,23 @@ while for 1:N BinaryOp, values can be an array with length >= 1. | name | [string](#string) | | | | op | [Condition.BinaryOp](#banyandb-model-v1-Condition-BinaryOp) | | | | value | [TagValue](#banyandb-model-v1-TagValue) | | | +| match_option | [Condition.MatchOption](#banyandb-model-v1-Condition-MatchOption) | | | + + + + + + + + +### Condition.MatchOption + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| analyzer | [string](#string) | | | +| operator | [Condition.MatchOption.Operator](#banyandb-model-v1-Condition-MatchOption-Operator) | | | @@ -914,6 +932,19 @@ Each item in a string array is seen as a token instead of a query expression. + + +### Condition.MatchOption.Operator + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| OPERATOR_UNSPECIFIED | 0 | | +| OPERATOR_AND | 1 | | +| OPERATOR_OR | 2 | | + + + ### LogicalExpression.LogicalOp @@ -1001,7 +1032,7 @@ IndexRule should bind to a subject through an IndexRuleBinding to generate prope | tags | [string](#string) | repeated | tags are the combination that refers to an indexed object If the elements in tags are more than 1, the object will generate a multi-tag index Caveat: All tags in a multi-tag MUST have an identical IndexType | | type | [IndexRule.Type](#banyandb-database-v1-IndexRule-Type) | | type is the IndexType of this IndexObject. | | updated_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | updated_at indicates when the IndexRule is updated | -| analyzer | [IndexRule.Analyzer](#banyandb-database-v1-IndexRule-Analyzer) | | analyzer analyzes tag value to support the full-text searching for TYPE_INVERTED indices. | +| analyzer | [string](#string) | | analyzer analyzes tag value to support the full-text searching for TYPE_INVERTED indices. available analyzers are: - "standard" provides grammar based tokenization - "simple" breaks text into tokens at any non-letter character, such as numbers, spaces, hyphens and apostrophes, discards non-letter characters, and changes uppercase to lowercase. - "keyword" is a “noop” analyzer which returns the entire input string as a single token. - "url" breaks test into tokens at any non-letter and non-digit character. | | no_sort | [bool](#bool) | | no_sort indicates whether the index is not for sorting. | @@ -1198,20 +1229,6 @@ TopNAggregation generates offline TopN statistics for a measure's TopN appro - - -### IndexRule.Analyzer - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| ANALYZER_UNSPECIFIED | 0 | | -| ANALYZER_KEYWORD | 1 | Keyword analyzer is a “noop” analyzer which returns the entire input string as a single token. | -| ANALYZER_STANDARD | 2 | Standard analyzer provides grammar based tokenization | -| ANALYZER_SIMPLE | 3 | Simple analyzer breaks text into tokens at any non-letter character, such as numbers, spaces, hyphens and apostrophes, discards non-letter characters, and changes uppercase to lowercase. | - - - ### IndexRule.Type diff --git a/docs/installation/binaries.md b/docs/installation/binaries.md index 02cad7482..2eeade4e9 100644 --- a/docs/installation/binaries.md +++ b/docs/installation/binaries.md @@ -26,8 +26,10 @@ The banyand and bydbctl directory structure is as follows. ├── NOTICE ├── README.md ├── bin -│   ├── banyand-linux-arm64 -│   └── banyand-linux-amd64 +│ ├──banyand-server-slim-linux-amd64 +│ ├──banyand-server-slim-linux-arm64 +│ ├──banyand-server-static-linux-amd64 +│   └──banyand-server-static-linux-arm64 └── licenses ``` @@ -38,13 +40,13 @@ The banyand and bydbctl directory structure is as follows. ├── NOTICE ├── README.md ├── bin -│   ├── bydbctl-linux-386 -│   ├── bydbctl-linux-amd64 -│   ├── bydbctl-linux-arm64 -│   ├── bydbctl-windows-386 -│   ├── bydbctl-windows-amd64 -│   ├── bydbctl-darwin-amd64 -│   └── bydbctl-darwin-arm64 +│   ├── bydbctl-cli-static-linux-386 +│   ├── bydbctl-cli-static-linux-amd64 +│   ├── bydbctl-cli-static-linux-arm64 +│   ├── bydbctl-cli-static-windows-386 +│   ├── bydbctl-cli-static-windows-amd64 +│   ├── bydbctl-cli-static-darwin-amd64 +│   └── bydbctl-cli-static-darwin-arm64 └── licenses ``` @@ -54,7 +56,7 @@ The banyand and bydbctl directory structure is as follows. Users who want to build a binary from sources have to set up: -* Go 1.22 +* Go 1.23 * Node 20.12 * Git >= 2.30 * Linux, macOS or Windows+WSL2 @@ -72,7 +74,9 @@ To issue the below command to get basic binaries of banyand and bydbctl. make generate ... make build +--- ui: all --- ... +Done building ui --- banyand: all --- ... chmod +x build/bin/banyand-server; @@ -84,26 +88,26 @@ chmod +x build/bin/dev/bydbctl-cli; Done building build/bin/dev/bydbctl-cli ``` -The build system provides a series of binary options as well. - -* `make -C banyand banyand-server` generates a basic `banyand-server`. -* `make -C banyand release` or `make -C banyand banyand-server-static` builds out a static binary `banyand-server-static` for releasing. -* `make -C bydbctl bydbctl-cli` generates a basic `bydbctl-cli`. -* `make -C bydbctl release` or `make -C banyand bydbctl-cli-static` builds out a static binary `bydbctl-cli-static` for releasing. - Then users get binaries as below ``` shell ls banyand/build/bin/dev banyand-server -banyand-server-static ls bydbctl/build/bin/dev bydbctl-cli -bydbctl-cli-static ``` -> The build script now checks if the binary file exists before rebuilding. If you want to rebuild, please remove the binary file manually. +The build system provides a series of binary options as well. + +* `make -C banyand banyand-server` generates a basic `banyand-server`. +* `make -C banyand banyand-server-static` builds out a static binary `banyand-server-static` which is statically linked with all dependencies. +* `make -C banyand banyand-server-slim` builds out a slim binary `banyand-server-slim` which doesn't include `UI`. +* `make -C banyand release` builds out the static and slim binaries for releasing. +* `make -C bydbctl bydbctl-cli` generates a basic `bydbctl-cli`. +* `make -C bydbctl release` or `make -C banyand bydbctl-cli-static` builds out a static binary `bydbctl-cli-static` for releasing. This binary is statically linked with all dependencies. + +> The build script now checks if the binary file exists before rebuilding. If you want to rebuild, please remove the binary file manually by running `make clean-build`. ### Cross-compile Binaries @@ -113,7 +117,7 @@ The build system supports cross-compiling binaries for different platforms. For TARGET_OS=windows PLATFORMS=windows/amd64 make release ``` -The `PLATFORMS` variable is a list of platforms separated by commas. The `TARGET_OS` variable is the target operating system. You could specify several platforms at once: +The `PLATFORMS` variable is a list of platforms separated by commas. The `TARGET_OS` variable is the target operating system. You could specify several platforms at once: ```shell TARGET_OS=linux PLATFORMS=linux/amd64,linux/arm64 make release diff --git a/docs/installation/docker.md b/docs/installation/docker.md index 8d9e17d1b..2fdcddfe9 100644 --- a/docs/installation/docker.md +++ b/docs/installation/docker.md @@ -1,5 +1,26 @@ # Installation On Docker +## Images on Docker Hub + +The BanyanDB images are hosted on Docker Hub. You can pull the images from the following links: [Apache SkyWalking BanyanDB](https://hub.docker.com/r/apache/skywalking-banyandb) + +There are two types of images: + +- `apache/skywalking-banyandb:` - The specific version of the BanyanDB. +- `apache/skywalking-banyandb:-slim` - The slim version of the BanyanDB. It does not contain the Web UI. + +We pushed `linux/amd64` and `linux/arm64` for each type of image. You can pull the image for the specific architecture. + +## Images on GitHub Container Registry + +The BanyanDB images are hosted on GitHub Container Registry for development or testing. You can pull the images from the following links: [ghcr.io/apache/skywalking-banyandb](https://github.com/apache/skywalking-banyandb/pkgs/container/skywalking-banyandb) + +There are three types of images: + +- `ghcr.io/apache/skywalking-banyandb:` - The specific version of the BanyanDB. We pushed `linux/amd64`, `linux/arm64` and `windows/amd64` for each type of image. +- `ghcr.io/apache/skywalking-banyandb:-slim` - The slim version of the BanyanDB. It does not contain the Web UI. We pushed `linux/amd64`, `linux/arm64` and `windows/amd64` for each type of image. +- `ghcr.io/apache/skywalking-banyandb:-testing` - The testing version of the BanyanDB. It contains the Web UI and the `bydbctl`. We pushed `linux/amd64` and `linux/arm64` for each type of image. + ## Start a container in `standalone mode` The following commands pull the docker image and run the BanyanDB on Docker. Replace `latest` with the version of the BanyanDB you want to run. - pull the image @@ -21,3 +42,49 @@ The BanyanDB server would be listening on the `0.0.0.0:17912` to access gRPC req At the same time, the BanyanDB server would be listening on the `0.0.0.0:17913` to access HTTP requests. if no errors occurred. The HTTP server is used for CLI and Web UI. The Web UI is hosted at `http://localhost:17913/`. + +## Build and Push the Custom Docker image + +The BanyanDB Docker image can be built from the source code. You can build the Docker image by running the following commands: + +```shell +make generate +make release +HUB= IMG_NAME= TAG= make docker.build +``` + +The `make release` command builds binaries and generates the necessary files for building the Docker image. The `make docker.build` command builds the Docker image with the architecture aligned with the host machine. + +`HUB` is the Docker Hub username or the Docker Hub organization name. `IMG_NAME` is the Docker image name. `TAG` is the Docker image tag. + +Note: You can't build other OS or architecture images not identical to the host machine. That's because the docker build command fails to load the image after the build process. + +The `make docker.push` command pushes the Docker image to the Docker Hub. You need to log in to the Docker Hub before running this command. + +```shell +docker login +make generate +make release +make docker.push +``` + +If you want to push other OS or architecture images, you can run the following commands: + +```shell +docker login +make generate +TARGET_OS=linux PLATFORMS=linux/amd64,linux/arm64 make release +PLATFORMS=linux/amd64,linux/arm64 make docker.push +``` + +The `TARGET_OS` environment variable specifies the target OS. The `PLATFORMS` environment variable specifies the target architectures. The `PLATFORMS` environment variable is a comma-separated list of the target architectures. + +If you want to build and publish slim images, you can run the following commands: + +```shell +docker login +make generate +make release +BINARYTYPE=slim make docker.build +BINARYTYPE=slim make docker.push +``` diff --git a/docs/interacting/bydbctl/query/filter-operation.md b/docs/interacting/bydbctl/query/filter-operation.md index 7283c7e52..76c6423e3 100644 --- a/docs/interacting/bydbctl/query/filter-operation.md +++ b/docs/interacting/bydbctl/query/filter-operation.md @@ -65,6 +65,41 @@ criteria: value: "us" ``` +You can set a `match_option` to control the behavior of the match operation. The following are the available options: + +- `analyzer`: The analyzer to use for the match operation. If not set, the analyzer defined in the index rule will be used. Available options are defined in the [IndexRules](../schema/index-rule.md). +- `operator`: The operator to use for the match operation. The default value is `OPERATOR_OR`. Available options are `OPERATOR_OR` and `OPERATOR_AND`. + +If you want to use a different analyzer and operator, you can set the `match_option` as follows: + +```shell +criteria: + condition: + name: "name" + op: "BINARY_OP_MATCH" + value: + str: + value: "service-1" + match_option: + analyzer: "url" + operator: "OPERATOR_AND" +``` + +Considering the data with the following tags: + +```shell +{ + "name": "service-1" +} +{ + "name": "service-2" +} +``` + +The above query will return the data with the tag `name` that contains both `service` and `1`, which is `service-1`. + +If you set the `operator` to `OPERATOR_OR`, the query will return the data with the tag `name` that contains either `service` or `1`, which is `service-1` and `service-2`. + ## [LogicalExpression.LogicalOp](../../../api-reference.md#logicalexpressionlogicalop) Logical operation is used to combine multiple conditions. diff --git a/docs/interacting/bydbctl/schema/index-rule.md b/docs/interacting/bydbctl/schema/index-rule.md index c15d8ff42..9f5cc41f0 100644 --- a/docs/interacting/bydbctl/schema/index-rule.md +++ b/docs/interacting/bydbctl/schema/index-rule.md @@ -53,8 +53,8 @@ EOF This YAML creates an index rule which uses the tag `trace_id` to generate a `TYPE_INVERTED` index. -The `analyzer` field is optional. If it is not set, the default value is `ANALYZER_UNSPECIFIED`. -We can set it to `ANALYZER_KEYWORD` to specify the analyzer. More analyzers can refer to the [API Reference](../../../api-reference.md#indexruleanalyzer). +The `analyzer` field is optional. If it is not set, the default value is an empty string. +We can set it to `url` to specify the analyzer. More analyzers can refer to the [API Reference](../../../api-reference.md#indexruleanalyzer). ```shell bydbctl indexRule create -f - < 1 { bq := bluge.NewBooleanQuery() bq.AddShould(qs...) bq.SetMinShould(1) primaryQuery = bq + n = newShouldNode() + for i := range nodes { + n.(*shouldNode).Append(nodes[i]) + } } else { primaryQuery = qs[0] + n = nodes[0] } query := bluge.NewBooleanQuery().AddMust(primaryQuery) node := newMustNode() - node.Append(primaryNode) + node.Append(n) if secondaryQuery != nil && secondaryQuery.(*queryNode).query != nil { query.AddMust(secondaryQuery.(*queryNode).query) node.Append(secondaryQuery.(*queryNode).node) diff --git a/pkg/index/inverted/inverted_series_test.go b/pkg/index/inverted/inverted_series_test.go index 647189d9a..44fe96716 100644 --- a/pkg/index/inverted/inverted_series_test.go +++ b/pkg/index/inverted/inverted_series_test.go @@ -192,6 +192,7 @@ func TestStore_Search(t *testing.T) { } t.Run(name, func(t *testing.T) { query, err := s.BuildQuery(matchers, nil) + require.NotEmpty(t, query.String()) require.NoError(t, err) got, err := s.Search(context.Background(), tt.projection, query) require.NoError(t, err) @@ -282,6 +283,7 @@ func TestStore_SearchWildcard(t *testing.T) { }, }, nil) require.NoError(t, err) + require.NotEmpty(t, query.String()) got, err := s.Search(context.Background(), tt.projection, query) require.NoError(t, err) assert.ElementsMatch(t, tt.want, got) @@ -349,6 +351,7 @@ func TestStore_SearchPrefix(t *testing.T) { }, }, nil) require.NoError(t, err) + require.NotEmpty(t, query.String()) got, err := s.Search(context.Background(), tt.projection, query) require.NoError(t, err) assert.ElementsMatch(t, tt.want, got) diff --git a/pkg/index/inverted/inverted_test.go b/pkg/index/inverted/inverted_test.go index 07b7ffa73..58b086ef8 100644 --- a/pkg/index/inverted/inverted_test.go +++ b/pkg/index/inverted/inverted_test.go @@ -25,7 +25,7 @@ import ( "github.com/stretchr/testify/require" "github.com/apache/skywalking-banyandb/api/common" - databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1" + modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1" "github.com/apache/skywalking-banyandb/pkg/index" "github.com/apache/skywalking-banyandb/pkg/index/posting" "github.com/apache/skywalking-banyandb/pkg/index/posting/roaring" @@ -51,14 +51,15 @@ func TestStore_Match(t *testing.T) { // http_method IndexRuleID: 6, SeriesID: common.SeriesID(11), - Analyzer: databasev1.IndexRule_ANALYZER_SIMPLE, + Analyzer: index.AnalyzerURL, } setup(tester, s, serviceName) tests := []struct { - want posting.List - matches []string - wantErr bool + want posting.List + matches []string + operator modelv1.Condition_MatchOption_Operator + wantErr bool }{ { matches: []string{"root"}, @@ -76,10 +77,20 @@ func TestStore_Match(t *testing.T) { matches: []string{"/root/product"}, want: roaring.NewPostingListWithInitialData(1, 2), }, + { + matches: []string{"/root/product"}, + operator: modelv1.Condition_MatchOption_OPERATOR_AND, + want: roaring.NewPostingListWithInitialData(2), + }, { matches: []string{"/product/order"}, want: roaring.NewPostingListWithInitialData(1, 2, 3), }, + { + matches: []string{"/product/order"}, + operator: modelv1.Condition_MatchOption_OPERATOR_AND, + want: roaring.NewPostingListWithInitialData(1), + }, { matches: []string{"GET"}, want: roaring.NewPostingListWithInitialData(1, 2), @@ -116,12 +127,22 @@ func TestStore_Match(t *testing.T) { matches: []string{"test"}, want: roaring.NewPostingListWithInitialData(), }, + { + matches: []string{"v1"}, + want: roaring.NewPostingListWithInitialData(4), + }, + { + matches: []string{"v2"}, + want: roaring.NewPostingListWithInitialData(5), + }, } for _, tt := range tests { name := strings.Join(tt.matches, "-") t.Run(name, func(t *testing.T) { tester := assert.New(t) - list, err := s.Match(serviceName, tt.matches) + list, err := s.Match(serviceName, tt.matches, &modelv1.Condition_MatchOption{ + Operator: tt.operator, + }) if tt.wantErr { tester.Error(err) return @@ -148,14 +169,15 @@ func TestStore_SeriesMatch(t *testing.T) { serviceName := index.FieldKey{ // http_method IndexRuleID: 6, - Analyzer: databasev1.IndexRule_ANALYZER_SIMPLE, + Analyzer: index.AnalyzerURL, } setupSeries(tester, s, serviceName) tests := []struct { - want posting.List - matches []string - wantErr bool + want posting.List + matches []string + operator modelv1.Condition_MatchOption_Operator + wantErr bool }{ { matches: []string{"test"}, @@ -173,7 +195,9 @@ func TestStore_SeriesMatch(t *testing.T) { for _, tt := range tests { name := strings.Join(tt.matches, " and ") t.Run(name, func(t *testing.T) { - list, err := s.Match(serviceName, tt.matches) + list, err := s.Match(serviceName, tt.matches, &modelv1.Condition_MatchOption{ + Operator: tt.operator, + }) if tt.wantErr { tester.Error(err) return @@ -209,6 +233,20 @@ func setup(tester *require.Assertions, s index.Store, serviceName index.FieldKey }}, DocID: 3, }, + index.Document{ + Fields: []index.Field{{ + Key: serviceName, + Term: []byte("/svc1/v1/user"), + }}, + DocID: 4, + }, + index.Document{ + Fields: []index.Field{{ + Key: serviceName, + Term: []byte("/svc1/v2/user"), + }}, + DocID: 5, + }, ) tester.NoError(s.Batch(batch)) } diff --git a/pkg/index/inverted/metrics.go b/pkg/index/inverted/metrics.go index 6816b90e8..98b6d7a3d 100644 --- a/pkg/index/inverted/metrics.go +++ b/pkg/index/inverted/metrics.go @@ -112,6 +112,7 @@ func (s *store) CollectMetrics(labelValues ...string) { if s.metrics == nil { return } + // fixme: data race here status := s.writer.Status() s.metrics.totalUpdates.Set(float64(status.TotUpdates), labelValues...) s.metrics.totalDeletes.Set(float64(status.TotDeletes), labelValues...) diff --git a/pkg/index/inverted/query.go b/pkg/index/inverted/query.go index b34fd7195..f44873528 100644 --- a/pkg/index/inverted/query.go +++ b/pkg/index/inverted/query.go @@ -183,7 +183,8 @@ func parseConditionToQuery(cond *modelv1.Condition, indexRule *databasev1.IndexR node := newTermNode(str, indexRule) return &queryNode{query, node}, [][]*modelv1.TagValue{entity}, false, nil case modelv1.Condition_BINARY_OP_MATCH: - query := bluge.NewMatchQuery(term).SetField(field).SetAnalyzer(Analyzers[indexRule.Analyzer]) + analyzer, operator := getMatchOptions(indexRule.Analyzer, cond.MatchOption) + query := bluge.NewMatchQuery(term).SetField(field).SetAnalyzer(analyzer).SetOperator(operator) node := newMatchNode(str, indexRule) return &queryNode{query, node}, [][]*modelv1.TagValue{entity}, false, nil case modelv1.Condition_BINARY_OP_NE: @@ -335,11 +336,11 @@ type termRangeInclusiveNode struct { maxInclusive bool } -func newTermRangeInclusiveNode(min, max string, minInclusive, maxInclusive bool, indexRule *databasev1.IndexRule) *termRangeInclusiveNode { +func newTermRangeInclusiveNode(minVal, maxVal string, minInclusive, maxInclusive bool, indexRule *databasev1.IndexRule) *termRangeInclusiveNode { return &termRangeInclusiveNode{ indexRule: indexRule, - min: min, - max: max, + min: minVal, + max: maxVal, minInclusive: minInclusive, maxInclusive: maxInclusive, } @@ -361,7 +362,9 @@ func (t *termRangeInclusiveNode) MarshalJSON() ([]byte, error) { builder.WriteString(")") } inner["range"] = builder.String() - inner["index"] = t.indexRule.Metadata.Name + ":" + t.indexRule.Metadata.Group + if t.indexRule != nil { + inner["index"] = t.indexRule.Metadata.Name + ":" + t.indexRule.Metadata.Group + } data := make(map[string]interface{}, 1) data["termRangeInclusive"] = inner return json.Marshal(data) @@ -385,7 +388,9 @@ func newTermNode(term string, indexRule *databasev1.IndexRule) *termNode { func (t *termNode) MarshalJSON() ([]byte, error) { inner := make(map[string]interface{}, 1) - inner["index"] = t.indexRule.Metadata.Name + ":" + t.indexRule.Metadata.Group + if t.indexRule != nil { + inner["index"] = t.indexRule.Metadata.Name + ":" + t.indexRule.Metadata.Group + } inner["value"] = t.term data := make(map[string]interface{}, 1) data["term"] = inner @@ -412,7 +417,7 @@ func (m *matchNode) MarshalJSON() ([]byte, error) { inner := make(map[string]interface{}, 1) inner["index"] = m.indexRule.Metadata.Name + ":" + m.indexRule.Metadata.Group inner["value"] = m.match - inner["analyzer"] = databasev1.IndexRule_Analyzer_name[int32(m.indexRule.Analyzer)] + inner["analyzer"] = m.indexRule.Analyzer data := make(map[string]interface{}, 1) data["match"] = inner return json.Marshal(data) @@ -423,23 +428,18 @@ func (m *matchNode) String() string { } type prefixNode struct { - indexRule *databasev1.IndexRule - prefix string + prefix string } -func newPrefixNode(prefix string, indexRule *databasev1.IndexRule) *prefixNode { +func newPrefixNode(prefix string) *prefixNode { return &prefixNode{ - indexRule: indexRule, - prefix: prefix, + prefix: prefix, } } func (m *prefixNode) MarshalJSON() ([]byte, error) { - inner := make(map[string]interface{}, 1) - inner["index"] = m.indexRule.Metadata.Name + ":" + m.indexRule.Metadata.Group - inner["value"] = m.prefix data := make(map[string]interface{}, 1) - data["prefix"] = inner + data["prefix"] = m.prefix return json.Marshal(data) } @@ -448,23 +448,18 @@ func (m *prefixNode) String() string { } type wildcardNode struct { - indexRule *databasev1.IndexRule - wildcard string + wildcard string } -func newWildcardNode(wildcard string, indexRule *databasev1.IndexRule) *wildcardNode { +func newWildcardNode(wildcard string) *wildcardNode { return &wildcardNode{ - indexRule: indexRule, - wildcard: wildcard, + wildcard: wildcard, } } func (m *wildcardNode) MarshalJSON() ([]byte, error) { - inner := make(map[string]interface{}, 1) - inner["index"] = m.indexRule.Metadata.Name + ":" + m.indexRule.Metadata.Group - inner["value"] = m.wildcard data := make(map[string]interface{}, 1) - data["wildcard"] = inner + data["wildcard"] = m.wildcard return json.Marshal(data) } diff --git a/pkg/index/posting/roaring/roaring.go b/pkg/index/posting/roaring/roaring.go index 5143f273c..65d101eef 100644 --- a/pkg/index/posting/roaring/roaring.go +++ b/pkg/index/posting/roaring/roaring.go @@ -173,15 +173,15 @@ func (p *postingsList) AddIterator(iter posting.Iterator) error { return nil } -func (p *postingsList) AddRange(min, max uint64) error { - for i := min; i < max; i++ { +func (p *postingsList) AddRange(minVal, maxVal uint64) error { + for i := minVal; i < maxVal; i++ { p.bitmap.Add(i) } return nil } -func (p *postingsList) RemoveRange(min, max uint64) error { - for i := min; i < max; i++ { +func (p *postingsList) RemoveRange(minVal, maxVal uint64) error { + for i := minVal; i < maxVal; i++ { p.bitmap.Remove(i) } return nil diff --git a/pkg/query/logical/measure/measure_plan_distributed.go b/pkg/query/logical/measure/measure_plan_distributed.go index db4d75821..54280489f 100644 --- a/pkg/query/logical/measure/measure_plan_distributed.go +++ b/pkg/query/logical/measure/measure_plan_distributed.go @@ -219,8 +219,8 @@ func (t *distributedPlan) Schema() logical.Schema { return t.s } -func (t *distributedPlan) Limit(max int) { - t.maxDataPointsSize = uint32(max) +func (t *distributedPlan) Limit(maxVal int) { + t.maxDataPointsSize = uint32(maxVal) } var _ sort.Comparable = (*comparableDataPoint)(nil) diff --git a/pkg/query/logical/optimizer.go b/pkg/query/logical/optimizer.go index 4ee752b74..a087cdbcb 100644 --- a/pkg/query/logical/optimizer.go +++ b/pkg/query/logical/optimizer.go @@ -89,8 +89,8 @@ type PushDownMaxSize struct { } // NewPushDownMaxSize returns a new PushDownMaxSize. -func NewPushDownMaxSize(max int) PushDownMaxSize { - return PushDownMaxSize{max: max} +func NewPushDownMaxSize(maxVal int) PushDownMaxSize { + return PushDownMaxSize{max: maxVal} } // Optimize a Plan by pushing down the max volume. diff --git a/pkg/query/logical/parser.go b/pkg/query/logical/parser.go index 68f8ad47c..b4769e8cb 100644 --- a/pkg/query/logical/parser.go +++ b/pkg/query/logical/parser.go @@ -28,7 +28,7 @@ import ( func ParseExprOrEntity(entityDict map[string]int, entity []*modelv1.TagValue, cond *modelv1.Condition) (LiteralExpr, [][]*modelv1.TagValue, error) { entityIdx, ok := entityDict[cond.Name] if ok && cond.Op != modelv1.Condition_BINARY_OP_EQ && cond.Op != modelv1.Condition_BINARY_OP_IN { - return nil, nil, errors.WithMessagef(ErrUnsupportedConditionOp, "tag belongs to the entity only supports EQ or IN operation in condition(%v)", cond) + ok = false } switch v := cond.Value.Value.(type) { case *modelv1.TagValue_Str: diff --git a/pkg/query/logical/stream/index_filter.go b/pkg/query/logical/stream/index_filter.go index 533000f13..fa8852b62 100644 --- a/pkg/query/logical/stream/index_filter.go +++ b/pkg/query/logical/stream/index_filter.go @@ -126,7 +126,7 @@ func parseConditionToFilter(cond *modelv1.Condition, indexRule *databasev1.Index case modelv1.Condition_BINARY_OP_EQ: return newEq(indexRule, expr), [][]*modelv1.TagValue{entity}, nil case modelv1.Condition_BINARY_OP_MATCH: - return newMatch(indexRule, expr), [][]*modelv1.TagValue{entity}, nil + return newMatch(indexRule, expr, cond.MatchOption), [][]*modelv1.TagValue{entity}, nil case modelv1.Condition_BINARY_OP_NE: return newNot(indexRule, newEq(indexRule, expr)), [][]*modelv1.TagValue{entity}, nil case modelv1.Condition_BINARY_OP_HAVING: @@ -409,14 +409,16 @@ func (eq *eq) String() string { type match struct { *leaf + opts *modelv1.Condition_MatchOption } -func newMatch(indexRule *databasev1.IndexRule, values logical.LiteralExpr) *match { +func newMatch(indexRule *databasev1.IndexRule, values logical.LiteralExpr, opts *modelv1.Condition_MatchOption) *match { return &match{ leaf: &leaf{ Key: newFieldKey(indexRule), Expr: values, }, + opts: opts, } } @@ -433,6 +435,7 @@ func (match *match) Execute(searcher index.GetSearcher, seriesID common.SeriesID return s.Match( match.Key.toIndex(seriesID), matches, + match.opts, ) } diff --git a/pkg/query/logical/stream/stream_plan_distributed.go b/pkg/query/logical/stream/stream_plan_distributed.go index 6de4ce5d2..cf8de2b21 100644 --- a/pkg/query/logical/stream/stream_plan_distributed.go +++ b/pkg/query/logical/stream/stream_plan_distributed.go @@ -194,8 +194,8 @@ func (t *distributedPlan) Schema() logical.Schema { return t.s } -func (t *distributedPlan) Limit(max int) { - t.maxElementSize = uint32(max) +func (t *distributedPlan) Limit(maxVal int) { + t.maxElementSize = uint32(maxVal) } var _ sort.Comparable = (*comparableElement)(nil) diff --git a/pkg/query/logical/stream/stream_plan_indexscan_local.go b/pkg/query/logical/stream/stream_plan_indexscan_local.go index 89bafe984..49723340f 100644 --- a/pkg/query/logical/stream/stream_plan_indexscan_local.go +++ b/pkg/query/logical/stream/stream_plan_indexscan_local.go @@ -64,8 +64,8 @@ func (i *localIndexScan) Close() { } } -func (i *localIndexScan) Limit(max int) { - i.maxElementSize = max +func (i *localIndexScan) Limit(maxVal int) { + i.maxElementSize = maxVal } func (i *localIndexScan) Sort(order *logical.OrderBy) { @@ -113,7 +113,7 @@ func (i *localIndexScan) Children() []logical.Plan { } func (i *localIndexScan) Schema() logical.Schema { - if i.projectionTagRefs == nil || len(i.projectionTagRefs) == 0 { + if len(i.projectionTagRefs) == 0 { return i.schema } return i.schema.ProjTags(i.projectionTagRefs...) diff --git a/pkg/test/measure/testdata/index_rule_bindings/endpoint_traffic.json b/pkg/test/measure/testdata/index_rule_bindings/endpoint_traffic.json new file mode 100644 index 000000000..2633d4a54 --- /dev/null +++ b/pkg/test/measure/testdata/index_rule_bindings/endpoint_traffic.json @@ -0,0 +1,16 @@ +{ + "metadata": { + "name": "endpoint_traffic", + "group": "sw_metric" + }, + "rules": [ + "endpoint_name" + ], + "subject": { + "catalog": "CATALOG_MEASURE", + "name": "endpoint_traffic" + }, + "begin_at": "2021-04-15T01:30:15.01Z", + "expire_at": "2121-04-15T01:30:15.01Z", + "updated_at": "2021-04-15T01:30:15.01Z" +} \ No newline at end of file diff --git a/pkg/test/measure/testdata/index_rules/endpoint_name.json b/pkg/test/measure/testdata/index_rules/endpoint_name.json new file mode 100644 index 000000000..b75806a7e --- /dev/null +++ b/pkg/test/measure/testdata/index_rules/endpoint_name.json @@ -0,0 +1,13 @@ +{ + "metadata": { + "id": 5, + "name": "endpoint_name", + "group": "sw_metric" + }, + "tags": [ + "endpoint_name" + ], + "type": "TYPE_INVERTED", + "analyzer": "url", + "updated_at": "2021-04-15T01:30:15.01Z" +} \ No newline at end of file diff --git a/pkg/test/measure/testdata/index_rules/searchable_name.json b/pkg/test/measure/testdata/index_rules/searchable_name.json index afbc37bf9..73c3a2f26 100644 --- a/pkg/test/measure/testdata/index_rules/searchable_name.json +++ b/pkg/test/measure/testdata/index_rules/searchable_name.json @@ -8,6 +8,6 @@ "name" ], "type": "TYPE_INVERTED", - "analyzer": "ANALYZER_SIMPLE", + "analyzer": "url", "updated_at": "2021-04-15T01:30:15.01Z" } \ No newline at end of file diff --git a/pkg/test/measure/testdata/measures/endpoint_traffic.json b/pkg/test/measure/testdata/measures/endpoint_traffic.json new file mode 100644 index 000000000..2c240557b --- /dev/null +++ b/pkg/test/measure/testdata/measures/endpoint_traffic.json @@ -0,0 +1,28 @@ +{ + "metadata": { + "name": "endpoint_traffic", + "group": "sw_metric" + }, + "tag_families": [ + { + "name": "default", + "tags": [ + { + "name": "service_id", + "type": "TAG_TYPE_STRING" + }, + { + "name": "endpoint_name", + "type": "TAG_TYPE_STRING" + } + ] + } + ], + "entity": { + "tag_names": [ + "service_id", + "endpoint_name" + ] + }, + "updated_at": "2024-04-15T01:30:15.01Z" +} \ No newline at end of file diff --git a/pkg/test/metric/analysis.go b/pkg/test/metric/analysis.go index e94f5d336..22c1a261b 100644 --- a/pkg/test/metric/analysis.go +++ b/pkg/test/metric/analysis.go @@ -103,8 +103,8 @@ func analyzeMetrics() { } // Calculate the statistics. - min, _ := stats.Min(data) - max, _ := stats.Max(data) + minVal, _ := stats.Min(data) + maxVal, _ := stats.Max(data) mean, _ := stats.Mean(data) median, _ := stats.Median(data) p90, _ := stats.Percentile(data, 90) @@ -113,7 +113,7 @@ func analyzeMetrics() { p99, _ := stats.Percentile(data, 99) // Write the results to another file and print them to the console. - writeResults(resultsFile, metricsToCollect[i], min, max, mean, median, p90, p95, p98, p99) + writeResults(resultsFile, metricsToCollect[i], minVal, maxVal, mean, median, p90, p95, p98, p99) } } @@ -126,9 +126,9 @@ func writeHeader(file *os.File) { } } -func writeResults(file *os.File, metricName string, min, max, mean, median, p90, p95, p98, p99 float64) { +func writeResults(file *os.File, metricName string, minVal, maxVal, mean, median, p90, p95, p98, p99 float64) { results := fmt.Sprintf("%s, %f, %f, %f, %f, %f, %f, %f, %f\n", - metricName, min, max, mean, median, p90, p95, p98, p99) + metricName, minVal, maxVal, mean, median, p90, p95, p98, p99) _, err := file.WriteString(results) if err != nil { diff --git a/pkg/test/query/metric.go b/pkg/test/query/metric.go index a890a1189..0cfdfe746 100644 --- a/pkg/test/query/metric.go +++ b/pkg/test/query/metric.go @@ -25,6 +25,7 @@ import ( "sync" "time" + "github.com/apache/skywalking-cli/pkg/graphql/dependency" "github.com/apache/skywalking-cli/pkg/graphql/metrics" "github.com/apache/skywalking-cli/pkg/graphql/utils" "github.com/urfave/cli/v2" @@ -191,3 +192,64 @@ func sortMetrics(name, svc string, limit int, order api.Order, fs *flag.FlagSet) } return elapsed, nil } + +// Topology verifies the topology. +func Topology(basePath string, timeout time.Duration, groupNum int, fs *flag.FlagSet) { + basePath = path.Join(basePath, "topology") + err := os.MkdirAll(basePath, 0o755) + if err != nil { + panic(err) + } + stopCh := make(chan struct{}) + go func() { + time.Sleep(timeout) + close(stopCh) + }() + header := make([]string, groupNum) + for i := 0; i < groupNum; i++ { + header[i] = fmt.Sprintf("topology-%d", i) + } + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + collect(basePath, func() ([]float64, error) { + data := make([]float64, groupNum) + var subWg sync.WaitGroup + for i := 0; i < groupNum; i++ { + subWg.Add(1) + go func() { + defer subWg.Done() + d, err := globalTopology(fs) + if err != nil { + fmt.Printf("query topology error: %v \n", err) + } + data[i] = d.Seconds() + }() + } + subWg.Wait() + return data, nil + }, 500*time.Millisecond, stopCh) + analyze(header, basePath) + }() + wg.Wait() +} + +func globalTopology(fs *flag.FlagSet) (time.Duration, error) { + ctx := cli.NewContext(cli.NewApp(), fs, nil) + duration := api.Duration{ + Start: time.Now().Add(-200 * time.Minute).Format(utils.StepFormats[api.StepMinute]), + End: time.Now().Format(utils.StepFormats[api.StepMinute]), + Step: api.StepMinute, + } + start := time.Now() + result, err := dependency.GlobalTopologyWithoutLayer(ctx, duration) + elapsed := time.Since(start) + if err != nil { + return 0, err + } + if len(result.Nodes) < 1 { + return 0, fmt.Errorf("no result") + } + return elapsed, nil +} diff --git a/pkg/test/query/query.go b/pkg/test/query/query.go index 489cb0349..99034834a 100644 --- a/pkg/test/query/query.go +++ b/pkg/test/query/query.go @@ -91,14 +91,14 @@ func analyze(metricNames []string, rootPath string) { } // Calculate the statistics. - min, _ := stats.Min(data) - max, _ := stats.Max(data) + minVal, _ := stats.Min(data) + maxVal, _ := stats.Max(data) mean, _ := stats.Mean(data) median, _ := stats.Median(data) p95, _ := stats.Percentile(data, 95) // Write the results to another file and print them to the console. - writeResults(resultsFile, metricNames[i], min, max, mean, median, p95) + writeResults(resultsFile, metricNames[i], minVal, maxVal, mean, median, p95) } } @@ -111,9 +111,9 @@ func writeHeader(file *os.File) { } } -func writeResults(file *os.File, metricName string, min, max, mean, median, p95 float64) { +func writeResults(file *os.File, metricName string, minVal, maxVal, mean, median, p95 float64) { results := fmt.Sprintf("%s, %f, %f, %f, %f, %f\n", - metricName, min, max, mean, median, p95) + metricName, minVal, maxVal, mean, median, p95) _, err := file.WriteString(results) if err != nil { diff --git a/pkg/test/stream/testdata/index_rules/db.instance.json b/pkg/test/stream/testdata/index_rules/db.instance.json index 691a703e6..85c3c6ada 100644 --- a/pkg/test/stream/testdata/index_rules/db.instance.json +++ b/pkg/test/stream/testdata/index_rules/db.instance.json @@ -8,6 +8,6 @@ "db.instance" ], "type": "TYPE_INVERTED", - "analyzer": "ANALYZER_SIMPLE", + "analyzer": "url", "updated_at": "2021-04-15T01:30:15.01Z" } diff --git a/pkg/timestamp/range.go b/pkg/timestamp/range.go index 352b1449e..b0b92afdf 100644 --- a/pkg/timestamp/range.go +++ b/pkg/timestamp/range.go @@ -122,28 +122,28 @@ func NewTimeRangeDuration(start time.Time, duration time.Duration, includeStart, } // FindRange returns the indices of the first and last elements in a sorted 'timestamps' slice that are within the min and max range. -func FindRange[T int64 | uint64](timestamps []T, min, max T) (int, int, bool) { +func FindRange[T int64 | uint64](timestamps []T, minVal, maxVal T) (int, int, bool) { if len(timestamps) == 0 { return -1, -1, false } isAsc := timestamps[0] <= timestamps[len(timestamps)-1] - if isAsc && (timestamps[0] > max || timestamps[len(timestamps)-1] < min) { + if isAsc && (timestamps[0] > maxVal || timestamps[len(timestamps)-1] < minVal) { return -1, -1, false } - if !isAsc && (timestamps[0] < min || timestamps[len(timestamps)-1] > max) { + if !isAsc && (timestamps[0] < minVal || timestamps[len(timestamps)-1] > maxVal) { return -1, -1, false } start, end := -1, len(timestamps) for start < len(timestamps)-1 { start++ - if isAsc && timestamps[start] >= min || !isAsc && timestamps[start] <= max { + if isAsc && timestamps[start] >= minVal || !isAsc && timestamps[start] <= maxVal { break } } for end > 0 { end-- - if isAsc && timestamps[end] <= max || !isAsc && timestamps[end] >= min { + if isAsc && timestamps[end] <= maxVal || !isAsc && timestamps[end] >= minVal { break } } diff --git a/scripts/build/build.mk b/scripts/build/build.mk index 29f8ec507..899dfef0c 100644 --- a/scripts/build/build.mk +++ b/scripts/build/build.mk @@ -25,6 +25,7 @@ $(error The BINARIES variable should be set to the name binaries to produce) endif STATIC_BINARIES ?= $(addsuffix -static,$(BINARIES)) +SLIM_BINARIES ?= $(addsuffix -slim,$(BINARIES)) BUILD_DIR ?= build/bin TARGET_OS ?= linux OS := ${TARGET_OS} @@ -61,8 +62,19 @@ $(STATIC_BINARIES_GOBUILD_TARGET): $(BUILD_DIR)/$(OS)/%-static: $(BUILD_LOCK) $(call go_build_static_executable,,-s -w) @echo "Done building static $*" +SLIM_BINARIES_GOBUILD_TARGET_PATTERN := $(foreach goarch,$(GOBUILD_ARCHS),$(BUILD_DIR)/$(OS)/$(goarch)/$(NAME)-%-slim) +SLIM_BINARIES_GOBUILD_TARGET := $(foreach goarch,$(GOBUILD_ARCHS),$(addprefix $(BUILD_DIR)/$(OS)/$(goarch)/,$(SLIM_BINARIES))) +$(SLIM_BINARIES): $(NAME)-%-slim: $(SLIM_BINARIES_GOBUILD_TARGET_PATTERN) +$(SLIM_BINARIES_GOBUILD_TARGET): $(BUILD_DIR)/$(OS)/%-slim: $(BUILD_LOCK) + $(call set_build_package,$*,$@) + @echo "Building slim $*" + $(MAKE) prepare-build + $(eval BUILD_TAGS := $(BUILD_TAGS) slim) + $(call go_build_static_executable,,-s -w) + @echo "Done building static $*" + .PHONY: release -release: $(STATIC_BINARIES) ## Build the release binaries +release: $(STATIC_BINARIES) ## Build the release binaries .PHONY: clean-build clean-build: ## Clean all artifacts @@ -74,7 +86,7 @@ clean-build: ## Clean all artifacts # be rebuilt again. $(BUILD_LOCK): @echo "cleaning up stale build artifacts..." - $(MAKE) clean + $(MAKE) clean-build mkdir -p $(BUILD_DIR) touch $@ diff --git a/scripts/build/docker.mk b/scripts/build/docker.mk index a3c6de5fc..7f5626a9b 100644 --- a/scripts/build/docker.mk +++ b/scripts/build/docker.mk @@ -27,6 +27,12 @@ endif # The tag of the docker image. The default value if latest. TAG ?= latest +BINARYTYPE ?= static + +ifeq ($(BINARYTYPE),slim) + TAG := $(TAG)-slim +endif + IMG := $(HUB)/$(IMG_NAME):$(TAG) # Disable cache in CI environment @@ -42,5 +48,5 @@ docker.push: DOCKER_TYPE = "Push" docker docker.push: @echo "$(DOCKER_TYPE) $(IMG) with platform $(PLATFORMS)" @pwd - time docker buildx build $(DOCKER_BUILD_ARGS) --platform $(PLATFORMS) $(LOAD_OR_PUSH) -t $(IMG) -f Dockerfile --provenance=false . + time docker buildx build $(DOCKER_BUILD_ARGS) --platform $(PLATFORMS) $(LOAD_OR_PUSH) -t $(IMG) -f Dockerfile --provenance=false --build-arg BINARYTYPE=$(BINARYTYPE) . diff --git a/scripts/build/lint-api.mk b/scripts/build/lint-api.mk index 5bc3bba8c..0d9e684c9 100644 --- a/scripts/build/lint-api.mk +++ b/scripts/build/lint-api.mk @@ -21,7 +21,7 @@ include $(mk_dir)lint-bin.mk ##@ Code quality targets .PHONY: lint -lint: $(LINTER) $(REVIVE) ## Run all linters +lint: $(BUF) $(LINTER) $(REVIVE) ## Run all linters @PATH=$(tool_bin):$(proto_dir) $(BUF) lint $(LINTER) run -v --config $(root_dir)/.golangci.yml ./... && \ $(REVIVE) -config $(root_dir)/revive.toml -formatter friendly ./... diff --git a/scripts/build/lint.mk b/scripts/build/lint.mk index 394161c07..49dd2c98b 100644 --- a/scripts/build/lint.mk +++ b/scripts/build/lint.mk @@ -20,8 +20,6 @@ include $(mk_dir)lint-bin.mk ##@ Code quality targets - - .PHONY: lint lint: $(LINTER) $(REVIVE) ## Run all linters $(LINTER) run -v --config $(root_dir)/.golangci.yml --timeout 10m ./... && \ diff --git a/scripts/build/vendor.mk b/scripts/build/vendor.mk index 345f69efe..2823aaf86 100644 --- a/scripts/build/vendor.mk +++ b/scripts/build/vendor.mk @@ -22,4 +22,4 @@ .PHONY: vendor-update vendor-update: ## Update vendors go get -u -d ./... - go mod tidy -compat=1.22 + go mod tidy -compat=1.23 diff --git a/scripts/build/version.mk b/scripts/build/version.mk index 5e2fc5de3..45fa61221 100644 --- a/scripts/build/version.mk +++ b/scripts/build/version.mk @@ -16,17 +16,19 @@ # under the License. # -BUF_VERSION := v1.31.0 -PROTOC_GEN_GO_VERSION := v1.33.0 -PROTOC_GEN_GO_GRPC_VERSION := v1.3.0 +BUF_VERSION := v1.40.1 +PROTOC_GEN_GO_VERSION := v1.34.2 +PROTOC_GEN_GO_GRPC_VERSION := v1.5.1 PROTOC_GEN_DOC_VERSION := v1.5.1 -GRPC_GATEWAY_VERSION := v2.19.1 -PROTOC_GEN_VALIDATE_VERSION := v1.0.4 +GRPC_GATEWAY_VERSION := v2.22.0 +PROTOC_GEN_VALIDATE_VERSION := v1.1.0 -GOLANGCI_LINT_VERSION := v1.57.2 -REVIVE_VERSION := v1.3.7 -LICENSE_EYE_VERSION := cd7b195c51fd3d6ad52afceb760719ddc6b3ee91 +GOLANGCI_LINT_VERSION := v1.61.0 +REVIVE_VERSION := v1.3.9 +LICENSE_EYE_VERSION := 3ea9df11bb3a5a85665377d1fd10c02edecf2c40 -MOCKGEN_VERSION := v0.3.0 +MOCKGEN_VERSION := v0.4.0 -GINKGO_VERSION := v2.17.2 \ No newline at end of file +GINKGO_VERSION := v2.20.2 + +GOVULNCHECK_VERSION := v1.1.3 diff --git a/scripts/build/vuln.mk b/scripts/build/vuln.mk new file mode 100644 index 000000000..3c6dcac76 --- /dev/null +++ b/scripts/build/vuln.mk @@ -0,0 +1,5 @@ +GOVULNCHECK := $(tool_bin)/govulncheck +$(GOVULNCHECK): + @echo "Install govulncheck..." + @mkdir -p $(tool_bin) + @GOBIN=$(tool_bin) go install golang.org/x/vuln/cmd/govulncheck@$(GOVULNCHECK_VERSION) diff --git a/scripts/ci/check/version_test.go b/scripts/ci/check/version_test.go index 58ff9a370..26555a591 100644 --- a/scripts/ci/check/version_test.go +++ b/scripts/ci/check/version_test.go @@ -31,7 +31,7 @@ import ( ) const ( - GoVersion = "1.22" + GoVersion = "1.23.0" CPUType = 8 ) @@ -71,9 +71,11 @@ func TestGoVersion(t *testing.T) { m := parseGoMod(t, root+"/go.mod") - require.Equal(t, expectedMajorMinor, m.Go.Version, + goMajorVersion, _ := splitVersion(m.Go.Version) + + require.Equal(t, expectedMajorMinor, goMajorVersion, "go.mod version mismatch: current[%s], want[%s]", - m.Go.Version, expectedMajorMinor) + goMajorVersion, expectedMajorMinor) } func splitVersion(v string) (string, string) { diff --git a/scripts/push-release.sh b/scripts/push-release.sh new file mode 100755 index 000000000..4c41f32ec --- /dev/null +++ b/scripts/push-release.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +set -ex + +if [ "$VERSION" == "" ]; then + echo "VERSION environment variable not found, Please setting the VERSION." + echo "For example: export VERSION=1.0.0" + exit 1 +fi + +VERSION=${VERSION} +TAG_NAME=v${VERSION} +PRODUCT_NAME="skywalking-banyandb-${VERSION}" + +echo "Release version "${VERSION} +echo "Source tag "${TAG_NAME} + +SCRIPTDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +ROOTDIR=${SCRIPTDIR}/.. +BUILDDIR=${ROOTDIR}/build + +pushd ${BUILDDIR} +trap 'popd' EXIT + +rm -rf skywalking + +svn co https://dist.apache.org/repos/dist/dev/skywalking/ +mkdir -p skywalking/banyandb/"$VERSION" +cp ${PRODUCT_NAME}-*.tgz skywalking/banyandb/"$VERSION" +cp ${PRODUCT_NAME}-*.tgz.asc skywalking/banyandb/"$VERSION" +cp ${PRODUCT_NAME}-*.tgz.sha512 skywalking/banyandb/"$VERSION" + +cd skywalking/banyandb && svn add "$VERSION" && svn commit -m "Draft Apache SkyWalking BanyanDB release $VERSION" +cd "$VERSION" + +cat << EOF +========================================================================= +Subject: [VOTE] Release Apache SkyWalking BanyanDB version $VERSION + +Content: + +Hi the SkyWalking Community: +This is a call for vote to release Apache SkyWalking BanyanDB version $VERSION. + +Release notes: + + * https://github.com/apache/skywalking-banyandb/blob/v$VERSION/CHANGES.md + +Release Candidate: + + * https://dist.apache.org/repos/dist/dev/skywalking/banyandb/$VERSION + * sha512 checksums + - $(cat ${PRODUCT_NAME}-src.tgz.sha512) + - $(cat ${PRODUCT_NAME}-banyand.tgz.sha512) + - $(cat ${PRODUCT_NAME}-bydbctl.tgz.sha512) + +Release Tag : + + * (Git Tag) $TAG_NAME + +Release Commit Hash : + + * https://github.com/apache/skywalking-banyandb/tree/$(git rev-list -n 1 "$TAG_NAME") + +Keys to verify the Release Candidate : + + * https://dist.apache.org/repos/dist/release/skywalking/KEYS + +Guide to build the release from source : + + * https://github.com/apache/skywalking-banyandb/blob/v$VERSION/docs/installation/binaries.md#Build-From-Source + +Voting will start now and will remain open for at least 72 hours, all PMC members are required to give their votes. + +[ ] +1 Release this package. +[ ] +0 No opinion. +[ ] -1 Do not release this package because.... + +Thanks. + +[1] https://github.com/apache/skywalking/blob/master/docs/en/guides/How-to-release.md#vote-check +EOF diff --git a/scripts/release.sh b/scripts/release.sh index 0182a2f76..ab619fa48 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -24,7 +24,8 @@ BUILDDIR=${ROOTDIR}/build RELEASE_TAG=$(git describe --tags $(git rev-list --tags --max-count=1)) RELEASE_VERSION=${RELEASE_TAG#"v"} -SOURCE_FILE=${BUILDDIR}/skywalking-banyandb-${RELEASE_VERSION}-src.tgz +SOURCE_FILE_NAME=skywalking-banyandb-${RELEASE_VERSION}-src.tgz +SOURCE_FILE=${BUILDDIR}/${SOURCE_FILE_NAME} binary(){ if [ ! -f "${SOURCE_FILE}" ]; then @@ -34,8 +35,9 @@ binary(){ tmpdir=`mktemp -d` trap "rm -rf ${tmpdir}" EXIT pushd ${tmpdir} + trap 'popd' EXIT tar -xvf ${SOURCE_FILE} - make generate + make generate && make -C ui build TARGET_OS=linux PLATFORMS=linux/amd64,linux/arm64 make -C banyand release bindir=./build mkdir -p ${bindir}/bin @@ -57,7 +59,6 @@ binary(){ copy_binaries bydbctl # Package tar -czf ${BUILDDIR}/skywalking-banyandb-${RELEASE_VERSION}-bydbctl.tgz -C ${bindir} . - popd } copy_binaries() { @@ -67,14 +68,14 @@ copy_binaries() { # Extract os and arch from the path os_arch=$(echo ${binary} | awk -F'/' '{print $(NF-2)"/"$(NF-1)}') binary_name=$(basename ${binary}) - binary_name=${binary_name%-*-*} cp -Rfv ${binary} ${bindir}/bin/${binary_name}-${os_arch//\//-} done } source(){ # Package - mkdir -p ${BUILDDIR} + tmpdir=`mktemp -d` + trap "rm -rf ${tmpdir}" EXIT rm -rf ${SOURCE_FILE} pushd ${ROOTDIR} echo "RELEASE_VERSION=${RELEASE_VERSION}" > .env @@ -86,8 +87,11 @@ source(){ --exclude=".idea" \ --exclude=".vscode" \ --exclude="bin" \ - -czf ${SOURCE_FILE} \ + -czf ${tmpdir}/${SOURCE_FILE_NAME} \ . + + mkdir -p ${BUILDDIR} + mv ${tmpdir}/${SOURCE_FILE_NAME} ${BUILDDIR} popd } diff --git a/test/cases/init.go b/test/cases/init.go index 7341a96d3..7f32b753a 100644 --- a/test/cases/init.go +++ b/test/cases/init.go @@ -54,5 +54,6 @@ func Initialize(addr string, now time.Time) { casesmeasuredata.Write(conn, "service_latency_minute", "sw_metric", "service_latency_minute_data.json", now, interval) casesmeasuredata.Write(conn, "service_instance_latency_minute", "sw_metric", "service_instance_latency_minute_data.json", now, interval) casesmeasuredata.Write(conn, "service_instance_latency_minute", "sw_metric", "service_instance_latency_minute_data1.json", now.Add(1*time.Minute), interval) + casesmeasuredata.Write(conn, "endpoint_traffic", "sw_metric", "endpoint_traffic.json", now, interval) casesmeasuredata.Write(conn, "duplicated", "exception", "duplicated.json", now, 0) } diff --git a/test/cases/measure/data/data.go b/test/cases/measure/data/data.go index 3077c5108..8bd664f22 100644 --- a/test/cases/measure/data/data.go +++ b/test/cases/measure/data/data.go @@ -81,23 +81,33 @@ var VerifyFn = func(innerGm gm.Gomega, sharedContext helpers.SharedContext, args innerGm.Expect(resp.DataPoints[i].Sid).Should(gm.BeNumerically(">", 0)) } } - innerGm.Expect(cmp.Equal(resp, want, + success := innerGm.Expect(cmp.Equal(resp, want, protocmp.IgnoreUnknown(), protocmp.IgnoreFields(&measurev1.DataPoint{}, "timestamp"), protocmp.IgnoreFields(&measurev1.DataPoint{}, "version"), protocmp.IgnoreFields(&measurev1.DataPoint{}, "sid"), protocmp.Transform())). To(gm.BeTrue(), func() string { - j, err := protojson.Marshal(resp) + var j []byte + j, err = protojson.Marshal(resp) if err != nil { return err.Error() } - y, err := yaml.JSONToYAML(j) + var y []byte + y, err = yaml.JSONToYAML(j) if err != nil { return err.Error() } return string(y) }) + if !success { + return + } + query.Trace = true + resp, err = c.Query(ctx, query) + innerGm.Expect(err).NotTo(gm.HaveOccurred()) + innerGm.Expect(resp.Trace).NotTo(gm.BeNil()) + innerGm.Expect(resp.Trace.GetSpans()).NotTo(gm.BeEmpty()) } //go:embed testdata/*.json diff --git a/test/cases/measure/data/input/entity_match.yaml b/test/cases/measure/data/input/entity_match.yaml new file mode 100644 index 000000000..39a41e340 --- /dev/null +++ b/test/cases/measure/data/input/entity_match.yaml @@ -0,0 +1,43 @@ +# Licensed to Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright +# ownership. Apache Software Foundation (ASF) licenses this file to you under +# the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: "endpoint_traffic" +groups: ["sw_metric"] +tagProjection: + tagFamilies: + - name: "default" + tags: ["service_id", "endpoint_name"] +criteria: + le: + op: "LOGICAL_OP_AND" + right: + condition: + name: "endpoint_name" + op: "BINARY_OP_MATCH" + match_option: + operator: "OPERATOR_AND" + value: + str: + value: "endpoint-1" + left: + condition: + name: "service_id" + op: "BINARY_OP_EQ" + value: + str: + value: "service_1" + diff --git a/test/cases/measure/data/testdata/endpoint_traffic.json b/test/cases/measure/data/testdata/endpoint_traffic.json new file mode 100644 index 000000000..881908c32 --- /dev/null +++ b/test/cases/measure/data/testdata/endpoint_traffic.json @@ -0,0 +1,74 @@ +[ + { + "tag_families": [ + { + "tags": [ + { + "str": { + "value": "service_1" + } + }, + { + "str": { + "value": "/api/v1/endpoint-1" + } + } + ] + } + ] + }, + { + "tag_families": [ + { + "tags": [ + { + "str": { + "value": "service_1" + } + }, + { + "str": { + "value": "/api/v1/endpoint-2" + } + } + ] + } + ] + }, + { + "tag_families": [ + { + "tags": [ + { + "str": { + "value": "service_2" + } + }, + { + "str": { + "value": "/api/v1/endpoint-1" + } + } + ] + } + ] + }, + { + "tag_families": [ + { + "tags": [ + { + "str": { + "value": "service_2" + } + }, + { + "str": { + "value": "/api/v1/endpoint-2" + } + } + ] + } + ] + } +] \ No newline at end of file diff --git a/test/cases/measure/data/want/entity_match.yaml b/test/cases/measure/data/want/entity_match.yaml new file mode 100644 index 000000000..a66172410 --- /dev/null +++ b/test/cases/measure/data/want/entity_match.yaml @@ -0,0 +1,29 @@ +# Licensed to Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright +# ownership. Apache Software Foundation (ASF) licenses this file to you under +# the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +dataPoints: + - tagFamilies: + - name: default + tags: + - key: service_id + value: + str: + value: service_1 + - key: endpoint_name + value: + str: + value: /api/v1/endpoint-1 diff --git a/test/cases/measure/measure.go b/test/cases/measure/measure.go index 06b24498a..8f843105b 100644 --- a/test/cases/measure/measure.go +++ b/test/cases/measure/measure.go @@ -71,4 +71,5 @@ var _ = g.DescribeTable("Scanning Measures", verify, g.Entry("float64 aggregation:min", helpers.Args{Input: "float_agg_min", Duration: 25 * time.Minute, Offset: -20 * time.Minute}), g.Entry("all_latency", helpers.Args{Input: "all_latency", Duration: 25 * time.Minute, Offset: -20 * time.Minute}), g.Entry("duplicated in a part", helpers.Args{Input: "duplicated_part", Duration: 25 * time.Minute, Offset: -20 * time.Minute}), + g.Entry("match a tag belongs to the entity", helpers.Args{Input: "entity_match", Duration: 25 * time.Minute, Offset: -20 * time.Minute}), ) diff --git a/test/cases/stream/data/data.go b/test/cases/stream/data/data.go index 822d35b38..6701e1667 100644 --- a/test/cases/stream/data/data.go +++ b/test/cases/stream/data/data.go @@ -97,21 +97,31 @@ var VerifyFn = func(innerGm gm.Gomega, sharedContext helpers.SharedContext, args return strings.Compare(a.ElementId, b.ElementId) }) } - innerGm.Expect(cmp.Equal(resp, want, + success := innerGm.Expect(cmp.Equal(resp, want, protocmp.IgnoreUnknown(), protocmp.IgnoreFields(&streamv1.Element{}, "timestamp"), protocmp.Transform())). To(gm.BeTrue(), func() string { - j, err := protojson.Marshal(resp) + var j []byte + j, err = protojson.Marshal(resp) if err != nil { return err.Error() } - y, err := yaml.JSONToYAML(j) + var y []byte + y, err = yaml.JSONToYAML(j) if err != nil { return err.Error() } return string(y) }) + if !success { + return + } + query.Trace = true + resp, err = c.Query(ctx, query) + innerGm.Expect(err).NotTo(gm.HaveOccurred()) + innerGm.Expect(resp.Trace).NotTo(gm.BeNil()) + innerGm.Expect(resp.Trace.GetSpans()).NotTo(gm.BeEmpty()) } func loadData(stream streamv1.StreamService_WriteClient, metadata *commonv1.Metadata, dataFile string, baseTime time.Time, interval time.Duration) { diff --git a/test/cases/topn/data/data.go b/test/cases/topn/data/data.go index 1eb7fbb52..983be9c4d 100644 --- a/test/cases/topn/data/data.go +++ b/test/cases/topn/data/data.go @@ -67,19 +67,29 @@ var VerifyFn = func(innerGm gm.Gomega, sharedContext helpers.SharedContext, args innerGm.Expect(err).NotTo(gm.HaveOccurred()) want := &measurev1.TopNResponse{} helpers.UnmarshalYAML(ww, want) - innerGm.Expect(cmp.Equal(resp, want, + success := innerGm.Expect(cmp.Equal(resp, want, protocmp.IgnoreUnknown(), protocmp.IgnoreFields(&measurev1.TopNList{}, "timestamp"), protocmp.Transform())). To(gm.BeTrue(), func() string { - j, err := protojson.Marshal(resp) + var j []byte + j, err = protojson.Marshal(resp) if err != nil { return err.Error() } - y, err := yaml.JSONToYAML(j) + var y []byte + y, err = yaml.JSONToYAML(j) if err != nil { return err.Error() } return string(y) }) + if !success { + return + } + query.Trace = true + resp, err = c.TopN(ctx, query) + innerGm.Expect(err).NotTo(gm.HaveOccurred()) + innerGm.Expect(resp.Trace).NotTo(gm.BeNil()) + innerGm.Expect(resp.Trace.GetSpans()).NotTo(gm.BeEmpty()) } diff --git a/test/docker/Makefile b/test/docker/Makefile index e1c79ffae..01c71efd3 100644 --- a/test/docker/Makefile +++ b/test/docker/Makefile @@ -23,7 +23,7 @@ HUB ?= apache # The tag of the docker image. The default value if latest. TAG ?= latest -IMG := $(HUB)/skywalking-banyandb-test:$(TAG) +IMG := $(HUB)/skywalking-banyandb:$(TAG)-testing build: @echo "Building $(IMG)" diff --git a/test/e2e-v2/script/docker-compose/base-compose.yml b/test/e2e-v2/script/docker-compose/base-compose.yml index 2f1f78a26..fe30d45c1 100644 --- a/test/e2e-v2/script/docker-compose/base-compose.yml +++ b/test/e2e-v2/script/docker-compose/base-compose.yml @@ -20,7 +20,7 @@ services: extends: file: ../../../docker/base-compose.yml service: banyandb - image: "apache/skywalking-banyandb-test:${TAG}" + image: "apache/skywalking-banyandb:${TAG}-testing" networks: - e2e @@ -28,7 +28,7 @@ services: extends: file: ../../../docker/base-compose.yml service: liaison - image: "apache/skywalking-banyandb-test:${TAG}" + image: "apache/skywalking-banyandb:${TAG}-testing" networks: - e2e @@ -36,7 +36,7 @@ services: extends: file: ../../../docker/base-compose.yml service: data - image: "apache/skywalking-banyandb-test:${TAG}" + image: "apache/skywalking-banyandb:${TAG}-testing" networks: - e2e diff --git a/test/integration/load/load_suite_test.go b/test/integration/load/load_suite_test.go index 84dccc386..2a39e6a33 100644 --- a/test/integration/load/load_suite_test.go +++ b/test/integration/load/load_suite_test.go @@ -164,13 +164,13 @@ var _ = Describe("Load Test Suit", func() { }) func analysis(name string, data []float64) { - min, _ := stats.Min(data) - max, _ := stats.Max(data) + minVal, _ := stats.Min(data) + maxVal, _ := stats.Max(data) mean, _ := stats.Mean(data) median, _ := stats.Median(data) p90, _ := stats.Percentile(data, 90) p95, _ := stats.Percentile(data, 95) p98, _ := stats.Percentile(data, 98) p99, _ := stats.Percentile(data, 99) - logger.Infof("%s: min: %f, max: %f, mean: %f, median: %f, p90: %f, p95: %f, p98: %f, p99: %f\n", name, min, max, mean, median, p90, p95, p98, p99) + logger.Infof("%s: min: %f, max: %f, mean: %f, median: %f, p90: %f, p95: %f, p98: %f, p99: %f\n", name, minVal, maxVal, mean, median, p90, p95, p98, p99) } diff --git a/test/stress/istio/testdata/index-rules/measure-default-index-rule.yaml b/test/stress/istio/testdata/index-rules/measure-default-index-rule.yaml index cc95f2a3e..31c789bbb 100644 --- a/test/stress/istio/testdata/index-rules/measure-default-index-rule.yaml +++ b/test/stress/istio/testdata/index-rules/measure-default-index-rule.yaml @@ -1,4 +1,4 @@ -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "43" group: measure-default @@ -6,10 +6,10 @@ modRevision: "43" name: agent_id tags: - - agent_id + - agent_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "49" group: measure-default @@ -17,10 +17,10 @@ modRevision: "49" name: dest_endpoint tags: - - dest_endpoint + - dest_endpoint type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "62" group: measure-default @@ -28,10 +28,10 @@ modRevision: "62" name: dest_service_id tags: - - dest_service_id + - dest_service_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "63" group: measure-default @@ -39,10 +39,10 @@ modRevision: "63" name: dest_service_instance_id tags: - - dest_service_instance_id + - dest_service_instance_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "42" group: measure-default @@ -50,10 +50,10 @@ modRevision: "42" name: detect_type tags: - - detect_type + - detect_type type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "136" group: measure-default @@ -61,10 +61,10 @@ modRevision: "136" name: end_time tags: - - end_time + - end_time type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "131" group: measure-default @@ -72,10 +72,10 @@ modRevision: "131" name: endpoint tags: - - endpoint + - endpoint type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "21" group: measure-default @@ -83,10 +83,10 @@ modRevision: "21" name: id tags: - - id + - id type: TYPE_INVERTED updatedAt: "2023-05-22T18:03:28.011340226Z" -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "23" group: measure-default @@ -94,10 +94,10 @@ modRevision: "23" name: last_ping tags: - - last_ping + - last_ping type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "38" group: measure-default @@ -105,10 +105,10 @@ modRevision: "38" name: last_update_time_bucket tags: - - last_update_time_bucket + - last_update_time_bucket type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "137" group: measure-default @@ -116,10 +116,10 @@ modRevision: "137" name: layer tags: - - layer + - layer type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "134" group: measure-default @@ -127,10 +127,10 @@ modRevision: "134" name: message tags: - - message + - message type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "132" group: measure-default @@ -138,10 +138,10 @@ modRevision: "132" name: name tags: - - name + - name type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "156" group: measure-default @@ -149,10 +149,10 @@ modRevision: "156" name: process_id tags: - - process_id + - process_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "44" group: measure-default @@ -160,10 +160,10 @@ modRevision: "44" name: profiling_support_status tags: - - profiling_support_status + - profiling_support_status type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "36" group: measure-default @@ -171,10 +171,10 @@ modRevision: "36" name: represent_service_id tags: - - represent_service_id + - represent_service_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "37" group: measure-default @@ -182,10 +182,10 @@ modRevision: "37" name: represent_service_instance_id tags: - - represent_service_instance_id + - represent_service_instance_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "129" group: measure-default @@ -193,10 +193,10 @@ modRevision: "129" name: service tags: - - service + - service type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "110" group: measure-default @@ -204,10 +204,10 @@ modRevision: "110" name: service_group tags: - - service_group + - service_group type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "41" group: measure-default @@ -215,10 +215,10 @@ modRevision: "41" name: service_id tags: - - service_id + - service_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "130" group: measure-default @@ -226,10 +226,10 @@ modRevision: "130" name: service_instance tags: - - service_instance + - service_instance type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "109" group: measure-default @@ -237,10 +237,10 @@ modRevision: "109" name: short_name tags: - - short_name + - short_name type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "48" group: measure-default @@ -248,10 +248,10 @@ modRevision: "48" name: source_endpoint tags: - - source_endpoint + - source_endpoint type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "60" group: measure-default @@ -259,10 +259,10 @@ modRevision: "60" name: source_service_id tags: - - source_service_id + - source_service_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "61" group: measure-default @@ -270,10 +270,10 @@ modRevision: "61" name: source_service_instance_id tags: - - source_service_instance_id + - source_service_instance_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "135" group: measure-default @@ -281,10 +281,10 @@ modRevision: "135" name: start_time tags: - - start_time + - start_time type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "155" group: measure-default @@ -292,10 +292,10 @@ modRevision: "155" name: task_id tags: - - task_id + - task_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "133" group: measure-default @@ -303,7 +303,7 @@ modRevision: "133" name: type tags: - - type + - type type: TYPE_INVERTED updatedAt: null diff --git a/test/stress/istio/testdata/index-rules/measure-minute-index-rule.yaml b/test/stress/istio/testdata/index-rules/measure-minute-index-rule.yaml index 4180da1d6..7274d164d 100644 --- a/test/stress/istio/testdata/index-rules/measure-minute-index-rule.yaml +++ b/test/stress/istio/testdata/index-rules/measure-minute-index-rule.yaml @@ -1,4 +1,4 @@ -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "57" group: measure-minute @@ -6,10 +6,10 @@ modRevision: "57" name: dest_endpoint tags: - - dest_endpoint + - dest_endpoint type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "82" group: measure-minute @@ -17,10 +17,10 @@ modRevision: "82" name: dest_process_id tags: - - dest_process_id + - dest_process_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "70" group: measure-minute @@ -28,10 +28,10 @@ modRevision: "70" name: dest_service_id tags: - - dest_service_id + - dest_service_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "71" group: measure-minute @@ -39,10 +39,10 @@ modRevision: "71" name: dest_service_instance_id tags: - - dest_service_instance_id + - dest_service_instance_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "55" group: measure-minute @@ -50,10 +50,10 @@ modRevision: "55" name: id tags: - - id + - id type: TYPE_INVERTED updatedAt: "2023-05-22T18:03:28.196387339Z" -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "412" group: measure-minute @@ -61,10 +61,10 @@ modRevision: "412" name: service_id tags: - - service_id + - service_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "80" group: measure-minute @@ -72,10 +72,10 @@ modRevision: "80" name: service_instance_id tags: - - service_instance_id + - service_instance_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "56" group: measure-minute @@ -83,10 +83,10 @@ modRevision: "56" name: source_endpoint tags: - - source_endpoint + - source_endpoint type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "81" group: measure-minute @@ -94,10 +94,10 @@ modRevision: "81" name: source_process_id tags: - - source_process_id + - source_process_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "68" group: measure-minute @@ -105,10 +105,10 @@ modRevision: "68" name: source_service_id tags: - - source_service_id + - source_service_id type: TYPE_INVERTED updatedAt: null -- analyzer: ANALYZER_UNSPECIFIED +- analyzer: "" metadata: createRevision: "69" group: measure-minute @@ -116,7 +116,7 @@ modRevision: "69" name: source_service_instance_id tags: - - source_service_instance_id + - source_service_instance_id type: TYPE_INVERTED updatedAt: null diff --git a/test/stress/trace/trace_suite_test.go b/test/stress/trace/trace_suite_test.go index 0aaee55b4..b26acbf69 100644 --- a/test/stress/trace/trace_suite_test.go +++ b/test/stress/trace/trace_suite_test.go @@ -76,4 +76,8 @@ var _ = Describe("Query", func() { It("TopN", func() { query.TopN(basePath, timeout, 1, fs) }) + + It("Topology", func() { + query.Topology(basePath, timeout, 1, fs) + }) }) diff --git a/ui/LICENSE b/ui/LICENSE index f753b55fe..e40f6d67c 100644 --- a/ui/LICENSE +++ b/ui/LICENSE @@ -29,7 +29,7 @@ BSD-3-Clause licenses ======================================================================== normalize-wheel-es 1.2.0 BSD-3-Clause - source-map-js 1.2.0 BSD-3-Clause + source-map-js 1.2.1 BSD-3-Clause zrender 5.6.0 BSD-3-Clause ======================================================================== @@ -39,58 +39,61 @@ ISC licenses anymatch 3.1.3 ISC glob-parent 5.1.2 ISC graceful-fs 4.2.11 ISC - picocolors 1.0.1 ISC - semver 7.6.2 ISC - yaml 2.4.5 ISC + picocolors 1.1.0 ISC + semver 7.6.3 ISC + yaml 2.5.1 ISC ======================================================================== MIT licenses ======================================================================== - @babel/parser 7.24.7 MIT + @babel/helper-string-parser 7.24.8 MIT + @babel/helper-validator-identifier 7.24.7 MIT + @babel/parser 7.25.6 MIT + @babel/types 7.25.6 MIT @ctrl/tinycolor 3.6.1 MIT @element-plus/icons-vue 2.3.1 MIT - @floating-ui/core 1.6.4 MIT - @floating-ui/dom 1.6.7 MIT - @floating-ui/utils 0.2.4 MIT - @jridgewell/sourcemap-codec 1.4.15 MIT + @floating-ui/core 1.6.7 MIT + @floating-ui/dom 1.6.10 MIT + @floating-ui/utils 0.2.7 MIT + @jridgewell/sourcemap-codec 1.5.0 MIT @popperjs/core 2.11.7 MIT - @types/lodash 4.17.6 MIT + @types/lodash 4.17.7 MIT @types/lodash-es 4.17.12 MIT @types/web-bluetooth 0.0.16 MIT - @vue/compiler-core 3.4.31 MIT - @vue/compiler-dom 3.4.31 MIT - @vue/compiler-sfc 3.4.31 MIT - @vue/compiler-ssr 3.4.31 MIT - @vue/devtools-api 6.6.3 MIT - @vue/reactivity 3.4.31 MIT - @vue/runtime-core 3.4.31 MIT - @vue/runtime-dom 3.4.31 MIT - @vue/server-renderer 3.4.31 MIT - @vue/shared 3.4.31 MIT + @vue/compiler-core 3.5.4 MIT + @vue/compiler-dom 3.5.4 MIT + @vue/compiler-sfc 3.5.4 MIT + @vue/compiler-ssr 3.5.4 MIT + @vue/devtools-api 6.6.4 MIT + @vue/reactivity 3.5.4 MIT + @vue/runtime-core 3.5.4 MIT + @vue/runtime-dom 3.5.4 MIT + @vue/server-renderer 3.5.4 MIT + @vue/shared 3.5.4 MIT @vueuse/core 9.13.0 MIT - @vueuse/core/node_modules/vue-demi 0.14.8 MIT + @vueuse/core/node_modules/vue-demi 0.14.10 MIT @vueuse/metadata 9.13.0 MIT @vueuse/shared 9.13.0 MIT - @vueuse/shared/node_modules/vue-demi 0.14.8 MIT + @vueuse/shared/node_modules/vue-demi 0.14.10 MIT async-validator 4.2.5 MIT asynckit 0.4.0 MIT - axios 1.7.2 MIT + axios 1.7.7 MIT binary-extensions 2.3.0 MIT braces 3.0.3 MIT chokidar 3.6.0 MIT - codemirror 5.65.16 MIT + codemirror 5.65.17 MIT combined-stream 1.0.8 MIT csstype 3.1.3 MIT - dayjs 1.11.11 MIT + dayjs 1.11.13 MIT delayed-stream 1.0.0 MIT - element-plus 2.7.6 MIT + element-plus 2.8.2 MIT escape-html 1.0.3 MIT estree-walker 2.0.2 MIT fill-range 7.1.1 MIT - follow-redirects 1.15.6 MIT + follow-redirects 1.15.9 MIT form-data 4.0.0 MIT - immutable 4.3.6 MIT + immutable 4.3.7 MIT is-binary-path 2.1.0 MIT is-extglob 2.1.1 MIT is-glob 4.0.3 MIT @@ -100,7 +103,7 @@ MIT licenses lodash 4.17.21 MIT lodash-es 4.17.21 MIT lodash-unified 1.0.3 MIT - magic-string 0.30.10 MIT + magic-string 0.30.11 MIT memoize-one 6.0.0 MIT mime-db 1.52.0 MIT mime-types 2.1.35 MIT @@ -108,16 +111,17 @@ MIT licenses nanoid 3.3.7 MIT normalize-path 3.0.0 MIT picomatch 2.3.1 MIT - pinia 2.1.7 MIT - pinia/node_modules/vue-demi 0.14.8 MIT - postcss 8.4.39 MIT + pinia 2.2.2 MIT + pinia/node_modules/vue-demi 0.14.10 MIT + postcss 8.4.45 MIT proxy-from-env 1.1.0 MIT readdirp 3.6.0 MIT - sass 1.77.6 MIT + sass 1.78.0 MIT + to-fast-properties 2.0.0 MIT to-regex-range 5.0.1 MIT universalify 2.0.1 MIT - vue 3.4.31 MIT - vue-router 4.4.0 MIT + vue 3.5.4 MIT + vue-router 4.4.4 MIT ======================================================================== Python-2.0 licenses diff --git a/ui/Makefile b/ui/Makefile index aed91b15e..60c1eee6d 100644 --- a/ui/Makefile +++ b/ui/Makefile @@ -37,7 +37,6 @@ all: build .PHONY: generate generate: install -generate: $(DIST_INDEX) $(DIST_INDEX): @echo "Building $(NAME)" @@ -45,8 +44,12 @@ $(DIST_INDEX): @echo "Done building $(NAME)" .PHONY: build -build: - @echo "Run generate to build the UI" +build: $(DIST_INDEX) + +.PHONY: clean-build +clean-build: + @echo "Cleaning build artifacts" + rm -rf dist .PHONY: test test: diff --git a/ui/index.html b/ui/index.html index 9abfda1e7..5eb59873a 100644 --- a/ui/index.html +++ b/ui/index.html @@ -23,7 +23,7 @@ - Banyan DB + BanyanDB
diff --git a/ui/package-lock.json b/ui/package-lock.json index 7c1e28035..b1ac54be3 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -38,14 +38,37 @@ "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -53,10 +76,25 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", "engines": { "node": ">=10" } @@ -65,6 +103,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "license": "MIT", "peerDependencies": { "vue": "^3.2.0" } @@ -77,6 +116,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -93,6 +133,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -109,6 +150,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -125,6 +167,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -141,6 +184,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -157,6 +201,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -173,6 +218,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -189,6 +235,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -205,6 +252,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -221,6 +269,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -237,6 +286,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -253,6 +303,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -269,6 +320,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -285,6 +337,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -301,6 +354,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -317,6 +371,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -333,6 +388,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -349,6 +405,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -365,6 +422,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -381,6 +439,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -397,6 +456,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -413,6 +473,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -429,6 +490,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -438,37 +500,42 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz", - "integrity": "sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", + "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", + "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.4" + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.7.tgz", - "integrity": "sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==", + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", + "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", + "license": "MIT", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.4" + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz", - "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==" + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==", + "license": "MIT" }, "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==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -482,6 +549,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -491,6 +559,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -504,6 +573,7 @@ "version": "2.11.7", "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -514,6 +584,7 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -532,9 +603,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -545,9 +616,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -558,9 +629,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -571,9 +642,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -584,9 +655,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -597,9 +668,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -610,9 +681,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -623,9 +694,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -636,9 +707,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -649,9 +720,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -662,9 +733,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -675,9 +746,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", - "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -688,9 +759,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", - "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -701,9 +772,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -714,9 +785,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -727,9 +798,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", - "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -743,17 +814,20 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.6.tgz", - "integrity": "sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==" + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "license": "MIT" }, "node_modules/@types/lodash-es": { "version": "4.17.12", "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", "dependencies": { "@types/lodash": "*" } @@ -761,13 +835,15 @@ "node_modules/@types/web-bluetooth": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "license": "MIT" }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", - "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.3.tgz", + "integrity": "sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" }, @@ -777,105 +853,116 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", - "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.4.tgz", + "integrity": "sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ==", + "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.31", + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.4", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", - "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.4.tgz", + "integrity": "sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw==", + "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-core": "3.5.4", + "@vue/shared": "3.5.4" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", - "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", - "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.31", - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.4.tgz", + "integrity": "sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.4", + "@vue/compiler-dom": "3.5.4", + "@vue/compiler-ssr": "3.5.4", + "@vue/shared": "3.5.4", "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.38", + "magic-string": "^0.30.11", + "postcss": "^8.4.44", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", - "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.4.tgz", + "integrity": "sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg==", + "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-dom": "3.5.4", + "@vue/shared": "3.5.4" } }, "node_modules/@vue/devtools-api": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", - "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", - "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.4.tgz", + "integrity": "sha512-HKKbEuP7tYSGCq4e4nK6ZW6l5hyG66OUetefBp4budUyjvAYsnQDf+bgFzg2RAgnH0CInyqXwD9y47jwJEHrQw==", + "license": "MIT", "dependencies": { - "@vue/shared": "3.4.31" + "@vue/shared": "3.5.4" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", - "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.4.tgz", + "integrity": "sha512-f3ek2sTA0AFu0n+w+kCtz567Euqqa3eHewvo4klwS7mWfSj/A+UmYTwsnUFo35KeyAFY60JgrCGvEBsu1n/3LA==", + "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/reactivity": "3.5.4", + "@vue/shared": "3.5.4" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", - "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.4.tgz", + "integrity": "sha512-ofyc0w6rbD5KtjhP1i9hGOKdxGpvmuB1jprP7Djlj0X7R5J/oLwuNuE98GJ8WW31Hu2VxQHtk/LYTAlW8xrJdw==", + "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/runtime-core": "3.4.31", - "@vue/shared": "3.4.31", + "@vue/reactivity": "3.5.4", + "@vue/runtime-core": "3.5.4", + "@vue/shared": "3.5.4", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", - "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.4.tgz", + "integrity": "sha512-FbjV6DJLgKRetMYFBA1UXCroCiED/Ckr53/ba9wivyd7D/Xw9fpo0T6zXzCnxQwyvkyrL7y6plgYhWhNjGxY5g==", + "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-ssr": "3.5.4", + "@vue/shared": "3.5.4" }, "peerDependencies": { - "vue": "3.4.31" + "vue": "3.5.4" } }, "node_modules/@vue/shared": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", - "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==" + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.4.tgz", + "integrity": "sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==", + "license": "MIT" }, "node_modules/@vueuse/core": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", "dependencies": { "@types/web-bluetooth": "^0.0.16", "@vueuse/metadata": "9.13.0", @@ -887,10 +974,11 @@ } }, "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", - "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", "hasInstallScript": true, + "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" @@ -915,6 +1003,7 @@ "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } @@ -923,6 +1012,7 @@ "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", "dependencies": { "vue-demi": "*" }, @@ -931,10 +1021,11 @@ } }, "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", - "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", "hasInstallScript": true, + "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" @@ -960,6 +1051,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -971,6 +1063,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -982,22 +1075,26 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/async-validator": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1008,12 +1105,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -1026,6 +1125,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1034,6 +1134,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1045,6 +1146,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1059,20 +1161,19 @@ }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/codemirror": { - "version": "5.65.16", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", - "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" + "version": "5.65.17", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.17.tgz", + "integrity": "sha512-1zOsUx3lzAOu/gnMAZkQ9kpIHcPYOc9y1Fbm2UVk5UBPkdq380nhkelG0qUwm1f7wPvTbndu9ZYlug35EwAZRQ==", + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1084,25 +1185,29 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/dayjs": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1117,6 +1222,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -1125,15 +1231,17 @@ "version": "5.5.1", "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.1.tgz", "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==", + "license": "Apache-2.0", "dependencies": { "tslib": "2.3.0", "zrender": "5.6.0" } }, "node_modules/element-plus": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.7.6.tgz", - "integrity": "sha512-36sw1K23hYjgeooR10U6CiCaCp2wvOqwoFurADZVlekeQ9v5U1FhJCFGEXO6i/kZBBMwsE1c9fxjLs9LENw2Rg==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.8.2.tgz", + "integrity": "sha512-pqoQlaUmzUFCjjTHyxGO7Cd0CizsQpIaad1ozV9PCaYjh2T4MIMnjfifqiYs2lWoZ/8GVwrRG1WTCfnZEjwfcg==", + "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^3.4.1", "@element-plus/icons-vue": "^2.3.1", @@ -1159,6 +1267,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -1172,6 +1281,7 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1207,13 +1317,15 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1224,13 +1336,15 @@ "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1247,6 +1361,7 @@ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -1255,6 +1370,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1263,15 +1379,16 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1285,6 +1402,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1298,6 +1416,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -1312,6 +1431,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1320,6 +1440,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1331,6 +1452,7 @@ "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==", + "license": "ISC", "optional": true }, "node_modules/hasown": { @@ -1338,6 +1460,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1346,14 +1469,16 @@ } }, "node_modules/immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1362,10 +1487,11 @@ } }, "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -1380,6 +1506,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1388,6 +1515,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1399,6 +1527,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1407,12 +1536,14 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1424,6 +1555,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -1436,6 +1568,7 @@ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", "dev": true, + "license": "MIT", "dependencies": { "mlly": "^1.4.2", "pkg-types": "^1.0.3" @@ -1450,17 +1583,20 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" }, "node_modules/lodash-unified": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", "peerDependencies": { "@types/lodash-es": "*", "lodash": "*", @@ -1468,32 +1604,36 @@ } }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -1506,6 +1646,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1514,6 +1655,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -1526,6 +1668,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1539,13 +1682,15 @@ "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" }, "node_modules/mlly": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", @@ -1554,10 +1699,11 @@ } }, "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==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", @@ -1569,6 +1715,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1580,6 +1727,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1587,29 +1735,34 @@ "node_modules/normalize-wheel-es": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -1618,12 +1771,13 @@ } }, "node_modules/pinia": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", - "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.2.2.tgz", + "integrity": "sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==", + "license": "MIT", "dependencies": { - "@vue/devtools-api": "^6.5.0", - "vue-demi": ">=0.14.5" + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" }, "funding": { "url": "https://github.com/sponsors/posva" @@ -1643,10 +1797,11 @@ } }, "node_modules/pinia/node_modules/vue-demi": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", - "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", "hasInstallScript": true, + "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" @@ -1668,10 +1823,11 @@ } }, "node_modules/pkg-types": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", - "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", + "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", "dev": true, + "license": "MIT", "dependencies": { "confbox": "^0.1.7", "mlly": "^1.7.1", @@ -1679,9 +1835,9 @@ } }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.45", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", "funding": [ { "type": "opencollective", @@ -1696,6 +1852,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", @@ -1708,7 +1865,8 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -1728,12 +1886,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -1746,6 +1906,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -1763,15 +1924,16 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rollup": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", - "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -1784,22 +1946,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.0", - "@rollup/rollup-android-arm64": "4.18.0", - "@rollup/rollup-darwin-arm64": "4.18.0", - "@rollup/rollup-darwin-x64": "4.18.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", - "@rollup/rollup-linux-arm-musleabihf": "4.18.0", - "@rollup/rollup-linux-arm64-gnu": "4.18.0", - "@rollup/rollup-linux-arm64-musl": "4.18.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", - "@rollup/rollup-linux-riscv64-gnu": "4.18.0", - "@rollup/rollup-linux-s390x-gnu": "4.18.0", - "@rollup/rollup-linux-x64-gnu": "4.18.0", - "@rollup/rollup-linux-x64-musl": "4.18.0", - "@rollup/rollup-win32-arm64-msvc": "4.18.0", - "@rollup/rollup-win32-ia32-msvc": "4.18.0", - "@rollup/rollup-win32-x64-msvc": "4.18.0", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, @@ -1822,14 +1984,16 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz", + "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==", + "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -1846,12 +2010,14 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1860,9 +2026,10 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1872,6 +2039,7 @@ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dev": true, + "license": "MIT", "dependencies": { "js-tokens": "^9.0.0" }, @@ -1884,6 +2052,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1891,10 +2060,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -1905,33 +2084,36 @@ "node_modules/tslib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" }, "node_modules/ufo": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", - "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", - "dev": true + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true, + "license": "MIT" }, "node_modules/unimport": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.7.2.tgz", - "integrity": "sha512-91mxcZTadgXyj3lFWmrGT8GyoRHWuE5fqPOjg5RVtF6vj+OfM5G6WCzXjuYtSgELE5ggB34RY4oiCSEP8I3AHw==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.11.1.tgz", + "integrity": "sha512-DuB1Uoq01LrrXTScxnwOoMSlTXxyKcULguFxbLrMDFcE/CO0ZWHpEiyhovN0mycPt7K6luAHe8laqvwvuoeUPg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0", - "acorn": "^8.11.3", + "acorn": "^8.12.1", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "fast-glob": "^3.3.2", "local-pkg": "^0.5.0", - "magic-string": "^0.30.10", - "mlly": "^1.7.0", + "magic-string": "^0.30.11", + "mlly": "^1.7.1", "pathe": "^1.1.2", - "pkg-types": "^1.1.1", + "pkg-types": "^1.2.0", "scule": "^1.3.0", "strip-literal": "^2.1.0", - "unplugin": "^1.10.1" + "unplugin": "^1.12.2" } }, "node_modules/unimport/node_modules/estree-walker": { @@ -1939,6 +2121,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -1947,39 +2130,48 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unplugin": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.11.0.tgz", - "integrity": "sha512-3r7VWZ/webh0SGgJScpWl2/MRCZK5d3ZYFcNaeci/GQ7Teop7zf0Nl2pUuz7G21BwPd9pcUPOC5KmJ2L3WgC5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz", + "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.11.3", - "chokidar": "^3.6.0", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.6.1" + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } } }, "node_modules/unplugin-auto-import": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.17.6.tgz", - "integrity": "sha512-dmX0Pex5DzMzVuALkexboOZvh51fL/BD6aoPO7qHoTYGlQp0GRKsREv2KMF1lzYI9SXKQiRxAjwzbQnrFFNydQ==", + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.17.8.tgz", + "integrity": "sha512-CHryj6HzJ+n4ASjzwHruD8arhbdl+UXvhuAIlHDs15Y/IMecG3wrf7FVg4pVH/DIysbq/n0phIjNHAjl7TG7Iw==", "dev": true, + "license": "MIT", "dependencies": { - "@antfu/utils": "^0.7.8", + "@antfu/utils": "^0.7.10", "@rollup/pluginutils": "^5.1.0", "fast-glob": "^3.3.2", "local-pkg": "^0.5.0", "magic-string": "^0.30.10", "minimatch": "^9.0.4", - "unimport": "^3.7.1", - "unplugin": "^1.10.1" + "unimport": "^3.7.2", + "unplugin": "^1.11.0" }, "engines": { "node": ">=14" @@ -2005,6 +2197,7 @@ "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz", "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==", "dev": true, + "license": "MIT", "dependencies": { "@antfu/utils": "^0.7.6", "@rollup/pluginutils": "^5.0.4", @@ -2042,6 +2235,7 @@ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -2050,14 +2244,14 @@ } }, "node_modules/vite": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", - "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", + "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", "dev": true, "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -2076,6 +2270,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -2093,6 +2288,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -2105,15 +2303,16 @@ } }, "node_modules/vue": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", - "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.4.tgz", + "integrity": "sha512-3yAj2gkmiY+i7+22A1PWM+kjOVXjU74UPINcTiN7grIVPyFFI0lpGwHlV/4xydDmobaBn7/xmi+YG8HeSlCTcg==", + "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-sfc": "3.4.31", - "@vue/runtime-dom": "3.4.31", - "@vue/server-renderer": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-dom": "3.5.4", + "@vue/compiler-sfc": "3.5.4", + "@vue/runtime-dom": "3.5.4", + "@vue/server-renderer": "3.5.4", + "@vue/shared": "3.5.4" }, "peerDependencies": { "typescript": "*" @@ -2125,11 +2324,12 @@ } }, "node_modules/vue-router": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.0.tgz", - "integrity": "sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.4.tgz", + "integrity": "sha512-3MlnDqwRwZwCQVbtVfpsU+nrNymNjnXSsQtXName5925NVC1+326VVfYH9vSrA0N13teGEo8z5x7gbRnGjCDiQ==", + "license": "MIT", "dependencies": { - "@vue/devtools-api": "^6.5.1" + "@vue/devtools-api": "^6.6.4" }, "funding": { "url": "https://github.com/sponsors/posva" @@ -2138,25 +2338,18 @@ "vue": "^3.2.0" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -2168,6 +2361,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.0.tgz", "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==", + "license": "BSD-3-Clause", "dependencies": { "tslib": "2.3.0" } diff --git a/ui/src/components/IndexRule/Editor.vue b/ui/src/components/IndexRule/Editor.vue index 56e2543c8..b7dd174b1 100644 --- a/ui/src/components/IndexRule/Editor.vue +++ b/ui/src/components/IndexRule/Editor.vue @@ -66,20 +66,20 @@ const typeList = [ ] const analyzerList = [ { - label: "ANALYZER_UNSPECIFIED", - value: "ANALYZER_UNSPECIFIED" + label: "unspecified", + value: "" }, { - label: "ANALYZER_KEYWORD", - value: "ANALYZER_KEYWORD" + label: "keyword", + value: "keyword" }, { - label: "ANALYZER_STANDARD", - value: "ANALYZER_STANDARD" + label: "standard", + value: "standard" }, { - label: "ANALYZER_SIMPLE", - value: "ANALYZER_SIMPLE" + label: "simple", + value: "simple" } ] const data = reactive({