diff --git a/.github/workflows/deploy.console.yaml b/.github/workflows/deploy.console.yaml index 594edb26ef..eba06e6fc7 100644 --- a/.github/workflows/deploy.console.yaml +++ b/.github/workflows/deploy.console.yaml @@ -23,7 +23,10 @@ jobs: changed: ${{ steps.filter.outputs.changed }} steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ssh-key: ${{ secrets.DEPLOY_KEY }} - name: Get Version id: version diff --git a/.github/workflows/deploy.py.yaml b/.github/workflows/deploy.py.yaml index cae761a788..901a205e8e 100644 --- a/.github/workflows/deploy.py.yaml +++ b/.github/workflows/deploy.py.yaml @@ -11,7 +11,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 + with: + fetch-depth: 0 + base-ref: main + ssh-key: ${{ secrets.DEPLOY_KEY }} - name: Set up Python uses: actions/setup-python@v4 diff --git a/.github/workflows/test.aspen.yaml b/.github/workflows/test.aspen.yaml index 918d28e23d..583ac0628a 100644 --- a/.github/workflows/test.aspen.yaml +++ b/.github/workflows/test.aspen.yaml @@ -1,4 +1,5 @@ name: "Test - Aspen" + on: pull_request: branches: @@ -9,12 +10,16 @@ on: - rc - main workflow_dispatch: + jobs: - test: + changes: + name: Changes runs-on: ubuntu-latest + outputs: + changed: ${{ steps.filter.outputs.changed }} steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Diff Changes uses: dorny/paths-filter@v3 @@ -22,33 +27,35 @@ jobs: with: filters: | changed: - - 'aspen/**' - - 'x/**' - - '.github/workflows/test.aspen.yaml' + - .github/workflows/test.aspen.yaml + - alamos/go/** + - aspen/** + - freighter/go/** + - x/go/** + + test: + name: Test (${{ matrix.os }}) + needs: changes + if: needs.changes.outputs.changed == 'true' + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout Repository + uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 - if: steps.filter.outputs.changed == 'true' with: - go-version-file: "go.work" + go-version-file: go.work cache-dependency-path: | - "alamos/go/go.sum" - "aspen/go.sum" - "cesium/go.sum" - "freighter/go/go.sum" - "synnax/go.sum" - "x/go/go.sum" + alamos/go/go.sum + aspen/go.sum + freighter/go/go.sum + x/go/go.sum - name: Test - if: steps.filter.outputs.changed == 'true' - run: go test -v --covermode=atomic --coverprofile=coverage.txt ./... - working-directory: ./aspen - - - name: Upload Coverage - if: steps.filter.outputs.changed == 'true' - uses: codecov/codecov-action@v3 - with: - directory: ./aspen - fail_ci_if_error: true - token: ${{ secrets.CODECOV_TOKEN }} - flags: aspen + run: go test -v -shuffle=on ./... + working-directory: aspen diff --git a/.github/workflows/test.cesium.yaml b/.github/workflows/test.cesium.yaml index 72dd218300..eccf9c7f31 100644 --- a/.github/workflows/test.cesium.yaml +++ b/.github/workflows/test.cesium.yaml @@ -1,4 +1,5 @@ name: "Test - Cesium" + on: pull_request: branches: @@ -9,46 +10,51 @@ on: - rc - main workflow_dispatch: + jobs: - test: + changes: + name: Changes runs-on: ubuntu-latest + outputs: + changed: ${{ steps.filter.outputs.changed }} steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Diff Changes uses: dorny/paths-filter@v3 id: filter with: + base: ${{ github.ref }} filters: | changed: - - 'cesium/**' - - 'x/**' - - '.github/workflows/test.cesium.yaml' + - .github/workflows/test.cesium.yaml + - alamos/go/** + - cesium/** + - x/go/** + + test: + name: Test (${{ matrix.os }}) + needs: changes + if: needs.changes.outputs.changed == 'true' + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout Repository + uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 - if: steps.filter.outputs.changed == 'true' with: - go-version-file: "go.work" + go-version-file: go.work cache-dependency-path: | - "alamos/go/go.sum" - "aspen/go.sum" - "cesium/go.sum" - "freighter/go/go.sum" - "synnax/go.sum" - "x/go/go.sum" + alamos/go/go.sum + cesium/go.sum + x/go/go.sum - name: Test - if: steps.filter.outputs.changed == 'true' - run: go test -v ./... --covermode=atomic --coverprofile=coverage.txt --ginkgo.label-filter="!integration && !performance" - working-directory: ./cesium - - - name: Upload Coverage - if: steps.filter.outputs.changed == 'true' - uses: codecov/codecov-action@v3 - with: - directory: ./cesium - fail_ci_if_error: true - token: ${{ secrets.CODECOV_TOKEN }} - flags: cesium + run: go test -v -shuffle=on ./... + working-directory: cesium diff --git a/.github/workflows/test.synnax.yaml b/.github/workflows/test.synnax.yaml index fb1c3ab937..6ffab85ddb 100644 --- a/.github/workflows/test.synnax.yaml +++ b/.github/workflows/test.synnax.yaml @@ -1,4 +1,5 @@ name: "Test - Synnax" + on: pull_request: branches: @@ -9,12 +10,16 @@ on: - rc - main workflow_dispatch: + jobs: - test: + changes: + name: Changes runs-on: ubuntu-latest + outputs: + changed: ${{ steps.filter.outputs.changed }} steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Diff Changes uses: dorny/paths-filter@v3 @@ -22,37 +27,39 @@ jobs: with: filters: | changed: - - 'synnax/**' - - 'cesium/**' - - 'aspen/**' - - 'x/**' - - 'freighter/go/**' - - '.github/workflows/test.synnax.yaml' + - .github/workflows/test.synnax.yaml + - alamos/go/** + - aspen/** + - cesium/** + - freighter/go/** + - synnax/** + - x/go/** + + test: + name: Test (${{ matrix.os }}) + needs: changes + if: needs.changes.outputs.changed == 'true' + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout Repository + uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 - if: steps.filter.outputs.changed == 'true' with: - go-version-file: "go.work" + go-version-file: go.work cache-dependency-path: | - "alamos/go/go.sum" - "aspen/go.sum" - "cesium/go.sum" - "freighter/go/go.sum" - "synnax/go.sum" - "x/go/go.sum" - + alamos/go/go.sum + aspen/go.sum + cesium/go.sum + freighter/go/go.sum + synnax/go.sum + x/go/go.sum - name: Test - if: steps.filter.outputs.changed == 'true' - run: go test -tags="noui development" -v ./... --covermode=atomic --coverprofile=coverage.txt --ginkgo.label-filter="!integration && !performance" - working-directory: ./synnax - - - name: Upload Coverage - if: steps.filter.outputs.changed == 'true' - uses: codecov/codecov-action@v3 - with: - directory: ./synnax - fail_ci_if_error: true - token: ${{ secrets.CODECOV_TOKEN }} - flags: synnax + run: go test -v -shuffle=on ./... + working-directory: synnax diff --git a/.github/workflows/test.x.yaml b/.github/workflows/test.x.yaml index 204a6e314e..f8106c6b85 100644 --- a/.github/workflows/test.x.yaml +++ b/.github/workflows/test.x.yaml @@ -1,4 +1,5 @@ name: "Test - X" + on: pull_request: branches: @@ -9,90 +10,82 @@ on: - rc - main workflow_dispatch: + jobs: - test-go: + changes: + name: Changes runs-on: ubuntu-latest + outputs: + go: ${{ steps.filter.outputs.go }} + ts: ${{ steps.filter.outputs.ts }} steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Diff Changes uses: dorny/paths-filter@v3 id: filter with: filters: | - changed: - - 'x/go/**' - - '.github/workflows/test.x.yaml' + shared: &shared + - .github/workflows/text.x.yaml + go: + - *shared + - alamos/go/** + - x/go/** + ts: + - *shared + - x/ts/** + + go: + name: Go (${{ matrix.os }}) + needs: changes + if: needs.changes.outputs.go == 'true' + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout Repository + uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 - if: steps.filter.outputs.changed == 'true' with: - go-version-file: "go.work" + go-version-file: go.work cache-dependency-path: | - "alamos/go/go.sum" - "aspen/go.sum" - "cesium/go.sum" - "freighter/go/go.sum" - "synnax/go.sum" - "x/go/go.sum" + alamos/go/go.sum + x/go/go.sum - name: Test - if: steps.filter.outputs.changed == 'true' - run: go test -v --covermode=atomic --coverprofile=coverage.txt ./... - working-directory: ./x/go + run: go test -v -shuffle=on ./... + working-directory: x/go - - name: Upload Coverage - if: steps.filter.outputs.changed == 'true' - uses: codecov/codecov-action@v3 - with: - directory: ./x/go - fail_ci_if_error: true - token: ${{ secrets.CODECOV_TOKEN }} - flags: gox - - test-typescript: + ts: + name: TypeScript + needs: changes + if: needs.changes.outputs.ts == 'true' runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v3 - - - name: Diff Changes - uses: dorny/paths-filter@v3 - id: filter - with: - filters: | - changed: - - 'x/typescript/**' - - '.github/workflows/test.x.yaml' + uses: actions/checkout@v4 - name: Setup pnpm - if: steps.filter.outputs.changed == 'true' - uses: pnpm/action-setup@v3 - with: - version: 9 + uses: pnpm/action-setup@v4 - - name: Setup Node - if: steps.filter.outputs.changed == 'true' + - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: package.json cache: pnpm + cache-dependency-path: pnpm-lock.yaml - name: Install Dependencies - if: steps.filter.outputs.changed == 'true' - run: pnpm i + run: pnpm install - - name: Test - if: steps.filter.outputs.changed == 'true' - run: pnpm cov:x + - name: Build + run: pnpm build:x - - name: Upload Coverage - if: steps.filter.outputs.changed == 'true' - uses: codecov/codecov-action@v3 - with: - directory: ./x/ts - fail_ci_if_error: true - token: ${{ secrets.CODECOV_TOKEN }} - flags: xts + - name: Test + run: pnpm test:x diff --git a/.gitignore b/.gitignore index 028a4af611..a23eaeba97 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,6 @@ driver/vendor/mbedtls/mbedtls # |||| GENERAL |||| **/ignore* *.test + +# |||| ESLINT |||| +.eslintcache diff --git a/alamos/go/go.mod b/alamos/go/go.mod index 99041090d6..51fedc4cb6 100644 --- a/alamos/go/go.mod +++ b/alamos/go/go.mod @@ -1,18 +1,18 @@ module github.com/synnaxlabs/alamos -go 1.22 +go 1.22.7 -toolchain go1.22.0 +toolchain go1.23.0 replace github.com/synnaxlabs/x => ../../x/go require ( - github.com/onsi/ginkgo/v2 v2.19.0 - github.com/onsi/gomega v1.33.1 - github.com/samber/lo v1.44.0 + github.com/onsi/ginkgo/v2 v2.21.0 + github.com/onsi/gomega v1.35.1 + github.com/samber/lo v1.47.0 github.com/synnaxlabs/x v0.0.0-00010101000000-000000000000 - go.opentelemetry.io/otel v1.28.0 - go.opentelemetry.io/otel/trace v1.28.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 go.uber.org/zap v1.27.0 ) @@ -21,40 +21,40 @@ require ( github.com/cockroachdb/errors v1.11.3 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/getsentry/sentry-go v0.29.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect + github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/uptrace/uptrace-go v1.27.1 // indirect - go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/log v0.3.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.3.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/uptrace/uptrace-go v1.31.0 // indirect + go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.8.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/grpc v1.65.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + golang.org/x/tools v0.27.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.0 // indirect + google.golang.org/protobuf v1.35.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/alamos/go/go.sum b/alamos/go/go.sum index e8c23b8725..369f404770 100644 --- a/alamos/go/go.sum +++ b/alamos/go/go.sum @@ -11,6 +11,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -26,10 +28,14 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -38,8 +44,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -50,42 +60,76 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/samber/lo v1.44.0 h1:5il56KxRE+GHsm1IR+sZ/6J42NODigFiqCWpSc2dybA= github.com/samber/lo v1.44.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= +github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/uptrace/uptrace-go v1.27.1 h1:CIcBWKucTkw1ussNToZA1HNO7+HXOju9zDcFC+MOpOA= github.com/uptrace/uptrace-go v1.27.1/go.mod h1:/9tKtcIaxb3GAwPOCqkZ8bhXRR/ZYCsXb9Zs5kh14Eo= +github.com/uptrace/uptrace-go v1.31.0 h1:i+AsiXVZ5NHHYWvlmJyTqg5l9sLqYN/KSZeLWr3kAM8= +github.com/uptrace/uptrace-go v1.31.0/go.mod h1:zX5JqvEoLpFbbtGN+G1/vf276rfoHiTFrh7yt1XdVCY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0 h1:UaQVCH34fQsyDjlgS0L070Kjs9uCrLKoQfzn2Nl7XTY= go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0/go.mod h1:Ks4aHdMgu1vAfEY0cIBHcGx2l1S0+PwFm2BE/HRzqSk= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 h1:kJB5wMVorwre8QzEodzTAbzm9FOOah0zvG+V4abNlEE= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0/go.mod h1:Nup4TgnOyEJWmVq9sf/ASH3ZJiAXwWHd5xZCHG7Sg9M= go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 h1:ccBrA8nCY5mM0y5uO7FT0ze4S0TuFcWdDB2FxGMTjkI= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0/go.mod h1:/9pb6634zi2Lk8LYg9Q0X8Ar6jka4dkFOylBLbVQPCE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= go.opentelemetry.io/otel/log v0.3.0 h1:kJRFkpUFYtny37NQzL386WbznUByZx186DpEMKhEGZs= go.opentelemetry.io/otel/log v0.3.0/go.mod h1:ziCwqZr9soYDwGNbIL+6kAvQC+ANvjgG367HVcyR/ys= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/log v0.3.0 h1:GEjJ8iftz2l+XO1GF2856r7yYVh74URiF9JMcAacr5U= go.opentelemetry.io/otel/sdk/log v0.3.0/go.mod h1:BwCxtmux6ACLuys1wlbc0+vGBd+xytjmjajwqqIul2g= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -103,6 +147,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -111,28 +157,42 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/alamos/py/pyproject.toml b/alamos/py/pyproject.toml index 6f46c34097..87429fccc7 100644 --- a/alamos/py/pyproject.toml +++ b/alamos/py/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "alamos" -version = "0.33.0" +version = "0.34.0" description = "" authors = ["Emiliano Bonilla "] readme = "README.md" diff --git a/alamos/ts/package.json b/alamos/ts/package.json index 6e7c6f6a89..ccdcf7b7d7 100644 --- a/alamos/ts/package.json +++ b/alamos/ts/package.json @@ -1,6 +1,6 @@ { "name": "@synnaxlabs/alamos", - "version": "0.33.0", + "version": "0.34.0", "type": "module", "description": "Distributed instrumentation for Synnax", "repository": "https://github.com/synnaxlabs/synnax/tree/main/freighter/ts", @@ -19,8 +19,8 @@ "watch": "tsc --noEmit && vite build --watch", "test": "vitest", "cov": "vitest --coverage", - "lint": "eslint \"src/**/*.ts*\"", - "fix": "eslint \"src/**/*.ts*\" --fix" + "lint": "eslint --cache", + "fix": "eslint --cache --fix" }, "engines": { "node": ">=18" @@ -37,11 +37,12 @@ "devDependencies": { "@synnaxlabs/tsconfig": "workspace:*", "@synnaxlabs/vite-plugin": "workspace:*", - "@vitest/coverage-v8": "^2.1.2", + "@vitest/coverage-v8": "^2.1.4", + "eslint": "^9.12.0", "eslint-config-synnaxlabs": "workspace:*", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vitest": "^2.1.2" + "vite": "^5.4.10", + "vitest": "^2.1.4" }, "main": "dist/index.js", "module": "dist/index.js", diff --git a/alamos/ts/vite.config.ts b/alamos/ts/vite.config.ts index e654b6895c..85a307ab0a 100644 --- a/alamos/ts/vite.config.ts +++ b/alamos/ts/vite.config.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { isProd, lib } from "@synnaxlabs/vite-plugin"; +import { lib } from "@synnaxlabs/vite-plugin"; import path from "path"; import { defineConfig } from "vite"; diff --git a/cesium/channel_test.go b/cesium/channel_test.go index 4f209b68aa..6acc40cc67 100644 --- a/cesium/channel_test.go +++ b/cesium/channel_test.go @@ -204,6 +204,7 @@ var _ = Describe("Channel", Ordered, func() { Expect(err).ToNot(HaveOccurred()) Expect(ch.Key).To(Equal(unaryKeyNew)) + Expect(f.Close()).To(Succeed()) }) }) @@ -233,6 +234,7 @@ var _ = Describe("Channel", Ordered, func() { Expect(err).ToNot(HaveOccurred()) Expect(ch.Key).To(Equal(virtualKeyNew)) + Expect(f.Close()).To(Succeed()) }) }) @@ -282,6 +284,7 @@ var _ = Describe("Channel", Ordered, func() { Expect(err).ToNot(HaveOccurred()) Expect(ch.Key).To(Equal(indexKeyNew)) + Expect(f.Close()).To(Succeed()) }) }) @@ -325,6 +328,7 @@ var _ = Describe("Channel", Ordered, func() { Expect(err).ToNot(HaveOccurred()) Expect(ch.Key).To(Equal(errorKey1New)) + Expect(f.Close()).To(Succeed()) }) }) @@ -362,6 +366,7 @@ var _ = Describe("Channel", Ordered, func() { Expect(err).ToNot(HaveOccurred()) Expect(ch.Key).To(Equal(errorKey2New)) + Expect(f.Close()).To(Succeed()) }) }) }) @@ -414,6 +419,7 @@ var _ = Describe("Channel", Ordered, func() { f := MustSucceed(db.Read(ctx, telem.TimeRangeMax, key)) Expect(f.Series[0].Data).To(Equal(telem.NewSeriesV[int64](1, 2, 3, 4, 5).Data)) + Expect(db.Close()).To(Succeed()) }) It("Should not error when db is opened on existing directory", func() { @@ -459,6 +465,8 @@ var _ = Describe("Channel", Ordered, func() { Expect(f.Series[1].TimeRange).To(Equal((11 * telem.SecondTS).Range(15*telem.SecondTS + 1))) Expect(f.Series[1].Data).To(Equal(telem.NewSeriesV[int64](11, 12, 13, 14, 15).Data)) + + Expect(db.Close()).To(Succeed()) }) }) diff --git a/cesium/db.go b/cesium/db.go index b8c4b8b151..982618391d 100644 --- a/cesium/db.go +++ b/cesium/db.go @@ -102,6 +102,8 @@ func (db *DB) Read(ctx context.Context, tr telem.TimeRange, keys ...core.Channel // Note that if this method is called while writers are still open on channels in the // database, a deadlock is caused since the signal context is closed while the writers // attempt to send to relay. +// If there is an error in closing the cesium database, the database will be marked as +// closed regardless of whether an error occurred. func (db *DB) Close() error { if !db.closed.CompareAndSwap(false, true) { return nil @@ -122,5 +124,6 @@ func (db *DB) Close() error { for _, u := range db.unaryDBs { c.Exec(u.Close) } + return c.Error() } diff --git a/cesium/delete_test.go b/cesium/delete_test.go index cb6f2d91b5..3731a5de8f 100644 --- a/cesium/delete_test.go +++ b/cesium/delete_test.go @@ -282,6 +282,17 @@ var _ = Describe("Delete", func() { var key cesium.ChannelKey BeforeEach(func() { key = GenerateChannelKey() }) + It("Should delete an index unary channel WITHOUT OPENING WRITERS ON IT", func() { + By("Creating a channel") + Expect(db.CreateChannel( + ctx, + cesium.Channel{Key: key, IsIndex: true, DataType: telem.TimeStampT}, + )).To(Succeed()) + + By("Deleting the channel") + Expect(db.DeleteChannel(key)).To(Succeed()) + }) + It("Should delete an index unary channel", func() { By("Creating a channel") Expect(db.CreateChannel( diff --git a/cesium/go.mod b/cesium/go.mod index 25483e6883..e8da8b46fd 100644 --- a/cesium/go.mod +++ b/cesium/go.mod @@ -1,20 +1,20 @@ module github.com/synnaxlabs/cesium -go 1.22 +go 1.22.7 -toolchain go1.22.0 +toolchain go1.23.0 require ( github.com/cockroachdb/errors v1.11.3 github.com/google/uuid v1.6.0 - github.com/onsi/ginkgo/v2 v2.19.0 - github.com/onsi/gomega v1.33.1 - github.com/samber/lo v1.44.0 + github.com/onsi/ginkgo/v2 v2.21.0 + github.com/onsi/gomega v1.35.1 + github.com/samber/lo v1.47.0 github.com/synnaxlabs/alamos v0.0.0-00010101000000-000000000000 github.com/synnaxlabs/x v0.0.0-00010101000000-000000000000 go.uber.org/zap v1.27.0 - golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 - golang.org/x/sync v0.7.0 + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f + golang.org/x/sync v0.9.0 ) replace github.com/synnaxlabs/x => ../x/go @@ -25,43 +25,43 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/getsentry/sentry-go v0.28.1 // indirect + github.com/getsentry/sentry-go v0.29.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/uptrace/uptrace-go v1.27.1 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/uptrace/uptrace-go v1.31.0 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/log v0.3.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.3.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.8.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.27.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/tools v0.23.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/grpc v1.65.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + golang.org/x/tools v0.27.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.0 // indirect + google.golang.org/protobuf v1.35.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/cesium/go.sum b/cesium/go.sum index 38fdb8660c..0b03bffec7 100644 --- a/cesium/go.sum +++ b/cesium/go.sum @@ -11,6 +11,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRtY6P5k= github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -26,10 +28,14 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0 h1:e+8XbKB6IMn8A4OAyZccO4pYfB3s7bt6azNIPE7AnPg= github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -38,8 +44,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -50,12 +60,18 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/samber/lo v1.44.0 h1:5il56KxRE+GHsm1IR+sZ/6J42NODigFiqCWpSc2dybA= github.com/samber/lo v1.44.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= +github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/uptrace/uptrace-go v1.27.1 h1:CIcBWKucTkw1ussNToZA1HNO7+HXOju9zDcFC+MOpOA= github.com/uptrace/uptrace-go v1.27.1/go.mod h1:/9tKtcIaxb3GAwPOCqkZ8bhXRR/ZYCsXb9Zs5kh14Eo= +github.com/uptrace/uptrace-go v1.31.0 h1:i+AsiXVZ5NHHYWvlmJyTqg5l9sLqYN/KSZeLWr3kAM8= +github.com/uptrace/uptrace-go v1.31.0/go.mod h1:zX5JqvEoLpFbbtGN+G1/vf276rfoHiTFrh7yt1XdVCY= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -64,32 +80,60 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0 h1:UaQVCH34fQsyDjlgS0L070Kjs9uCrLKoQfzn2Nl7XTY= go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0/go.mod h1:Ks4aHdMgu1vAfEY0cIBHcGx2l1S0+PwFm2BE/HRzqSk= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 h1:kJB5wMVorwre8QzEodzTAbzm9FOOah0zvG+V4abNlEE= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0/go.mod h1:Nup4TgnOyEJWmVq9sf/ASH3ZJiAXwWHd5xZCHG7Sg9M= go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 h1:ccBrA8nCY5mM0y5uO7FT0ze4S0TuFcWdDB2FxGMTjkI= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0/go.mod h1:/9pb6634zi2Lk8LYg9Q0X8Ar6jka4dkFOylBLbVQPCE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= go.opentelemetry.io/otel/log v0.3.0 h1:kJRFkpUFYtny37NQzL386WbznUByZx186DpEMKhEGZs= go.opentelemetry.io/otel/log v0.3.0/go.mod h1:ziCwqZr9soYDwGNbIL+6kAvQC+ANvjgG367HVcyR/ys= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/log v0.3.0 h1:GEjJ8iftz2l+XO1GF2856r7yYVh74URiF9JMcAacr5U= go.opentelemetry.io/otel/sdk/log v0.3.0/go.mod h1:BwCxtmux6ACLuys1wlbc0+vGBd+xytjmjajwqqIul2g= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -101,6 +145,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -109,38 +155,56 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/cesium/internal/domain/db.go b/cesium/internal/domain/db.go index f65c748242..dabb6fecb9 100644 --- a/cesium/internal/domain/db.go +++ b/cesium/internal/domain/db.go @@ -30,6 +30,7 @@ var ( ErrWriteConflict = errors.Wrap(validate.Error, "write overlaps with existing data in database") // ErrRangeNotFound is returned when a requested domain is not found in the DB. ErrRangeNotFound = errors.Wrap(query.NotFound, "time range not found") + ErrOpenEntity = errors.New("cannot close database because there are open entities on it") errDBClosed = core.EntityClosed("domain.db") ) @@ -191,18 +192,22 @@ func (db *DB) HasDataFor(ctx context.Context, tr telem.TimeRange) (bool, error) } // Close closes the DB. Close should not be called concurrently with any other DB methods. +// If close fails for a reason other than unclosed writers/readers, the database will +// still be marked closed and no read/write operations are allowed on it to protect +// data integrity. func (db *DB) Close() error { if !db.closed.CompareAndSwap(false, true) { return nil } count := db.entityCount.Load() if count > 0 { - err := errors.Newf("cannot close domain because there are %d unclosed writers/iterators accessing it", count) + err := errors.Wrapf(ErrOpenEntity, "there are %d unclosed writers/iterators accessing it", count) db.closed.Store(false) return err } w := errors.NewCatcher(errors.WithAggregation()) w.Exec(db.fc.close) w.Exec(db.idx.close) + return w.Error() } diff --git a/cesium/internal/domain/index.go b/cesium/internal/domain/index.go index ab0462a15e..cc0df7a3da 100644 --- a/cesium/internal/domain/index.go +++ b/cesium/internal/domain/index.go @@ -248,7 +248,8 @@ func (idx *index) read(f func()) { func (idx *index) close() error { idx.mu.Lock() + defer idx.mu.Unlock() + idx.mu.pointers = nil - idx.mu.Unlock() - return nil + return idx.indexPersist.Close() } diff --git a/cesium/internal/domain/index_persist.go b/cesium/internal/domain/index_persist.go index 7537227c0a..493377cbfc 100644 --- a/cesium/internal/domain/index_persist.go +++ b/cesium/internal/domain/index_persist.go @@ -53,6 +53,10 @@ func (ip *indexPersist) prepare(start int) func() error { } } +func (ip *indexPersist) Close() error { + return ip.p.Close() +} + type pointerPersist struct { fs.File sync.Mutex diff --git a/cesium/internal/index/domain_test.go b/cesium/internal/index/domain_test.go index 7e32444343..a9aba1879e 100644 --- a/cesium/internal/index/domain_test.go +++ b/cesium/internal/index/domain_test.go @@ -271,9 +271,13 @@ var _ = Describe("Domain", func() { Expect(w.Commit(ctx, 22*telem.SecondTS+1)).To(Succeed()) MustSucceed(w.Write(telem.NewSecondsTSV(25, 26).Data)) Expect(w.Commit(ctx, 26*telem.SecondTS+1)).To(Succeed()) + Expect(w.Close()).To(Succeed()) Expect(domain.Write(ctx, db2, (30 * telem.SecondTS).Range(33*telem.SecondTS+1), telem.NewSecondsTSV(30, 32, 33).Data)).To(Succeed()) idx2 = &index.Domain{DB: db2} }) + AfterEach(func() { + Expect(db2.Close()).To(Succeed()) + }) DescribeTable("effectively continuous", func( tr telem.TimeRange, expected index.Approximation[int64], diff --git a/cesium/internal/meta/meta.go b/cesium/internal/meta/meta.go index de1dbcc256..35f37886e9 100644 --- a/cesium/internal/meta/meta.go +++ b/cesium/internal/meta/meta.go @@ -43,20 +43,23 @@ func ReadOrCreate(fs xfs.FS, ch core.Channel, codec binary.Codec) (core.Channel, // Read reads the metadata file for a database whose data is kept in fs and is encoded // by the provided encoder. -func Read(fs xfs.FS, codec binary.Codec) (core.Channel, error) { +func Read(fs xfs.FS, codec binary.Codec) (ch core.Channel, err error) { s, err := fs.Stat("") if err != nil { - return core.Channel{}, err + return } metaF, err := fs.Open(metaFile, os.O_RDONLY) - var ch core.Channel if err != nil { - return ch, err + return } - if err = codec.DecodeStream(nil, metaF, &ch); err != nil { - return ch, errors.Wrapf(err, "error decoding meta in folder for channel %s", s.Name()) + defer func() { err = errors.CombineErrors(err, metaF.Close()) }() + + err = codec.DecodeStream(nil, metaF, &ch) + if err != nil { + err = errors.Wrapf(err, "error decoding meta in folder for channel %s", s.Name()) } - return ch, metaF.Close() + + return } // Create creates the metadata file for a database whose data is kept in fs and is diff --git a/cesium/internal/testutil/testutil_test.go b/cesium/internal/testutil/testutil_test.go index 9b82217654..c6405f1188 100644 --- a/cesium/internal/testutil/testutil_test.go +++ b/cesium/internal/testutil/testutil_test.go @@ -71,10 +71,13 @@ var _ = Describe("Test Util Test", func() { // - file1 subsub1 := MustSucceed(sub1.Sub("subsub1")) MustSucceed(sub1.Sub("subsub2")) - MustSucceed(sub1.Open("file1", os.O_CREATE)) + f1 := MustSucceed(sub1.Open("file1", os.O_CREATE)) + Expect(f1.Close()).To(Succeed()) subsubsub1 := MustSucceed(subsub1.Sub("subsubsub1")) - MustSucceed(subsub1.Open("file2", os.O_CREATE)) - MustSucceed(subsubsub1.Open("file3", os.O_CREATE)) + f2 := MustSucceed(subsub1.Open("file2", os.O_CREATE)) + Expect(f2.Close()).To(Succeed()) + f3 := MustSucceed(subsubsub1.Open("file3", os.O_CREATE)) + Expect(f3.Close()).To(Succeed()) }) By("Copying the FS") diff --git a/cesium/internal/unary/db.go b/cesium/internal/unary/db.go index c94bd2423a..b3e5e50ada 100644 --- a/cesium/internal/unary/db.go +++ b/cesium/internal/unary/db.go @@ -151,11 +151,24 @@ func (db *DB) Read(ctx context.Context, tr telem.TimeRange) (frame core.Frame, e // will return an error if there are any unclosed writers, iterators, or delete // operations being executed on the database. Close is idempotent, and will return nil // if the database is already closed. +// If close fails for a reason other than unclosed writers/readers, the database will +// still be marked closed and no read/write operations are allowed on it to protect +// data integrity. func (db *DB) Close() error { if !db.closed.CompareAndSwap(false, true) { return nil } - return db.wrapError(db.domain.Close()) + err := db.domain.Close() + if err != nil { + if errors.Is(err, domain.ErrOpenEntity) { + // If the close failed because of an open entity, the database should not + // be marked as closed and can still serve reads/writes. + db.closed.Store(false) + } + return db.wrapError(err) + } + + return nil } // RenameChannelInMeta renames the channel to the given name, and persists the change to the diff --git a/cesium/internal/unary/race_test.go b/cesium/internal/unary/race_test.go index 721fbcacf2..359da70ca5 100644 --- a/cesium/internal/unary/race_test.go +++ b/cesium/internal/unary/race_test.go @@ -75,6 +75,9 @@ var _ = Describe("Unary racing", func() { dataDB.SetIndex(indexDB.Index()) }) AfterEach(func() { + Expect(rateDB.Close()).To(Succeed()) + Expect(indexDB.Close()).To(Succeed()) + Expect(dataDB.Close()).To(Succeed()) Expect(cleanUp()).To(Succeed()) }) diff --git a/client/py/pyproject.toml b/client/py/pyproject.toml index f52ac7ad19..0d01e95e5c 100644 --- a/client/py/pyproject.toml +++ b/client/py/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "synnax" -version = "0.33.3" +version = "0.34.0" description = "Synnax Client Library" keywords = ["Synnax", "Synnax Python Client"] authors = ["emiliano bonilla "] diff --git a/client/ts/eslint.config.js b/client/ts/eslint.config.js index da67e44641..38dad56c92 100644 --- a/client/ts/eslint.config.js +++ b/client/ts/eslint.config.js @@ -9,4 +9,4 @@ import synnaxConfig from "eslint-config-synnaxlabs"; -export default synnaxConfig; +export default [...synnaxConfig, { ignores: ["examples"] }]; diff --git a/client/ts/package.json b/client/ts/package.json index ddbcc85f0a..216a7572e1 100644 --- a/client/ts/package.json +++ b/client/ts/package.json @@ -1,6 +1,6 @@ { "name": "@synnaxlabs/client", - "version": "0.33.0", + "version": "0.34.0", "description": "The Synnax Client Library", "keywords": [ "synnax", @@ -28,8 +28,8 @@ "watch": "tsc --noEmit && vite build --watch", "test": "vitest", "cov": "vitest --coverage", - "lint": "eslint \"src/**/*.ts*\"", - "fix": "eslint \"src/**/*.ts*\" --fix", + "lint": "eslint --cache", + "fix": "eslint --cache --fix", "genApi": "tsc --noEmit && vite build && npx api-extractor run --local", "checkApi": "tsc --noEmit && vite build && npx api-extractor run" }, @@ -43,14 +43,14 @@ "@synnaxlabs/tsconfig": "workspace:*", "@synnaxlabs/vite-plugin": "workspace:*", "@types/node": "^22.7.5", - "@vitest/coverage-v8": "^2.1.2", - "eslint": "^9.12.0", - "uuid": "^10.0.0", "@types/uuid": "^10.0.0", + "@vitest/coverage-v8": "^2.1.4", + "eslint": "^9.14.0", "eslint-config-synnaxlabs": "workspace:*", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vitest": "^2.1.2" + "uuid": "^10.0.0", + "vite": "^5.4.10", + "vitest": "^2.1.4" }, "type": "module", "types": "dist/index.d.ts", diff --git a/client/ts/src/access/policy/policy.spec.ts b/client/ts/src/access/policy/policy.spec.ts index bb2fed0831..8185f58e7b 100644 --- a/client/ts/src/access/policy/policy.spec.ts +++ b/client/ts/src/access/policy/policy.spec.ts @@ -10,7 +10,7 @@ import { id } from "@synnaxlabs/x"; import { describe, expect, test } from "vitest"; -import { policy } from "@/access/policy"; +import { type policy } from "@/access/policy"; import { channel } from "@/channel"; import Synnax from "@/client"; import { AuthError } from "@/errors"; @@ -209,9 +209,7 @@ describe("Policy", () => { }, ]); const received = await client.access.policy.retrieveFor(user.ontologyID(key2)); - const newReceived = received.filter((p) => { - return created.some((c) => c.key === p.key); - }); + const newReceived = received.filter((p) => created.some((c) => c.key === p.key)); expect(created[0]).toMatchObject(newReceived[0]); await client.access.policy.delete([created[0].key, created[1].key]); }); diff --git a/client/ts/src/auth/auth.spec.ts b/client/ts/src/auth/auth.spec.ts index 4428e3db19..300dffb245 100644 --- a/client/ts/src/auth/auth.spec.ts +++ b/client/ts/src/auth/auth.spec.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { Context } from "@synnaxlabs/freighter"; +import { type Context } from "@synnaxlabs/freighter"; import { URL } from "@synnaxlabs/x/url"; import { describe, expect, it, test } from "vitest"; diff --git a/client/ts/src/auth/auth.ts b/client/ts/src/auth/auth.ts index e772b584e3..0bd7ded2cb 100644 --- a/client/ts/src/auth/auth.ts +++ b/client/ts/src/auth/auth.ts @@ -72,24 +72,23 @@ export class Client { middleware(): Middleware { const mw: Middleware = async (reqCtx, next) => { if (!this.authenticated && !reqCtx.target.endsWith(LOGIN_ENDPOINT)) { - if (this.authenticating == null) - this.authenticating = new Promise((resolve, reject) => { - this.client - .send( - LOGIN_ENDPOINT, - this.credentials, - insecureCredentialsZ, - tokenResponseZ, - ) - .then(([res, err]) => { - if (err != null) return resolve(err); - this.token = res?.token; - this.user = res?.user; - this.authenticated = true; - resolve(null); - }) - .catch(reject); - }); + this.authenticating ??= new Promise((resolve, reject) => { + this.client + .send( + LOGIN_ENDPOINT, + this.credentials, + insecureCredentialsZ, + tokenResponseZ, + ) + .then(([res, err]) => { + if (err != null) return resolve(err); + this.token = res?.token; + this.user = res?.user; + this.authenticated = true; + resolve(null); + }) + .catch(reject); + }); const err = await this.authenticating; if (err != null) return [reqCtx, err]; } diff --git a/client/ts/src/channel/writer.ts b/client/ts/src/channel/writer.ts index 8010387cae..f87cbb3aba 100644 --- a/client/ts/src/channel/writer.ts +++ b/client/ts/src/channel/writer.ts @@ -11,14 +11,14 @@ import { sendRequired, type UnaryClient } from "@synnaxlabs/freighter"; import { z } from "zod"; import { - Key, + type Key, keyZ, type NewPayload, newPayload, type Payload, payload, } from "@/channel/payload"; -import { CacheRetriever } from "@/channel/retriever"; +import { type CacheRetriever } from "@/channel/retriever"; const createReqZ = z.object({ channels: newPayload.array() }); const createResZ = z.object({ channels: payload.array() }); diff --git a/client/ts/src/connection/checker.ts b/client/ts/src/connection/checker.ts index 06c94997fa..e53f83874f 100644 --- a/client/ts/src/connection/checker.ts +++ b/client/ts/src/connection/checker.ts @@ -48,7 +48,7 @@ const generateWarning = ( clientIsNewer: boolean, ): string => { const toUpgrade = clientIsNewer ? "cluster" : "client"; - return `Synnax cluster node version ${nodeVersion != null ? nodeVersion + " " : ""}is too ${clientIsNewer ? "old" : "new"} for client version ${clientVersion}. + return `Synnax cluster node version ${nodeVersion != null ? `${nodeVersion} ` : ""}is too ${clientIsNewer ? "old" : "new"} for client version ${clientVersion}. This may cause compatibility issues. We recommend updating the ${toUpgrade}. For more information, see https://docs.synnaxlabs.com/reference/typescript-client/troubleshooting#old-${toUpgrade}-version`; }; diff --git a/client/ts/src/control/client.ts b/client/ts/src/control/client.ts index c270719d1f..8f2a4585ed 100644 --- a/client/ts/src/control/client.ts +++ b/client/ts/src/control/client.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { StateTracker } from "@/control/state"; -import { framer } from "@/framer"; +import { type framer } from "@/framer"; const CONTROL_STATE_KEY = "sy_node_1_control"; diff --git a/client/ts/src/control/state.ts b/client/ts/src/control/state.ts index 83fef8268e..094ae0d9ee 100644 --- a/client/ts/src/control/state.ts +++ b/client/ts/src/control/state.ts @@ -9,7 +9,7 @@ import { control } from "@synnaxlabs/x"; import { binary } from "@synnaxlabs/x/binary"; -import { observe } from "@synnaxlabs/x/observe"; +import { type observe } from "@synnaxlabs/x/observe"; import { z } from "zod"; import { type Key as ChannelKey } from "@/channel/payload"; diff --git a/client/ts/src/errors.spec.ts b/client/ts/src/errors.spec.ts index 16c223c452..521a11195d 100644 --- a/client/ts/src/errors.spec.ts +++ b/client/ts/src/errors.spec.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { MatchableErrorType } from "@synnaxlabs/freighter/src/errors"; +import { type MatchableErrorType } from "@synnaxlabs/freighter/src/errors"; import { id } from "@synnaxlabs/x"; import { v4 as uuid } from "uuid"; import { describe, expect, test } from "vitest"; diff --git a/client/ts/src/errors.ts b/client/ts/src/errors.ts index 22d349f66f..e10ec7a303 100644 --- a/client/ts/src/errors.ts +++ b/client/ts/src/errors.ts @@ -27,20 +27,20 @@ export interface Field { * Raised when a validation error occurs. */ export class ValidationError extends BaseTypedError { - static readonly TYPE = _FREIGHTER_EXCEPTION_PREFIX + "validation"; + static readonly TYPE: string = `${_FREIGHTER_EXCEPTION_PREFIX}validation`; type = ValidationError.TYPE; static readonly matches = errorMatcher(ValidationError.TYPE); } export class FieldError extends ValidationError { - static readonly TYPE = ValidationError.TYPE + ".field"; + static readonly TYPE = `${ValidationError.TYPE}.field`; type = FieldError.TYPE; static readonly matches = errorMatcher(FieldError.TYPE); readonly field: string; readonly message: string; constructor(field: string, message: string) { - super(field + ": " + message); + super(`${field}: ${message}`); this.field = field; this.message = message; } @@ -50,7 +50,7 @@ export class FieldError extends ValidationError { * AuthError is raised when an authentication error occurs. */ export class AuthError extends BaseTypedError { - static readonly TYPE = _FREIGHTER_EXCEPTION_PREFIX + "auth"; + static readonly TYPE: string = `${_FREIGHTER_EXCEPTION_PREFIX}auth`; type = AuthError.TYPE; static readonly matches = errorMatcher(AuthError.TYPE); } @@ -59,7 +59,7 @@ export class AuthError extends BaseTypedError { * InvalidTokenError is raised when an authentication token is invalid. */ export class InvalidTokenError extends AuthError { - static readonly TYPE = AuthError.TYPE + ".invalid-token"; + static readonly TYPE = `${AuthError.TYPE}.invalid-token`; type = InvalidTokenError.TYPE; static readonly matches = errorMatcher(InvalidTokenError.TYPE); } @@ -68,7 +68,7 @@ export class InvalidTokenError extends AuthError { * UnexpectedError is raised when an unexpected error occurs. */ export class UnexpectedError extends BaseTypedError { - static readonly TYPE = _FREIGHTER_EXCEPTION_PREFIX + "unexpected"; + static readonly TYPE = `${_FREIGHTER_EXCEPTION_PREFIX}unexpected`; type = UnexpectedError.TYPE; static readonly matches = errorMatcher(UnexpectedError.TYPE); @@ -87,19 +87,19 @@ export class UnexpectedError extends BaseTypedError { * QueryError is raised when a query error occurs. */ export class QueryError extends BaseTypedError { - static readonly TYPE = _FREIGHTER_EXCEPTION_PREFIX + "query"; + static readonly TYPE: string = `${_FREIGHTER_EXCEPTION_PREFIX}query`; type = QueryError.TYPE; static readonly matches = errorMatcher(QueryError.TYPE); } export class NotFoundError extends QueryError { - static readonly TYPE = QueryError.TYPE + ".not_found"; + static readonly TYPE = `${QueryError.TYPE}.not_found`; type = NotFoundError.TYPE; static readonly matches = errorMatcher(NotFoundError.TYPE); } export class MultipleFoundError extends QueryError { - static readonly TYPE = QueryError.TYPE + ".multiple_results"; + static readonly TYPE = `${QueryError.TYPE}.multiple_results`; type = MultipleFoundError.TYPE; static readonly matches = errorMatcher(MultipleFoundError.TYPE); } @@ -108,7 +108,7 @@ export class MultipleFoundError extends QueryError { * RouteError is raised when a routing error occurs. */ export class RouteError extends BaseTypedError { - static readonly TYPE = _FREIGHTER_EXCEPTION_PREFIX + "route"; + static readonly TYPE = `${_FREIGHTER_EXCEPTION_PREFIX}route`; type = RouteError.TYPE; static readonly matches = errorMatcher(RouteError.TYPE); path: string; @@ -120,13 +120,13 @@ export class RouteError extends BaseTypedError { } export class ControlError extends BaseTypedError { - static readonly TYPE = _FREIGHTER_EXCEPTION_PREFIX + "control"; + static readonly TYPE: string = `${_FREIGHTER_EXCEPTION_PREFIX}control`; type = ControlError.TYPE; static readonly matches = errorMatcher(ControlError.TYPE); } export class UnauthorizedError extends ControlError { - static readonly TYPE = ControlError.TYPE + ".unauthorized"; + static readonly TYPE = `${ControlError.TYPE}.unauthorized`; type = UnauthorizedError.TYPE; static readonly matches = errorMatcher(UnauthorizedError.TYPE); } @@ -135,7 +135,7 @@ export class UnauthorizedError extends ControlError { * Raised when time-series data is not contiguous. */ export class ContiguityError extends BaseTypedError { - static readonly TYPE = _FREIGHTER_EXCEPTION_PREFIX + "contiguity"; + static readonly TYPE = `${_FREIGHTER_EXCEPTION_PREFIX}contiguity`; type = ContiguityError.TYPE; static readonly matches = errorMatcher(ContiguityError.TYPE); } @@ -157,9 +157,8 @@ const decode = (payload: ErrorPayload): Error | null => { return new AuthError(payload.data); } - if (payload.type.startsWith(UnexpectedError.TYPE)) { + if (payload.type.startsWith(UnexpectedError.TYPE)) return new UnexpectedError(payload.data); - } if (payload.type.startsWith(QueryError.TYPE)) { if (payload.type.startsWith(NotFoundError.TYPE)) diff --git a/client/ts/src/framer/adapter.ts b/client/ts/src/framer/adapter.ts index cc4ad100ac..7e61bba00a 100644 --- a/client/ts/src/framer/adapter.ts +++ b/client/ts/src/framer/adapter.ts @@ -127,11 +127,11 @@ export class WriteFrameAdapter { Received a single channel name or key but no series. `); if (Array.isArray(series)) { - if (series.some((s) => s instanceof Series || Array.isArray(s))) { + if (series.some((s) => s instanceof Series || Array.isArray(s))) throw new ValidationError(` Received a single channel name or key but multiple series. `); - } + series = series as CrudeSeries; } const pld = await this.fetchChannel(columnsOrData); @@ -152,11 +152,11 @@ export class WriteFrameAdapter { const data = []; for (let i = 0; i < columnsOrData.length; i++) { const pld = await this.fetchChannel(columnsOrData[i]); - if (i >= series.length) { + if (i >= series.length) throw new ValidationError(` Received an array of channel names or keys but not enough series. `); - } + const s = new Series({ data: series[i] as CrudeSeries, dataType: pld.dataType, @@ -170,8 +170,7 @@ export class WriteFrameAdapter { if (columnsOrData instanceof Frame || columnsOrData instanceof Map) { const fr = new Frame(columnsOrData); if (this.adapter == null) return fr; - let cols: Key[] = []; - cols = fr.columns.map((col_) => { + const cols = fr.columns.map((col_) => { const col = typeof col_ === "string" ? this.adapter?.get(col_) : col_; if (col == null) throw new ValidationError(` diff --git a/client/ts/src/framer/client.ts b/client/ts/src/framer/client.ts index 8e6267e4e7..ac996dd755 100644 --- a/client/ts/src/framer/client.ts +++ b/client/ts/src/framer/client.ts @@ -7,21 +7,26 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { type StreamClient, UnaryClient } from "@synnaxlabs/freighter"; +import { type StreamClient, type UnaryClient } from "@synnaxlabs/freighter"; import { type CrudeSeries, type CrudeTimeRange, type CrudeTimeStamp, type MultiSeries, - TimeRange, + type TimeRange, TimeSpan, } from "@synnaxlabs/x"; -import { type Key, type KeyOrName, KeysOrNames, type Params } from "@/channel/payload"; +import { + type Key, + type KeyOrName, + type KeysOrNames, + type Params, +} from "@/channel/payload"; import { analyzeChannelParams, type Retriever } from "@/channel/retriever"; import { Deleter } from "@/framer/deleter"; import { Frame } from "@/framer/frame"; -import { Iterator, IteratorConfig } from "@/framer/iterator"; +import { Iterator, type IteratorConfig } from "@/framer/iterator"; import { Streamer, type StreamerConfig } from "@/framer/streamer"; import { Writer, type WriterConfig, WriterMode } from "@/framer/writer"; import { ontology } from "@/ontology"; diff --git a/client/ts/src/framer/deleter.ts b/client/ts/src/framer/deleter.ts index ec05c7ca38..feb74f49dd 100644 --- a/client/ts/src/framer/deleter.ts +++ b/client/ts/src/framer/deleter.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { sendRequired, UnaryClient } from "@synnaxlabs/freighter"; +import { sendRequired, type UnaryClient } from "@synnaxlabs/freighter"; import { TimeRange } from "@synnaxlabs/x"; import { z } from "zod"; diff --git a/client/ts/src/framer/frame.ts b/client/ts/src/framer/frame.ts index ef065d3328..a99db29b80 100644 --- a/client/ts/src/framer/frame.ts +++ b/client/ts/src/framer/frame.ts @@ -10,7 +10,7 @@ import { MultiSeries, Series, - SeriesPayload, + type SeriesPayload, Size, type TelemValue, TimeRange, @@ -126,7 +126,7 @@ export class Frame { Object.entries(columnsOrData).forEach(([k, v]) => { const key = parseInt(k); if (!isNaN(key)) return this.push(key, ...toArray(v)); - else this.push(k, ...toArray(v)); + this.push(k, ...toArray(v)); }); return; } @@ -334,7 +334,7 @@ export class Frame { */ has(channel: KeyOrName): boolean { if (typeof channel === "string" && this.colType === "key") return false; - else if (typeof channel === "number" && this.colType === "name") return false; + if (typeof channel === "number" && this.colType === "name") return false; return (this.columns as Keys).includes(channel as Key); } @@ -418,11 +418,9 @@ export const seriesFromPayload = (series: SeriesPayload): Series => { return new Series({ data, dataType, timeRange, glBufferUsage: "static", alignment }); }; -export const seriesToPayload = (series: Series): SeriesPayload => { - return { - timeRange: series._timeRange, - dataType: series.dataType, - data: new Uint8Array(series.data.buffer), - alignment: series.alignment, - }; -}; +export const seriesToPayload = (series: Series): SeriesPayload => ({ + timeRange: series._timeRange, + dataType: series.dataType, + data: new Uint8Array(series.data.buffer), + alignment: series.alignment, +}); diff --git a/client/ts/src/framer/iterator.spec.ts b/client/ts/src/framer/iterator.spec.ts index 63bdef33e2..09229e4e06 100644 --- a/client/ts/src/framer/iterator.spec.ts +++ b/client/ts/src/framer/iterator.spec.ts @@ -17,14 +17,13 @@ import { randomSeries } from "@/util/telem"; const client = newClient(); -const newChannel = async (): Promise => { - return await client.channels.create({ +const newChannel = async (): Promise => + await client.channels.create({ name: "test", leaseholder: 1, rate: Rate.hz(25), dataType: DataType.FLOAT64, }); -}; describe("Iterator", () => { test("happy path", async () => { diff --git a/client/ts/src/framer/writer.ts b/client/ts/src/framer/writer.ts index cb2b9bb2b2..2e788c198e 100644 --- a/client/ts/src/framer/writer.ts +++ b/client/ts/src/framer/writer.ts @@ -245,7 +245,7 @@ export class Writer { value: Record | KeyOrName | number, authority?: control.Authority, ): Promise { - let config: Config = { keys: [], authorities: [] }; + let config: Config; if (typeof value === "number" && authority == null) config = { keys: [], authorities: [value] }; else { diff --git a/client/ts/src/hardware/device/client.ts b/client/ts/src/hardware/device/client.ts index 26567790bb..a8f72eb87a 100644 --- a/client/ts/src/hardware/device/client.ts +++ b/client/ts/src/hardware/device/client.ts @@ -14,11 +14,11 @@ import { z } from "zod"; import { type framer } from "@/framer"; import { - Device, - DeviceKey, + type Device, + type DeviceKey, deviceKeyZ, deviceZ, - NewDevice, + type NewDevice, newDeviceZ, } from "@/hardware/device/payload"; import { signals } from "@/signals"; diff --git a/client/ts/src/hardware/device/payload.ts b/client/ts/src/hardware/device/payload.ts index a49c5d426c..a54e931c93 100644 --- a/client/ts/src/hardware/device/payload.ts +++ b/client/ts/src/hardware/device/payload.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { binary, UnknownRecord } from "@synnaxlabs/x"; +import { binary, type UnknownRecord } from "@synnaxlabs/x"; import { z } from "zod"; import { rackKeyZ } from "@/hardware/rack/payload"; diff --git a/client/ts/src/hardware/rack/client.ts b/client/ts/src/hardware/rack/client.ts index 8e0496dd2f..d89d495a39 100644 --- a/client/ts/src/hardware/rack/client.ts +++ b/client/ts/src/hardware/rack/client.ts @@ -15,11 +15,11 @@ import { z } from "zod"; import { type framer } from "@/framer"; import { - NewRack, + type NewRack, newRackZ, - RackKey, + type RackKey, rackKeyZ, - RackPayload, + type RackPayload, rackZ, } from "@/hardware/rack/payload"; import { type task } from "@/hardware/task"; diff --git a/client/ts/src/hardware/task/client.ts b/client/ts/src/hardware/task/client.ts index 1504442ffc..6c8452b8f9 100644 --- a/client/ts/src/hardware/task/client.ts +++ b/client/ts/src/hardware/task/client.ts @@ -19,18 +19,18 @@ import { framer } from "@/framer"; import { type Frame } from "@/framer/frame"; import { rack } from "@/hardware/rack"; import { - NewTask, + type NewTask, newTaskZ, - Payload, - State, - StateObservable, + type Payload, + type State, + type StateObservable, stateZ, - TaskKey, + type TaskKey, taskKeyZ, taskZ, } from "@/hardware/task/payload"; import { ontology } from "@/ontology"; -import { ranger } from "@/ranger"; +import { type ranger } from "@/ranger"; import { signals } from "@/signals"; import { analyzeParams, checkForMultipleOrNoResults } from "@/util/retrieve"; import { nullableArrayZ } from "@/util/zod"; @@ -123,9 +123,7 @@ export class Task< if (parsed.success) { res = parsed.data as State; if (res.key === cmdKey) break; - } else { - console.error(parsed.error); - } + } else console.error(parsed.error); } streamer.close(); return res; @@ -316,10 +314,14 @@ export class Client implements AsyncTermSearcher { return this.sugar([res.task])[0]; } - async retrieveByName(name: string, rack?: number): Promise { + async retrieveByName< + C extends UnknownRecord = UnknownRecord, + D extends {} = UnknownRecord, + T extends string = string, + >(name: string, rack?: number): Promise> { const tasks = await this.execRetrieve({ names: [name], rack }); checkForMultipleOrNoResults("Task", name, tasks, true); - return this.sugar(tasks)[0]; + return this.sugar(tasks)[0] as Task; } private async execRetrieve(req: RetrieveRequest): Promise { diff --git a/client/ts/src/hardware/task/ni/types.ts b/client/ts/src/hardware/task/ni/types.ts index 87ec05e05d..e6ff626d70 100644 --- a/client/ts/src/hardware/task/ni/types.ts +++ b/client/ts/src/hardware/task/ni/types.ts @@ -10,7 +10,7 @@ import { z } from "zod"; import { device } from "@/hardware/device"; -import { task } from "@/hardware/task"; +import { type task } from "@/hardware/task"; export const unitsVoltsZ = z.literal("Volts"); export type UnitsVolts = z.infer; diff --git a/client/ts/src/hardware/task/payload.ts b/client/ts/src/hardware/task/payload.ts index da4e0ca509..a72347f4de 100644 --- a/client/ts/src/hardware/task/payload.ts +++ b/client/ts/src/hardware/task/payload.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { binary, observe, UnknownRecord } from "@synnaxlabs/x"; +import { binary, type observe, type UnknownRecord } from "@synnaxlabs/x"; import { z } from "zod"; import { ontology } from "@/ontology"; diff --git a/client/ts/src/hardware/task/task.spec.ts b/client/ts/src/hardware/task/task.spec.ts index ed400a54ba..ea2fcf9f09 100644 --- a/client/ts/src/hardware/task/task.spec.ts +++ b/client/ts/src/hardware/task/task.spec.ts @@ -10,7 +10,7 @@ import { id } from "@synnaxlabs/x"; import { describe, expect, it } from "vitest"; -import { task } from "@/hardware/task"; +import { type task } from "@/hardware/task"; import { newClient } from "@/setupspecs"; const client = newClient(); diff --git a/client/ts/src/label/client.ts b/client/ts/src/label/client.ts index 5a6dcdaf12..4862cc853b 100644 --- a/client/ts/src/label/client.ts +++ b/client/ts/src/label/client.ts @@ -14,7 +14,7 @@ import { type AsyncTermSearcher } from "@synnaxlabs/x/search"; import { type framer } from "@/framer"; import { type Key, type Label, labelZ } from "@/label/payload"; import { Retriever } from "@/label/retriever"; -import { type NewLabelPayload, SetOptions, Writer } from "@/label/writer"; +import { type NewLabelPayload, type SetOptions, Writer } from "@/label/writer"; import { ontology } from "@/ontology"; import { signals } from "@/signals"; diff --git a/client/ts/src/ontology/client.ts b/client/ts/src/ontology/client.ts index 3a633b79f4..f2c21dc556 100644 --- a/client/ts/src/ontology/client.ts +++ b/client/ts/src/ontology/client.ts @@ -290,9 +290,7 @@ export class ChangeTracker { } private async start(): Promise { - for await (const frame of this.streamer) { - await this.update(frame); - } + for await (const frame of this.streamer) await this.update(frame); } private async update(frame: framer.Frame): Promise { diff --git a/client/ts/src/ontology/group/payload.ts b/client/ts/src/ontology/group/payload.ts index 35d34c63f8..aee0511085 100644 --- a/client/ts/src/ontology/group/payload.ts +++ b/client/ts/src/ontology/group/payload.ts @@ -52,9 +52,9 @@ export type ParamAnalysisResult = export const analyzeParams = (groups: Params): ParamAnalysisResult => { const normal = toArray(groups) as Keys | Names; - if (normal.length === 0) { + if (normal.length === 0) throw new Error("No groups specified"); - } + const isKey = keyZ.safeParse(normal[0]).success; return { single: !Array.isArray(groups), diff --git a/client/ts/src/ontology/payload.ts b/client/ts/src/ontology/payload.ts index 18a0fc9eff..aafa433a1e 100644 --- a/client/ts/src/ontology/payload.ts +++ b/client/ts/src/ontology/payload.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { change, UnknownRecord } from "@synnaxlabs/x"; +import { type change, type UnknownRecord } from "@synnaxlabs/x"; import { z } from "zod"; export type ResourceChange = change.Change; diff --git a/client/ts/src/ranger/alias.ts b/client/ts/src/ranger/alias.ts index 574bc122ff..3f3bed91a8 100644 --- a/client/ts/src/ranger/alias.ts +++ b/client/ts/src/ranger/alias.ts @@ -12,7 +12,7 @@ import { type change } from "@synnaxlabs/x/change"; import { z } from "zod"; import { type channel } from "@/channel"; -import { type Key as ChannelKey,keyZ as channelKeyZ } from "@/channel/payload"; +import { type Key as ChannelKey, keyZ as channelKeyZ } from "@/channel/payload"; import { type Client as FrameClient } from "@/framer/client"; import { type Key, keyZ } from "@/ranger/payload"; import { signals } from "@/signals"; @@ -161,7 +161,7 @@ const aliasSeparator = "---"; const decodeAliasChanges = (rangeKey: Key): signals.Decoder => (variant, data) => { - if (variant === "delete") { + if (variant === "delete") return data .toStrings() .filter((k) => k.split(aliasSeparator)[0] === rangeKey) @@ -170,7 +170,6 @@ const decodeAliasChanges = key: alias, value: undefined, })); - } return data.parseJSON(aliasZ).map((alias) => ({ variant, key: alias.alias, diff --git a/client/ts/src/ranger/client.ts b/client/ts/src/ranger/client.ts index 8e896b179d..6d5aae98a6 100644 --- a/client/ts/src/ranger/client.ts +++ b/client/ts/src/ranger/client.ts @@ -8,21 +8,20 @@ // included in the file licenses/APL.txt. import { sendRequired, type UnaryClient } from "@synnaxlabs/freighter"; -import { CrudeTimeRange, observe, TimeRange } from "@synnaxlabs/x"; +import { type CrudeTimeRange, observe, TimeRange } from "@synnaxlabs/x"; import { type AsyncTermSearcher } from "@synnaxlabs/x/search"; import { type Series } from "@synnaxlabs/x/telem"; import { toArray } from "@synnaxlabs/x/toArray"; import { z } from "zod"; -import { Key as ChannelKey } from "@/channel/payload"; +import { type Key as ChannelKey } from "@/channel/payload"; import { type Retriever as ChannelRetriever } from "@/channel/retriever"; -import { MultipleFoundError, NotFoundError } from "@/errors"; -import { QueryError } from "@/errors"; +import { MultipleFoundError, NotFoundError, QueryError } from "@/errors"; import { type framer } from "@/framer"; import { type label } from "@/label"; import { type Label } from "@/label/payload"; import { ontology } from "@/ontology"; -import { Resource } from "@/ontology/payload"; +import { type Resource } from "@/ontology/payload"; import { type Alias, Aliaser } from "@/ranger/alias"; import { KV } from "@/ranger/kv"; import { @@ -37,7 +36,7 @@ import { type Payload, payloadZ, } from "@/ranger/payload"; -import { CreateOptions, type Writer } from "@/ranger/writer"; +import { type CreateOptions, type Writer } from "@/ranger/writer"; import { signals } from "@/signals"; import { nullableArrayZ } from "@/util/zod"; @@ -98,9 +97,8 @@ export class Range { async setAlias(channel: ChannelKey | Name, alias: string): Promise { const ch = await this.channels.retrieve(channel); - if (ch.length === 0) { - throw new QueryError(`Channel ${channel} does not exist`); - } + if (ch.length === 0) throw new QueryError(`Channel ${channel} does not exist`); + await this.aliaser.set({ [ch[0].key]: alias }); } diff --git a/client/ts/src/ranger/kv.ts b/client/ts/src/ranger/kv.ts index d508b35e66..25480a7716 100644 --- a/client/ts/src/ranger/kv.ts +++ b/client/ts/src/ranger/kv.ts @@ -12,7 +12,7 @@ import { isObject } from "@synnaxlabs/x/identity"; import { toArray } from "@synnaxlabs/x/toArray"; import { z } from "zod"; -import { framer } from "@/framer"; +import { type framer } from "@/framer"; import { type Key, keyZ } from "@/ranger/payload"; import { signals } from "@/signals"; import { nullableArrayZ } from "@/util/zod"; @@ -96,7 +96,7 @@ export class KV { key: k, value: v, })); - else pairs = [{ range: this.rangeKey, key: key, value: value }]; + else pairs = [{ range: this.rangeKey, key, value }]; await sendRequired( this.client, KV.SET_ENDPOINT, diff --git a/client/ts/src/ranger/payload.ts b/client/ts/src/ranger/payload.ts index 5b225a5673..3f38a9ffa1 100644 --- a/client/ts/src/ranger/payload.ts +++ b/client/ts/src/ranger/payload.ts @@ -79,7 +79,7 @@ export const ONTOLOGY_TYPE: ontology.ResourceType = "range"; export const ALIAS_ONTOLOGY_TYPE: ontology.ResourceType = "range-alias"; export const rangeOntologyID = (key: Key): ontology.ID => - new ontology.ID({ type: ONTOLOGY_TYPE, key: key }); + new ontology.ID({ type: ONTOLOGY_TYPE, key }); export const rangeAliasOntologyID = (key: Key): ontology.ID => - new ontology.ID({ type: ALIAS_ONTOLOGY_TYPE, key: key }); + new ontology.ID({ type: ALIAS_ONTOLOGY_TYPE, key }); diff --git a/client/ts/src/ranger/ranger.spec.ts b/client/ts/src/ranger/ranger.spec.ts index bae774c4a1..604c8cd709 100644 --- a/client/ts/src/ranger/ranger.spec.ts +++ b/client/ts/src/ranger/ranger.spec.ts @@ -7,12 +7,12 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { change } from "@synnaxlabs/x"; +import { type change } from "@synnaxlabs/x"; import { DataType, Rate, TimeSpan, TimeStamp } from "@synnaxlabs/x/telem"; import { describe, expect, it } from "vitest"; import { QueryError } from "@/errors"; -import { ranger } from "@/ranger"; +import { type ranger } from "@/ranger"; import { type NewPayload } from "@/ranger/payload"; import { newClient } from "@/setupspecs"; diff --git a/client/ts/src/user/user.spec.ts b/client/ts/src/user/user.spec.ts index d08650c109..bd9366cda8 100644 --- a/client/ts/src/user/user.spec.ts +++ b/client/ts/src/user/user.spec.ts @@ -183,9 +183,8 @@ describe("User", () => { }); }); test("not found", async () => { - for (const u of userArray) { + for (const u of userArray) await expect(client.user.delete(u.key as string)).resolves.toBeUndefined(); - } await expect( client.user.retrieve(userArray.map((u) => u.key as string)), ).rejects.toThrow(NotFoundError); diff --git a/client/ts/src/util/telem.ts b/client/ts/src/util/telem.ts index 96d4ddef29..ef4e7edfdb 100644 --- a/client/ts/src/util/telem.ts +++ b/client/ts/src/util/telem.ts @@ -12,8 +12,6 @@ import { type DataType, type TypedArray } from "@synnaxlabs/x/telem"; export const randomSeries = (length: number, dataType: DataType): TypedArray => { // generate random bytes of the correct length const bytes = new Uint8Array(length * dataType.density.valueOf()); - for (let i = 0; i < bytes.byteLength; i++) { - bytes[i] = Math.floor(Math.random() * 256); - } + for (let i = 0; i < bytes.byteLength; i++) bytes[i] = Math.floor(Math.random() * 256); return new dataType.Array(bytes.buffer); }; diff --git a/client/ts/src/workspace/lineplot/payload.ts b/client/ts/src/workspace/lineplot/payload.ts index 518f729125..3f63fb3f68 100644 --- a/client/ts/src/workspace/lineplot/payload.ts +++ b/client/ts/src/workspace/lineplot/payload.ts @@ -27,4 +27,4 @@ export type LinePlot = z.infer; export const ONTOLOGY_TYPE: ontology.ResourceType = "lineplot"; export const ontologyID = (key: Key): ontology.ID => - new ontology.ID({ type: ONTOLOGY_TYPE, key: key }); + new ontology.ID({ type: ONTOLOGY_TYPE, key }); diff --git a/client/ts/src/workspace/log/payload.ts b/client/ts/src/workspace/log/payload.ts index 46ad04c5b5..2353d0a1bb 100644 --- a/client/ts/src/workspace/log/payload.ts +++ b/client/ts/src/workspace/log/payload.ts @@ -33,4 +33,4 @@ export type Log = z.infer; export const ONTOLOGY_TYPE: ontology.ResourceType = "log"; export const ontologyID = (key: Key): ontology.ID => - new ontology.ID({ type: ONTOLOGY_TYPE, key: key }); + new ontology.ID({ type: ONTOLOGY_TYPE, key }); diff --git a/client/ts/src/workspace/payload.ts b/client/ts/src/workspace/payload.ts index 6efc577d73..81e82898c2 100644 --- a/client/ts/src/workspace/payload.ts +++ b/client/ts/src/workspace/payload.ts @@ -41,4 +41,4 @@ export type Workspace = z.infer; export const ONTOLOGY_TYPE: ontology.ResourceType = "workspace"; export const ontologyID = (key: Key): ontology.ID => - new ontology.ID({ type: ONTOLOGY_TYPE, key: key }); + new ontology.ID({ type: ONTOLOGY_TYPE, key }); diff --git a/client/ts/src/workspace/schematic/payload.ts b/client/ts/src/workspace/schematic/payload.ts index 52ecc74423..8ace26c8c8 100644 --- a/client/ts/src/workspace/schematic/payload.ts +++ b/client/ts/src/workspace/schematic/payload.ts @@ -35,4 +35,4 @@ export type Schematic = z.infer; export const ONTOLOGY_TYPE: ontology.ResourceType = "schematic"; export const ontologyID = (key: Key): ontology.ID => - new ontology.ID({ type: ONTOLOGY_TYPE, key: key }); + new ontology.ID({ type: ONTOLOGY_TYPE, key }); diff --git a/console/.stylelintrc.cjs b/configs/eslint/eslint.config.js similarity index 81% rename from console/.stylelintrc.cjs rename to configs/eslint/eslint.config.js index bf3126dabd..da67e44641 100644 --- a/console/.stylelintrc.cjs +++ b/configs/eslint/eslint.config.js @@ -7,6 +7,6 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -module.exports = { - extends: ["stylelint-config-synnaxlabs"], -}; +import synnaxConfig from "eslint-config-synnaxlabs"; + +export default synnaxConfig; diff --git a/configs/eslint/index.js b/configs/eslint/index.js index 2c4625dd50..9fd260e4b5 100644 --- a/configs/eslint/index.js +++ b/configs/eslint/index.js @@ -7,28 +7,79 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import globals from "globals"; +import { fixupConfigRules, includeIgnoreFile } from "@eslint/compat"; import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; -import pluginReactConfig from "eslint-plugin-react/configs/recommended.js"; -import { fixupConfigRules } from "@eslint/compat"; +import pluginReact from "eslint-plugin-react/configs/recommended.js"; import simpleImportSort from "eslint-plugin-simple-import-sort"; +import globals from "globals"; +import path from "path"; +import tseslint from "typescript-eslint"; +import { fileURLToPath } from "url"; + +const filename = fileURLToPath(import.meta.url); +const dirname = path.dirname(filename); +const gitignorePath = path.join(dirname, "../../.gitignore"); export default [ + includeIgnoreFile(gitignorePath), { languageOptions: { globals: globals.browser } }, pluginJs.configs.recommended, ...tseslint.configs.recommended, - ...fixupConfigRules(pluginReactConfig), + ...fixupConfigRules(pluginReact), { languageOptions: { ecmaVersion: "latest", sourceType: "module", globals: { ...globals.browser }, - parserOptions: { ecmaVersion: "latest", sourceType: "module" }, + parserOptions: { + ecmaFeatures: { jsx: true }, + ecmaVersion: "latest", + sourceType: "module", + }, }, - ignores: ["node_modules", "node_modules", "build", "dist", "release"], plugins: { "simple-import-sort": simpleImportSort }, rules: { + "no-constant-condition": ["error", { checkLoops: false }], + "no-duplicate-imports": "error", + "use-isnan": ["error", { enforceForIndexOf: true }], + "valid-typeof": ["error", { requireStringLiterals: true }], + "arrow-body-style": "error", + curly: ["error", "multi"], + "dot-notation": "error", + "logical-assignment-operators": [ + "error", + "always", + { enforceForIfStatements: true }, + ], + "no-array-constructor": "error", + "no-else-return": ["error", { allowElseIf: false }], + "no-extra-boolean-cast": ["error", { enforceForInnerExpressions: true }], + "no-lonely-if": "error", + "no-object-constructor": "error", + "no-undef-init": "error", + "no-unneeded-ternary": ["error", { defaultAssignment: false }], + "no-useless-computed-key": "error", + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "object-shorthand": "error", + "operator-assignment": "error", + "prefer-arrow-callback": "error", + "prefer-const": "error", + "prefer-exponentiation-operator": "error", + "prefer-numeric-literals": "error", + "prefer-object-has-own": "error", + "prefer-object-spread": "error", + "prefer-regex-literals": ["error", { disallowRedundantWrapping: true }], + "prefer-spread": "error", + "prefer-template": "error", + radix: ["error", "as-needed"], + yoda: "error", + "@typescript-eslint/consistent-type-imports": [ + "error", + { fixStyle: "inline-type-imports" }, + ], "simple-import-sort/imports": "error", "simple-import-sort/exports": "error", "react/react-in-jsx-scope": "off", @@ -50,7 +101,6 @@ export default [ ignoreRestSiblings: true, }, ], - "no-constant-condition": "off", }, settings: { "import/resolver": { @@ -60,4 +110,5 @@ export default [ react: { version: "^18.0.0" }, }, }, + { ignores: ["node_modules", "build", "dist", "release", "**/*.d.ts"] }, ]; diff --git a/configs/eslint/package.json b/configs/eslint/package.json index c9878002ff..41682459a6 100644 --- a/configs/eslint/package.json +++ b/configs/eslint/package.json @@ -4,17 +4,21 @@ "type": "module", "main": "index.js", "license": "MIT", + "scripts": { + "lint": "eslint --cache", + "fix": "eslint --cache --fix" + }, "publishConfig": { "access": "public" }, "devDependencies": { "@eslint/compat": "^1.2.0", "@eslint/js": "^9.12.0", - "eslint": "^9.12.0", + "eslint": "^9.14.0", "eslint-plugin-react": "^7.37.1", "eslint-plugin-simple-import-sort": "^12.1.1", "globals": "^15.11.0", "typescript": "^5.6.3", - "typescript-eslint": "^8.8.1" + "typescript-eslint": "^8.13.0" } } diff --git a/pluto/.stylelintrc.cjs b/configs/stylelint/eslint.config.js similarity index 81% rename from pluto/.stylelintrc.cjs rename to configs/stylelint/eslint.config.js index b68ae3c125..da67e44641 100644 --- a/pluto/.stylelintrc.cjs +++ b/configs/stylelint/eslint.config.js @@ -7,6 +7,6 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -module.exports = { - extends: ["stylelint-config-synnaxlabs"], -}; +import synnaxConfig from "eslint-config-synnaxlabs"; + +export default synnaxConfig; diff --git a/configs/stylelint/index.js b/configs/stylelint/index.js index 0749bd80eb..8f40360b24 100644 --- a/configs/stylelint/index.js +++ b/configs/stylelint/index.js @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -module.exports = { +export default { extends: ["stylelint-config-standard", "stylelint-config-prettier"], rules: { "selector-class-pattern": diff --git a/configs/stylelint/package.json b/configs/stylelint/package.json index 384414b908..f33b649d37 100644 --- a/configs/stylelint/package.json +++ b/configs/stylelint/package.json @@ -6,9 +6,18 @@ "repository": "https://github.com/synnaxlabs/synnax/tree/main/configs/stylelint", "author": "emilbon99@gmail.com", "license": "MIT", + "type": "module", + "scripts": { + "lint": "eslint --cache", + "fix": "eslint --cache --fix" + }, "dependencies": { "stylelint": "^16.9.0", "stylelint-config-prettier": "^9.0.5", "stylelint-config-standard": "^36.0.1" + }, + "devDependencies": { + "eslint": "^9.12.0", + "eslint-config-synnaxlabs": "workspace:*" } } diff --git a/docs/site/.stylelintrc.cjs b/configs/vite/eslint.config.js similarity index 81% rename from docs/site/.stylelintrc.cjs rename to configs/vite/eslint.config.js index b68ae3c125..da67e44641 100644 --- a/docs/site/.stylelintrc.cjs +++ b/configs/vite/eslint.config.js @@ -7,6 +7,6 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -module.exports = { - extends: ["stylelint-config-synnaxlabs"], -}; +import synnaxConfig from "eslint-config-synnaxlabs"; + +export default synnaxConfig; diff --git a/configs/vite/package.json b/configs/vite/package.json index 8fc3083966..ad8d022c37 100644 --- a/configs/vite/package.json +++ b/configs/vite/package.json @@ -4,7 +4,9 @@ "type": "module", "description": "Vite plugin for Synnax Labs", "scripts": { - "build": "tsc" + "build": "tsc", + "lint": "eslint --cache", + "fix": "eslint --cache --fix" }, "exports": { ".": { @@ -15,10 +17,12 @@ }, "devDependencies": { "@synnaxlabs/tsconfig": "workspace:*", + "eslint": "^9.12.0", + "eslint-config-synnaxlabs": "workspace:*", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vite-plugin-dts": "^4.2.4", - "vite-tsconfig-paths": "^5.0.1" + "vite": "^5.4.10", + "vite-plugin-dts": "^4.3.0", + "vite-tsconfig-paths": "^5.1.2" }, "main": "dist/index.js", "module": "dist/index.js", diff --git a/configs/vite/src/index.ts b/configs/vite/src/index.ts index b46161e62f..ec1ecfe5a5 100644 --- a/configs/vite/src/index.ts +++ b/configs/vite/src/index.ts @@ -9,9 +9,7 @@ import { promises as fs } from "fs"; import path from "path"; - -import type { CompilerOptions } from "typescript"; -import ts from "typescript"; +import ts, { type CompilerOptions } from "typescript"; import type { Alias, AliasOptions, Plugin } from "vite"; import dts from "vite-plugin-dts"; diff --git a/console/eslint.config.js b/console/eslint.config.js index 84914f9f73..9bedbb7fbd 100644 --- a/console/eslint.config.js +++ b/console/eslint.config.js @@ -7,6 +7,18 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import synnaxConfig from "eslint-config-synnaxlabs"; +import { includeIgnoreFile } from "@eslint/compat"; +import baseConfig from "eslint-config-synnaxlabs"; +import path from "path"; +import { fileURLToPath } from "url"; -export default synnaxConfig +const filename = fileURLToPath(import.meta.url); +const dirname = path.dirname(filename); +const gitignorePaths = [".gitignore", "src-tauri/.gitignore"]; + +const ignoredFiles = gitignorePaths.map((p) => { + const gitignorePath = path.join(dirname, p); + return includeIgnoreFile(gitignorePath); +}); + +export default [...ignoredFiles, ...baseConfig, { ignores: [".vite/"] }]; diff --git a/console/package.json b/console/package.json index cfd126106a..06f9cda59e 100644 --- a/console/package.json +++ b/console/package.json @@ -1,7 +1,7 @@ { "name": "@synnaxlabs/console", "private": true, - "version": "0.33.5", + "version": "0.34.0", "type": "module", "scripts": { "dev": "tauri dev", @@ -10,50 +10,52 @@ "dev-vite": "vite --force", "build-vite": "vite build", "preview": "vite preview", - "lint": "eslint \"src/**/*.ts*\"", + "lint": "eslint --cache", + "fix": "eslint --cache --fix", "test": "vitest", - "fix": "eslint \"src/**/*.ts*\" --fix", "devtools": "pnpm react-devtools", "react-devtools": "npx react-devtools" }, "dependencies": { "@fontsource/inter": "^5.1.0", - "@reduxjs/toolkit": "^2.2.8", + "@reduxjs/toolkit": "^2.3.0", "@synnaxlabs/client": "workspace:*", "@synnaxlabs/drift": "workspace:*", "@synnaxlabs/media": "workspace:*", "@synnaxlabs/pluto": "workspace:*", "@synnaxlabs/x": "workspace:*", - "@tanstack/react-query": "^5.59.9", - "@tauri-apps/api": "^2.0.2", + "@tanstack/react-query": "^5.59.20", + "@tauri-apps/api": "^2.1.0", "@tauri-apps/plugin-deep-link": "^2.0.0", - "@tauri-apps/plugin-dialog": "^2.0.0", - "@tauri-apps/plugin-fs": "^2.0.0", + "@tauri-apps/plugin-dialog": "^2.0.1", + "@tauri-apps/plugin-fs": "^2.0.2", "@tauri-apps/plugin-process": "^2.0.0", - "@tauri-apps/plugin-store": "^2.0.0", + "@tauri-apps/plugin-store": "^2.1.0", "@tauri-apps/plugin-updater": "^2.0.0", "async-mutex": "^0.5.0", - "proxy-memoize": "2.0.3", + "proxy-memoize": "2.0.6", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-error-boundary": "^4.0.13", + "react-error-boundary": "^4.1.2", "react-icons": "^5.3.0", "react-redux": "^9.1.2", - "uuid": "^10.0.0", + "uuid": "^11.0.3", "zod": "^3.23.8" }, "devDependencies": { + "@eslint/compat": "^1.2.0", "@synnaxlabs/tsconfig": "workspace:*", - "@tauri-apps/cli": "^2.0.2", + "@tauri-apps/cli": "^2.1.0", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.1", "@types/uuid": "^10.0.0", - "@vitejs/plugin-react": "^4.3.2", + "@vitejs/plugin-react": "^4.3.3", + "eslint": "^9.12.0", "eslint-config-synnaxlabs": "workspace:*", "stylelint-config-synnaxlabs": "workspace:*", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vite-tsconfig-paths": "^5.0.1", - "vitest": "^2.1.2" + "vite": "^5.4.10", + "vite-tsconfig-paths": "^5.1.2", + "vitest": "^2.1.4" } } diff --git a/console/release-spec.json b/console/release-spec.json index 361050d2cf..69beaadce3 100644 --- a/console/release-spec.json +++ b/console/release-spec.json @@ -1,19 +1,19 @@ { - "version": "v0.33.5", + "version": "v0.34.0", "notes": "Synnax Update", - "pub_date": "2024-11-08T17:31:11Z", + "pub_date": "2024-11-11T23:20:51Z", "platforms": { "darwin-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRZ3h4ZmpWZnBGeU1KbGd1R1NJWWx6RXZNL1g0SkwrbUNhT1Z0VHUvMWNtWFBuME42MFRZWURGOG9HL004TlZtMnl6MVdnUVpRY1hLbzcvN04wT0lsbUcyK3RYdkE0QUFRPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMxMDg2NTczCWZpbGU6U3lubmF4LmFwcC50YXIuZ3oKWC9TS0MyV25SVzlLaVIyZ3QwV0F3RytpbkxEZFBudCsrOVZtQTZUSzdkLzNZdUU5NGJZUnJtSVlrdmNCTlBhRnNaUUhNQm54dVkxRUZMWCtaWm1WQnc9PQo=", - "url": "https://github.com/synnaxlabs/synnax/releases/download/console-v0.33.5/Synnax.app.tar.gz" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRZ3h4ZmpWZnBGeUJqUWdtbElzcjYzdTRZOU9ISmZpc2djK3ROVHJUa2hVeHJsNWgwQThtc2wwcVlnYmowWk1Nc1dxOW15R0lWRHV0dnowSjl6TlFBa0RsbDRRcTlKOHc0PQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMxMzY2NjczCWZpbGU6U3lubmF4LmFwcC50YXIuZ3oKZHR0eEpMMFY3WVlBeHA0bG4yOEU0RFdQMlJ4azFzWGVlSUVDekFVc3lxZzV0S2JBbVZrZHBWVFlwSi83U3JpdnFhazRhL2NDbzh0VFJXL0c2a2crQUE9PQo=", + "url": "https://github.com/synnaxlabs/synnax/releases/download/console-v0.34.0-rc/Synnax.app.tar.gz" }, "linux-x86_64": { "signature": "not_supported_and_tauri_requires_an_entry", - "url": "https://github.com/synnaxlabs/synnax/releases/download/console-v0.33.5/Synnax.app.tar.gz" + "url": "https://github.com/synnaxlabs/synnax/releases/download/console-v0.34.0-rc/Synnax.app.tar.gz" }, "windows-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRZ3h4ZmpWZnBGeUxHVWMyb2VkUzFNSHZRM01raGxyM0tJMFY3ODNRZUFxUFV3VmFaV25KZ0Z3ZGRKY3l1SVZHWU5xcnhOTkcvakd3bzM4YkJwOGdzT2Y2RWxHYjNOY0FRPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMxMDg2OTA4CWZpbGU6U3lubmF4XzAuMzMuNV94NjRfZW4tVVMubXNpClRzckc5YUhKKzdtTXAvYUo2QzZ5WkIvYitGZStSakRoeW0xaDhFRWphMzB1d1RVVkk1dUpCQ2w3cTJiVStqdWdMWWdNbWlXaWVDS0NJSGNVZHZTb0N3PT0K", - "url": "https://github.com/synnaxlabs/synnax/releases/download/console-v0.33.5/Synnax_0.33.5_x64_en-US.msi" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRZ3h4ZmpWZnBGeVBBV0NScllzenVRYVRIaTFVcVZZRDlJcE4vbFBNVXR5dk12VXFNaHYyMWYyVy9TUk1SbUlrVGVqb2UzbGtlSXNBNzIxODFOeTFBRFNEV084UE9GUmdJPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMxMzY3MDA4CWZpbGU6U3lubmF4XzAuMzQuMF94NjRfZW4tVVMubXNpCkZFTzVvT3B1TENvQ2szRDlaSlJqSG9LcjZBUDNPM2hVaGdzNWtpWncrWjY0eEhXMWI5MUtGdFNnQTdrSjFndVZHVFVGSklldy8rZjJNaTV3cGNkZUR3PT0K", + "url": "https://github.com/synnaxlabs/synnax/releases/download/console-v0.34.0-rc/Synnax_0.34.0_x64_en-US.msi" } } } \ No newline at end of file diff --git a/console/src-tauri/.gitignore b/console/src-tauri/.gitignore index aba21e242c..9be9ac05a4 100644 --- a/console/src-tauri/.gitignore +++ b/console/src-tauri/.gitignore @@ -1,3 +1,3 @@ # Generated by Cargo # will have compiled files and executables -/target/ +target/ diff --git a/console/src-tauri/Cargo.lock b/console/src-tauri/Cargo.lock index 7af195c96d..afd6fb594c 100644 --- a/console/src-tauri/Cargo.lock +++ b/console/src-tauri/Cargo.lock @@ -58,15 +58,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "app" version = "0.1.0" dependencies = [ - "cocoa 0.25.0", + "cocoa 0.26.0", "device_query", "objc", "rand 0.8.5", @@ -86,9 +86,9 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -140,9 +140,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", "cfg-if", @@ -195,7 +195,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -230,7 +230,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -349,9 +349,9 @@ dependencies = [ [[package]] name = "brotli" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -376,9 +376,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" [[package]] name = "byteorder" @@ -388,9 +388,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ "serde", ] @@ -406,7 +406,7 @@ dependencies = [ "glib", "libc", "once_cell", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -449,7 +449,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -464,9 +464,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.29" +version = "1.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e804ac3194a48bb129643eb1d62fcc20d18c6b8c181704489353d13120bcd1" +checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" dependencies = [ "shlex", ] @@ -628,6 +628,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -704,9 +714,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" dependencies = [ "libc", ] @@ -775,7 +785,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -785,7 +795,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -809,7 +819,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -820,7 +830,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -846,13 +856,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -865,7 +875,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -928,7 +938,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -960,7 +970,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1016,9 +1026,9 @@ checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "embed-resource" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa" +checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379" dependencies = [ "cc", "memchr", @@ -1036,9 +1046,9 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1067,7 +1077,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1119,15 +1129,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "fdeflate" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" +checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" dependencies = [ "simd-adler32", ] @@ -1164,15 +1174,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "fluent-uri" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1197,7 +1198,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1259,9 +1260,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "fastrand", "futures-core", @@ -1278,7 +1279,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1472,7 +1473,7 @@ dependencies = [ "once_cell", "pin-project-lite", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1508,7 +1509,7 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1522,7 +1523,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1601,7 +1602,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1618,9 +1619,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "heck" @@ -1708,9 +1709,9 @@ checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -1745,9 +1746,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -1795,6 +1796,124 @@ dependencies = [ "png", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1803,12 +1922,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -1829,7 +1959,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.1", "serde", ] @@ -1922,7 +2052,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] @@ -1944,23 +2074,22 @@ dependencies = [ [[package]] name = "json-patch" -version = "2.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" dependencies = [ "jsonptr", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "jsonptr" -version = "0.4.7" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" dependencies = [ - "fluent-uri", "serde", "serde_json", ] @@ -2021,9 +2150,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.159" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libloading" @@ -2062,6 +2191,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.4.12" @@ -2174,9 +2309,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.15.1" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8123dfd4996055ac9b15a60ad263b44b01e539007523ad7a4a533a3d93b0591" +checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" dependencies = [ "crossbeam-channel", "dpi", @@ -2188,7 +2323,7 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror", + "thiserror 1.0.69", "windows-sys 0.59.0", ] @@ -2204,7 +2339,7 @@ dependencies = [ "ndk-sys", "num_enum", "raw-window-handle 0.6.2", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2279,7 +2414,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2289,7 +2424,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] [[package]] @@ -2297,6 +2431,9 @@ name = "objc-sys" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" +dependencies = [ + "cc", +] [[package]] name = "objc2" @@ -2324,6 +2461,30 @@ dependencies = [ "objc2-quartz-core", ] +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + [[package]] name = "objc2-core-data" version = "0.2.2" @@ -2348,6 +2509,18 @@ dependencies = [ "objc2-metal", ] +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + [[package]] name = "objc2-encode" version = "4.0.3" @@ -2367,6 +2540,18 @@ dependencies = [ "objc2", ] +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + [[package]] name = "objc2-metal" version = "0.2.2" @@ -2393,21 +2578,71 @@ dependencies = [ ] [[package]] -name = "objc_exception" -version = "0.1.2" +name = "objc2-symbols" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "cc", + "objc2", + "objc2-foundation", ] [[package]] -name = "objc_id" -version = "0.1.1" +name = "objc2-ui-kit" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "objc", + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bc69301064cebefc6c4c90ce9cba69225239e4b8ff99d445a2b5563797da65" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", ] [[package]] @@ -2528,9 +2763,9 @@ dependencies = [ [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" [[package]] name = "percent-encoding" @@ -2642,7 +2877,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2674,9 +2909,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -2729,9 +2964,9 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", @@ -2815,9 +3050,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -2853,7 +3088,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -2870,17 +3105,18 @@ dependencies = [ "rustc-hash", "rustls", "slab", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tracing", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -3019,14 +3255,14 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -3036,9 +3272,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -3053,9 +3289,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -3167,9 +3403,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" dependencies = [ "bitflags 2.6.0", "errno", @@ -3180,9 +3416,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.14" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "once_cell", "ring", @@ -3203,9 +3439,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -3257,7 +3493,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -3303,9 +3539,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -3323,13 +3559,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -3340,14 +3576,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa 1.0.11", "memchr", @@ -3363,7 +3599,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -3414,7 +3650,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -3661,9 +3897,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -3679,6 +3915,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "system-deps" version = "6.2.2" @@ -3694,9 +3941,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.30.3" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0dbbebe82d02044dfa481adca1550d6dd7bd16e086bc34fa0fbecceb5a63751" +checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da" dependencies = [ "bitflags 2.6.0", "cocoa 0.26.0", @@ -3739,14 +3986,14 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] name = "tar" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -3761,9 +4008,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.0.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5920aad0804ea5e86808d4b6e8753d3bcbae7efc8f4e41a4da00b45427559868" +checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c" dependencies = [ "anyhow", "bytes", @@ -3798,7 +4045,7 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror", + "thiserror 2.0.3", "tokio", "tray-icon", "url", @@ -3811,9 +4058,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "935f9b3c49b22b3e2e485a57f46d61cd1ae07b1cbb2ba87387a387caf2d8c4e7" +checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01" dependencies = [ "anyhow", "cargo_toml", @@ -3833,9 +4080,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d7443dd4f0b597704b6a14b964ee2ed16e99928d8e6292ae9825f09fbcd30e" +checksum = "bf79faeecf301d3e969b1fae977039edb77a4c1f25cc0a961be298b54bff97cf" dependencies = [ "base64 0.22.1", "brotli", @@ -3849,9 +4096,9 @@ dependencies = [ "serde", "serde_json", "sha2", - "syn 2.0.79", + "syn 2.0.87", "tauri-utils", - "thiserror", + "thiserror 2.0.3", "time", "url", "uuid", @@ -3860,23 +4107,23 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2c0963ccfc3f5194415f2cce7acc975942a8797fbabfb0aa1ed6f59326ae7f" +checksum = "c52027c8c5afb83166dacddc092ee8fff50772f9646d461d8c33ee887e447a03" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", "tauri-codegen", "tauri-utils", ] [[package]] name = "tauri-plugin" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e6660a409963e4d57b9bfab4addd141eeff41bd3a7fb14e13004a832cf7ef6" +checksum = "e753f2a30933a9bbf0a202fa47d7cc4a3401f06e8d6dcc53b79aa62954828c79" dependencies = [ "anyhow", "glob", @@ -3903,7 +4150,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-utils", - "thiserror", + "thiserror 1.0.69", "url", "windows-registry 0.3.0", "windows-result", @@ -3911,9 +4158,9 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddb2fe88b602461c118722c574e2775ab26a4e68886680583874b2f6520608b7" +checksum = "4307310e1d2c09ab110235834722e7c2b85099b683e1eb7342ab351b0be5ada3" dependencies = [ "log", "raw-window-handle 0.6.2", @@ -3923,15 +4170,15 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror", + "thiserror 1.0.69", "url", ] [[package]] name = "tauri-plugin-fs" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab300488ebec3487ca5f56289692e7e45feb07eea8d5e1dba497f7dc9dd9c407" +checksum = "96ba7d46e86db8c830d143ef90ab5a453328365b0cc834c24edea4267b16aba0" dependencies = [ "anyhow", "dunce", @@ -3943,7 +4190,7 @@ dependencies = [ "serde_repr", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.69", "url", "uuid", ] @@ -3960,9 +4207,9 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "371fb9aca2823990a2d0db7970573be5fdf07881fcaa2b835b29631feb84aec1" +checksum = "0ad7880c5586b6b2104be451e3d7fc0f3800c84bda69e9ba81c828f87cb34267" dependencies = [ "encoding_rs", "log", @@ -3975,15 +4222,15 @@ dependencies = [ "shared_child", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "tauri-plugin-store" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5058f179f7215390fc5a68eeffcb805b7e2681d6e817a5d08094fae7ab649e68" +checksum = "e9a580be53f04bb62422d239aa798e88522877f58a0d4a0e745f030055a51bb4" dependencies = [ "dunce", "log", @@ -3991,7 +4238,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -4017,7 +4264,7 @@ dependencies = [ "tauri", "tauri-plugin", "tempfile", - "thiserror", + "thiserror 1.0.69", "time", "tokio", "url", @@ -4027,9 +4274,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af12ad1af974b274ef1d32a94e6eba27a312b429ef28fcb98abc710df7f9151d" +checksum = "cce18d43f80d4aba3aa8a0c953bbe835f3d0f2370aca75e8dbb14bd4bab27958" dependencies = [ "dpi", "gtk", @@ -4039,16 +4286,16 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "thiserror", + "thiserror 2.0.3", "url", "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45e88aa0b11b302d836e6ea3e507a6359044c4a8bc86b865ba99868c695753d" +checksum = "9f442a38863e10129ffe2cec7bd09c2dcf8a098a3a27801a476a304d5bb991d2" dependencies = [ "gtk", "http", @@ -4072,9 +4319,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c38b0230d6880cf6dd07b6d7dd7789a0869f98ac12146e0d18d1c1049215a045" +checksum = "9271a88f99b4adea0dc71d0baca4505475a0bbd139fb135f62958721aaa8fe54" dependencies = [ "brotli", "cargo_metadata", @@ -4082,6 +4329,7 @@ dependencies = [ "dunce", "glob", "html5ever", + "http", "infer", "json-patch", "kuchikiki", @@ -4098,7 +4346,7 @@ dependencies = [ "serde_json", "serde_with", "swift-rs", - "thiserror", + "thiserror 2.0.3", "toml 0.8.2", "url", "urlpattern", @@ -4118,9 +4366,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -4148,22 +4396,42 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +dependencies = [ + "thiserror-impl 2.0.3", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] @@ -4206,6 +4474,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -4223,9 +4501,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -4247,7 +4525,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -4358,7 +4636,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -4372,9 +4650,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533fc2d4105e0e3d96ce1c71f2d308c9fbbe2ef9c587cab63dd627ab5bde218f" +checksum = "7c92af36a182b46206723bdf8a7942e20838cde1cf062e5b97854d57eb01763b" dependencies = [ "core-graphics 0.24.0", "crossbeam-channel", @@ -4387,7 +4665,7 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror", + "thiserror 1.0.69", "windows-sys 0.59.0", ] @@ -4467,27 +4745,12 @@ dependencies = [ "unic-common", ] -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -4502,9 +4765,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -4530,11 +4793,23 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom 0.2.15", "serde", @@ -4625,7 +4900,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -4659,7 +4934,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4672,9 +4947,9 @@ checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -4699,9 +4974,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", "rustix", @@ -4711,9 +4986,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.4" +version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -4828,7 +5103,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -4837,7 +5112,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ - "thiserror", + "thiserror 1.0.69", "windows 0.58.0", "windows-core 0.58.0", ] @@ -4948,7 +5223,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -4959,7 +5234,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -5254,16 +5529,27 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wry" -version = "0.44.1" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440600584cfbd8b0d28eace95c1f2c253db05dae43780b79380aa1e868f04c73" +checksum = "553ca1ce149982123962fac2506aa75b8b76288779a77e72b12fa2fc34938647" dependencies = [ "base64 0.22.1", - "block", - "cocoa 0.26.0", - "core-graphics 0.24.0", + "block2", + "cookie", "crossbeam-channel", "dpi", "dunce", @@ -5276,15 +5562,19 @@ dependencies = [ "kuchikiki", "libc", "ndk", - "objc", - "objc_id", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", "once_cell", "percent-encoding", "raw-window-handle 0.6.2", "sha2", "soup3", "tao-macros", - "thiserror", + "thiserror 1.0.69", + "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", @@ -5336,6 +5626,30 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zbus" version = "4.0.1" @@ -5413,7 +5727,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -5422,6 +5757,28 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "zip" version = "2.2.0" @@ -5434,7 +5791,7 @@ dependencies = [ "displaydoc", "indexmap 2.6.0", "memchr", - "thiserror", + "thiserror 1.0.69", ] [[package]] diff --git a/console/src-tauri/Cargo.toml b/console/src-tauri/Cargo.toml index 3922d6fd82..1af307efe5 100644 --- a/console/src-tauri/Cargo.toml +++ b/console/src-tauri/Cargo.toml @@ -7,33 +7,30 @@ license = "" repository = "" default-run = "app" edition = "2021" -rust-version = "1.79" +rust-version = "1.82" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] -tauri-build = { version = "2.0.0-rc.10", features = [] } +tauri-build = { version = "2.0.3", features = [] } [target.'cfg(target_os = "macos")'.dependencies] -cocoa = "0.25.0" +cocoa = "0.26.0" objc = "0.2.7" rand = "0.8.5" -[target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies] -tauri-plugin-updater = "2" - [dependencies] -tauri = { version = "2.0.2", features = ["devtools"] } -tauri-plugin-store = "2" -tauri-plugin-deep-link = "2" -tauri-plugin-fs = "2" -tauri-plugin-shell = "2" -tauri-plugin-updater = "2.0.0-rc.3" -tauri-plugin-dialog = "2" -tauri-plugin-process = "2" +tauri = { version = "2.1.0", features = ["devtools"] } +tauri-plugin-store = "2.1.0" +tauri-plugin-deep-link = "2.0.1" +tauri-plugin-fs = "2.0.3" +tauri-plugin-shell = "2.0.2" +tauri-plugin-updater = "2.0.2" +tauri-plugin-dialog = "2.0.3" +tauri-plugin-process = "2.0.1" window-shadows = "0.2.2" -serde = { version = "1", features = ["derive"] } -serde_json = "1" +serde = "1.0.214" +serde_json = "1.0.132" device_query = "1.1.1" [features] diff --git a/console/src-tauri/gen/schemas/acl-manifests.json b/console/src-tauri/gen/schemas/acl-manifests.json index 9e50436f39..cfac6e78db 100644 --- a/console/src-tauri/gen/schemas/acl-manifests.json +++ b/console/src-tauri/gen/schemas/acl-manifests.json @@ -1 +1 @@ -{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set which includes:\n- 'core:path:default'\n- 'core:event:default'\n- 'core:window:default'\n- 'core:webview:default'\n- 'core:app:default'\n- 'core:image:default'\n- 'core:resources:default'\n- 'core:menu:default'\n- 'core:tray:default'\n","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"deep-link":{"default_permission":{"identifier":"default","description":"Allows reading the opened deep link via the get_current command","permissions":["allow-get-current"]},"permissions":{"allow-get-current":{"identifier":"allow-get-current","description":"Enables the get_current command without any pre-configured scope.","commands":{"allow":["get_current"],"deny":[]}},"allow-is-registered":{"identifier":"allow-is-registered","description":"Enables the is_registered command without any pre-configured scope.","commands":{"allow":["is_registered"],"deny":[]}},"allow-register":{"identifier":"allow-register","description":"Enables the register command without any pre-configured scope.","commands":{"allow":["register"],"deny":[]}},"allow-unregister":{"identifier":"allow-unregister","description":"Enables the unregister command without any pre-configured scope.","commands":{"allow":["unregister"],"deny":[]}},"deny-get-current":{"identifier":"deny-get-current","description":"Denies the get_current command without any pre-configured scope.","commands":{"allow":[],"deny":["get_current"]}},"deny-is-registered":{"identifier":"deny-is-registered","description":"Denies the is_registered command without any pre-configured scope.","commands":{"allow":[],"deny":["is_registered"]}},"deny-register":{"identifier":"deny-register","description":"Denies the register command without any pre-configured scope.","commands":{"allow":[],"deny":["register"]}},"deny-unregister":{"identifier":"deny-unregister","description":"Denies the unregister command without any pre-configured scope.","commands":{"allow":[],"deny":["unregister"]}}},"permission_sets":{},"global_scope_schema":null},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-ask","allow-confirm","allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope.","commands":{"allow":["ask"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope.","commands":{"allow":["confirm"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope.","commands":{"allow":[],"deny":["ask"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope.","commands":{"allow":[],"deny":["confirm"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"fs":{"default_permission":{"identifier":"default","description":"This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n","permissions":["create-app-specific-dirs","read-app-specific-dirs-recursive","deny-default"]},"permissions":{"allow-copy-file":{"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]}},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]}},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]}},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]}},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]}},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]}},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]}},"allow-read-text-file":{"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]}},"allow-read-text-file-lines":{"identifier":"allow-read-text-file-lines","description":"Enables the read_text_file_lines command without any pre-configured scope.","commands":{"allow":["read_text_file_lines"],"deny":[]}},"allow-read-text-file-lines-next":{"identifier":"allow-read-text-file-lines-next","description":"Enables the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":["read_text_file_lines_next"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]}},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]}},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]}},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]}},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]}},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]}},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]}},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file"],"deny":[]}},"allow-write-text-file":{"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]}},"create-app-specific-dirs":{"identifier":"create-app-specific-dirs","description":"This permissions allows to create the application specific directories.\n","commands":{"allow":["mkdir","scope-app-index"],"deny":[]}},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]}},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]}},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]}},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]}},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]}},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]}},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]}},"deny-read-text-file":{"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]}},"deny-read-text-file-lines":{"identifier":"deny-read-text-file-lines","description":"Denies the read_text_file_lines command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines"]}},"deny-read-text-file-lines-next":{"identifier":"deny-read-text-file-lines-next","description":"Denies the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines_next"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]}},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]}},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]}},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]}},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]}},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]}},"deny-webview-data-linux":{"identifier":"deny-webview-data-linux","description":"This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-webview-data-windows":{"identifier":"deny-webview-data-windows","description":"This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]}},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]}},"deny-write-text-file":{"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]}},"read-all":{"identifier":"read-all","description":"This enables all read related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists","watch","unwatch"],"deny":[]}},"read-app-specific-dirs-recursive":{"identifier":"read-app-specific-dirs-recursive","description":"This permission allows recursive read functionality on the application\nspecific base directories. \n","commands":{"allow":["read_dir","read_file","read_text_file","read_text_file_lines","read_text_file_lines_next","exists","scope-app-recursive"],"deny":[]}},"read-dirs":{"identifier":"read-dirs","description":"This enables directory read and file metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"read-files":{"identifier":"read-files","description":"This enables file read related commands without any pre-configured accessible paths.","commands":{"allow":["read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists"],"deny":[]}},"read-meta":{"identifier":"read-meta","description":"This enables all index or metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.","commands":{"allow":[],"deny":[]}},"scope-app":{"identifier":"scope-app","description":"This scope permits access to all files and list content of top level directories in the application folders.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"},{"path":"$APPDATA"},{"path":"$APPDATA/*"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"},{"path":"$APPCACHE"},{"path":"$APPCACHE/*"},{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-app-index":{"identifier":"scope-app-index","description":"This scope permits to list all files and folders in the application directories.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPDATA"},{"path":"$APPLOCALDATA"},{"path":"$APPCACHE"},{"path":"$APPLOG"}]}},"scope-app-recursive":{"identifier":"scope-app-recursive","description":"This scope permits recursive access to the complete application folders, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"},{"path":"$APPDATA"},{"path":"$APPDATA/**"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"},{"path":"$APPCACHE"},{"path":"$APPCACHE/**"},{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-appcache":{"identifier":"scope-appcache","description":"This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/*"}]}},"scope-appcache-index":{"identifier":"scope-appcache-index","description":"This scope permits to list all files and folders in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"}]}},"scope-appcache-recursive":{"identifier":"scope-appcache-recursive","description":"This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/**"}]}},"scope-appconfig":{"identifier":"scope-appconfig","description":"This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"}]}},"scope-appconfig-index":{"identifier":"scope-appconfig-index","description":"This scope permits to list all files and folders in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"}]}},"scope-appconfig-recursive":{"identifier":"scope-appconfig-recursive","description":"This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"}]}},"scope-appdata":{"identifier":"scope-appdata","description":"This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/*"}]}},"scope-appdata-index":{"identifier":"scope-appdata-index","description":"This scope permits to list all files and folders in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"}]}},"scope-appdata-recursive":{"identifier":"scope-appdata-recursive","description":"This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]}},"scope-applocaldata":{"identifier":"scope-applocaldata","description":"This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"}]}},"scope-applocaldata-index":{"identifier":"scope-applocaldata-index","description":"This scope permits to list all files and folders in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"}]}},"scope-applocaldata-recursive":{"identifier":"scope-applocaldata-recursive","description":"This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"}]}},"scope-applog":{"identifier":"scope-applog","description":"This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-applog-index":{"identifier":"scope-applog-index","description":"This scope permits to list all files and folders in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"}]}},"scope-applog-recursive":{"identifier":"scope-applog-recursive","description":"This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-audio":{"identifier":"scope-audio","description":"This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/*"}]}},"scope-audio-index":{"identifier":"scope-audio-index","description":"This scope permits to list all files and folders in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"}]}},"scope-audio-recursive":{"identifier":"scope-audio-recursive","description":"This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/**"}]}},"scope-cache":{"identifier":"scope-cache","description":"This scope permits access to all files and list content of top level directories in the `$CACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/*"}]}},"scope-cache-index":{"identifier":"scope-cache-index","description":"This scope permits to list all files and folders in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"}]}},"scope-cache-recursive":{"identifier":"scope-cache-recursive","description":"This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/**"}]}},"scope-config":{"identifier":"scope-config","description":"This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/*"}]}},"scope-config-index":{"identifier":"scope-config-index","description":"This scope permits to list all files and folders in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"}]}},"scope-config-recursive":{"identifier":"scope-config-recursive","description":"This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/**"}]}},"scope-data":{"identifier":"scope-data","description":"This scope permits access to all files and list content of top level directories in the `$DATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/*"}]}},"scope-data-index":{"identifier":"scope-data-index","description":"This scope permits to list all files and folders in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"}]}},"scope-data-recursive":{"identifier":"scope-data-recursive","description":"This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/**"}]}},"scope-desktop":{"identifier":"scope-desktop","description":"This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/*"}]}},"scope-desktop-index":{"identifier":"scope-desktop-index","description":"This scope permits to list all files and folders in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"}]}},"scope-desktop-recursive":{"identifier":"scope-desktop-recursive","description":"This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/**"}]}},"scope-document":{"identifier":"scope-document","description":"This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/*"}]}},"scope-document-index":{"identifier":"scope-document-index","description":"This scope permits to list all files and folders in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"}]}},"scope-document-recursive":{"identifier":"scope-document-recursive","description":"This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/**"}]}},"scope-download":{"identifier":"scope-download","description":"This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/*"}]}},"scope-download-index":{"identifier":"scope-download-index","description":"This scope permits to list all files and folders in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"}]}},"scope-download-recursive":{"identifier":"scope-download-recursive","description":"This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/**"}]}},"scope-exe":{"identifier":"scope-exe","description":"This scope permits access to all files and list content of top level directories in the `$EXE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/*"}]}},"scope-exe-index":{"identifier":"scope-exe-index","description":"This scope permits to list all files and folders in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"}]}},"scope-exe-recursive":{"identifier":"scope-exe-recursive","description":"This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/**"}]}},"scope-font":{"identifier":"scope-font","description":"This scope permits access to all files and list content of top level directories in the `$FONT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/*"}]}},"scope-font-index":{"identifier":"scope-font-index","description":"This scope permits to list all files and folders in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"}]}},"scope-font-recursive":{"identifier":"scope-font-recursive","description":"This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/**"}]}},"scope-home":{"identifier":"scope-home","description":"This scope permits access to all files and list content of top level directories in the `$HOME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/*"}]}},"scope-home-index":{"identifier":"scope-home-index","description":"This scope permits to list all files and folders in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"}]}},"scope-home-recursive":{"identifier":"scope-home-recursive","description":"This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/**"}]}},"scope-localdata":{"identifier":"scope-localdata","description":"This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/*"}]}},"scope-localdata-index":{"identifier":"scope-localdata-index","description":"This scope permits to list all files and folders in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"}]}},"scope-localdata-recursive":{"identifier":"scope-localdata-recursive","description":"This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/**"}]}},"scope-log":{"identifier":"scope-log","description":"This scope permits access to all files and list content of top level directories in the `$LOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/*"}]}},"scope-log-index":{"identifier":"scope-log-index","description":"This scope permits to list all files and folders in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"}]}},"scope-log-recursive":{"identifier":"scope-log-recursive","description":"This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/**"}]}},"scope-picture":{"identifier":"scope-picture","description":"This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/*"}]}},"scope-picture-index":{"identifier":"scope-picture-index","description":"This scope permits to list all files and folders in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"}]}},"scope-picture-recursive":{"identifier":"scope-picture-recursive","description":"This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/**"}]}},"scope-public":{"identifier":"scope-public","description":"This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/*"}]}},"scope-public-index":{"identifier":"scope-public-index","description":"This scope permits to list all files and folders in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"}]}},"scope-public-recursive":{"identifier":"scope-public-recursive","description":"This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/**"}]}},"scope-resource":{"identifier":"scope-resource","description":"This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/*"}]}},"scope-resource-index":{"identifier":"scope-resource-index","description":"This scope permits to list all files and folders in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"}]}},"scope-resource-recursive":{"identifier":"scope-resource-recursive","description":"This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/**"}]}},"scope-runtime":{"identifier":"scope-runtime","description":"This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/*"}]}},"scope-runtime-index":{"identifier":"scope-runtime-index","description":"This scope permits to list all files and folders in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"}]}},"scope-runtime-recursive":{"identifier":"scope-runtime-recursive","description":"This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/**"}]}},"scope-temp":{"identifier":"scope-temp","description":"This scope permits access to all files and list content of top level directories in the `$TEMP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/*"}]}},"scope-temp-index":{"identifier":"scope-temp-index","description":"This scope permits to list all files and folders in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"}]}},"scope-temp-recursive":{"identifier":"scope-temp-recursive","description":"This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/**"}]}},"scope-template":{"identifier":"scope-template","description":"This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/*"}]}},"scope-template-index":{"identifier":"scope-template-index","description":"This scope permits to list all files and folders in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"}]}},"scope-template-recursive":{"identifier":"scope-template-recursive","description":"This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/**"}]}},"scope-video":{"identifier":"scope-video","description":"This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/*"}]}},"scope-video-index":{"identifier":"scope-video-index","description":"This scope permits to list all files and folders in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"}]}},"scope-video-recursive":{"identifier":"scope-video-recursive","description":"This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/**"}]}},"write-all":{"identifier":"write-all","description":"This enables all write related commands without any pre-configured accessible paths.","commands":{"allow":["mkdir","create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}},"write-files":{"identifier":"write-files","description":"This enables all file write related commands without any pre-configured accessible paths.","commands":{"allow":["create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}}},"permission_sets":{"allow-app-meta":{"identifier":"allow-app-meta","description":"This allows non-recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-index"]},"allow-app-meta-recursive":{"identifier":"allow-app-meta-recursive","description":"This allows full recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-recursive"]},"allow-app-read":{"identifier":"allow-app-read","description":"This allows non-recursive read access to the application folders.","permissions":["read-all","scope-app"]},"allow-app-read-recursive":{"identifier":"allow-app-read-recursive","description":"This allows full recursive read access to the complete application folders, files and subdirectories.","permissions":["read-all","scope-app-recursive"]},"allow-app-write":{"identifier":"allow-app-write","description":"This allows non-recursive write access to the application folders.","permissions":["write-all","scope-app"]},"allow-app-write-recursive":{"identifier":"allow-app-write-recursive","description":"This allows full recursive write access to the complete application folders, files and subdirectories.","permissions":["write-all","scope-app-recursive"]},"allow-appcache-meta":{"identifier":"allow-appcache-meta","description":"This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-index"]},"allow-appcache-meta-recursive":{"identifier":"allow-appcache-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-recursive"]},"allow-appcache-read":{"identifier":"allow-appcache-read","description":"This allows non-recursive read access to the `$APPCACHE` folder.","permissions":["read-all","scope-appcache"]},"allow-appcache-read-recursive":{"identifier":"allow-appcache-read-recursive","description":"This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["read-all","scope-appcache-recursive"]},"allow-appcache-write":{"identifier":"allow-appcache-write","description":"This allows non-recursive write access to the `$APPCACHE` folder.","permissions":["write-all","scope-appcache"]},"allow-appcache-write-recursive":{"identifier":"allow-appcache-write-recursive","description":"This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["write-all","scope-appcache-recursive"]},"allow-appconfig-meta":{"identifier":"allow-appconfig-meta","description":"This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-index"]},"allow-appconfig-meta-recursive":{"identifier":"allow-appconfig-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-recursive"]},"allow-appconfig-read":{"identifier":"allow-appconfig-read","description":"This allows non-recursive read access to the `$APPCONFIG` folder.","permissions":["read-all","scope-appconfig"]},"allow-appconfig-read-recursive":{"identifier":"allow-appconfig-read-recursive","description":"This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["read-all","scope-appconfig-recursive"]},"allow-appconfig-write":{"identifier":"allow-appconfig-write","description":"This allows non-recursive write access to the `$APPCONFIG` folder.","permissions":["write-all","scope-appconfig"]},"allow-appconfig-write-recursive":{"identifier":"allow-appconfig-write-recursive","description":"This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["write-all","scope-appconfig-recursive"]},"allow-appdata-meta":{"identifier":"allow-appdata-meta","description":"This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-index"]},"allow-appdata-meta-recursive":{"identifier":"allow-appdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-recursive"]},"allow-appdata-read":{"identifier":"allow-appdata-read","description":"This allows non-recursive read access to the `$APPDATA` folder.","permissions":["read-all","scope-appdata"]},"allow-appdata-read-recursive":{"identifier":"allow-appdata-read-recursive","description":"This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["read-all","scope-appdata-recursive"]},"allow-appdata-write":{"identifier":"allow-appdata-write","description":"This allows non-recursive write access to the `$APPDATA` folder.","permissions":["write-all","scope-appdata"]},"allow-appdata-write-recursive":{"identifier":"allow-appdata-write-recursive","description":"This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["write-all","scope-appdata-recursive"]},"allow-applocaldata-meta":{"identifier":"allow-applocaldata-meta","description":"This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-index"]},"allow-applocaldata-meta-recursive":{"identifier":"allow-applocaldata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-recursive"]},"allow-applocaldata-read":{"identifier":"allow-applocaldata-read","description":"This allows non-recursive read access to the `$APPLOCALDATA` folder.","permissions":["read-all","scope-applocaldata"]},"allow-applocaldata-read-recursive":{"identifier":"allow-applocaldata-read-recursive","description":"This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-applocaldata-recursive"]},"allow-applocaldata-write":{"identifier":"allow-applocaldata-write","description":"This allows non-recursive write access to the `$APPLOCALDATA` folder.","permissions":["write-all","scope-applocaldata"]},"allow-applocaldata-write-recursive":{"identifier":"allow-applocaldata-write-recursive","description":"This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-applocaldata-recursive"]},"allow-applog-meta":{"identifier":"allow-applog-meta","description":"This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-index"]},"allow-applog-meta-recursive":{"identifier":"allow-applog-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-recursive"]},"allow-applog-read":{"identifier":"allow-applog-read","description":"This allows non-recursive read access to the `$APPLOG` folder.","permissions":["read-all","scope-applog"]},"allow-applog-read-recursive":{"identifier":"allow-applog-read-recursive","description":"This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["read-all","scope-applog-recursive"]},"allow-applog-write":{"identifier":"allow-applog-write","description":"This allows non-recursive write access to the `$APPLOG` folder.","permissions":["write-all","scope-applog"]},"allow-applog-write-recursive":{"identifier":"allow-applog-write-recursive","description":"This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["write-all","scope-applog-recursive"]},"allow-audio-meta":{"identifier":"allow-audio-meta","description":"This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-index"]},"allow-audio-meta-recursive":{"identifier":"allow-audio-meta-recursive","description":"This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-recursive"]},"allow-audio-read":{"identifier":"allow-audio-read","description":"This allows non-recursive read access to the `$AUDIO` folder.","permissions":["read-all","scope-audio"]},"allow-audio-read-recursive":{"identifier":"allow-audio-read-recursive","description":"This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["read-all","scope-audio-recursive"]},"allow-audio-write":{"identifier":"allow-audio-write","description":"This allows non-recursive write access to the `$AUDIO` folder.","permissions":["write-all","scope-audio"]},"allow-audio-write-recursive":{"identifier":"allow-audio-write-recursive","description":"This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["write-all","scope-audio-recursive"]},"allow-cache-meta":{"identifier":"allow-cache-meta","description":"This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-index"]},"allow-cache-meta-recursive":{"identifier":"allow-cache-meta-recursive","description":"This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-recursive"]},"allow-cache-read":{"identifier":"allow-cache-read","description":"This allows non-recursive read access to the `$CACHE` folder.","permissions":["read-all","scope-cache"]},"allow-cache-read-recursive":{"identifier":"allow-cache-read-recursive","description":"This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.","permissions":["read-all","scope-cache-recursive"]},"allow-cache-write":{"identifier":"allow-cache-write","description":"This allows non-recursive write access to the `$CACHE` folder.","permissions":["write-all","scope-cache"]},"allow-cache-write-recursive":{"identifier":"allow-cache-write-recursive","description":"This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.","permissions":["write-all","scope-cache-recursive"]},"allow-config-meta":{"identifier":"allow-config-meta","description":"This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-index"]},"allow-config-meta-recursive":{"identifier":"allow-config-meta-recursive","description":"This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-recursive"]},"allow-config-read":{"identifier":"allow-config-read","description":"This allows non-recursive read access to the `$CONFIG` folder.","permissions":["read-all","scope-config"]},"allow-config-read-recursive":{"identifier":"allow-config-read-recursive","description":"This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["read-all","scope-config-recursive"]},"allow-config-write":{"identifier":"allow-config-write","description":"This allows non-recursive write access to the `$CONFIG` folder.","permissions":["write-all","scope-config"]},"allow-config-write-recursive":{"identifier":"allow-config-write-recursive","description":"This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["write-all","scope-config-recursive"]},"allow-data-meta":{"identifier":"allow-data-meta","description":"This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-index"]},"allow-data-meta-recursive":{"identifier":"allow-data-meta-recursive","description":"This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-recursive"]},"allow-data-read":{"identifier":"allow-data-read","description":"This allows non-recursive read access to the `$DATA` folder.","permissions":["read-all","scope-data"]},"allow-data-read-recursive":{"identifier":"allow-data-read-recursive","description":"This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.","permissions":["read-all","scope-data-recursive"]},"allow-data-write":{"identifier":"allow-data-write","description":"This allows non-recursive write access to the `$DATA` folder.","permissions":["write-all","scope-data"]},"allow-data-write-recursive":{"identifier":"allow-data-write-recursive","description":"This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.","permissions":["write-all","scope-data-recursive"]},"allow-desktop-meta":{"identifier":"allow-desktop-meta","description":"This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-index"]},"allow-desktop-meta-recursive":{"identifier":"allow-desktop-meta-recursive","description":"This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-recursive"]},"allow-desktop-read":{"identifier":"allow-desktop-read","description":"This allows non-recursive read access to the `$DESKTOP` folder.","permissions":["read-all","scope-desktop"]},"allow-desktop-read-recursive":{"identifier":"allow-desktop-read-recursive","description":"This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["read-all","scope-desktop-recursive"]},"allow-desktop-write":{"identifier":"allow-desktop-write","description":"This allows non-recursive write access to the `$DESKTOP` folder.","permissions":["write-all","scope-desktop"]},"allow-desktop-write-recursive":{"identifier":"allow-desktop-write-recursive","description":"This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["write-all","scope-desktop-recursive"]},"allow-document-meta":{"identifier":"allow-document-meta","description":"This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-index"]},"allow-document-meta-recursive":{"identifier":"allow-document-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-recursive"]},"allow-document-read":{"identifier":"allow-document-read","description":"This allows non-recursive read access to the `$DOCUMENT` folder.","permissions":["read-all","scope-document"]},"allow-document-read-recursive":{"identifier":"allow-document-read-recursive","description":"This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["read-all","scope-document-recursive"]},"allow-document-write":{"identifier":"allow-document-write","description":"This allows non-recursive write access to the `$DOCUMENT` folder.","permissions":["write-all","scope-document"]},"allow-document-write-recursive":{"identifier":"allow-document-write-recursive","description":"This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["write-all","scope-document-recursive"]},"allow-download-meta":{"identifier":"allow-download-meta","description":"This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-index"]},"allow-download-meta-recursive":{"identifier":"allow-download-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-recursive"]},"allow-download-read":{"identifier":"allow-download-read","description":"This allows non-recursive read access to the `$DOWNLOAD` folder.","permissions":["read-all","scope-download"]},"allow-download-read-recursive":{"identifier":"allow-download-read-recursive","description":"This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["read-all","scope-download-recursive"]},"allow-download-write":{"identifier":"allow-download-write","description":"This allows non-recursive write access to the `$DOWNLOAD` folder.","permissions":["write-all","scope-download"]},"allow-download-write-recursive":{"identifier":"allow-download-write-recursive","description":"This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["write-all","scope-download-recursive"]},"allow-exe-meta":{"identifier":"allow-exe-meta","description":"This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-index"]},"allow-exe-meta-recursive":{"identifier":"allow-exe-meta-recursive","description":"This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-recursive"]},"allow-exe-read":{"identifier":"allow-exe-read","description":"This allows non-recursive read access to the `$EXE` folder.","permissions":["read-all","scope-exe"]},"allow-exe-read-recursive":{"identifier":"allow-exe-read-recursive","description":"This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.","permissions":["read-all","scope-exe-recursive"]},"allow-exe-write":{"identifier":"allow-exe-write","description":"This allows non-recursive write access to the `$EXE` folder.","permissions":["write-all","scope-exe"]},"allow-exe-write-recursive":{"identifier":"allow-exe-write-recursive","description":"This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.","permissions":["write-all","scope-exe-recursive"]},"allow-font-meta":{"identifier":"allow-font-meta","description":"This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-index"]},"allow-font-meta-recursive":{"identifier":"allow-font-meta-recursive","description":"This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-recursive"]},"allow-font-read":{"identifier":"allow-font-read","description":"This allows non-recursive read access to the `$FONT` folder.","permissions":["read-all","scope-font"]},"allow-font-read-recursive":{"identifier":"allow-font-read-recursive","description":"This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.","permissions":["read-all","scope-font-recursive"]},"allow-font-write":{"identifier":"allow-font-write","description":"This allows non-recursive write access to the `$FONT` folder.","permissions":["write-all","scope-font"]},"allow-font-write-recursive":{"identifier":"allow-font-write-recursive","description":"This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.","permissions":["write-all","scope-font-recursive"]},"allow-home-meta":{"identifier":"allow-home-meta","description":"This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-index"]},"allow-home-meta-recursive":{"identifier":"allow-home-meta-recursive","description":"This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-recursive"]},"allow-home-read":{"identifier":"allow-home-read","description":"This allows non-recursive read access to the `$HOME` folder.","permissions":["read-all","scope-home"]},"allow-home-read-recursive":{"identifier":"allow-home-read-recursive","description":"This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.","permissions":["read-all","scope-home-recursive"]},"allow-home-write":{"identifier":"allow-home-write","description":"This allows non-recursive write access to the `$HOME` folder.","permissions":["write-all","scope-home"]},"allow-home-write-recursive":{"identifier":"allow-home-write-recursive","description":"This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.","permissions":["write-all","scope-home-recursive"]},"allow-localdata-meta":{"identifier":"allow-localdata-meta","description":"This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-index"]},"allow-localdata-meta-recursive":{"identifier":"allow-localdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-recursive"]},"allow-localdata-read":{"identifier":"allow-localdata-read","description":"This allows non-recursive read access to the `$LOCALDATA` folder.","permissions":["read-all","scope-localdata"]},"allow-localdata-read-recursive":{"identifier":"allow-localdata-read-recursive","description":"This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-localdata-recursive"]},"allow-localdata-write":{"identifier":"allow-localdata-write","description":"This allows non-recursive write access to the `$LOCALDATA` folder.","permissions":["write-all","scope-localdata"]},"allow-localdata-write-recursive":{"identifier":"allow-localdata-write-recursive","description":"This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-localdata-recursive"]},"allow-log-meta":{"identifier":"allow-log-meta","description":"This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-index"]},"allow-log-meta-recursive":{"identifier":"allow-log-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-recursive"]},"allow-log-read":{"identifier":"allow-log-read","description":"This allows non-recursive read access to the `$LOG` folder.","permissions":["read-all","scope-log"]},"allow-log-read-recursive":{"identifier":"allow-log-read-recursive","description":"This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.","permissions":["read-all","scope-log-recursive"]},"allow-log-write":{"identifier":"allow-log-write","description":"This allows non-recursive write access to the `$LOG` folder.","permissions":["write-all","scope-log"]},"allow-log-write-recursive":{"identifier":"allow-log-write-recursive","description":"This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.","permissions":["write-all","scope-log-recursive"]},"allow-picture-meta":{"identifier":"allow-picture-meta","description":"This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-index"]},"allow-picture-meta-recursive":{"identifier":"allow-picture-meta-recursive","description":"This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-recursive"]},"allow-picture-read":{"identifier":"allow-picture-read","description":"This allows non-recursive read access to the `$PICTURE` folder.","permissions":["read-all","scope-picture"]},"allow-picture-read-recursive":{"identifier":"allow-picture-read-recursive","description":"This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["read-all","scope-picture-recursive"]},"allow-picture-write":{"identifier":"allow-picture-write","description":"This allows non-recursive write access to the `$PICTURE` folder.","permissions":["write-all","scope-picture"]},"allow-picture-write-recursive":{"identifier":"allow-picture-write-recursive","description":"This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["write-all","scope-picture-recursive"]},"allow-public-meta":{"identifier":"allow-public-meta","description":"This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-index"]},"allow-public-meta-recursive":{"identifier":"allow-public-meta-recursive","description":"This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-recursive"]},"allow-public-read":{"identifier":"allow-public-read","description":"This allows non-recursive read access to the `$PUBLIC` folder.","permissions":["read-all","scope-public"]},"allow-public-read-recursive":{"identifier":"allow-public-read-recursive","description":"This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["read-all","scope-public-recursive"]},"allow-public-write":{"identifier":"allow-public-write","description":"This allows non-recursive write access to the `$PUBLIC` folder.","permissions":["write-all","scope-public"]},"allow-public-write-recursive":{"identifier":"allow-public-write-recursive","description":"This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["write-all","scope-public-recursive"]},"allow-resource-meta":{"identifier":"allow-resource-meta","description":"This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-index"]},"allow-resource-meta-recursive":{"identifier":"allow-resource-meta-recursive","description":"This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-recursive"]},"allow-resource-read":{"identifier":"allow-resource-read","description":"This allows non-recursive read access to the `$RESOURCE` folder.","permissions":["read-all","scope-resource"]},"allow-resource-read-recursive":{"identifier":"allow-resource-read-recursive","description":"This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["read-all","scope-resource-recursive"]},"allow-resource-write":{"identifier":"allow-resource-write","description":"This allows non-recursive write access to the `$RESOURCE` folder.","permissions":["write-all","scope-resource"]},"allow-resource-write-recursive":{"identifier":"allow-resource-write-recursive","description":"This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["write-all","scope-resource-recursive"]},"allow-runtime-meta":{"identifier":"allow-runtime-meta","description":"This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-index"]},"allow-runtime-meta-recursive":{"identifier":"allow-runtime-meta-recursive","description":"This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-recursive"]},"allow-runtime-read":{"identifier":"allow-runtime-read","description":"This allows non-recursive read access to the `$RUNTIME` folder.","permissions":["read-all","scope-runtime"]},"allow-runtime-read-recursive":{"identifier":"allow-runtime-read-recursive","description":"This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["read-all","scope-runtime-recursive"]},"allow-runtime-write":{"identifier":"allow-runtime-write","description":"This allows non-recursive write access to the `$RUNTIME` folder.","permissions":["write-all","scope-runtime"]},"allow-runtime-write-recursive":{"identifier":"allow-runtime-write-recursive","description":"This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["write-all","scope-runtime-recursive"]},"allow-temp-meta":{"identifier":"allow-temp-meta","description":"This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-index"]},"allow-temp-meta-recursive":{"identifier":"allow-temp-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-recursive"]},"allow-temp-read":{"identifier":"allow-temp-read","description":"This allows non-recursive read access to the `$TEMP` folder.","permissions":["read-all","scope-temp"]},"allow-temp-read-recursive":{"identifier":"allow-temp-read-recursive","description":"This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.","permissions":["read-all","scope-temp-recursive"]},"allow-temp-write":{"identifier":"allow-temp-write","description":"This allows non-recursive write access to the `$TEMP` folder.","permissions":["write-all","scope-temp"]},"allow-temp-write-recursive":{"identifier":"allow-temp-write-recursive","description":"This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.","permissions":["write-all","scope-temp-recursive"]},"allow-template-meta":{"identifier":"allow-template-meta","description":"This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-index"]},"allow-template-meta-recursive":{"identifier":"allow-template-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-recursive"]},"allow-template-read":{"identifier":"allow-template-read","description":"This allows non-recursive read access to the `$TEMPLATE` folder.","permissions":["read-all","scope-template"]},"allow-template-read-recursive":{"identifier":"allow-template-read-recursive","description":"This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["read-all","scope-template-recursive"]},"allow-template-write":{"identifier":"allow-template-write","description":"This allows non-recursive write access to the `$TEMPLATE` folder.","permissions":["write-all","scope-template"]},"allow-template-write-recursive":{"identifier":"allow-template-write-recursive","description":"This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["write-all","scope-template-recursive"]},"allow-video-meta":{"identifier":"allow-video-meta","description":"This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-index"]},"allow-video-meta-recursive":{"identifier":"allow-video-meta-recursive","description":"This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-recursive"]},"allow-video-read":{"identifier":"allow-video-read","description":"This allows non-recursive read access to the `$VIDEO` folder.","permissions":["read-all","scope-video"]},"allow-video-read-recursive":{"identifier":"allow-video-read-recursive","description":"This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["read-all","scope-video-recursive"]},"allow-video-write":{"identifier":"allow-video-write","description":"This allows non-recursive write access to the `$VIDEO` folder.","permissions":["write-all","scope-video"]},"allow-video-write-recursive":{"identifier":"allow-video-write-recursive","description":"This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["write-all","scope-video-recursive"]},"deny-default":{"identifier":"deny-default","description":"This denies access to dangerous Tauri relevant files and folders by default.","permissions":["deny-webview-data-linux","deny-webview-data-windows"]}},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"FS scope path.","type":"string"},{"properties":{"path":{"description":"FS scope path.","type":"string"}},"required":["path"],"type":"object"}],"description":"FS scope entry.","title":"FsScopeEntry"}},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess feeatures are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}},"store":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\noperations are available from the store plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n","permissions":["allow-create-store","allow-clear","allow-delete","allow-entries","allow-get","allow-has","allow-keys","allow-length","allow-load","allow-reset","allow-save","allow-set","allow-values"]},"permissions":{"allow-clear":{"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]}},"allow-create-store":{"identifier":"allow-create-store","description":"Enables the create_store command without any pre-configured scope.","commands":{"allow":["create_store"],"deny":[]}},"allow-delete":{"identifier":"allow-delete","description":"Enables the delete command without any pre-configured scope.","commands":{"allow":["delete"],"deny":[]}},"allow-entries":{"identifier":"allow-entries","description":"Enables the entries command without any pre-configured scope.","commands":{"allow":["entries"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-has":{"identifier":"allow-has","description":"Enables the has command without any pre-configured scope.","commands":{"allow":["has"],"deny":[]}},"allow-keys":{"identifier":"allow-keys","description":"Enables the keys command without any pre-configured scope.","commands":{"allow":["keys"],"deny":[]}},"allow-length":{"identifier":"allow-length","description":"Enables the length command without any pre-configured scope.","commands":{"allow":["length"],"deny":[]}},"allow-load":{"identifier":"allow-load","description":"Enables the load command without any pre-configured scope.","commands":{"allow":["load"],"deny":[]}},"allow-reset":{"identifier":"allow-reset","description":"Enables the reset command without any pre-configured scope.","commands":{"allow":["reset"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"allow-set":{"identifier":"allow-set","description":"Enables the set command without any pre-configured scope.","commands":{"allow":["set"],"deny":[]}},"allow-values":{"identifier":"allow-values","description":"Enables the values command without any pre-configured scope.","commands":{"allow":["values"],"deny":[]}},"deny-clear":{"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]}},"deny-create-store":{"identifier":"deny-create-store","description":"Denies the create_store command without any pre-configured scope.","commands":{"allow":[],"deny":["create_store"]}},"deny-delete":{"identifier":"deny-delete","description":"Denies the delete command without any pre-configured scope.","commands":{"allow":[],"deny":["delete"]}},"deny-entries":{"identifier":"deny-entries","description":"Denies the entries command without any pre-configured scope.","commands":{"allow":[],"deny":["entries"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-has":{"identifier":"deny-has","description":"Denies the has command without any pre-configured scope.","commands":{"allow":[],"deny":["has"]}},"deny-keys":{"identifier":"deny-keys","description":"Denies the keys command without any pre-configured scope.","commands":{"allow":[],"deny":["keys"]}},"deny-length":{"identifier":"deny-length","description":"Denies the length command without any pre-configured scope.","commands":{"allow":[],"deny":["length"]}},"deny-load":{"identifier":"deny-load","description":"Denies the load command without any pre-configured scope.","commands":{"allow":[],"deny":["load"]}},"deny-reset":{"identifier":"deny-reset","description":"Denies the reset command without any pre-configured scope.","commands":{"allow":[],"deny":["reset"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}},"deny-set":{"identifier":"deny-set","description":"Denies the set command without any pre-configured scope.","commands":{"allow":[],"deny":["set"]}},"deny-values":{"identifier":"deny-values","description":"Denies the values command without any pre-configured scope.","commands":{"allow":[],"deny":["values"]}}},"permission_sets":{},"global_scope_schema":null},"updater":{"default_permission":{"identifier":"default","description":"This permission set configures which kind of\nupdater functions are exposed to the frontend.\n\n#### Granted Permissions\n\nThe full workflow from checking for updates to installing them\nis enabled.\n\n","permissions":["allow-check","allow-download","allow-install","allow-download-and-install"]},"permissions":{"allow-check":{"identifier":"allow-check","description":"Enables the check command without any pre-configured scope.","commands":{"allow":["check"],"deny":[]}},"allow-download":{"identifier":"allow-download","description":"Enables the download command without any pre-configured scope.","commands":{"allow":["download"],"deny":[]}},"allow-download-and-install":{"identifier":"allow-download-and-install","description":"Enables the download_and_install command without any pre-configured scope.","commands":{"allow":["download_and_install"],"deny":[]}},"allow-install":{"identifier":"allow-install","description":"Enables the install command without any pre-configured scope.","commands":{"allow":["install"],"deny":[]}},"deny-check":{"identifier":"deny-check","description":"Denies the check command without any pre-configured scope.","commands":{"allow":[],"deny":["check"]}},"deny-download":{"identifier":"deny-download","description":"Denies the download command without any pre-configured scope.","commands":{"allow":[],"deny":["download"]}},"deny-download-and-install":{"identifier":"deny-download-and-install","description":"Denies the download_and_install command without any pre-configured scope.","commands":{"allow":[],"deny":["download_and_install"]}},"deny-install":{"identifier":"deny-install","description":"Denies the install command without any pre-configured scope.","commands":{"allow":[],"deny":["install"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file +{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set which includes:\n- 'core:path:default'\n- 'core:event:default'\n- 'core:window:default'\n- 'core:webview:default'\n- 'core:app:default'\n- 'core:image:default'\n- 'core:resources:default'\n- 'core:menu:default'\n- 'core:tray:default'\n","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"deep-link":{"default_permission":{"identifier":"default","description":"Allows reading the opened deep link via the get_current command","permissions":["allow-get-current"]},"permissions":{"allow-get-current":{"identifier":"allow-get-current","description":"Enables the get_current command without any pre-configured scope.","commands":{"allow":["get_current"],"deny":[]}},"allow-is-registered":{"identifier":"allow-is-registered","description":"Enables the is_registered command without any pre-configured scope.","commands":{"allow":["is_registered"],"deny":[]}},"allow-register":{"identifier":"allow-register","description":"Enables the register command without any pre-configured scope.","commands":{"allow":["register"],"deny":[]}},"allow-unregister":{"identifier":"allow-unregister","description":"Enables the unregister command without any pre-configured scope.","commands":{"allow":["unregister"],"deny":[]}},"deny-get-current":{"identifier":"deny-get-current","description":"Denies the get_current command without any pre-configured scope.","commands":{"allow":[],"deny":["get_current"]}},"deny-is-registered":{"identifier":"deny-is-registered","description":"Denies the is_registered command without any pre-configured scope.","commands":{"allow":[],"deny":["is_registered"]}},"deny-register":{"identifier":"deny-register","description":"Denies the register command without any pre-configured scope.","commands":{"allow":[],"deny":["register"]}},"deny-unregister":{"identifier":"deny-unregister","description":"Denies the unregister command without any pre-configured scope.","commands":{"allow":[],"deny":["unregister"]}}},"permission_sets":{},"global_scope_schema":null},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-ask","allow-confirm","allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope.","commands":{"allow":["ask"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope.","commands":{"allow":["confirm"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope.","commands":{"allow":[],"deny":["ask"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope.","commands":{"allow":[],"deny":["confirm"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"fs":{"default_permission":{"identifier":"default","description":"This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n","permissions":["create-app-specific-dirs","read-app-specific-dirs-recursive","deny-default"]},"permissions":{"allow-copy-file":{"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]}},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]}},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]}},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]}},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]}},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]}},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]}},"allow-read-text-file":{"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]}},"allow-read-text-file-lines":{"identifier":"allow-read-text-file-lines","description":"Enables the read_text_file_lines command without any pre-configured scope.","commands":{"allow":["read_text_file_lines"],"deny":[]}},"allow-read-text-file-lines-next":{"identifier":"allow-read-text-file-lines-next","description":"Enables the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":["read_text_file_lines_next"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]}},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]}},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]}},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]}},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]}},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]}},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]}},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file"],"deny":[]}},"allow-write-text-file":{"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]}},"create-app-specific-dirs":{"identifier":"create-app-specific-dirs","description":"This permissions allows to create the application specific directories.\n","commands":{"allow":["mkdir","scope-app-index"],"deny":[]}},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]}},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]}},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]}},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]}},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]}},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]}},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]}},"deny-read-text-file":{"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]}},"deny-read-text-file-lines":{"identifier":"deny-read-text-file-lines","description":"Denies the read_text_file_lines command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines"]}},"deny-read-text-file-lines-next":{"identifier":"deny-read-text-file-lines-next","description":"Denies the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines_next"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]}},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]}},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]}},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]}},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]}},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]}},"deny-webview-data-linux":{"identifier":"deny-webview-data-linux","description":"This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-webview-data-windows":{"identifier":"deny-webview-data-windows","description":"This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]}},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]}},"deny-write-text-file":{"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]}},"read-all":{"identifier":"read-all","description":"This enables all read related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists","watch","unwatch"],"deny":[]}},"read-app-specific-dirs-recursive":{"identifier":"read-app-specific-dirs-recursive","description":"This permission allows recursive read functionality on the application\nspecific base directories. \n","commands":{"allow":["read_dir","read_file","read_text_file","read_text_file_lines","read_text_file_lines_next","exists","scope-app-recursive"],"deny":[]}},"read-dirs":{"identifier":"read-dirs","description":"This enables directory read and file metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"read-files":{"identifier":"read-files","description":"This enables file read related commands without any pre-configured accessible paths.","commands":{"allow":["read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists"],"deny":[]}},"read-meta":{"identifier":"read-meta","description":"This enables all index or metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.","commands":{"allow":[],"deny":[]}},"scope-app":{"identifier":"scope-app","description":"This scope permits access to all files and list content of top level directories in the application folders.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"},{"path":"$APPDATA"},{"path":"$APPDATA/*"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"},{"path":"$APPCACHE"},{"path":"$APPCACHE/*"},{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-app-index":{"identifier":"scope-app-index","description":"This scope permits to list all files and folders in the application directories.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPDATA"},{"path":"$APPLOCALDATA"},{"path":"$APPCACHE"},{"path":"$APPLOG"}]}},"scope-app-recursive":{"identifier":"scope-app-recursive","description":"This scope permits recursive access to the complete application folders, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"},{"path":"$APPDATA"},{"path":"$APPDATA/**"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"},{"path":"$APPCACHE"},{"path":"$APPCACHE/**"},{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-appcache":{"identifier":"scope-appcache","description":"This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/*"}]}},"scope-appcache-index":{"identifier":"scope-appcache-index","description":"This scope permits to list all files and folders in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"}]}},"scope-appcache-recursive":{"identifier":"scope-appcache-recursive","description":"This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/**"}]}},"scope-appconfig":{"identifier":"scope-appconfig","description":"This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"}]}},"scope-appconfig-index":{"identifier":"scope-appconfig-index","description":"This scope permits to list all files and folders in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"}]}},"scope-appconfig-recursive":{"identifier":"scope-appconfig-recursive","description":"This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"}]}},"scope-appdata":{"identifier":"scope-appdata","description":"This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/*"}]}},"scope-appdata-index":{"identifier":"scope-appdata-index","description":"This scope permits to list all files and folders in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"}]}},"scope-appdata-recursive":{"identifier":"scope-appdata-recursive","description":"This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]}},"scope-applocaldata":{"identifier":"scope-applocaldata","description":"This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"}]}},"scope-applocaldata-index":{"identifier":"scope-applocaldata-index","description":"This scope permits to list all files and folders in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"}]}},"scope-applocaldata-recursive":{"identifier":"scope-applocaldata-recursive","description":"This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"}]}},"scope-applog":{"identifier":"scope-applog","description":"This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-applog-index":{"identifier":"scope-applog-index","description":"This scope permits to list all files and folders in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"}]}},"scope-applog-recursive":{"identifier":"scope-applog-recursive","description":"This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-audio":{"identifier":"scope-audio","description":"This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/*"}]}},"scope-audio-index":{"identifier":"scope-audio-index","description":"This scope permits to list all files and folders in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"}]}},"scope-audio-recursive":{"identifier":"scope-audio-recursive","description":"This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/**"}]}},"scope-cache":{"identifier":"scope-cache","description":"This scope permits access to all files and list content of top level directories in the `$CACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/*"}]}},"scope-cache-index":{"identifier":"scope-cache-index","description":"This scope permits to list all files and folders in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"}]}},"scope-cache-recursive":{"identifier":"scope-cache-recursive","description":"This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/**"}]}},"scope-config":{"identifier":"scope-config","description":"This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/*"}]}},"scope-config-index":{"identifier":"scope-config-index","description":"This scope permits to list all files and folders in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"}]}},"scope-config-recursive":{"identifier":"scope-config-recursive","description":"This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/**"}]}},"scope-data":{"identifier":"scope-data","description":"This scope permits access to all files and list content of top level directories in the `$DATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/*"}]}},"scope-data-index":{"identifier":"scope-data-index","description":"This scope permits to list all files and folders in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"}]}},"scope-data-recursive":{"identifier":"scope-data-recursive","description":"This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/**"}]}},"scope-desktop":{"identifier":"scope-desktop","description":"This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/*"}]}},"scope-desktop-index":{"identifier":"scope-desktop-index","description":"This scope permits to list all files and folders in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"}]}},"scope-desktop-recursive":{"identifier":"scope-desktop-recursive","description":"This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/**"}]}},"scope-document":{"identifier":"scope-document","description":"This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/*"}]}},"scope-document-index":{"identifier":"scope-document-index","description":"This scope permits to list all files and folders in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"}]}},"scope-document-recursive":{"identifier":"scope-document-recursive","description":"This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/**"}]}},"scope-download":{"identifier":"scope-download","description":"This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/*"}]}},"scope-download-index":{"identifier":"scope-download-index","description":"This scope permits to list all files and folders in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"}]}},"scope-download-recursive":{"identifier":"scope-download-recursive","description":"This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/**"}]}},"scope-exe":{"identifier":"scope-exe","description":"This scope permits access to all files and list content of top level directories in the `$EXE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/*"}]}},"scope-exe-index":{"identifier":"scope-exe-index","description":"This scope permits to list all files and folders in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"}]}},"scope-exe-recursive":{"identifier":"scope-exe-recursive","description":"This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/**"}]}},"scope-font":{"identifier":"scope-font","description":"This scope permits access to all files and list content of top level directories in the `$FONT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/*"}]}},"scope-font-index":{"identifier":"scope-font-index","description":"This scope permits to list all files and folders in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"}]}},"scope-font-recursive":{"identifier":"scope-font-recursive","description":"This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/**"}]}},"scope-home":{"identifier":"scope-home","description":"This scope permits access to all files and list content of top level directories in the `$HOME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/*"}]}},"scope-home-index":{"identifier":"scope-home-index","description":"This scope permits to list all files and folders in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"}]}},"scope-home-recursive":{"identifier":"scope-home-recursive","description":"This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/**"}]}},"scope-localdata":{"identifier":"scope-localdata","description":"This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/*"}]}},"scope-localdata-index":{"identifier":"scope-localdata-index","description":"This scope permits to list all files and folders in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"}]}},"scope-localdata-recursive":{"identifier":"scope-localdata-recursive","description":"This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/**"}]}},"scope-log":{"identifier":"scope-log","description":"This scope permits access to all files and list content of top level directories in the `$LOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/*"}]}},"scope-log-index":{"identifier":"scope-log-index","description":"This scope permits to list all files and folders in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"}]}},"scope-log-recursive":{"identifier":"scope-log-recursive","description":"This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/**"}]}},"scope-picture":{"identifier":"scope-picture","description":"This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/*"}]}},"scope-picture-index":{"identifier":"scope-picture-index","description":"This scope permits to list all files and folders in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"}]}},"scope-picture-recursive":{"identifier":"scope-picture-recursive","description":"This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/**"}]}},"scope-public":{"identifier":"scope-public","description":"This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/*"}]}},"scope-public-index":{"identifier":"scope-public-index","description":"This scope permits to list all files and folders in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"}]}},"scope-public-recursive":{"identifier":"scope-public-recursive","description":"This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/**"}]}},"scope-resource":{"identifier":"scope-resource","description":"This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/*"}]}},"scope-resource-index":{"identifier":"scope-resource-index","description":"This scope permits to list all files and folders in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"}]}},"scope-resource-recursive":{"identifier":"scope-resource-recursive","description":"This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/**"}]}},"scope-runtime":{"identifier":"scope-runtime","description":"This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/*"}]}},"scope-runtime-index":{"identifier":"scope-runtime-index","description":"This scope permits to list all files and folders in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"}]}},"scope-runtime-recursive":{"identifier":"scope-runtime-recursive","description":"This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/**"}]}},"scope-temp":{"identifier":"scope-temp","description":"This scope permits access to all files and list content of top level directories in the `$TEMP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/*"}]}},"scope-temp-index":{"identifier":"scope-temp-index","description":"This scope permits to list all files and folders in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"}]}},"scope-temp-recursive":{"identifier":"scope-temp-recursive","description":"This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/**"}]}},"scope-template":{"identifier":"scope-template","description":"This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/*"}]}},"scope-template-index":{"identifier":"scope-template-index","description":"This scope permits to list all files and folders in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"}]}},"scope-template-recursive":{"identifier":"scope-template-recursive","description":"This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/**"}]}},"scope-video":{"identifier":"scope-video","description":"This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/*"}]}},"scope-video-index":{"identifier":"scope-video-index","description":"This scope permits to list all files and folders in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"}]}},"scope-video-recursive":{"identifier":"scope-video-recursive","description":"This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/**"}]}},"write-all":{"identifier":"write-all","description":"This enables all write related commands without any pre-configured accessible paths.","commands":{"allow":["mkdir","create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}},"write-files":{"identifier":"write-files","description":"This enables all file write related commands without any pre-configured accessible paths.","commands":{"allow":["create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}}},"permission_sets":{"allow-app-meta":{"identifier":"allow-app-meta","description":"This allows non-recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-index"]},"allow-app-meta-recursive":{"identifier":"allow-app-meta-recursive","description":"This allows full recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-recursive"]},"allow-app-read":{"identifier":"allow-app-read","description":"This allows non-recursive read access to the application folders.","permissions":["read-all","scope-app"]},"allow-app-read-recursive":{"identifier":"allow-app-read-recursive","description":"This allows full recursive read access to the complete application folders, files and subdirectories.","permissions":["read-all","scope-app-recursive"]},"allow-app-write":{"identifier":"allow-app-write","description":"This allows non-recursive write access to the application folders.","permissions":["write-all","scope-app"]},"allow-app-write-recursive":{"identifier":"allow-app-write-recursive","description":"This allows full recursive write access to the complete application folders, files and subdirectories.","permissions":["write-all","scope-app-recursive"]},"allow-appcache-meta":{"identifier":"allow-appcache-meta","description":"This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-index"]},"allow-appcache-meta-recursive":{"identifier":"allow-appcache-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-recursive"]},"allow-appcache-read":{"identifier":"allow-appcache-read","description":"This allows non-recursive read access to the `$APPCACHE` folder.","permissions":["read-all","scope-appcache"]},"allow-appcache-read-recursive":{"identifier":"allow-appcache-read-recursive","description":"This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["read-all","scope-appcache-recursive"]},"allow-appcache-write":{"identifier":"allow-appcache-write","description":"This allows non-recursive write access to the `$APPCACHE` folder.","permissions":["write-all","scope-appcache"]},"allow-appcache-write-recursive":{"identifier":"allow-appcache-write-recursive","description":"This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["write-all","scope-appcache-recursive"]},"allow-appconfig-meta":{"identifier":"allow-appconfig-meta","description":"This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-index"]},"allow-appconfig-meta-recursive":{"identifier":"allow-appconfig-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-recursive"]},"allow-appconfig-read":{"identifier":"allow-appconfig-read","description":"This allows non-recursive read access to the `$APPCONFIG` folder.","permissions":["read-all","scope-appconfig"]},"allow-appconfig-read-recursive":{"identifier":"allow-appconfig-read-recursive","description":"This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["read-all","scope-appconfig-recursive"]},"allow-appconfig-write":{"identifier":"allow-appconfig-write","description":"This allows non-recursive write access to the `$APPCONFIG` folder.","permissions":["write-all","scope-appconfig"]},"allow-appconfig-write-recursive":{"identifier":"allow-appconfig-write-recursive","description":"This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["write-all","scope-appconfig-recursive"]},"allow-appdata-meta":{"identifier":"allow-appdata-meta","description":"This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-index"]},"allow-appdata-meta-recursive":{"identifier":"allow-appdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-recursive"]},"allow-appdata-read":{"identifier":"allow-appdata-read","description":"This allows non-recursive read access to the `$APPDATA` folder.","permissions":["read-all","scope-appdata"]},"allow-appdata-read-recursive":{"identifier":"allow-appdata-read-recursive","description":"This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["read-all","scope-appdata-recursive"]},"allow-appdata-write":{"identifier":"allow-appdata-write","description":"This allows non-recursive write access to the `$APPDATA` folder.","permissions":["write-all","scope-appdata"]},"allow-appdata-write-recursive":{"identifier":"allow-appdata-write-recursive","description":"This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["write-all","scope-appdata-recursive"]},"allow-applocaldata-meta":{"identifier":"allow-applocaldata-meta","description":"This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-index"]},"allow-applocaldata-meta-recursive":{"identifier":"allow-applocaldata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-recursive"]},"allow-applocaldata-read":{"identifier":"allow-applocaldata-read","description":"This allows non-recursive read access to the `$APPLOCALDATA` folder.","permissions":["read-all","scope-applocaldata"]},"allow-applocaldata-read-recursive":{"identifier":"allow-applocaldata-read-recursive","description":"This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-applocaldata-recursive"]},"allow-applocaldata-write":{"identifier":"allow-applocaldata-write","description":"This allows non-recursive write access to the `$APPLOCALDATA` folder.","permissions":["write-all","scope-applocaldata"]},"allow-applocaldata-write-recursive":{"identifier":"allow-applocaldata-write-recursive","description":"This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-applocaldata-recursive"]},"allow-applog-meta":{"identifier":"allow-applog-meta","description":"This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-index"]},"allow-applog-meta-recursive":{"identifier":"allow-applog-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-recursive"]},"allow-applog-read":{"identifier":"allow-applog-read","description":"This allows non-recursive read access to the `$APPLOG` folder.","permissions":["read-all","scope-applog"]},"allow-applog-read-recursive":{"identifier":"allow-applog-read-recursive","description":"This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["read-all","scope-applog-recursive"]},"allow-applog-write":{"identifier":"allow-applog-write","description":"This allows non-recursive write access to the `$APPLOG` folder.","permissions":["write-all","scope-applog"]},"allow-applog-write-recursive":{"identifier":"allow-applog-write-recursive","description":"This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["write-all","scope-applog-recursive"]},"allow-audio-meta":{"identifier":"allow-audio-meta","description":"This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-index"]},"allow-audio-meta-recursive":{"identifier":"allow-audio-meta-recursive","description":"This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-recursive"]},"allow-audio-read":{"identifier":"allow-audio-read","description":"This allows non-recursive read access to the `$AUDIO` folder.","permissions":["read-all","scope-audio"]},"allow-audio-read-recursive":{"identifier":"allow-audio-read-recursive","description":"This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["read-all","scope-audio-recursive"]},"allow-audio-write":{"identifier":"allow-audio-write","description":"This allows non-recursive write access to the `$AUDIO` folder.","permissions":["write-all","scope-audio"]},"allow-audio-write-recursive":{"identifier":"allow-audio-write-recursive","description":"This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["write-all","scope-audio-recursive"]},"allow-cache-meta":{"identifier":"allow-cache-meta","description":"This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-index"]},"allow-cache-meta-recursive":{"identifier":"allow-cache-meta-recursive","description":"This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-recursive"]},"allow-cache-read":{"identifier":"allow-cache-read","description":"This allows non-recursive read access to the `$CACHE` folder.","permissions":["read-all","scope-cache"]},"allow-cache-read-recursive":{"identifier":"allow-cache-read-recursive","description":"This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.","permissions":["read-all","scope-cache-recursive"]},"allow-cache-write":{"identifier":"allow-cache-write","description":"This allows non-recursive write access to the `$CACHE` folder.","permissions":["write-all","scope-cache"]},"allow-cache-write-recursive":{"identifier":"allow-cache-write-recursive","description":"This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.","permissions":["write-all","scope-cache-recursive"]},"allow-config-meta":{"identifier":"allow-config-meta","description":"This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-index"]},"allow-config-meta-recursive":{"identifier":"allow-config-meta-recursive","description":"This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-recursive"]},"allow-config-read":{"identifier":"allow-config-read","description":"This allows non-recursive read access to the `$CONFIG` folder.","permissions":["read-all","scope-config"]},"allow-config-read-recursive":{"identifier":"allow-config-read-recursive","description":"This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["read-all","scope-config-recursive"]},"allow-config-write":{"identifier":"allow-config-write","description":"This allows non-recursive write access to the `$CONFIG` folder.","permissions":["write-all","scope-config"]},"allow-config-write-recursive":{"identifier":"allow-config-write-recursive","description":"This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["write-all","scope-config-recursive"]},"allow-data-meta":{"identifier":"allow-data-meta","description":"This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-index"]},"allow-data-meta-recursive":{"identifier":"allow-data-meta-recursive","description":"This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-recursive"]},"allow-data-read":{"identifier":"allow-data-read","description":"This allows non-recursive read access to the `$DATA` folder.","permissions":["read-all","scope-data"]},"allow-data-read-recursive":{"identifier":"allow-data-read-recursive","description":"This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.","permissions":["read-all","scope-data-recursive"]},"allow-data-write":{"identifier":"allow-data-write","description":"This allows non-recursive write access to the `$DATA` folder.","permissions":["write-all","scope-data"]},"allow-data-write-recursive":{"identifier":"allow-data-write-recursive","description":"This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.","permissions":["write-all","scope-data-recursive"]},"allow-desktop-meta":{"identifier":"allow-desktop-meta","description":"This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-index"]},"allow-desktop-meta-recursive":{"identifier":"allow-desktop-meta-recursive","description":"This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-recursive"]},"allow-desktop-read":{"identifier":"allow-desktop-read","description":"This allows non-recursive read access to the `$DESKTOP` folder.","permissions":["read-all","scope-desktop"]},"allow-desktop-read-recursive":{"identifier":"allow-desktop-read-recursive","description":"This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["read-all","scope-desktop-recursive"]},"allow-desktop-write":{"identifier":"allow-desktop-write","description":"This allows non-recursive write access to the `$DESKTOP` folder.","permissions":["write-all","scope-desktop"]},"allow-desktop-write-recursive":{"identifier":"allow-desktop-write-recursive","description":"This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["write-all","scope-desktop-recursive"]},"allow-document-meta":{"identifier":"allow-document-meta","description":"This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-index"]},"allow-document-meta-recursive":{"identifier":"allow-document-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-recursive"]},"allow-document-read":{"identifier":"allow-document-read","description":"This allows non-recursive read access to the `$DOCUMENT` folder.","permissions":["read-all","scope-document"]},"allow-document-read-recursive":{"identifier":"allow-document-read-recursive","description":"This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["read-all","scope-document-recursive"]},"allow-document-write":{"identifier":"allow-document-write","description":"This allows non-recursive write access to the `$DOCUMENT` folder.","permissions":["write-all","scope-document"]},"allow-document-write-recursive":{"identifier":"allow-document-write-recursive","description":"This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["write-all","scope-document-recursive"]},"allow-download-meta":{"identifier":"allow-download-meta","description":"This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-index"]},"allow-download-meta-recursive":{"identifier":"allow-download-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-recursive"]},"allow-download-read":{"identifier":"allow-download-read","description":"This allows non-recursive read access to the `$DOWNLOAD` folder.","permissions":["read-all","scope-download"]},"allow-download-read-recursive":{"identifier":"allow-download-read-recursive","description":"This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["read-all","scope-download-recursive"]},"allow-download-write":{"identifier":"allow-download-write","description":"This allows non-recursive write access to the `$DOWNLOAD` folder.","permissions":["write-all","scope-download"]},"allow-download-write-recursive":{"identifier":"allow-download-write-recursive","description":"This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["write-all","scope-download-recursive"]},"allow-exe-meta":{"identifier":"allow-exe-meta","description":"This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-index"]},"allow-exe-meta-recursive":{"identifier":"allow-exe-meta-recursive","description":"This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-recursive"]},"allow-exe-read":{"identifier":"allow-exe-read","description":"This allows non-recursive read access to the `$EXE` folder.","permissions":["read-all","scope-exe"]},"allow-exe-read-recursive":{"identifier":"allow-exe-read-recursive","description":"This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.","permissions":["read-all","scope-exe-recursive"]},"allow-exe-write":{"identifier":"allow-exe-write","description":"This allows non-recursive write access to the `$EXE` folder.","permissions":["write-all","scope-exe"]},"allow-exe-write-recursive":{"identifier":"allow-exe-write-recursive","description":"This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.","permissions":["write-all","scope-exe-recursive"]},"allow-font-meta":{"identifier":"allow-font-meta","description":"This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-index"]},"allow-font-meta-recursive":{"identifier":"allow-font-meta-recursive","description":"This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-recursive"]},"allow-font-read":{"identifier":"allow-font-read","description":"This allows non-recursive read access to the `$FONT` folder.","permissions":["read-all","scope-font"]},"allow-font-read-recursive":{"identifier":"allow-font-read-recursive","description":"This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.","permissions":["read-all","scope-font-recursive"]},"allow-font-write":{"identifier":"allow-font-write","description":"This allows non-recursive write access to the `$FONT` folder.","permissions":["write-all","scope-font"]},"allow-font-write-recursive":{"identifier":"allow-font-write-recursive","description":"This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.","permissions":["write-all","scope-font-recursive"]},"allow-home-meta":{"identifier":"allow-home-meta","description":"This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-index"]},"allow-home-meta-recursive":{"identifier":"allow-home-meta-recursive","description":"This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-recursive"]},"allow-home-read":{"identifier":"allow-home-read","description":"This allows non-recursive read access to the `$HOME` folder.","permissions":["read-all","scope-home"]},"allow-home-read-recursive":{"identifier":"allow-home-read-recursive","description":"This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.","permissions":["read-all","scope-home-recursive"]},"allow-home-write":{"identifier":"allow-home-write","description":"This allows non-recursive write access to the `$HOME` folder.","permissions":["write-all","scope-home"]},"allow-home-write-recursive":{"identifier":"allow-home-write-recursive","description":"This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.","permissions":["write-all","scope-home-recursive"]},"allow-localdata-meta":{"identifier":"allow-localdata-meta","description":"This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-index"]},"allow-localdata-meta-recursive":{"identifier":"allow-localdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-recursive"]},"allow-localdata-read":{"identifier":"allow-localdata-read","description":"This allows non-recursive read access to the `$LOCALDATA` folder.","permissions":["read-all","scope-localdata"]},"allow-localdata-read-recursive":{"identifier":"allow-localdata-read-recursive","description":"This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-localdata-recursive"]},"allow-localdata-write":{"identifier":"allow-localdata-write","description":"This allows non-recursive write access to the `$LOCALDATA` folder.","permissions":["write-all","scope-localdata"]},"allow-localdata-write-recursive":{"identifier":"allow-localdata-write-recursive","description":"This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-localdata-recursive"]},"allow-log-meta":{"identifier":"allow-log-meta","description":"This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-index"]},"allow-log-meta-recursive":{"identifier":"allow-log-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-recursive"]},"allow-log-read":{"identifier":"allow-log-read","description":"This allows non-recursive read access to the `$LOG` folder.","permissions":["read-all","scope-log"]},"allow-log-read-recursive":{"identifier":"allow-log-read-recursive","description":"This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.","permissions":["read-all","scope-log-recursive"]},"allow-log-write":{"identifier":"allow-log-write","description":"This allows non-recursive write access to the `$LOG` folder.","permissions":["write-all","scope-log"]},"allow-log-write-recursive":{"identifier":"allow-log-write-recursive","description":"This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.","permissions":["write-all","scope-log-recursive"]},"allow-picture-meta":{"identifier":"allow-picture-meta","description":"This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-index"]},"allow-picture-meta-recursive":{"identifier":"allow-picture-meta-recursive","description":"This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-recursive"]},"allow-picture-read":{"identifier":"allow-picture-read","description":"This allows non-recursive read access to the `$PICTURE` folder.","permissions":["read-all","scope-picture"]},"allow-picture-read-recursive":{"identifier":"allow-picture-read-recursive","description":"This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["read-all","scope-picture-recursive"]},"allow-picture-write":{"identifier":"allow-picture-write","description":"This allows non-recursive write access to the `$PICTURE` folder.","permissions":["write-all","scope-picture"]},"allow-picture-write-recursive":{"identifier":"allow-picture-write-recursive","description":"This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["write-all","scope-picture-recursive"]},"allow-public-meta":{"identifier":"allow-public-meta","description":"This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-index"]},"allow-public-meta-recursive":{"identifier":"allow-public-meta-recursive","description":"This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-recursive"]},"allow-public-read":{"identifier":"allow-public-read","description":"This allows non-recursive read access to the `$PUBLIC` folder.","permissions":["read-all","scope-public"]},"allow-public-read-recursive":{"identifier":"allow-public-read-recursive","description":"This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["read-all","scope-public-recursive"]},"allow-public-write":{"identifier":"allow-public-write","description":"This allows non-recursive write access to the `$PUBLIC` folder.","permissions":["write-all","scope-public"]},"allow-public-write-recursive":{"identifier":"allow-public-write-recursive","description":"This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["write-all","scope-public-recursive"]},"allow-resource-meta":{"identifier":"allow-resource-meta","description":"This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-index"]},"allow-resource-meta-recursive":{"identifier":"allow-resource-meta-recursive","description":"This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-recursive"]},"allow-resource-read":{"identifier":"allow-resource-read","description":"This allows non-recursive read access to the `$RESOURCE` folder.","permissions":["read-all","scope-resource"]},"allow-resource-read-recursive":{"identifier":"allow-resource-read-recursive","description":"This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["read-all","scope-resource-recursive"]},"allow-resource-write":{"identifier":"allow-resource-write","description":"This allows non-recursive write access to the `$RESOURCE` folder.","permissions":["write-all","scope-resource"]},"allow-resource-write-recursive":{"identifier":"allow-resource-write-recursive","description":"This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["write-all","scope-resource-recursive"]},"allow-runtime-meta":{"identifier":"allow-runtime-meta","description":"This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-index"]},"allow-runtime-meta-recursive":{"identifier":"allow-runtime-meta-recursive","description":"This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-recursive"]},"allow-runtime-read":{"identifier":"allow-runtime-read","description":"This allows non-recursive read access to the `$RUNTIME` folder.","permissions":["read-all","scope-runtime"]},"allow-runtime-read-recursive":{"identifier":"allow-runtime-read-recursive","description":"This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["read-all","scope-runtime-recursive"]},"allow-runtime-write":{"identifier":"allow-runtime-write","description":"This allows non-recursive write access to the `$RUNTIME` folder.","permissions":["write-all","scope-runtime"]},"allow-runtime-write-recursive":{"identifier":"allow-runtime-write-recursive","description":"This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["write-all","scope-runtime-recursive"]},"allow-temp-meta":{"identifier":"allow-temp-meta","description":"This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-index"]},"allow-temp-meta-recursive":{"identifier":"allow-temp-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-recursive"]},"allow-temp-read":{"identifier":"allow-temp-read","description":"This allows non-recursive read access to the `$TEMP` folder.","permissions":["read-all","scope-temp"]},"allow-temp-read-recursive":{"identifier":"allow-temp-read-recursive","description":"This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.","permissions":["read-all","scope-temp-recursive"]},"allow-temp-write":{"identifier":"allow-temp-write","description":"This allows non-recursive write access to the `$TEMP` folder.","permissions":["write-all","scope-temp"]},"allow-temp-write-recursive":{"identifier":"allow-temp-write-recursive","description":"This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.","permissions":["write-all","scope-temp-recursive"]},"allow-template-meta":{"identifier":"allow-template-meta","description":"This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-index"]},"allow-template-meta-recursive":{"identifier":"allow-template-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-recursive"]},"allow-template-read":{"identifier":"allow-template-read","description":"This allows non-recursive read access to the `$TEMPLATE` folder.","permissions":["read-all","scope-template"]},"allow-template-read-recursive":{"identifier":"allow-template-read-recursive","description":"This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["read-all","scope-template-recursive"]},"allow-template-write":{"identifier":"allow-template-write","description":"This allows non-recursive write access to the `$TEMPLATE` folder.","permissions":["write-all","scope-template"]},"allow-template-write-recursive":{"identifier":"allow-template-write-recursive","description":"This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["write-all","scope-template-recursive"]},"allow-video-meta":{"identifier":"allow-video-meta","description":"This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-index"]},"allow-video-meta-recursive":{"identifier":"allow-video-meta-recursive","description":"This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-recursive"]},"allow-video-read":{"identifier":"allow-video-read","description":"This allows non-recursive read access to the `$VIDEO` folder.","permissions":["read-all","scope-video"]},"allow-video-read-recursive":{"identifier":"allow-video-read-recursive","description":"This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["read-all","scope-video-recursive"]},"allow-video-write":{"identifier":"allow-video-write","description":"This allows non-recursive write access to the `$VIDEO` folder.","permissions":["write-all","scope-video"]},"allow-video-write-recursive":{"identifier":"allow-video-write-recursive","description":"This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["write-all","scope-video-recursive"]},"deny-default":{"identifier":"deny-default","description":"This denies access to dangerous Tauri relevant files and folders by default.","permissions":["deny-webview-data-linux","deny-webview-data-windows"]}},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"FS scope path.","type":"string"},{"properties":{"path":{"description":"FS scope path.","type":"string"}},"required":["path"],"type":"object"}],"description":"FS scope entry.","title":"FsScopeEntry"}},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess feeatures are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}},"store":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\noperations are available from the store plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n","permissions":["allow-load","allow-get-store","allow-set","allow-get","allow-has","allow-delete","allow-clear","allow-reset","allow-keys","allow-values","allow-entries","allow-length","allow-reload","allow-save"]},"permissions":{"allow-clear":{"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]}},"allow-delete":{"identifier":"allow-delete","description":"Enables the delete command without any pre-configured scope.","commands":{"allow":["delete"],"deny":[]}},"allow-entries":{"identifier":"allow-entries","description":"Enables the entries command without any pre-configured scope.","commands":{"allow":["entries"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-get-store":{"identifier":"allow-get-store","description":"Enables the get_store command without any pre-configured scope.","commands":{"allow":["get_store"],"deny":[]}},"allow-has":{"identifier":"allow-has","description":"Enables the has command without any pre-configured scope.","commands":{"allow":["has"],"deny":[]}},"allow-keys":{"identifier":"allow-keys","description":"Enables the keys command without any pre-configured scope.","commands":{"allow":["keys"],"deny":[]}},"allow-length":{"identifier":"allow-length","description":"Enables the length command without any pre-configured scope.","commands":{"allow":["length"],"deny":[]}},"allow-load":{"identifier":"allow-load","description":"Enables the load command without any pre-configured scope.","commands":{"allow":["load"],"deny":[]}},"allow-reload":{"identifier":"allow-reload","description":"Enables the reload command without any pre-configured scope.","commands":{"allow":["reload"],"deny":[]}},"allow-reset":{"identifier":"allow-reset","description":"Enables the reset command without any pre-configured scope.","commands":{"allow":["reset"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"allow-set":{"identifier":"allow-set","description":"Enables the set command without any pre-configured scope.","commands":{"allow":["set"],"deny":[]}},"allow-values":{"identifier":"allow-values","description":"Enables the values command without any pre-configured scope.","commands":{"allow":["values"],"deny":[]}},"deny-clear":{"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]}},"deny-delete":{"identifier":"deny-delete","description":"Denies the delete command without any pre-configured scope.","commands":{"allow":[],"deny":["delete"]}},"deny-entries":{"identifier":"deny-entries","description":"Denies the entries command without any pre-configured scope.","commands":{"allow":[],"deny":["entries"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-get-store":{"identifier":"deny-get-store","description":"Denies the get_store command without any pre-configured scope.","commands":{"allow":[],"deny":["get_store"]}},"deny-has":{"identifier":"deny-has","description":"Denies the has command without any pre-configured scope.","commands":{"allow":[],"deny":["has"]}},"deny-keys":{"identifier":"deny-keys","description":"Denies the keys command without any pre-configured scope.","commands":{"allow":[],"deny":["keys"]}},"deny-length":{"identifier":"deny-length","description":"Denies the length command without any pre-configured scope.","commands":{"allow":[],"deny":["length"]}},"deny-load":{"identifier":"deny-load","description":"Denies the load command without any pre-configured scope.","commands":{"allow":[],"deny":["load"]}},"deny-reload":{"identifier":"deny-reload","description":"Denies the reload command without any pre-configured scope.","commands":{"allow":[],"deny":["reload"]}},"deny-reset":{"identifier":"deny-reset","description":"Denies the reset command without any pre-configured scope.","commands":{"allow":[],"deny":["reset"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}},"deny-set":{"identifier":"deny-set","description":"Denies the set command without any pre-configured scope.","commands":{"allow":[],"deny":["set"]}},"deny-values":{"identifier":"deny-values","description":"Denies the values command without any pre-configured scope.","commands":{"allow":[],"deny":["values"]}}},"permission_sets":{},"global_scope_schema":null},"updater":{"default_permission":{"identifier":"default","description":"This permission set configures which kind of\nupdater functions are exposed to the frontend.\n\n#### Granted Permissions\n\nThe full workflow from checking for updates to installing them\nis enabled.\n\n","permissions":["allow-check","allow-download","allow-install","allow-download-and-install"]},"permissions":{"allow-check":{"identifier":"allow-check","description":"Enables the check command without any pre-configured scope.","commands":{"allow":["check"],"deny":[]}},"allow-download":{"identifier":"allow-download","description":"Enables the download command without any pre-configured scope.","commands":{"allow":["download"],"deny":[]}},"allow-download-and-install":{"identifier":"allow-download-and-install","description":"Enables the download_and_install command without any pre-configured scope.","commands":{"allow":["download_and_install"],"deny":[]}},"allow-install":{"identifier":"allow-install","description":"Enables the install command without any pre-configured scope.","commands":{"allow":["install"],"deny":[]}},"deny-check":{"identifier":"deny-check","description":"Denies the check command without any pre-configured scope.","commands":{"allow":[],"deny":["check"]}},"deny-download":{"identifier":"deny-download","description":"Denies the download command without any pre-configured scope.","commands":{"allow":[],"deny":["download"]}},"deny-download-and-install":{"identifier":"deny-download-and-install","description":"Denies the download_and_install command without any pre-configured scope.","commands":{"allow":[],"deny":["download_and_install"]}},"deny-install":{"identifier":"deny-install","description":"Denies the install command without any pre-configured scope.","commands":{"allow":[],"deny":["install"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/console/src-tauri/gen/schemas/desktop-schema.json b/console/src-tauri/gen/schemas/desktop-schema.json index 03b053d64e..8ffe99feaf 100644 --- a/console/src-tauri/gen/schemas/desktop-schema.json +++ b/console/src-tauri/gen/schemas/desktop-schema.json @@ -37,7 +37,7 @@ ], "definitions": { "Capability": { - "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows fine grained access to the Tauri core, application, or plugin commands. If a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, \"platforms\": [\"macOS\",\"windows\"] } ```", + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows fine grained access to the Tauri core, application, or plugin commands. If a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", "type": "object", "required": [ "identifier", @@ -84,7 +84,7 @@ } }, "permissions": { - "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ```", + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", "type": "array", "items": { "$ref": "#/definitions/PermissionEntry" @@ -4977,11 +4977,6 @@ "type": "string", "const": "store:allow-clear" }, - { - "description": "Enables the create_store command without any pre-configured scope.", - "type": "string", - "const": "store:allow-create-store" - }, { "description": "Enables the delete command without any pre-configured scope.", "type": "string", @@ -4997,6 +4992,11 @@ "type": "string", "const": "store:allow-get" }, + { + "description": "Enables the get_store command without any pre-configured scope.", + "type": "string", + "const": "store:allow-get-store" + }, { "description": "Enables the has command without any pre-configured scope.", "type": "string", @@ -5017,6 +5017,11 @@ "type": "string", "const": "store:allow-load" }, + { + "description": "Enables the reload command without any pre-configured scope.", + "type": "string", + "const": "store:allow-reload" + }, { "description": "Enables the reset command without any pre-configured scope.", "type": "string", @@ -5042,11 +5047,6 @@ "type": "string", "const": "store:deny-clear" }, - { - "description": "Denies the create_store command without any pre-configured scope.", - "type": "string", - "const": "store:deny-create-store" - }, { "description": "Denies the delete command without any pre-configured scope.", "type": "string", @@ -5062,6 +5062,11 @@ "type": "string", "const": "store:deny-get" }, + { + "description": "Denies the get_store command without any pre-configured scope.", + "type": "string", + "const": "store:deny-get-store" + }, { "description": "Denies the has command without any pre-configured scope.", "type": "string", @@ -5082,6 +5087,11 @@ "type": "string", "const": "store:deny-load" }, + { + "description": "Denies the reload command without any pre-configured scope.", + "type": "string", + "const": "store:deny-reload" + }, { "description": "Denies the reset command without any pre-configured scope.", "type": "string", diff --git a/console/src-tauri/gen/schemas/macOS-schema.json b/console/src-tauri/gen/schemas/macOS-schema.json index 03b053d64e..8ffe99feaf 100644 --- a/console/src-tauri/gen/schemas/macOS-schema.json +++ b/console/src-tauri/gen/schemas/macOS-schema.json @@ -37,7 +37,7 @@ ], "definitions": { "Capability": { - "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows fine grained access to the Tauri core, application, or plugin commands. If a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, \"platforms\": [\"macOS\",\"windows\"] } ```", + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows fine grained access to the Tauri core, application, or plugin commands. If a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", "type": "object", "required": [ "identifier", @@ -84,7 +84,7 @@ } }, "permissions": { - "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ```", + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", "type": "array", "items": { "$ref": "#/definitions/PermissionEntry" @@ -4977,11 +4977,6 @@ "type": "string", "const": "store:allow-clear" }, - { - "description": "Enables the create_store command without any pre-configured scope.", - "type": "string", - "const": "store:allow-create-store" - }, { "description": "Enables the delete command without any pre-configured scope.", "type": "string", @@ -4997,6 +4992,11 @@ "type": "string", "const": "store:allow-get" }, + { + "description": "Enables the get_store command without any pre-configured scope.", + "type": "string", + "const": "store:allow-get-store" + }, { "description": "Enables the has command without any pre-configured scope.", "type": "string", @@ -5017,6 +5017,11 @@ "type": "string", "const": "store:allow-load" }, + { + "description": "Enables the reload command without any pre-configured scope.", + "type": "string", + "const": "store:allow-reload" + }, { "description": "Enables the reset command without any pre-configured scope.", "type": "string", @@ -5042,11 +5047,6 @@ "type": "string", "const": "store:deny-clear" }, - { - "description": "Denies the create_store command without any pre-configured scope.", - "type": "string", - "const": "store:deny-create-store" - }, { "description": "Denies the delete command without any pre-configured scope.", "type": "string", @@ -5062,6 +5062,11 @@ "type": "string", "const": "store:deny-get" }, + { + "description": "Denies the get_store command without any pre-configured scope.", + "type": "string", + "const": "store:deny-get-store" + }, { "description": "Denies the has command without any pre-configured scope.", "type": "string", @@ -5082,6 +5087,11 @@ "type": "string", "const": "store:deny-load" }, + { + "description": "Denies the reload command without any pre-configured scope.", + "type": "string", + "const": "store:deny-reload" + }, { "description": "Denies the reset command without any pre-configured scope.", "type": "string", diff --git a/console/src/channel/external.ts b/console/src/channel/external.ts index 3158eb264b..1940a96b5f 100644 --- a/console/src/channel/external.ts +++ b/console/src/channel/external.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { CREATE_LAYOUT_TYPE, CreateModal } from "@/channel/Create"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export * from "@/channel/Create"; export * from "@/channel/services/ontology"; diff --git a/console/src/channel/services/link.ts b/console/src/channel/services/link.ts index 77f3485b27..d9ae9c1b7f 100644 --- a/console/src/channel/services/link.ts +++ b/console/src/channel/services/link.ts @@ -10,7 +10,7 @@ import { channel } from "@synnaxlabs/client"; import { LinePlot } from "@/lineplot"; -import { Link } from "@/link"; +import { type Link } from "@/link"; export const linkHandler: Link.Handler = async ({ resource, diff --git a/console/src/channel/services/ontology.tsx b/console/src/channel/services/ontology.tsx index 8c0780e430..a41f671f89 100644 --- a/console/src/channel/services/ontology.tsx +++ b/console/src/channel/services/ontology.tsx @@ -17,7 +17,7 @@ import { telem, } from "@synnaxlabs/pluto"; import { Tree } from "@synnaxlabs/pluto/tree"; -import { errors, UnknownRecord } from "@synnaxlabs/x"; +import { errors, type UnknownRecord } from "@synnaxlabs/x"; import { useMutation } from "@tanstack/react-query"; import { type ReactElement } from "react"; @@ -26,7 +26,7 @@ import { Group } from "@/group"; import { Layout } from "@/layout"; import { LinePlot } from "@/lineplot"; import { Link } from "@/link"; -import { Ontology } from "@/ontology"; +import { type Ontology } from "@/ontology"; import { useConfirmDelete } from "@/ontology/hooks"; import { Range } from "@/range"; import { Schematic } from "@/schematic"; diff --git a/console/src/cluster/Connect.tsx b/console/src/cluster/Connect.tsx index 509f27e841..6e54c6a42a 100644 --- a/console/src/cluster/Connect.tsx +++ b/console/src/cluster/Connect.tsx @@ -103,9 +103,7 @@ export const Connect = ({ onClose }: Layout.RendererProps): ReactElement => { const handleTestConnection = (): void => { void (async (): Promise => { - if (!methods.validate()) { - return; - } + if (!methods.validate()) return; setConnState(null); setLoading("test"); const state = await testConnection(methods.value() as SynnaxProps); diff --git a/console/src/cluster/external.ts b/console/src/cluster/external.ts index 3f59f8ac44..6797e7a08e 100644 --- a/console/src/cluster/external.ts +++ b/console/src/cluster/external.ts @@ -9,7 +9,7 @@ import { Connect, connectWindowLayout } from "@/cluster/Connect"; import { versionOutdatedAdapter } from "@/cluster/notification"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; import { type NotificationAdapter } from "@/notifications/Notifications"; export * from "@/cluster/Badges"; diff --git a/console/src/cluster/migrations/index.ts b/console/src/cluster/migrations/index.ts index e0753ea355..b92d7a18c0 100644 --- a/console/src/cluster/migrations/index.ts +++ b/console/src/cluster/migrations/index.ts @@ -9,7 +9,7 @@ import { migrate } from "@synnaxlabs/x"; -import * as v0 from "@/cluster/migrations/v0"; +import type * as v0 from "@/cluster/migrations/v0"; import * as v1 from "@/cluster/migrations/v1"; export type Cluster = v0.Cluster; diff --git a/console/src/cluster/migrations/v1.ts b/console/src/cluster/migrations/v1.ts index b608c52fa5..6abd077195 100644 --- a/console/src/cluster/migrations/v1.ts +++ b/console/src/cluster/migrations/v1.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { SynnaxProps } from "@synnaxlabs/client"; +import { type SynnaxProps } from "@synnaxlabs/client"; import { migrate } from "@synnaxlabs/x"; import { z } from "zod"; diff --git a/console/src/cluster/notification.tsx b/console/src/cluster/notification.tsx index 23311326a1..4bb691bd79 100644 --- a/console/src/cluster/notification.tsx +++ b/console/src/cluster/notification.tsx @@ -11,7 +11,7 @@ import { Button, Synnax } from "@synnaxlabs/pluto"; import { type NotificationAdapter, - SugaredNotification, + type SugaredNotification, } from "@/notifications/Notifications"; import { Version } from "@/version"; diff --git a/console/src/cluster/slice.ts b/console/src/cluster/slice.ts index 38dc506320..870b8f9759 100644 --- a/console/src/cluster/slice.ts +++ b/console/src/cluster/slice.ts @@ -56,17 +56,12 @@ export const { name: SLICE_NAME, initialState: ZERO_SLICE_STATE, reducers: { - set: ( - { activeCluster, clusters }, - { payload: cluster }: PayloadAction, - ) => { - clusters[cluster.key] = cluster; - if (activeCluster == null) activeCluster = cluster.key; + set: (state, { payload: cluster }: PayloadAction) => { + state.clusters[cluster.key] = cluster; + state.activeCluster ??= cluster.key; }, remove: ({ clusters }, { payload: { keys } }: PayloadAction) => { - for (const key of keys) { - delete clusters[key]; - } + for (const key of keys) delete clusters[key]; }, setActive: (state, { payload: key }: PayloadAction) => { state.activeCluster = key; diff --git a/console/src/components/menu/items.tsx b/console/src/components/menu/items.tsx index a61383d4d0..f7dba9d1a5 100644 --- a/console/src/components/menu/items.tsx +++ b/console/src/components/menu/items.tsx @@ -36,10 +36,8 @@ export const RenameItem = (): ReactElement => ( ); -export const DeleteItem = (): ReactElement => { - return ( - } size="small"> - Delete - - ); -}; +export const DeleteItem = (): ReactElement => ( + } size="small"> + Delete + +); diff --git a/console/src/components/nav/Nav.tsx b/console/src/components/nav/Nav.tsx index 8e8a35e85d..89741c73ef 100644 --- a/console/src/components/nav/Nav.tsx +++ b/console/src/components/nav/Nav.tsx @@ -7,9 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { Menu as PMenu, Nav } from "@synnaxlabs/pluto"; -import { CSS as PCSS } from "@synnaxlabs/pluto"; -import { Text } from "@synnaxlabs/pluto/text"; +import { CSS as PCSS, Menu as PMenu, Nav, Text } from "@synnaxlabs/pluto"; import { location } from "@synnaxlabs/x"; import { type ReactElement } from "react"; diff --git a/console/src/confirm/Confirm.tsx b/console/src/confirm/Confirm.tsx index ca30d9b041..0775863fff 100644 --- a/console/src/confirm/Confirm.tsx +++ b/console/src/confirm/Confirm.tsx @@ -7,13 +7,13 @@ // Source License, use of this software will be governed by the Apache License, // Version 2.0, included in the file licenses/APL.txt. -import { Align, Button, Nav, Status, Text, Triggers } from "@synnaxlabs/pluto"; +import { Align, Button, Nav, type Status, Text, Triggers } from "@synnaxlabs/pluto"; import { useDispatch, useStore } from "react-redux"; import { CSS } from "@/css"; import { Layout } from "@/layout"; import { selectArgs } from "@/layout/selectors"; -import { RootState } from "@/store"; +import { type RootState } from "@/store"; interface ConfirmLayoutArgs { message: string; diff --git a/console/src/confirm/external.ts b/console/src/confirm/external.ts index 326a1ccde2..9901acbe32 100644 --- a/console/src/confirm/external.ts +++ b/console/src/confirm/external.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { Confirm, LAYOUT_TYPE } from "@/confirm/Confirm"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export { useModal } from "@/confirm/Confirm"; diff --git a/console/src/docs/external.ts b/console/src/docs/external.ts index df2790470d..94546d6902 100644 --- a/console/src/docs/external.ts +++ b/console/src/docs/external.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { Docs,LAYOUT_TYPE } from "@/docs/Docs"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export * from "@/docs/Docs"; export * from "@/docs/palette"; diff --git a/console/src/error/Overlay.tsx b/console/src/error/Overlay.tsx index db96a3e0f0..f32f2fd3e8 100644 --- a/console/src/error/Overlay.tsx +++ b/console/src/error/Overlay.tsx @@ -26,7 +26,7 @@ import { type PropsWithChildren, type ReactElement, useEffect } from "react"; import { ErrorBoundary, type ErrorBoundaryProps, - FallbackProps, + type FallbackProps, } from "react-error-boundary"; import { useDispatch } from "react-redux"; @@ -62,9 +62,7 @@ const FallbackRenderWithStore: ErrorBoundaryProps["fallbackRender"] = ({ error } }; const FallbackRenderWithoutStore: ErrorBoundaryProps["fallbackRender"] = ({ error, -}) => { - return ; -}; +}) => ; type FallbackRenderContentProps = Pick & { onTryAgain?: () => void; diff --git a/console/src/fs/LoadFileContents.tsx b/console/src/fs/LoadFileContents.tsx index 5838ed591c..d485ee209e 100644 --- a/console/src/fs/LoadFileContents.tsx +++ b/console/src/fs/LoadFileContents.tsx @@ -10,12 +10,12 @@ import "@/fs/LoadFileContents.css"; import { Icon } from "@synnaxlabs/media"; -import { Align, Button, Input } from "@synnaxlabs/pluto"; +import { Align, Button, type Input } from "@synnaxlabs/pluto"; import { binary } from "@synnaxlabs/x"; import { open } from "@tauri-apps/plugin-dialog"; import { readFile } from "@tauri-apps/plugin-fs"; -import { ReactElement, useEffect, useState } from "react"; -import { z } from "zod"; +import { type ReactElement, useEffect, useState } from "react"; +import { type z } from "zod"; import { CSS } from "@/css"; diff --git a/console/src/group/ontology.tsx b/console/src/group/ontology.tsx index 9510e94ef8..c574f97f15 100644 --- a/console/src/group/ontology.tsx +++ b/console/src/group/ontology.tsx @@ -261,7 +261,7 @@ export const useCreateFromSelection = (): (( }, }); nextNodes = Tree.moveNode({ - tree: nodes, + tree: nextNodes, destination: newID.toString(), keys: resourcesToGroup.map((id) => id.toString()), }); diff --git a/console/src/hardware/device/Configure.tsx b/console/src/hardware/device/Configure.tsx index a49e02a07a..cb6b43c7cb 100644 --- a/console/src/hardware/device/Configure.tsx +++ b/console/src/hardware/device/Configure.tsx @@ -21,8 +21,7 @@ import { Text, Triggers, } from "@synnaxlabs/pluto"; -import { deep, strings } from "@synnaxlabs/x"; -import { type UnknownRecord } from "@synnaxlabs/x"; +import { deep, strings, type UnknownRecord } from "@synnaxlabs/x"; import { useMutation } from "@tanstack/react-query"; import { type ReactElement, useRef, useState } from "react"; import { z } from "zod"; diff --git a/console/src/hardware/device/services/notification.tsx b/console/src/hardware/device/services/notification.tsx index d8059c1e7e..1922f9aea7 100644 --- a/console/src/hardware/device/services/notification.tsx +++ b/console/src/hardware/device/services/notification.tsx @@ -16,7 +16,7 @@ import { createConfigureLayout } from "@/hardware/ni/device/Configure"; import { Layout } from "@/layout"; import { type NotificationAdapter, - SugaredNotification, + type SugaredNotification, } from "@/notifications/Notifications"; export const notificationAdapter: NotificationAdapter = (status) => { diff --git a/console/src/hardware/device/services/ontology.tsx b/console/src/hardware/device/services/ontology.tsx index a1a514d5eb..98858b3ce9 100644 --- a/console/src/hardware/device/services/ontology.tsx +++ b/console/src/hardware/device/services/ontology.tsx @@ -11,7 +11,7 @@ import { Icon } from "@synnaxlabs/media"; import { Menu as PMenu, Tree } from "@synnaxlabs/pluto"; import { errors } from "@synnaxlabs/x"; import { useMutation } from "@tanstack/react-query"; -import { ReactElement } from "react"; +import { type ReactElement } from "react"; import { Menu } from "@/components/menu"; import { Group } from "@/group"; @@ -19,8 +19,8 @@ import { LabJack } from "@/hardware/labjack"; import { type Make, makeZ } from "@/hardware/makes"; import { NI } from "@/hardware/ni"; import { OPC } from "@/hardware/opc"; -import { Layout } from "@/layout"; -import { Ontology } from "@/ontology"; +import { type Layout } from "@/layout"; +import { type Ontology } from "@/ontology"; import { useConfirmDelete } from "@/ontology/hooks"; type DeviceLayoutCreator = ( diff --git a/console/src/hardware/device/useDevice.ts b/console/src/hardware/device/useDevice.ts index 2ef0de3a74..8860b328eb 100644 --- a/console/src/hardware/device/useDevice.ts +++ b/console/src/hardware/device/useDevice.ts @@ -25,7 +25,7 @@ export const useDevice =

( setDevice(d); }, [client?.key]); Form.useFieldListener({ - ctx: ctx, + ctx, path: "config.device", onChange: useCallback( (fs) => { diff --git a/console/src/hardware/labjack/device/Select.tsx b/console/src/hardware/labjack/device/Select.tsx index 0be4c0ec8e..b80854622f 100644 --- a/console/src/hardware/labjack/device/Select.tsx +++ b/console/src/hardware/labjack/device/Select.tsx @@ -8,20 +8,20 @@ // included in the file licenses/APL.txt. import { Form, Select, Text } from "@synnaxlabs/pluto"; -import { deep, KeyedNamed } from "@synnaxlabs/x"; +import { deep, type KeyedNamed } from "@synnaxlabs/x"; import { - ChannelType, + type ChannelType, DEVICES, - InputChannelType, - ModelKey, - OutputChannelType, - Port, + type InputChannelType, + type ModelKey, + type OutputChannelType, + type Port, } from "@/hardware/labjack/device/types"; import { inputChan, - ReadChan, + type ReadChan, thermocoupleChanZ, ZERO_READ_CHAN, ZERO_THERMOCOUPLE_CHAN, diff --git a/console/src/hardware/labjack/device/ontology.tsx b/console/src/hardware/labjack/device/ontology.tsx index 36b1b47a5e..ccd024309d 100644 --- a/console/src/hardware/labjack/device/ontology.tsx +++ b/console/src/hardware/labjack/device/ontology.tsx @@ -14,7 +14,7 @@ import { createConfigureLayout } from "@/hardware/labjack/device/Configure"; import { configureReadLayout } from "@/hardware/labjack/task/Read"; import { configureWriteLayout } from "@/hardware/labjack/task/Write"; import { Layout } from "@/layout"; -import { Ontology } from "@/ontology"; +import { type Ontology } from "@/ontology"; interface InitialArgs { create: true; diff --git a/console/src/hardware/labjack/device/types.ts b/console/src/hardware/labjack/device/types.ts index 3423984353..c67418ffc2 100644 --- a/console/src/hardware/labjack/device/types.ts +++ b/console/src/hardware/labjack/device/types.ts @@ -111,33 +111,45 @@ const aiFactory = ( voltageRange: bounds.Bounds, altConfigs: AltConfig[] = [], ): AIPort[] => - Array.from({ length: bounds.span(b) + 1 }, (_, i) => ({ - key: `AIN${i + b.lower}`, - type: "AI", - voltageRange, - aliases: altConfigs.map((config) => `${config.prefix}${i + config.offset}`), - })); + Array.from({ length: bounds.span(b) + 1 }, (_, i) => { + const port = i + b.lower; + return { + key: `AIN${port}`, + type: "AI", + voltageRange, + aliases: altConfigs.map((config) => `${config.prefix}${port - config.offset}`), + }; + }); const diFactory = (b: bounds.Bounds, altConfigs: AltConfig[] = []): DIPort[] => - Array.from({ length: bounds.span(b) + 1 }, (_, i) => ({ - key: `DIO${i + b.lower}`, - type: "DI", - aliases: altConfigs.map((config) => `${config.prefix}${i + config.offset}`), - })); + Array.from({ length: bounds.span(b) + 1 }, (_, i) => { + const port = i + b.lower; + return { + key: `DIO${port}`, + type: "DI", + aliases: altConfigs.map((config) => `${config.prefix}${port - config.offset}`), + }; + }); const doFactory = (b: bounds.Bounds, altConfigs: AltConfig[] = []): DOPort[] => - Array.from({ length: bounds.span(b) + 1 }, (_, i) => ({ - key: `DIO${i + b.lower}`, - type: "DO", - aliases: altConfigs.map((config) => `${config.prefix}${i + config.offset}`), - })); + Array.from({ length: bounds.span(b) + 1 }, (_, i) => { + const port = i + b.lower; + return { + key: `DIO${i + b.lower}`, + type: "DO", + aliases: altConfigs.map((config) => `${config.prefix}${port - config.offset}`), + }; + }); const aoFactory = (b: bounds.Bounds, altConfigs: AltConfig[] = []): AOPort[] => - Array.from({ length: bounds.span(b) + 1 }, (_, i) => ({ - key: `DAC${i + b.lower}`, - type: "AO", - aliases: altConfigs.map((config) => `${config.prefix}${i + config.offset}`), - })); + Array.from({ length: bounds.span(b) + 1 }, (_, i) => { + const port = i + b.lower; + return { + key: `DAC${port}`, + type: "AO", + aliases: altConfigs.map((config) => `${config.prefix}${port - config.offset}`), + }; + }); const AIN_HIGH_VOLTAGE = bounds.construct(-10, 10); const AIN_LOW_VOLTAGE = bounds.construct(0, 2.5); diff --git a/console/src/hardware/labjack/palette.tsx b/console/src/hardware/labjack/palette.tsx index 3158ad2448..0bcc882e18 100644 --- a/console/src/hardware/labjack/palette.tsx +++ b/console/src/hardware/labjack/palette.tsx @@ -12,7 +12,7 @@ import { Icon as PIcon } from "@synnaxlabs/pluto"; import { configureReadLayout } from "@/hardware/labjack/task/Read"; import { configureWriteLayout } from "@/hardware/labjack/task/Write"; -import { Command } from "@/palette/Palette"; +import { type Command } from "@/palette/Palette"; const createReadTaskCommand: Command = { key: "labjack-create-read-task", diff --git a/console/src/hardware/labjack/task/Read.tsx b/console/src/hardware/labjack/task/Read.tsx index 39f19e349d..2afa1b1cc3 100644 --- a/console/src/hardware/labjack/task/Read.tsx +++ b/console/src/hardware/labjack/task/Read.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { device, NotFoundError, task } from "@synnaxlabs/client"; +import { type device, NotFoundError, type task } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; import { Align, @@ -22,9 +22,9 @@ import { Synnax, Text, } from "@synnaxlabs/pluto"; -import { deep, id, KeyedNamed, primitiveIsZero } from "@synnaxlabs/x"; +import { deep, id, type KeyedNamed, primitiveIsZero } from "@synnaxlabs/x"; import { useMutation } from "@tanstack/react-query"; -import { FC, ReactElement, useCallback, useState } from "react"; +import { type FC, type ReactElement, useCallback, useState } from "react"; import { z } from "zod"; import { CSS } from "@/css"; @@ -34,27 +34,27 @@ import { SelectPort, } from "@/hardware/labjack/device/Select"; import { - ChannelType, + type ChannelType, DEVICES, - InputChannelType, - ModelKey, - Properties, + type InputChannelType, + type ModelKey, + type Properties, } from "@/hardware/labjack/device/types"; import { SelectDevice } from "@/hardware/labjack/task/common"; import { inputChan, - Read, + type Read, READ_TYPE, - ReadChan, - ReadPayload, - ReadStateDetails, - ReadTaskConfig, + type ReadChan, + type ReadPayload, + type ReadStateDetails, + type ReadTaskConfig, readTaskConfigZ, - ReadType, - Scale, + type ReadType, + type Scale, SCALE_SCHEMAS, - ScaleType, - TemperatureUnits, + type ScaleType, + type TemperatureUnits, thermocoupleChanZ, ZERO_READ_CHAN, ZERO_READ_PAYLOAD, @@ -68,14 +68,14 @@ import { Controls, EnableDisableButton, TareButton, - TaskLayoutArgs, + type TaskLayoutArgs, useCreate, useObserveState, - WrappedTaskLayoutProps, + type WrappedTaskLayoutProps, wrapTaskLayout, } from "@/hardware/task/common/common"; import { LabJackThermocoupleTypeField } from "@/hardware/task/common/thermocouple"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; type LayoutArgs = TaskLayoutArgs; diff --git a/console/src/hardware/labjack/task/Write.tsx b/console/src/hardware/labjack/task/Write.tsx index b60b99826a..e7275dc44b 100644 --- a/console/src/hardware/labjack/task/Write.tsx +++ b/console/src/hardware/labjack/task/Write.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { device, NotFoundError } from "@synnaxlabs/client"; +import { type device, NotFoundError } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; import { Align, @@ -23,28 +23,28 @@ import { } from "@synnaxlabs/pluto"; import { deep, id, primitiveIsZero } from "@synnaxlabs/x"; import { useMutation } from "@tanstack/react-query"; -import { ReactElement, useCallback, useState } from "react"; +import { type ReactElement, useCallback, useState } from "react"; import { z } from "zod"; import { CSS } from "@/css"; import { useDevice } from "@/hardware/device/useDevice"; import { SelectOutputChannelType, SelectPort } from "@/hardware/labjack/device/Select"; import { - ChannelType, - ModelKey, - OutputChannelType, - Properties, + type ChannelType, + type ModelKey, + type OutputChannelType, + type Properties, } from "@/hardware/labjack/device/types"; import { SelectDevice } from "@/hardware/labjack/task/common"; import { - Write, + type Write, WRITE_TYPE, - WriteChan, - WritePayload, - WriteStateDetails, - WriteTaskConfig, + type WriteChan, + type WritePayload, + type WriteStateDetails, + type WriteTaskConfig, writeTaskConfigZ, - WriteType, + type WriteType, ZERO_WRITE_CHAN, ZERO_WRITE_PAYLOAD, } from "@/hardware/labjack/task/types"; @@ -54,13 +54,13 @@ import { ChannelListHeader, Controls, EnableDisableButton, - TaskLayoutArgs, + type TaskLayoutArgs, useCreate, useObserveState, - WrappedTaskLayoutProps, + type WrappedTaskLayoutProps, wrapTaskLayout, } from "@/hardware/task/common/common"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; type LayoutArgs = TaskLayoutArgs; @@ -133,14 +133,13 @@ const Wrapped = ({ let modified = false; let shouldCreateStateIndex = primitiveIsZero(dev.properties.writeStateIndex); - if (!shouldCreateStateIndex) { + if (!shouldCreateStateIndex) try { await client.channels.retrieve(dev.properties.writeStateIndex); } catch (e) { if (NotFoundError.matches(e)) shouldCreateStateIndex = true; else throw e; } - } if (shouldCreateStateIndex) { modified = true; @@ -189,14 +188,12 @@ const Wrapped = ({ ); states.forEach((s, i) => { const statesToCreateC = statesToCreate[i]; - if ( - !(statesToCreateC.port in dev.properties[statesToCreateC.type].channels) - ) { + if (!(statesToCreateC.port in dev.properties[statesToCreateC.type].channels)) dev.properties[statesToCreateC.type].channels[statesToCreateC.port] = { state: s.key, command: 0, }; - } else + else dev.properties[statesToCreateC.type].channels[statesToCreateC.port].state = s.key; }); @@ -219,12 +216,12 @@ const Wrapped = ({ ); commands.forEach((s, i) => { const cmdToCreate = commandsToCreate[i]; - if (!(cmdToCreate.port in dev.properties[cmdToCreate.type].channels)) { + if (!(cmdToCreate.port in dev.properties[cmdToCreate.type].channels)) dev.properties[cmdToCreate.type].channels[cmdToCreate.port] = { state: 0, command: s.key, }; - } else + else dev.properties[cmdToCreate.type].channels[cmdToCreate.port].command = s.key; }); } @@ -498,7 +495,7 @@ const ChannelListItem = ({ color={(() => { if (cmdChannelName === "No Command Channel") return "var(--pluto-warning-m1)"; - else if (cmdChannel) return undefined; + if (cmdChannel) return undefined; return "var(--pluto-error-z)"; })()} > @@ -510,7 +507,7 @@ const ChannelListItem = ({ color={(() => { if (stateChannelName === "No State Channel") return "var(--pluto-warning-m1)"; - else if (stateChannel) return undefined; + if (stateChannel) return undefined; return "var(--pluto-error-z)"; })()} > diff --git a/console/src/hardware/labjack/task/external.ts b/console/src/hardware/labjack/task/external.ts index 3967f1f5aa..676a2bedc1 100644 --- a/console/src/hardware/labjack/task/external.ts +++ b/console/src/hardware/labjack/task/external.ts @@ -10,7 +10,7 @@ import { ConfigureRead, READ_SELECTABLE } from "@/hardware/labjack/task/Read"; import { READ_TYPE, WRITE_TYPE } from "@/hardware/labjack/task/types"; import { ConfigureWrite, WRITE_SELECTABLE } from "@/hardware/labjack/task/Write"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export * from "@/hardware/labjack/task/common"; export * from "@/hardware/labjack/task/Read"; diff --git a/console/src/hardware/labjack/task/types.ts b/console/src/hardware/labjack/task/types.ts index 13f83500a9..fe4227b68e 100644 --- a/console/src/hardware/labjack/task/types.ts +++ b/console/src/hardware/labjack/task/types.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { device, task } from "@synnaxlabs/client"; +import { device, type task } from "@synnaxlabs/client"; import { z } from "zod"; import { outputChannelTypeZ } from "@/hardware/labjack/device/types"; diff --git a/console/src/hardware/makes.tsx b/console/src/hardware/makes.tsx index 8dfbc7bd10..16ac5b26a2 100644 --- a/console/src/hardware/makes.tsx +++ b/console/src/hardware/makes.tsx @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt.import { type LabJack } from "./labjack"; import { Icon } from "@synnaxlabs/media"; -import { ReactElement } from "react"; +import { type ReactElement } from "react"; import { z } from "zod"; import { LabJack } from "@/hardware/labjack"; diff --git a/console/src/hardware/ni/device/enrich/enrich.ts b/console/src/hardware/ni/device/enrich/enrich.ts index 9e472be19e..5726090404 100644 --- a/console/src/hardware/ni/device/enrich/enrich.ts +++ b/console/src/hardware/ni/device/enrich/enrich.ts @@ -7,12 +7,12 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { deep, UnknownRecord } from "@synnaxlabs/x"; +import { deep, type UnknownRecord } from "@synnaxlabs/x"; import data from "@/hardware/ni/device/enrich/enriched.json"; import { - Properties, - PropertiesDigest, + type Properties, + type PropertiesDigest, ZERO_PROPERTIES, } from "@/hardware/ni/device/types"; diff --git a/console/src/hardware/ni/device/external.ts b/console/src/hardware/ni/device/external.ts index 9ca899b280..b3fc776190 100644 --- a/console/src/hardware/ni/device/external.ts +++ b/console/src/hardware/ni/device/external.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { Configure, CONFIGURE_LAYOUT_TYPE } from "@/hardware/ni/device/Configure"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export * from "@/hardware/device/useListenForChanges"; export * from "@/hardware/ni/device/Configure"; diff --git a/console/src/hardware/ni/device/ontology.tsx b/console/src/hardware/ni/device/ontology.tsx index 7577804f2b..d3e07c0bbc 100644 --- a/console/src/hardware/ni/device/ontology.tsx +++ b/console/src/hardware/ni/device/ontology.tsx @@ -15,7 +15,7 @@ import { configureAnalogReadLayout } from "@/hardware/ni/task/AnalogRead"; import { configureDigitalReadLayout } from "@/hardware/ni/task/DigitalRead"; import { configureDigitalWriteLayout } from "@/hardware/ni/task/DigitalWrite"; import { Layout } from "@/layout"; -import { Ontology } from "@/ontology"; +import { type Ontology } from "@/ontology"; interface InitialArgs { create: true; diff --git a/console/src/hardware/ni/palette.tsx b/console/src/hardware/ni/palette.tsx index 5f930c015c..a37baa2056 100644 --- a/console/src/hardware/ni/palette.tsx +++ b/console/src/hardware/ni/palette.tsx @@ -13,6 +13,7 @@ import { Icon as PIcon } from "@synnaxlabs/pluto"; import { configureAnalogReadLayout } from "@/hardware/ni/task/AnalogRead"; import { configureDigitalReadLayout } from "@/hardware/ni/task/DigitalRead"; import { configureDigitalWriteLayout } from "@/hardware/ni/task/DigitalWrite"; +import { SCAN_TYPE, ScanConfig } from "@/hardware/ni/task/migrations"; import { Command } from "@/palette/Palette"; export const createAnalogReadTaskCommand: Command = { @@ -51,8 +52,42 @@ export const createDigitalReadTaskCommand: Command = { placeLayout(configureDigitalReadLayout({ create: true })), }; +export const toggleNIScanner: Command = { + key: "toggle-ni-scan-task", + name: "Toggle NI Device Scanner", + icon: ( + + + + ), + onSelect: ({ client, addStatus }) => { + if (client == null) return; + void (async () => { + try { + const tsk = await client.hardware.tasks.retrieveByName("ni scanner"); + const enabled = tsk.config.enabled ?? true; + client.hardware.tasks.create({ + ...tsk.payload, + config: { enabled : !enabled }, + }); + addStatus({ + variant: "success", + message: `NI device scanning ${!enabled ? "enabled" : "disabled"}`, + }); + } catch (e) { + addStatus({ + variant: "error", + message: "Failed to toggle NI scan task", + description: (e as Error).message, + }); + } + })(); + }, +}; + export const COMMANDS = [ createAnalogReadTaskCommand, createDigitalWriteTaskCommand, createDigitalReadTaskCommand, + toggleNIScanner, ]; diff --git a/console/src/hardware/ni/task/AnalogRead.tsx b/console/src/hardware/ni/task/AnalogRead.tsx index f2c4947207..15408097c9 100644 --- a/console/src/hardware/ni/task/AnalogRead.tsx +++ b/console/src/hardware/ni/task/AnalogRead.tsx @@ -14,26 +14,26 @@ import { Align } from "@synnaxlabs/pluto/align"; import { Input } from "@synnaxlabs/pluto/input"; import { List } from "@synnaxlabs/pluto/list"; import { Text } from "@synnaxlabs/pluto/text"; -import { binary, deep, id, migrate, primitiveIsZero, unique } from "@synnaxlabs/x"; +import { binary, deep, id, type migrate, primitiveIsZero, unique } from "@synnaxlabs/x"; import { useMutation } from "@tanstack/react-query"; import { type ReactElement, useCallback, useState } from "react"; import { z } from "zod"; import { CSS } from "@/css"; import { enrich } from "@/hardware/ni/device/enrich/enrich"; -import { Properties } from "@/hardware/ni/device/types"; +import { type Properties } from "@/hardware/ni/device/types"; import { CopyButtons } from "@/hardware/ni/task/common"; import { AI_CHANNEL_TYPE_NAMES, - AIChan, - AIChanType, + type AIChan, + type AIChanType, ANALOG_READ_TYPE, - AnalogRead as AnalogRead, - AnalogReadPayload as AnalogReadPayload, - AnalogReadStateDetails as AnalogReadStateDetails, - AnalogReadTaskConfig as AnalogReadConfig, + type AnalogRead, + type AnalogReadPayload, + type AnalogReadStateDetails, + type AnalogReadTaskConfig as AnalogReadConfig, analogReadTaskConfigZ, - AnalogReadType, + type AnalogReadType, type Chan, migrateAnalogReadTask, ZERO_AI_CHANNELS, @@ -47,14 +47,14 @@ import { EnableDisableButton, ParentRangeButton, TareButton, - TaskLayoutArgs, + type TaskLayoutArgs, useCreate, useObserveState, - WrappedTaskLayoutProps, + type WrappedTaskLayoutProps, wrapTaskLayout, } from "@/hardware/task/common/common"; import { useCopyToClipboard } from "@/hooks/useCopyToClipboard"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; import { ANALOG_INPUT_FORMS, SelectChannelTypeField } from "./ChannelForms"; @@ -134,14 +134,13 @@ const Wrapped = ({ let modified = false; let shouldCreateIndex = primitiveIsZero(dev.properties.analogInput.index); - if (!shouldCreateIndex) { + if (!shouldCreateIndex) try { await client.channels.retrieve(dev.properties.analogInput.index); } catch (e) { if (NotFoundError.matches(e)) shouldCreateIndex = true; else throw e; } - } if (shouldCreateIndex) { modified = true; @@ -160,14 +159,13 @@ const Wrapped = ({ // check if the channel is in properties const exKey = dev.properties.analogInput.channels[channel.port.toString()]; if (primitiveIsZero(exKey)) toCreate.push(channel); - else { + else try { await client.channels.retrieve(exKey.toString()); } catch (e) { if (QueryError.matches(e)) toCreate.push(channel); else throw e; } - } } if (toCreate.length > 0) { @@ -397,7 +395,7 @@ const ChannelList = ({ const handleAdd = (): void => { const key = id.id(); push({ - ...deep.copy(ZERO_AI_CHANNELS["ai_voltage"]), + ...deep.copy(ZERO_AI_CHANNELS.ai_voltage), port: availablePortFinder(value)(), key, }); diff --git a/console/src/hardware/ni/task/ChannelForms.tsx b/console/src/hardware/ni/task/ChannelForms.tsx index 165c824443..62acfccbcd 100644 --- a/console/src/hardware/ni/task/ChannelForms.tsx +++ b/console/src/hardware/ni/task/ChannelForms.tsx @@ -13,36 +13,36 @@ import { Divider, Form, Input, - List, + type List, Select, state, Synnax, } from "@synnaxlabs/pluto"; -import { binary, deep, KeyedNamed } from "@synnaxlabs/x"; -import { FC, ReactElement, useRef } from "react"; +import { binary, deep, type KeyedNamed } from "@synnaxlabs/x"; +import { type FC, type ReactElement, useRef } from "react"; import { z } from "zod"; import { FS } from "@/fs"; import { Device as NIDevice } from "@/hardware/ni/device"; -import { Properties } from "@/hardware/ni/device/types"; +import { type Properties } from "@/hardware/ni/device/types"; import { - AccelSensitivityUnits, + type AccelSensitivityUnits, AI_CHANNEL_SCHEMAS, AI_CHANNEL_TYPE_NAMES, - AIChan, - AIChanType, - ElectricalUnits, - ForceUnits, - PressureUnits, - Scale, + type AIChan, + type AIChanType, + type ElectricalUnits, + type ForceUnits, + type PressureUnits, + type Scale, SCALE_SCHEMAS, - ScaleType, - ShuntResistorLoc, - TemperatureUnits, - TorqueUnits, - Units, - VelocitySensitivityUnits, - VelocityUnits, + type ScaleType, + type ShuntResistorLoc, + type TemperatureUnits, + type TorqueUnits, + type Units, + type VelocitySensitivityUnits, + type VelocityUnits, ZERO_AI_CHANNELS, ZERO_SCALES, } from "@/hardware/ni/task/migrations"; @@ -418,13 +418,12 @@ export const SCALE_FORMS: Record> = { const scaledValues = value[scaledCol] as number[] | undefined; const hasScaled = scaledValues != null; const hasPreScaled = preScaledValues != null; - if (hasScaled && hasPreScaled) { + if (hasScaled && hasPreScaled) if (preScaledValues!.length !== scaledValues!.length) preScaledField.setStatus({ variant: "error", message: `Pre-scaled ${preScaledValues!.length} values and scaled ${scaledValues!.length} values must be the same length`, }); - } if (hasPreScaled) preScaledField.onChange(preScaledValues); if (hasScaled) scaledField.onChange(scaledValues); }; diff --git a/console/src/hardware/ni/task/DigitalRead.tsx b/console/src/hardware/ni/task/DigitalRead.tsx index 7c843b3d74..18054a2a53 100644 --- a/console/src/hardware/ni/task/DigitalRead.tsx +++ b/console/src/hardware/ni/task/DigitalRead.tsx @@ -23,23 +23,23 @@ import { } from "@synnaxlabs/pluto"; import { deep, id, primitiveIsZero } from "@synnaxlabs/x"; import { useMutation } from "@tanstack/react-query"; -import { ReactElement, useCallback, useState } from "react"; +import { type ReactElement, useCallback, useState } from "react"; import { z } from "zod"; import { CSS } from "@/css"; import { enrich } from "@/hardware/ni/device/enrich/enrich"; -import { Properties } from "@/hardware/ni/device/types"; +import { type Properties } from "@/hardware/ni/device/types"; import { CopyButtons, SelectDevice } from "@/hardware/ni/task/common"; import { - Chan, - DIChan, + type Chan, + type DIChan, DIGITAL_READ_TYPE, - DigitalRead, - DigitalReadConfig, + type DigitalRead, + type DigitalReadConfig, digitalReadConfigZ, - DigitalReadPayload, - DigitalReadStateDetails, - DigitalReadType, + type DigitalReadPayload, + type DigitalReadStateDetails, + type DigitalReadType, ZERO_DI_CHAN, ZERO_DIGITAL_READ_PAYLOAD, } from "@/hardware/ni/task/migrations"; @@ -49,13 +49,13 @@ import { ChannelListHeader, Controls, EnableDisableButton, - TaskLayoutArgs, + type TaskLayoutArgs, useCreate, useObserveState, - WrappedTaskLayoutProps, + type WrappedTaskLayoutProps, wrapTaskLayout, } from "@/hardware/task/common/common"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; type LayoutArgs = TaskLayoutArgs; @@ -129,14 +129,13 @@ const Wrapped = ({ let modified = false; let shouldCreateIndex = primitiveIsZero(dev.properties.digitalInput.index); - if (!shouldCreateIndex) { + if (!shouldCreateIndex) try { await client.channels.retrieve(dev.properties.digitalInput.index); } catch (e) { if (NotFoundError.matches(e)) shouldCreateIndex = true; else throw e; } - } if (shouldCreateIndex) { modified = true; @@ -155,14 +154,13 @@ const Wrapped = ({ // check if the channel is in properties const exKey = dev.properties.digitalInput.channels[key]; if (primitiveIsZero(exKey)) toCreate.push(channel); - else { + else try { await client.channels.retrieve(exKey.toString()); } catch (e) { if (NotFoundError.matches(e)) toCreate.push(channel); else throw e; } - } } if (toCreate.length > 0) { @@ -427,7 +425,7 @@ const ChannelListItem = ({ shade={9} color={(() => { if (channelName === "No Channel") return "var(--pluto-warning-m1)"; - else if (channelValid) return undefined; + if (channelValid) return undefined; return "var(--pluto-error-z)"; })()} > diff --git a/console/src/hardware/ni/task/DigitalWrite.tsx b/console/src/hardware/ni/task/DigitalWrite.tsx index 37ef2a8c39..5c8bf9414e 100644 --- a/console/src/hardware/ni/task/DigitalWrite.tsx +++ b/console/src/hardware/ni/task/DigitalWrite.tsx @@ -19,18 +19,18 @@ import { type ReactElement, useCallback, useState } from "react"; import { z } from "zod"; import { CSS } from "@/css"; -import { Properties } from "@/hardware/ni/device/types"; +import { type Properties } from "@/hardware/ni/device/types"; import { CopyButtons, SelectDevice } from "@/hardware/ni/task/common"; import { - Chan, + type Chan, DIGITAL_WRITE_TYPE, - DigitalWrite, - DigitalWriteConfig, + type DigitalWrite, + type DigitalWriteConfig, digitalWriteConfigZ, - DigitalWritePayload, - DigitalWriteStateDetails, - DigitalWriteType, - DOChan, + type DigitalWritePayload, + type DigitalWriteStateDetails, + type DigitalWriteType, + type DOChan, ZERO_DIGITAL_WRITE_PAYLOAD, ZERO_DO_CHAN, } from "@/hardware/ni/task/migrations"; @@ -40,13 +40,13 @@ import { ChannelListHeader, Controls, EnableDisableButton, - TaskLayoutArgs, + type TaskLayoutArgs, useCreate, useObserveState, - WrappedTaskLayoutProps, + type WrappedTaskLayoutProps, wrapTaskLayout, } from "@/hardware/task/common/common"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export const configureDigitalWriteLayout = ( args: TaskLayoutArgs = { create: true }, @@ -119,14 +119,13 @@ const Wrapped = ({ let shouldCreateStateIndex = primitiveIsZero( dev.properties.digitalOutput.stateIndex, ); - if (!shouldCreateStateIndex) { + if (!shouldCreateStateIndex) try { await client.channels.retrieve(dev.properties.digitalOutput.stateIndex); } catch (e) { if (NotFoundError.matches(e)) shouldCreateStateIndex = true; else throw e; } - } if (shouldCreateStateIndex) { modified = true; @@ -174,9 +173,9 @@ const Wrapped = ({ ); states.forEach((s, i) => { const key = `${statesToCreate[i].port}l${statesToCreate[i].line}`; - if (!(key in dev.properties.digitalOutput.channels)) { + if (!(key in dev.properties.digitalOutput.channels)) dev.properties.digitalOutput.channels[key] = { state: s.key, command: 0 }; - } else dev.properties.digitalOutput.channels[key].state = s.key; + else dev.properties.digitalOutput.channels[key].state = s.key; }); } @@ -197,9 +196,9 @@ const Wrapped = ({ ); commands.forEach((s, i) => { const key = `${commandsToCreate[i].port}l${commandsToCreate[i].line}`; - if (!(key in dev.properties.digitalOutput.channels)) { + if (!(key in dev.properties.digitalOutput.channels)) dev.properties.digitalOutput.channels[key] = { state: 0, command: s.key }; - } else dev.properties.digitalOutput.channels[key].command = s.key; + else dev.properties.digitalOutput.channels[key].command = s.key; }); } @@ -471,7 +470,7 @@ const ChannelListItem = ({ color={(() => { if (cmdChannelName === "No Synnax Channel") return "var(--pluto-warning-z)"; - else if (cmdChannelValid) return undefined; + if (cmdChannelValid) return undefined; return "var(--pluto-error-z)"; })()} > @@ -484,7 +483,7 @@ const ChannelListItem = ({ color={(() => { if (stateChannelName === "No Synnax Channel") return "var(--pluto-warning-z)"; - else if (stateChannelValid) return undefined; + if (stateChannelValid) return undefined; return "var(--pluto-error-z)"; })()} > diff --git a/console/src/hardware/ni/task/common.tsx b/console/src/hardware/ni/task/common.tsx index d3c678a8fd..367be61e97 100644 --- a/console/src/hardware/ni/task/common.tsx +++ b/console/src/hardware/ni/task/common.tsx @@ -12,7 +12,7 @@ import { Align, Button, Device, Form, Synnax, Text } from "@synnaxlabs/pluto"; import { binary } from "@synnaxlabs/x"; import { Device as NIDevice } from "@/hardware/ni/device"; -import { Properties } from "@/hardware/ni/device/types"; +import { type Properties } from "@/hardware/ni/device/types"; import { useCopyToClipboard } from "@/hooks/useCopyToClipboard"; import { Layout } from "@/layout"; import { Link } from "@/link"; diff --git a/console/src/hardware/ni/task/external.ts b/console/src/hardware/ni/task/external.ts index a74e0a84bd..f8eb787c5f 100644 --- a/console/src/hardware/ni/task/external.ts +++ b/console/src/hardware/ni/task/external.ts @@ -24,7 +24,7 @@ import { DIGITAL_READ_TYPE, DIGITAL_WRITE_TYPE, } from "@/hardware/ni/task/migrations"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export * from "@/hardware/ni/task/AnalogRead"; export * from "@/hardware/ni/task/DigitalRead"; diff --git a/console/src/hardware/ni/task/migrations/index.ts b/console/src/hardware/ni/task/migrations/index.ts index b07d83a583..42bdc87887 100644 --- a/console/src/hardware/ni/task/migrations/index.ts +++ b/console/src/hardware/ni/task/migrations/index.ts @@ -10,7 +10,7 @@ import { migrate } from "@synnaxlabs/x"; export * from "@/hardware/ni/task/migrations/v1"; -import * as v0 from "@/hardware/ni/task/migrations/v0"; +import type * as v0 from "@/hardware/ni/task/migrations/v0"; import * as v1 from "@/hardware/ni/task/migrations/v1"; export const ANALOG_READ_CONFIG_MIGRATIONS: migrate.Migrations = { diff --git a/console/src/hardware/ni/task/migrations/v0.ts b/console/src/hardware/ni/task/migrations/v0.ts index 30ccb4b95c..52d74024a1 100644 --- a/console/src/hardware/ni/task/migrations/v0.ts +++ b/console/src/hardware/ni/task/migrations/v0.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { device, task } from "@synnaxlabs/client"; +import { device, type task } from "@synnaxlabs/client"; import { z } from "zod"; export const unitsVoltsZ = z.literal("Volts"); diff --git a/console/src/hardware/ni/task/migrations/v1.ts b/console/src/hardware/ni/task/migrations/v1.ts index 83dd56114c..b80daabef7 100644 --- a/console/src/hardware/ni/task/migrations/v1.ts +++ b/console/src/hardware/ni/task/migrations/v1.ts @@ -7,11 +7,11 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { device, task } from "@synnaxlabs/client"; +import { device, type task } from "@synnaxlabs/client"; import { migrate } from "@synnaxlabs/x"; import { z } from "zod"; -import * as v0 from "@/hardware/ni/task/migrations/v0"; +import type * as v0 from "@/hardware/ni/task/migrations/v0"; import { thermocoupleTypeZ } from "@/hardware/task/common/thermocouple"; export const unitsVoltsZ = z.literal("Volts"); @@ -1748,6 +1748,14 @@ export const ZERO_DIGITAL_READ_PAYLOAD: DigitalReadPayload = { type: DIGITAL_READ_TYPE, }; +export const scanConfigZ = z.object({ + enabled: z.boolean().optional().default(true), +}); +export type ScanConfig = z.infer; +export const SCAN_TYPE = "ni_scanner"; +export type ScanType = typeof SCAN_TYPE; +export type Scan = task.Task; + export type Task = AnalogRead | DigitalWrite | DigitalRead; export type Chan = DIChan | AIChan | DOChan; diff --git a/console/src/hardware/opc/device/Browser.tsx b/console/src/hardware/opc/device/Browser.tsx index f2caa0ce7b..8041458609 100644 --- a/console/src/hardware/opc/device/Browser.tsx +++ b/console/src/hardware/opc/device/Browser.tsx @@ -19,14 +19,14 @@ import { TimeSpan, Tree, } from "@synnaxlabs/pluto"; -import { Optional } from "@synnaxlabs/x"; +import { type Optional } from "@synnaxlabs/x"; import { useMutation, useQuery } from "@tanstack/react-query"; -import { ReactElement, useCallback, useEffect, useState } from "react"; +import { type ReactElement, useCallback, useEffect, useState } from "react"; import { CSS } from "@/css"; import { - Device as OPCDevice, - ScannerScanCommandResult, + type Device as OPCDevice, + type ScannerScanCommandResult, } from "@/hardware/opc/device/types"; const ICONS: Record = { @@ -120,7 +120,7 @@ export const Browser = ({ device }: BrowserProps): ReactElement => { refresh(); }, [refresh]); - let content: ReactElement | null = null; + let content: ReactElement; if (initialLoading) content = ( diff --git a/console/src/hardware/opc/device/Configure.tsx b/console/src/hardware/opc/device/Configure.tsx index 1226224247..61df0babac 100644 --- a/console/src/hardware/opc/device/Configure.tsx +++ b/console/src/hardware/opc/device/Configure.tsx @@ -36,10 +36,10 @@ import { import { connectionConfigZ, type Properties, - SecurityMode, - SecurityPolicy, - TestConnCommandResponse, - TestConnCommandState, + type SecurityMode, + type SecurityPolicy, + type TestConnCommandResponse, + type TestConnCommandState, } from "@/hardware/opc/device/types"; import { Layout } from "@/layout"; diff --git a/console/src/hardware/opc/device/SelectNode.tsx b/console/src/hardware/opc/device/SelectNode.tsx index aaebc3e810..74a3d88ab3 100644 --- a/console/src/hardware/opc/device/SelectNode.tsx +++ b/console/src/hardware/opc/device/SelectNode.tsx @@ -10,7 +10,7 @@ import { type List, Select, Text } from "@synnaxlabs/pluto"; import { type ReactElement, useMemo } from "react"; -import { ScannedNode } from "@/hardware/opc/device/types"; +import { type ScannedNode } from "@/hardware/opc/device/types"; import { type NodeId, parseNodeId } from "@/hardware/opc/task/types"; interface NodeEntry extends NodeId { diff --git a/console/src/hardware/opc/device/SelectSecurityPolicy.tsx b/console/src/hardware/opc/device/SelectSecurityPolicy.tsx index 27bfdc9921..08f48c8c72 100644 --- a/console/src/hardware/opc/device/SelectSecurityPolicy.tsx +++ b/console/src/hardware/opc/device/SelectSecurityPolicy.tsx @@ -9,7 +9,7 @@ import { Select } from "@synnaxlabs/pluto"; -import { SecurityMode, SecurityPolicy } from "@/hardware/opc/device/types"; +import { type SecurityMode, type SecurityPolicy } from "@/hardware/opc/device/types"; interface SecurityPolicyInfo { key: SecurityPolicy; diff --git a/console/src/hardware/opc/device/external.ts b/console/src/hardware/opc/device/external.ts index aa4ce6c776..2f937ed6f3 100644 --- a/console/src/hardware/opc/device/external.ts +++ b/console/src/hardware/opc/device/external.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { Configure, CONFIGURE_LAYOUT_TYPE } from "@/hardware/opc/device/Configure"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export * from "@/hardware/opc/device/Configure"; export * from "@/hardware/opc/device/ontology"; diff --git a/console/src/hardware/opc/device/ontology.tsx b/console/src/hardware/opc/device/ontology.tsx index c6829b9bba..05daf492a0 100644 --- a/console/src/hardware/opc/device/ontology.tsx +++ b/console/src/hardware/opc/device/ontology.tsx @@ -9,13 +9,13 @@ import { Icon } from "@synnaxlabs/media"; import { Icon as PIcon, Menu } from "@synnaxlabs/pluto"; -import { ReactElement } from "react"; +import { type ReactElement } from "react"; import { createConfigureLayout } from "@/hardware/opc/device/Configure"; import { configureReadLayout } from "@/hardware/opc/task/ReadTask"; import { configureWriteLayout } from "@/hardware/opc/task/WriteTask"; import { Layout } from "@/layout"; -import { Ontology } from "@/ontology"; +import { type Ontology } from "@/ontology"; interface Args { create: boolean; diff --git a/console/src/hardware/opc/device/types.ts b/console/src/hardware/opc/device/types.ts index 7a220ee108..2a2e8fe12b 100644 --- a/console/src/hardware/opc/device/types.ts +++ b/console/src/hardware/opc/device/types.ts @@ -7,8 +7,8 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { device, task } from "@synnaxlabs/client"; -import { UnknownRecord } from "@synnaxlabs/x"; +import { type device, type task } from "@synnaxlabs/client"; +import { type UnknownRecord } from "@synnaxlabs/x"; import { z } from "zod"; export const securityModeZ = z.union([ diff --git a/console/src/hardware/opc/external.ts b/console/src/hardware/opc/external.ts index 0023c1be8e..4972e9bb91 100644 --- a/console/src/hardware/opc/external.ts +++ b/console/src/hardware/opc/external.ts @@ -9,7 +9,7 @@ import { Device } from "@/hardware/opc/device"; import { Task } from "@/hardware/opc/task"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export * from "@/hardware/opc/device"; export * from "@/hardware/opc/palette"; diff --git a/console/src/hardware/opc/task/ReadTask.tsx b/console/src/hardware/opc/task/ReadTask.tsx index c8900691d9..38364e83ee 100644 --- a/console/src/hardware/opc/task/ReadTask.tsx +++ b/console/src/hardware/opc/task/ReadTask.tsx @@ -9,7 +9,7 @@ import "@/hardware/opc/task/ReadTask.css"; -import { DataType, device, NotFoundError } from "@synnaxlabs/client"; +import { DataType, type device, NotFoundError } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; import { Align, @@ -38,14 +38,14 @@ import { type Device } from "@/hardware/opc/device"; import { Browser } from "@/hardware/opc/device/Browser"; import { createConfigureLayout } from "@/hardware/opc/device/Configure"; import { - Read, + type Read, READ_TYPE, type ReadChannelConfig, type ReadConfig, readConfigZ, - ReadPayload, + type ReadPayload, type ReadStateDetails, - ReadType, + type ReadType, ZERO_READ_PAYLOAD, } from "@/hardware/opc/task/types"; import { @@ -121,14 +121,13 @@ const Wrapped = ({ ); let modified = false; let shouldCreateIndex = primitiveIsZero(dev.properties.read.index); - if (!shouldCreateIndex) { + if (!shouldCreateIndex) try { await client.channels.retrieve(dev.properties.read.index); } catch (e) { if (NotFoundError.matches(e)) shouldCreateIndex = true; else throw e; } - } if (shouldCreateIndex) { modified = true; const idx = await client.channels.create({ @@ -145,17 +144,15 @@ const Wrapped = ({ if (ch.useAsIndex) continue; const exKey = getChannelByNodeID(dev.properties, ch.nodeId); if (primitiveIsZero(exKey)) toCreate.push(ch); - else { + else try { const rCh = await client.channels.retrieve(exKey); - if (rCh.name !== ch.name) { + if (rCh.name !== ch.name) await client.channels.rename(Number(exKey), ch.name); - } } catch (e) { if (NotFoundError.matches(e)) toCreate.push(ch); else throw e; } - } } if (toCreate.length > 0) { @@ -469,7 +466,7 @@ export const ChannelListItem = ({ if (childValues == null) return <>; const opcNode = childValues.nodeId.length > 0 ? childValues.nodeId : "No Node Selected"; - let opcNodeColor = undefined; + let opcNodeColor; if (opcNode === "No Node Selected") opcNodeColor = "var(--pluto-warning-z)"; return ( diff --git a/console/src/hardware/opc/task/WriteTask.tsx b/console/src/hardware/opc/task/WriteTask.tsx index 114b4fd779..c8bd8a7196 100644 --- a/console/src/hardware/opc/task/WriteTask.tsx +++ b/console/src/hardware/opc/task/WriteTask.tsx @@ -9,7 +9,7 @@ import "@/hardware/opc/task/ReadTask.css"; -import { device, NotFoundError } from "@synnaxlabs/client"; +import { type device, NotFoundError } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; import { Align, @@ -155,16 +155,14 @@ const Wrapped = ({ const commandsToCreate: WriteChannelConfig[] = []; for (const channel of config.channels) { const key = getChannelByNodeID(dev.properties, channel.nodeId); - if (primitiveIsZero(key)) { - commandsToCreate.push(channel); - } else { + if (primitiveIsZero(key)) commandsToCreate.push(channel); + else try { await client.channels.retrieve(key); } catch (e) { if (NotFoundError.matches(e)) commandsToCreate.push(channel); else throw e; } - } } if (commandsToCreate.length > 0) { @@ -477,7 +475,7 @@ const WriterChannelListItem = ({ if (childValues == null) return <>; const opcNode = childValues.nodeId.length > 0 ? childValues.nodeId : "No Node Selected"; - let opcNodeColor = undefined; + let opcNodeColor; if (opcNode === "No Node Selected") opcNodeColor = "var(--pluto-warning-z)"; return ( diff --git a/console/src/hardware/opc/task/external.ts b/console/src/hardware/opc/task/external.ts index 04273499cf..00291410ca 100644 --- a/console/src/hardware/opc/task/external.ts +++ b/console/src/hardware/opc/task/external.ts @@ -10,7 +10,7 @@ import { READ_SELECTABLE, ReadTask } from "@/hardware/opc/task/ReadTask"; import { READ_TYPE, WRITE_TYPE } from "@/hardware/opc/task/types"; import { WRITE_SELECTABLE, WriteTask } from "@/hardware/opc/task/WriteTask"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export * from "@/hardware/opc/task/ReadTask"; export * from "@/hardware/opc/task/types"; diff --git a/console/src/hardware/opc/task/types.ts b/console/src/hardware/opc/task/types.ts index 8775ea80c2..04fff96abd 100644 --- a/console/src/hardware/opc/task/types.ts +++ b/console/src/hardware/opc/task/types.ts @@ -143,7 +143,7 @@ export const parseNodeId = (nodeIdStr: string): NodeId | null => { if (match === null) return null; - const namespaceIndex = parseInt(match[1], 10); + const namespaceIndex = parseInt(match[1]); const typeCode = match[2]; const identifier = match[3]; @@ -155,7 +155,7 @@ export const parseNodeId = (nodeIdStr: string): NodeId | null => { return { namespaceIndex, identifierType, - identifier: parseInt(identifier, 10), + identifier: parseInt(identifier), }; case "S": identifierType = "String"; @@ -185,7 +185,6 @@ export const nodeIdToString = (nodeId: NodeId): string => { } }; - // Writes export const WRITE_TYPE = "opc_write"; export type WriteType = typeof WRITE_TYPE; @@ -248,7 +247,7 @@ export const writeConfigZ = z }, }); }); - }) + }); export type WriteConfig = z.infer; export type Write = task.Task; @@ -265,4 +264,3 @@ export const ZERO_WRITE_PAYLOAD: WritePayload = { }; type NodeIdType = "Numeric" | "String" | "GUID" | "ByteString"; - diff --git a/console/src/hardware/task/Toolbar.tsx b/console/src/hardware/task/Toolbar.tsx index 3f1d044238..f13cfedab9 100644 --- a/console/src/hardware/task/Toolbar.tsx +++ b/console/src/hardware/task/Toolbar.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { task } from "@synnaxlabs/client"; +import { type task } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; import { Align, diff --git a/console/src/hardware/task/common/common.tsx b/console/src/hardware/task/common/common.tsx index 8ede45b400..9084433f6c 100644 --- a/console/src/hardware/task/common/common.tsx +++ b/console/src/hardware/task/common/common.tsx @@ -9,7 +9,7 @@ import "@/hardware/task/common/common.css"; -import { ontology, task, UnexpectedError } from "@synnaxlabs/client"; +import { ontology, type task, UnexpectedError } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; import { Align, @@ -28,15 +28,15 @@ import { import { caseconv, deep, - Key, - Keyed, - migrate, - Optional, - UnknownRecord, + type Key, + type Keyed, + type migrate, + type Optional, + type UnknownRecord, } from "@synnaxlabs/x"; import { useQuery } from "@tanstack/react-query"; -import { Migratable } from "node_modules/@synnaxlabs/x/dist/src/migrate/migrate"; -import { FC, ReactElement, useCallback, useId, useState } from "react"; +import { type Migratable } from "node_modules/@synnaxlabs/x/dist/src/migrate/migrate"; +import { type FC, type ReactElement, useCallback, useId, useState } from "react"; import { useDispatch } from "react-redux"; import { z } from "zod"; @@ -202,12 +202,11 @@ export const useObserveState = ( if (state.task !== taskKey) return; setTaskState(state); if (state.variant !== "error") clearStatuses(); - else if (state.details != null && state.details.errors != null) { + else if (state.details != null && state.details.errors != null) state.details.errors.forEach((e) => { const path = `config.${caseconv.snakeToCamel(e.path)}`; setStatus(path, { variant: "error", message: "" }); }); - } }, }); return taskState; @@ -351,18 +350,16 @@ export interface TareButtonProps { disabled?: boolean; } -export const TareButton = ({ onClick, disabled }: TareButtonProps) => { - return ( - - - - ); -}; +export const TareButton = ({ onClick, disabled }: TareButtonProps) => ( + + + +); export const useCreate = < C extends UnknownRecord, diff --git a/console/src/hardware/task/link.ts b/console/src/hardware/task/link.ts index 1efa399fca..f847b83132 100644 --- a/console/src/hardware/task/link.ts +++ b/console/src/hardware/task/link.ts @@ -10,7 +10,7 @@ import { task } from "@synnaxlabs/client"; import { createTaskLayout } from "@/hardware/task/ontology"; -import { Link } from "@/link"; +import { type Link } from "@/link"; export const linkHandler: Link.Handler = async ({ resource, diff --git a/console/src/hardware/task/ontology.tsx b/console/src/hardware/task/ontology.tsx index 8df4e5fb16..90ecce2ec0 100644 --- a/console/src/hardware/task/ontology.tsx +++ b/console/src/hardware/task/ontology.tsx @@ -18,9 +18,9 @@ import { Group } from "@/group"; import { LabJack } from "@/hardware/labjack"; import { NI } from "@/hardware/ni"; import { OPC } from "@/hardware/opc"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; import { Link } from "@/link"; -import { Ontology } from "@/ontology"; +import { type Ontology } from "@/ontology"; import { useConfirmDelete } from "@/ontology/hooks"; import { Range } from "@/range"; @@ -108,7 +108,7 @@ const useRangeSnapshot = (): ((props: Ontology.TreeContextMenuProps) => void) => if (activeRange === null || parent == null) return; const tasks = await Promise.all( resources.map(({ id, name }) => - client.hardware.tasks.copy(id.key, name + " (Snapshot)", true), + client.hardware.tasks.copy(id.key, `${name} (Snapshot)`, true), ), ); const otgIDs = tasks.map((t) => t.ontologyID); diff --git a/console/src/hooks/selectors.ts b/console/src/hooks/selectors.ts index c7f5c6ad46..2e13869003 100644 --- a/console/src/hooks/selectors.ts +++ b/console/src/hooks/selectors.ts @@ -41,7 +41,7 @@ export const selectByKey = >( key?: string | null, defaultKey?: string | null, ): S | null | undefined => { - if (key == null) key = defaultKey; + key ??= defaultKey; if (key == null) return null; return state[key]; }; diff --git a/console/src/hooks/useLoadRemote.ts b/console/src/hooks/useLoadRemote.ts index 7e3cdc65e5..1b851c9c0f 100644 --- a/console/src/hooks/useLoadRemote.ts +++ b/console/src/hooks/useLoadRemote.ts @@ -7,8 +7,8 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { PayloadAction } from "@reduxjs/toolkit"; -import { Synnax } from "@synnaxlabs/client"; +import { type PayloadAction } from "@reduxjs/toolkit"; +import { type Synnax } from "@synnaxlabs/client"; import { Status, Synnax as PSynnax, useAsyncEffect } from "@synnaxlabs/pluto"; import { migrate } from "@synnaxlabs/x"; import { useMutation } from "@tanstack/react-query"; diff --git a/console/src/label/Edit.tsx b/console/src/label/Edit.tsx index 08d913e7cd..c752cf923b 100644 --- a/console/src/label/Edit.tsx +++ b/console/src/label/Edit.tsx @@ -21,8 +21,8 @@ import { List, Text, } from "@synnaxlabs/pluto"; -import { change } from "@synnaxlabs/x"; -import { ReactElement } from "react"; +import { type change } from "@synnaxlabs/x"; +import { type ReactElement } from "react"; import { v4 as uuid } from "uuid"; import { z } from "zod"; diff --git a/console/src/label/Select.tsx b/console/src/label/Select.tsx index c9fc241b67..061eacf63f 100644 --- a/console/src/label/Select.tsx +++ b/console/src/label/Select.tsx @@ -9,7 +9,7 @@ import { Icon } from "@synnaxlabs/media"; import { Align, Button, Dialog, Label, Status, Text } from "@synnaxlabs/pluto"; -import { ReactElement } from "react"; +import { type ReactElement } from "react"; import { createEditLayout } from "@/label/Edit"; import { Layout } from "@/layout"; diff --git a/console/src/label/external.ts b/console/src/label/external.ts index d18bab57ed..905b354182 100644 --- a/console/src/label/external.ts +++ b/console/src/label/external.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { Edit, EDIT_LAYOUT_TYPE } from "@/label/Edit"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; export * from "@/label/Edit"; export * from "@/label/Select"; diff --git a/console/src/layout/Menu.tsx b/console/src/layout/Menu.tsx index 160ac3bcc2..e7e0ef34a0 100644 --- a/console/src/layout/Menu.tsx +++ b/console/src/layout/Menu.tsx @@ -11,7 +11,7 @@ import { MAIN_WINDOW } from "@synnaxlabs/drift"; import { useSelectWindowKey } from "@synnaxlabs/drift/react"; import { Icon } from "@synnaxlabs/media"; import { Menu, Mosaic, Text } from "@synnaxlabs/pluto"; -import { direction } from "@synnaxlabs/x"; +import { type direction } from "@synnaxlabs/x"; import { type FC, type ReactElement } from "react"; import { useDispatch, useStore } from "react-redux"; @@ -35,7 +35,7 @@ export const FocusMenuItem = ({ layoutKey }: FocusMenuItemProps): ReactElement = } - onClick={() => dispatch(setFocus({ windowKey: windowKey, key: layoutKey }))} + onClick={() => dispatch(setFocus({ windowKey, key: layoutKey }))} trigger={["Control", "F"]} > Focus diff --git a/console/src/layout/Modal.tsx b/console/src/layout/Modal.tsx index e5f1893cec..ba2907e48a 100644 --- a/console/src/layout/Modal.tsx +++ b/console/src/layout/Modal.tsx @@ -11,10 +11,10 @@ import "@/layout/Modals.css"; import { Icon } from "@synnaxlabs/media"; import { Breadcrumb, Button, Menu, Modal as Core, Nav } from "@synnaxlabs/pluto"; -import { CSSProperties } from "react"; +import { type CSSProperties } from "react"; import { Content } from "@/layout/Content"; -import { State, WindowProps } from "@/layout/slice"; +import { type State, type WindowProps } from "@/layout/slice"; import { DefaultContextMenu } from "@/layout/Window"; const layoutCSS = (window?: WindowProps): CSSProperties => ({ diff --git a/console/src/layout/Selector.tsx b/console/src/layout/Selector.tsx index b3bf41ae85..c57765f671 100644 --- a/console/src/layout/Selector.tsx +++ b/console/src/layout/Selector.tsx @@ -14,8 +14,8 @@ import { Align } from "@synnaxlabs/pluto/align"; import { type ReactElement } from "react"; import { CSS } from "@/css"; -import { PlacerArgs, usePlacer } from "@/layout/hooks"; -import { RendererProps } from "@/layout/slice"; +import { type PlacerArgs, usePlacer } from "@/layout/hooks"; +import { type RendererProps } from "@/layout/slice"; export interface Selectable { key: string; diff --git a/console/src/layout/Window.tsx b/console/src/layout/Window.tsx index 1b7e187fed..65daf5c23c 100644 --- a/console/src/layout/Window.tsx +++ b/console/src/layout/Window.tsx @@ -18,7 +18,7 @@ import { import { useSelectWindowAttribute, useSelectWindowKey } from "@synnaxlabs/drift/react"; import { Logo } from "@synnaxlabs/media"; import { Align, Haul, Menu as PMenu, Nav, OS, Text } from "@synnaxlabs/pluto"; -import { runtime } from "@synnaxlabs/x"; +import { type runtime } from "@synnaxlabs/x"; import { getCurrentWindow } from "@tauri-apps/api/window"; import { memo, type ReactElement, useEffect } from "react"; import { useDispatch } from "react-redux"; @@ -28,7 +28,7 @@ import { Menu } from "@/components/menu"; import { CSS } from "@/css"; import { Content } from "@/layout/Content"; import { useSelect } from "@/layout/selectors"; -import { WindowProps } from "@/layout/slice"; +import { type WindowProps } from "@/layout/slice"; export interface NavTopProps extends Pick { title: string; diff --git a/console/src/layout/hooks.ts b/console/src/layout/hooks.ts index be1e775886..59b8ce0234 100644 --- a/console/src/layout/hooks.ts +++ b/console/src/layout/hooks.ts @@ -32,14 +32,15 @@ import { useSelectNavDrawer, useSelectTheme, } from "@/layout/selectors"; -import { setFocus, State } from "@/layout/slice"; import { type NavDrawerLocation, place, remove, resizeNavDrawer, setActiveTheme, + setFocus, setNavDrawerVisible, + type State, toggleActiveTheme, } from "@/layout/slice"; import { type RootAction, type RootState, type RootStore } from "@/store"; @@ -205,19 +206,17 @@ export const useNavDrawer = ( 100, [dispatch, windowKey], ); - if (state == null) { + if (state == null) return { activeItem: undefined, menuItems: [], onSelect: () => {}, onResize: () => {}, }; - } let activeItem: NavDrawerItem | undefined; - let menuItems: NavMenuItem[] = []; if (state.activeItem != null) activeItem = items.find((item) => item.key === state.activeItem); - menuItems = items.filter((item) => state.menuItems.includes(item.key)); + const menuItems = items.filter((item) => state.menuItems.includes(item.key)); if (activeItem != null) activeItem.initialSize = state.size; diff --git a/console/src/layout/middleware.ts b/console/src/layout/middleware.ts index 8442916d54..cb3e900602 100644 --- a/console/src/layout/middleware.ts +++ b/console/src/layout/middleware.ts @@ -13,19 +13,19 @@ import { runtime } from "@synnaxlabs/x"; import { Layout } from "@/layout"; import { select, selectSliceState } from "@/layout/selectors"; -import { WindowProps } from "@/layout/slice"; import { clearWorkspace, MOSAIC_WINDOW_TYPE, moveMosaicTab, type MoveMosaicTabPayload, place, - PlacePayload, + type PlacePayload, remove, type RemovePayload, setWorkspace, - SetWorkspacePayload, + type SetWorkspacePayload, type StoreState, + type WindowProps, } from "@/layout/slice"; import { effectMiddleware, type MiddlewareEffect } from "@/middleware"; diff --git a/console/src/layout/migrations/v0.ts b/console/src/layout/migrations/v0.ts index 0d9aee7989..68e8eae18b 100644 --- a/console/src/layout/migrations/v0.ts +++ b/console/src/layout/migrations/v0.ts @@ -8,9 +8,9 @@ // included in the file licenses/APL.txt. import { Drift } from "@synnaxlabs/drift"; -import { Haul, Mosaic, Tabs, Theming } from "@synnaxlabs/pluto"; +import { Haul, Mosaic, type Tabs, Theming } from "@synnaxlabs/pluto"; import { theming } from "@synnaxlabs/pluto/ether"; -import { location } from "@synnaxlabs/x"; +import { type location } from "@synnaxlabs/x"; import { z } from "zod"; export const placementLocationZ = z.union([ diff --git a/console/src/layout/selectors.ts b/console/src/layout/selectors.ts index 8ee0ba5504..c2eec6eef0 100644 --- a/console/src/layout/selectors.ts +++ b/console/src/layout/selectors.ts @@ -9,16 +9,15 @@ import { UnexpectedError } from "@synnaxlabs/client"; import { type Drift, selectWindow, selectWindowKey } from "@synnaxlabs/drift"; -import { useSelectWindowKey } from "@synnaxlabs/drift/react"; import { type Haul, type Mosaic, Theming } from "@synnaxlabs/pluto"; import { selectByKey, selectByKeys, useMemoSelect } from "@/hooks"; -import { type State } from "@/layout/slice"; import { type NavDrawerEntryState, type NavDrawerLocation, SLICE_NAME, type SliceState, + type State, type StoreState, } from "@/layout/slice"; @@ -226,9 +225,8 @@ export const selectActiveMosaicLayout = ( return select(state, activeTabKey); }; -export const useSelectActiveMosaicLayout = (): State | undefined => { - return useMemoSelect(selectActiveMosaicLayout, []); -}; +export const useSelectActiveMosaicLayout = (): State | undefined => + useMemoSelect(selectActiveMosaicLayout, []); export const selectHauling = (state: StoreState): Haul.DraggingState => selectSliceState(state).hauling; diff --git a/console/src/layout/slice.ts b/console/src/layout/slice.ts index 4ff400a1f3..2c4d66ec62 100644 --- a/console/src/layout/slice.ts +++ b/console/src/layout/slice.ts @@ -16,11 +16,11 @@ import { } from "@reduxjs/toolkit"; import { type Synnax } from "@synnaxlabs/client"; import { MAIN_WINDOW } from "@synnaxlabs/drift"; -import { Haul, Mosaic } from "@synnaxlabs/pluto"; -import { deep, direction, id, type location } from "@synnaxlabs/x"; -import { ComponentType } from "react"; +import { type Haul, Mosaic } from "@synnaxlabs/pluto"; +import { type deep, type direction, id, type location } from "@synnaxlabs/x"; +import { type ComponentType } from "react"; -import { CreateConfirmModal } from "@/confirm/Confirm"; +import { type CreateConfirmModal } from "@/confirm/Confirm"; import { type Placer } from "@/layout/hooks"; import * as latest from "@/layout/migrations"; @@ -288,7 +288,7 @@ export const { actions, reducer } = createSlice({ [prevMosaic.root] = Mosaic.removeTab(prevMosaic.root, tabKey); state.mosaics[prevWindowKey] = prevMosaic; const mosaic = state.mosaics[windowKey]; - if (mosaic.activeTab == null) mosaic.activeTab = tabKey; + mosaic.activeTab ??= tabKey; state.layouts[layout.key].windowKey = windowKey; const mosaicTab = { @@ -385,12 +385,12 @@ export const { actions, reducer } = createSlice({ state.nav[windowKey] = navState; } - if (key != null) { + if (key != null) Object.values(navState.drawers).forEach((drawer) => { if (drawer.menuItems.includes(key)) drawer.activeItem = (value ?? drawer.activeItem !== key) ? key : null; }); - } else if (location != null) { + else if (location != null) { let drawer = navState.drawers[location]; if (drawer == null) { drawer = { activeItem: null, menuItems: [] }; @@ -401,9 +401,7 @@ export const { actions, reducer } = createSlice({ else if (value === false) drawer.activeItem = null; else if (drawer.activeItem == null) drawer.activeItem = drawer.menuItems[0]; else drawer.activeItem = null; - } else { - throw new Error("setNavDrawerVisible requires either a key or location"); - } + } else throw new Error("setNavDrawerVisible requires either a key or location"); }, maybeCreateGetStartedTab: (state) => { const checkedGetStarted = state.alreadyCheckedGetStarted; @@ -434,8 +432,8 @@ export const { actions, reducer } = createSlice({ setWorkspace: ( state, { payload: { slice, keepNav = true } }: PayloadAction, - ) => { - return migrateSlice({ + ) => + migrateSlice({ ...slice, layouts: { ...layoutsToPreserve(state.layouts), @@ -446,21 +444,18 @@ export const { actions, reducer } = createSlice({ themes: state.themes, activeTheme: state.activeTheme, nav: keepNav ? state.nav : slice.nav, - }); - }, - clearWorkspace: (state) => { - return { - ...ZERO_SLICE_STATE, - layouts: { - ...layoutsToPreserve(state.layouts), - main: MAIN_LAYOUT, - }, - hauling: state.hauling, - themes: state.themes, - activeTheme: state.activeTheme, - nav: state.nav, - }; - }, + }), + clearWorkspace: (state) => ({ + ...ZERO_SLICE_STATE, + layouts: { + ...layoutsToPreserve(state.layouts), + main: MAIN_LAYOUT, + }, + hauling: state.hauling, + themes: state.themes, + activeTheme: state.activeTheme, + nav: state.nav, + }), setArgs: (state, { payload: { key, args } }: PayloadAction) => { const layout = select(state, key); if (layout == null) return; diff --git a/console/src/layouts/Mosaic.tsx b/console/src/layouts/Mosaic.tsx index f231cfb709..9dc5cfdc61 100644 --- a/console/src/layouts/Mosaic.tsx +++ b/console/src/layouts/Mosaic.tsx @@ -25,7 +25,7 @@ import { Portal, Status, Synnax, - Tabs, + type Tabs, Text, useDebouncedCallback, } from "@synnaxlabs/pluto"; @@ -54,7 +54,7 @@ import { createSelector } from "@/layouts/Selector"; import { LinePlot } from "@/lineplot"; import { Schematic } from "@/schematic"; import { SERVICES } from "@/services"; -import { RootState, type RootStore } from "@/store"; +import { type RootState, type RootStore } from "@/store"; import { Workspace } from "@/workspace"; const EmptyContent = (): ReactElement => ( @@ -82,13 +82,12 @@ export const ContextMenu = ({ const layout = Layout.useSelect(layoutKey); if (layout == null) return null; const C = Layout.useContextMenuRenderer(layout?.type); - if (C == null) { + if (C == null) return ( ); - } const res = ; return res; }; @@ -242,7 +241,7 @@ export const Mosaic = memo((): ReactElement => { const fileAsJSON = JSON.parse(new TextDecoder().decode(buffer)); let handlerFound = false; - for (const fileHandler of FILE_HANDLERS) { + for (const fileHandler of FILE_HANDLERS) if ( await fileHandler({ file: fileAsJSON, @@ -259,7 +258,6 @@ export const Mosaic = memo((): ReactElement => { handlerFound = true; break; } - } if (!handlerFound) throw Error(`${name} is not recognized as a Synnax object`); } catch (e) { diff --git a/console/src/layouts/Nav.tsx b/console/src/layouts/Nav.tsx index c9f95dc3ac..5dd76d5e50 100644 --- a/console/src/layouts/Nav.tsx +++ b/console/src/layouts/Nav.tsx @@ -223,21 +223,19 @@ const MemoryBadge = (): ReactElement | null => { * NavBottom is the bottom navigation bar for the Synnax Console. Try to keep this component * presentational. */ -export const NavBottom = (): ReactElement => { - return ( - - - - - - - - - - - - - - - ); -}; +export const NavBottom = (): ReactElement => ( + + + + + + + + + + + + + + +); diff --git a/console/src/lineplot/LinePlot.tsx b/console/src/lineplot/LinePlot.tsx index db0c4e5e7a..e9b6ba2e59 100644 --- a/console/src/lineplot/LinePlot.tsx +++ b/console/src/lineplot/LinePlot.tsx @@ -11,10 +11,10 @@ import { type channel } from "@synnaxlabs/client"; import { useSelectWindowKey } from "@synnaxlabs/drift/react"; import { Icon } from "@synnaxlabs/media"; import { - axis, + type axis, Channel, Color, - Legend, + type Legend, Menu as PMenu, Synnax, useAsyncEffect, @@ -43,12 +43,12 @@ import { Menu } from "@/components/menu"; import { useLoadRemote } from "@/hooks/useLoadRemote"; import { Layout } from "@/layout"; import { - AxisKey, + type AxisKey, axisLocation, - MultiXAxisRecord, + type MultiXAxisRecord, X_AXIS_KEYS, - XAxisKey, - YAxisKey, + type XAxisKey, + type YAxisKey, } from "@/lineplot/axis"; import { download } from "@/lineplot/download"; import { @@ -61,7 +61,7 @@ import { useSelectViewportMode, } from "@/lineplot/selectors"; import { - AxesState, + type AxesState, type AxisState, internalCreate, type LineState, @@ -235,7 +235,7 @@ const Loaded: Layout.Renderer = ({ layoutKey, focused, visible }): ReactElement mode: "add", }), ); - if (propsLines.length === 0 && rng != null) { + if (propsLines.length === 0 && rng != null) syncDispatch( setRanges({ mode: "add", @@ -244,7 +244,6 @@ const Loaded: Layout.Renderer = ({ layoutKey, focused, visible }): ReactElement ranges: [rng.key], }), ); - } }, [syncDispatch, layoutKey, propsLines.length, rng], ); @@ -283,12 +282,14 @@ const Loaded: Layout.Renderer = ({ layoutKey, focused, visible }): ReactElement const mode = useSelectViewportMode(); const triggers = useMemo(() => Viewport.DEFAULT_TRIGGERS[mode], [mode]); - const initialViewport = useMemo(() => { - return box.reRoot( - box.construct(vis.viewport.pan, vis.viewport.zoom), - location.BOTTOM_LEFT, - ); - }, [vis.viewport.renderTrigger]); + const initialViewport = useMemo( + () => + box.reRoot( + box.construct(vis.viewport.pan, vis.viewport.zoom), + location.BOTTOM_LEFT, + ), + [vis.viewport.renderTrigger], + ); const handleDoubleClick = useCallback(() => { dispatch( @@ -345,7 +346,7 @@ const Loaded: Layout.Renderer = ({ layoutKey, focused, visible }): ReactElement break; case "download": if (client == null) return; - download({ timeRange, lines, client, name: name + "-data" }); + download({ timeRange, lines, client, name: `${name}-data` }); break; } }; @@ -452,9 +453,12 @@ const Loaded: Layout.Renderer = ({ layoutKey, focused, visible }): ReactElement const buildAxes = (vis: State): Channel.AxisProps[] => getEntries(vis.axes.axes) .filter(([key]) => shouldDisplayAxis(key, vis)) - .map(([key, axis]): Channel.AxisProps => { - return { location: axisLocation(key as AxisKey), ...axis }; - }); + .map( + ([key, axis]): Channel.AxisProps => ({ + location: axisLocation(key as AxisKey), + ...axis, + }), + ); const buildLines = ( vis: State, @@ -527,7 +531,7 @@ export const LinePlot: Layout.Renderer = ({ name: "Line Plot", targetVersion: ZERO_STATE.version, layoutKey, - useSelect: useSelect, + useSelect, fetcher: async (client, layoutKey) => { const { data } = await client.workspaces.linePlot.retrieve(layoutKey); return data as unknown as State; diff --git a/console/src/lineplot/download.ts b/console/src/lineplot/download.ts index 9ab2fd7f9a..bbdf56b00f 100644 --- a/console/src/lineplot/download.ts +++ b/console/src/lineplot/download.ts @@ -7,9 +7,9 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { channel, framer,Synnax } from "@synnaxlabs/client"; +import { type channel, type framer, type Synnax } from "@synnaxlabs/client"; import { type Channel } from "@synnaxlabs/pluto"; -import { TimeRange, unique } from "@synnaxlabs/x"; +import { type TimeRange, unique } from "@synnaxlabs/x"; import { save } from "@tauri-apps/plugin-dialog"; import { writeFile } from "@tauri-apps/plugin-fs"; diff --git a/console/src/lineplot/file.ts b/console/src/lineplot/file.ts index d30c6c8ff7..22a706118e 100644 --- a/console/src/lineplot/file.ts +++ b/console/src/lineplot/file.ts @@ -11,7 +11,7 @@ import { NotFoundError, UnexpectedError } from "@synnaxlabs/client"; import { Status, Synnax } from "@synnaxlabs/pluto"; import { type UnknownRecord } from "@synnaxlabs/x"; import { useMutation } from "@tanstack/react-query"; -import { DialogFilter, open, save } from "@tauri-apps/plugin-dialog"; +import { type DialogFilter, open, save } from "@tauri-apps/plugin-dialog"; import { readFile, writeFile } from "@tauri-apps/plugin-fs"; import { useDispatch, useStore } from "react-redux"; @@ -54,9 +54,9 @@ export const fileHandler: Layout.FileHandler = async ({ if (existingState != null) { if ( !(await confirm({ - message: - `${fileName} already exists` + - (existingName != null ? ` as ${existingName}` : ""), + message: `${fileName} already exists${ + existingName != null ? ` as ${existingName}` : "" + }`, description: "Would you like to replace the existing schematic?", cancel: { label: "Cancel" }, confirm: { label: "Replace", variant: "error" }, diff --git a/console/src/lineplot/middleware.ts b/console/src/lineplot/middleware.ts index e4ec22b9d2..2014c2fb58 100644 --- a/console/src/lineplot/middleware.ts +++ b/console/src/lineplot/middleware.ts @@ -59,7 +59,7 @@ export const assignActiveRangeEffect: MiddlewareEffect< const s = getState(); const p = select(s, action.payload.key); const range = Range.selectActiveKey(s); - if (!p.axes.hasHadChannelSet && p.ranges.x1.length === 0 && range != null) { + if (!p.axes.hasHadChannelSet && p.ranges.x1.length === 0 && range != null) dispatch( setRanges({ key: p.key, @@ -67,7 +67,6 @@ export const assignActiveRangeEffect: MiddlewareEffect< ranges: [range], }), ); - } }; export const deleteEffect: MiddlewareEffect< diff --git a/console/src/lineplot/migrations/v0.ts b/console/src/lineplot/migrations/v0.ts index af27e9177d..5cf5272517 100644 --- a/console/src/lineplot/migrations/v0.ts +++ b/console/src/lineplot/migrations/v0.ts @@ -12,11 +12,11 @@ import { bounds, box, dimensions, direction, xy } from "@synnaxlabs/x"; import { z } from "zod"; import { - AxisKey, + type AxisKey, axisKeyZ, - MultiXAxisRecord, - MultiYAxisRecord, - XAxisRecord, + type MultiXAxisRecord, + type MultiYAxisRecord, + type XAxisRecord, } from "@/lineplot/axis"; // |||||| TITLE |||||| diff --git a/console/src/lineplot/migrations/v2.ts b/console/src/lineplot/migrations/v2.ts index e28a70c79d..b9eb15fccf 100644 --- a/console/src/lineplot/migrations/v2.ts +++ b/console/src/lineplot/migrations/v2.ts @@ -11,7 +11,7 @@ import { axis } from "@synnaxlabs/pluto"; import { bounds, migrate } from "@synnaxlabs/x"; import { z } from "zod"; -import { X_AXIS_KEYS, XAxisKey } from "@/lineplot/axis"; +import { X_AXIS_KEYS, type XAxisKey } from "@/lineplot/axis"; import * as v0 from "@/lineplot/migrations/v0"; import * as v1 from "@/lineplot/migrations/v1"; diff --git a/console/src/lineplot/selectors.ts b/console/src/lineplot/selectors.ts index 21f26eb651..7fc7f41383 100644 --- a/console/src/lineplot/selectors.ts +++ b/console/src/lineplot/selectors.ts @@ -11,7 +11,7 @@ import { type Viewport } from "@synnaxlabs/pluto"; import { type bounds } from "@synnaxlabs/x"; import { useMemoSelect } from "@/hooks"; -import { AxisKey, XAxisRecord } from "@/lineplot/axis"; +import { type AxisKey, type XAxisRecord } from "@/lineplot/axis"; import { type ControlState, type SelectionState, diff --git a/console/src/lineplot/services/Icon.tsx b/console/src/lineplot/services/Icon.tsx index 7f7fa090ed..e2b2d59827 100644 --- a/console/src/lineplot/services/Icon.tsx +++ b/console/src/lineplot/services/Icon.tsx @@ -9,7 +9,7 @@ import { Icon } from "@synnaxlabs/media"; import { Icon as PIcon } from "@synnaxlabs/pluto"; -import { ReactElement } from "react"; +import { type ReactElement } from "react"; export const ImportIcon = (): ReactElement => ( diff --git a/console/src/lineplot/services/link.ts b/console/src/lineplot/services/link.ts index ee43e255d8..fd56b03c49 100644 --- a/console/src/lineplot/services/link.ts +++ b/console/src/lineplot/services/link.ts @@ -8,8 +8,8 @@ // included in the file licenses/APL.txt. import { create } from "@/lineplot/LinePlot"; -import { State } from "@/lineplot/slice"; -import { Link } from "@/link"; +import { type State } from "@/lineplot/slice"; +import { type Link } from "@/link"; export const linkHandler: Link.Handler = async ({ resource, diff --git a/console/src/lineplot/services/ontology.tsx b/console/src/lineplot/services/ontology.tsx index d8d6363b7a..f8c331d5cd 100644 --- a/console/src/lineplot/services/ontology.tsx +++ b/console/src/lineplot/services/ontology.tsx @@ -19,7 +19,7 @@ import { useExport } from "@/lineplot/file"; import { create } from "@/lineplot/LinePlot"; import { type State } from "@/lineplot/slice"; import { Link } from "@/link"; -import { Ontology } from "@/ontology"; +import { type Ontology } from "@/ontology"; import { useConfirmDelete } from "@/ontology/hooks"; const useDelete = (): ((props: Ontology.TreeContextMenuProps) => void) => { diff --git a/console/src/lineplot/slice.ts b/console/src/lineplot/slice.ts index 8de2bcc044..d4309ab078 100644 --- a/console/src/lineplot/slice.ts +++ b/console/src/lineplot/slice.ts @@ -13,11 +13,11 @@ import { type Viewport } from "@synnaxlabs/pluto"; import { deep, toArray, unique } from "@synnaxlabs/x"; import { - AxisKey, - MultiXAxisRecord, + type AxisKey, + type MultiXAxisRecord, X_AXIS_KEYS, - XAxisKey, - YAxisKey, + type XAxisKey, + type YAxisKey, } from "@/lineplot/axis"; import * as latest from "@/lineplot/migrations"; @@ -313,13 +313,12 @@ export const { actions, reducer } = createSlice({ toArray(rule).forEach((r) => { const idx = plot.rules.findIndex((rr) => rr.key === r.key); if (idx >= 0) plot.rules[idx] = { ...plot.rules[idx], ...r }; - else { + else plot.rules.push({ ...latest.ZERO_RULE_STATE, label: `Rule ${plot.rules.length}`, ...r, }); - } }); }, removeRule: (state, { payload }: PayloadAction) => { diff --git a/console/src/lineplot/toolbar/Annotations.tsx b/console/src/lineplot/toolbar/Annotations.tsx index e18bfc4938..52d1e99731 100644 --- a/console/src/lineplot/toolbar/Annotations.tsx +++ b/console/src/lineplot/toolbar/Annotations.tsx @@ -27,7 +27,7 @@ import { type ReactElement, useState } from "react"; import { useDispatch } from "react-redux"; import { CSS } from "@/css"; -import { AXIS_KEYS, AxisKey } from "@/lineplot/axis"; +import { AXIS_KEYS, type AxisKey } from "@/lineplot/axis"; import { useSelect } from "@/lineplot/selectors"; import { removeRule, type RuleState, setRule } from "@/lineplot/slice"; @@ -163,7 +163,7 @@ export const Annotations = ({ layoutKey }: AnnotationsProps): ReactElement => { let content: ReactElement = emptyContent; - if (selectedRule != null) { + if (selectedRule != null) content = ( @@ -223,7 +223,6 @@ export const Annotations = ({ layoutKey }: AnnotationsProps): ReactElement => { ); - } const menuProps = Menu.useContextMenu(); diff --git a/console/src/lineplot/toolbar/Axes.tsx b/console/src/lineplot/toolbar/Axes.tsx index 3ffb88b7ed..7f0ad9c5aa 100644 --- a/console/src/lineplot/toolbar/Axes.tsx +++ b/console/src/lineplot/toolbar/Axes.tsx @@ -21,7 +21,7 @@ import { import { type ReactElement } from "react"; import { useDispatch } from "react-redux"; -import { AxisKey } from "@/lineplot/axis"; +import { type AxisKey } from "@/lineplot/axis"; import { useSelect } from "@/lineplot/selectors"; import { type AxisState, setAxis, shouldDisplayAxis } from "@/lineplot/slice"; @@ -52,15 +52,13 @@ export const Axes = ({ layoutKey }: AxesProps): ReactElement => { return ( - {(p) => { - return ( - - ); - }} + {(p) => ( + + )} ); }; @@ -74,22 +72,18 @@ export interface AutoBoundButtonProps extends Omit enabled: boolean; } -const AutoBoundButton = ({ enabled, ...props }: AutoBoundButtonProps): ReactElement => { - return ( - - - - ); -}; +const AutoBoundButton = ({ enabled, ...props }: AutoBoundButtonProps): ReactElement => ( + + + +); export const LinePlotAxisControls = ({ axisKey, diff --git a/console/src/link/Buttons.tsx b/console/src/link/Buttons.tsx index c704097e62..933ab2cd69 100644 --- a/console/src/link/Buttons.tsx +++ b/console/src/link/Buttons.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { ontology } from "@synnaxlabs/client"; +import { type ontology } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; import { Button } from "@synnaxlabs/pluto"; diff --git a/console/src/log/Log.tsx b/console/src/log/Log.tsx index ad6de6d378..b61686d0db 100644 --- a/console/src/log/Log.tsx +++ b/console/src/log/Log.tsx @@ -7,18 +7,18 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { Dispatch, PayloadAction } from "@reduxjs/toolkit"; +import { type Dispatch, type PayloadAction } from "@reduxjs/toolkit"; import { useSelectWindowKey } from "@synnaxlabs/drift/react"; import { Icon } from "@synnaxlabs/media"; import { Align, Log as Core, telem, Text, usePrevious } from "@synnaxlabs/pluto"; -import { deep, primitiveIsZero, TimeSpan, UnknownRecord } from "@synnaxlabs/x"; -import { ReactElement, useCallback, useEffect } from "react"; +import { deep, primitiveIsZero, TimeSpan, type UnknownRecord } from "@synnaxlabs/x"; +import { type ReactElement, useCallback, useEffect } from "react"; import { v4 as uuidv4 } from "uuid"; import { useLoadRemote } from "@/hooks/useLoadRemote"; import { Layout } from "@/layout"; import { select, useSelect } from "@/log/selectors"; -import { internalCreate, setRemoteCreated, State, ZERO_STATE } from "@/log/slice"; +import { internalCreate, setRemoteCreated, type State, ZERO_STATE } from "@/log/slice"; import { Workspace } from "@/workspace"; export type LayoutType = "log"; diff --git a/console/src/log/Toolbar.tsx b/console/src/log/Toolbar.tsx index 5a22d5c758..b307478d0e 100644 --- a/console/src/log/Toolbar.tsx +++ b/console/src/log/Toolbar.tsx @@ -7,10 +7,10 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { channel, log } from "@synnaxlabs/client"; +import { type channel, log } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; import { Align, Channel, Input } from "@synnaxlabs/pluto"; -import { ReactElement } from "react"; +import { type ReactElement } from "react"; import { useDispatch } from "react-redux"; import { ToolbarHeader, ToolbarTitle } from "@/components"; diff --git a/console/src/log/external.ts b/console/src/log/external.ts index c91431c353..9283abe17a 100644 --- a/console/src/log/external.ts +++ b/console/src/log/external.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; import { LAYOUT_TYPE, Log, SELECTABLE } from "@/log/Log"; export * from "@/log/Log"; diff --git a/console/src/log/selectors.ts b/console/src/log/selectors.ts index 284b6119d1..b1bd0b9610 100644 --- a/console/src/log/selectors.ts +++ b/console/src/log/selectors.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { useMemoSelect } from "@/hooks"; -import { SLICE_NAME, SliceState, State, StoreState } from "@/log/slice"; +import { SLICE_NAME, type SliceState, type State, type StoreState } from "@/log/slice"; export const selectSliceState = (state: StoreState): SliceState => state[SLICE_NAME]; diff --git a/console/src/log/services/Icon.tsx b/console/src/log/services/Icon.tsx index 31ecf5c9be..16c9b9d1e4 100644 --- a/console/src/log/services/Icon.tsx +++ b/console/src/log/services/Icon.tsx @@ -9,7 +9,7 @@ import { Icon } from "@synnaxlabs/media"; import { Icon as PIcon } from "@synnaxlabs/pluto"; -import { ReactElement } from "react"; +import { type ReactElement } from "react"; export const CreateIcon = (): ReactElement => ( diff --git a/console/src/log/services/link.ts b/console/src/log/services/link.ts index 7f87c731cb..b57a2b5a8e 100644 --- a/console/src/log/services/link.ts +++ b/console/src/log/services/link.ts @@ -7,9 +7,9 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { Link } from "@/link"; +import { type Link } from "@/link"; import { create } from "@/log/Log"; -import { State } from "@/log/slice"; +import { type State } from "@/log/slice"; export const linkHandler: Link.Handler = async ({ resource, diff --git a/console/src/log/services/ontology.tsx b/console/src/log/services/ontology.tsx index ca5a7c26a8..0f636814c5 100644 --- a/console/src/log/services/ontology.tsx +++ b/console/src/log/services/ontology.tsx @@ -18,7 +18,7 @@ import { useAsyncActionMenu } from "@/hooks/useAsyncAction"; import { Layout } from "@/layout"; import { Link } from "@/link"; import { Log } from "@/log"; -import { Ontology } from "@/ontology"; +import { type Ontology } from "@/ontology"; import { useConfirmDelete } from "@/ontology/hooks"; const useDelete = (): ((props: Ontology.TreeContextMenuProps) => void) => { diff --git a/console/src/log/slice.ts b/console/src/log/slice.ts index bf4742e3d8..57808978e7 100644 --- a/console/src/log/slice.ts +++ b/console/src/log/slice.ts @@ -7,8 +7,8 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { createSlice, PayloadAction } from "@reduxjs/toolkit/react"; -import { channel } from "@synnaxlabs/client"; +import { createSlice, type PayloadAction } from "@reduxjs/toolkit/react"; +import { type channel } from "@synnaxlabs/client"; import * as latest from "@/log/migrations"; diff --git a/console/src/notifications/Notifications.tsx b/console/src/notifications/Notifications.tsx index 4ee766d52e..54424fff28 100644 --- a/console/src/notifications/Notifications.tsx +++ b/console/src/notifications/Notifications.tsx @@ -10,7 +10,7 @@ import "@/notifications/Notifications.css"; import { Status } from "@synnaxlabs/pluto"; -import { Button } from "@synnaxlabs/pluto/button"; +import { type Button } from "@synnaxlabs/pluto/button"; import { List } from "@synnaxlabs/pluto/list"; import { TimeSpan } from "@synnaxlabs/x"; import { type ReactElement } from "react"; diff --git a/console/src/ontology/Tree.tsx b/console/src/ontology/Tree.tsx index e5db359546..02f5d62938 100644 --- a/console/src/ontology/Tree.tsx +++ b/console/src/ontology/Tree.tsx @@ -20,7 +20,7 @@ import { } from "@synnaxlabs/pluto"; import { Tree as Core } from "@synnaxlabs/pluto/tree"; import { deep } from "@synnaxlabs/x"; -import { MutationFunction, useMutation } from "@tanstack/react-query"; +import { type MutationFunction, useMutation } from "@tanstack/react-query"; import { Mutex } from "async-mutex"; import { memo, type ReactElement, useCallback, useMemo, useState } from "react"; import { useStore } from "react-redux"; @@ -28,8 +28,8 @@ import { useStore } from "react-redux"; import { Layout } from "@/layout"; import { MultipleSelectionContextMenu } from "@/ontology/ContextMenu"; import { - BaseProps, - HandleTreeRenameProps, + type BaseProps, + type HandleTreeRenameProps, type Services, type TreeContextMenuProps, } from "@/ontology/service"; @@ -504,7 +504,7 @@ export const Tree = (): ReactElement => { setResources, expand: treeProps.expand, contract: treeProps.contract, - setLoading: setLoading, + setLoading, }, }; diff --git a/console/src/ontology/hooks.tsx b/console/src/ontology/hooks.tsx index fa4c8a56c8..b15a0ac105 100644 --- a/console/src/ontology/hooks.tsx +++ b/console/src/ontology/hooks.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { ontology } from "@synnaxlabs/client"; +import { type ontology } from "@synnaxlabs/client"; import { Confirm } from "@/confirm"; diff --git a/console/src/palette/Palette.tsx b/console/src/palette/Palette.tsx index 86c9ebe553..3da171bd0f 100644 --- a/console/src/palette/Palette.tsx +++ b/console/src/palette/Palette.tsx @@ -9,26 +9,26 @@ import "@/palette/Palette.css"; -import { ontology } from "@synnaxlabs/client"; +import { ontology, Synnax } from "@synnaxlabs/client"; import { Drift } from "@synnaxlabs/drift"; import { Icon } from "@synnaxlabs/media"; import { + Align, Button, componentRenderProp, CSS as PCSS, + Dropdown, Haul, Input, + List, Mosaic, Status, - Synnax, + Synnax as PSynnax, Text, Tooltip, Triggers, useAsyncEffect, } from "@synnaxlabs/pluto"; -import { Align } from "@synnaxlabs/pluto"; -import { Dropdown } from "@synnaxlabs/pluto/dropdown"; -import { List } from "@synnaxlabs/pluto/list"; import { box, dimensions, runtime, xy } from "@synnaxlabs/x"; import { listen } from "@tauri-apps/api/event"; import { Window } from "@tauri-apps/api/window"; @@ -44,7 +44,7 @@ import { import { useDispatch, useStore } from "react-redux"; import { Confirm } from "@/confirm"; -import { CreateConfirmModal } from "@/confirm/Confirm"; +import { type CreateConfirmModal } from "@/confirm/Confirm"; import { CSS } from "@/css"; import { Layout } from "@/layout"; import { type Ontology } from "@/ontology"; @@ -271,7 +271,7 @@ const PaletteDialogContent = ({ }: PaletteDialogProps): ReactElement => { const { setSourceData } = List.useDataUtilContext(); const addStatus = Status.useAggregator(); - const client = Synnax.use(); + const client = PSynnax.use(); const store = useStore() as RootStore; const placeLayout = Layout.usePlacer(); const removeLayout = Layout.useRemover(); @@ -283,8 +283,8 @@ const PaletteDialogContent = ({ const confirm = Confirm.useModal(); const cmdSelectCtx = useMemo( - () => ({ store, placeLayout, confirm }), - [store, placeLayout], + () => ({ store, placeLayout, confirm, client, addStatus }), + [store, placeLayout, client?.key, addStatus], ); const handleSelect = useCallback( @@ -457,8 +457,10 @@ export interface ResourceListItemProps export interface CommandSelectionContext { store: RootStore; + client: Synnax | null; placeLayout: Layout.Placer; confirm: CreateConfirmModal; + addStatus: Status.AddStatusFn; } interface CommandActionProps { diff --git a/console/src/persist/kv.ts b/console/src/persist/kv.ts index d2d8ee16cb..ac6a639a47 100644 --- a/console/src/persist/kv.ts +++ b/console/src/persist/kv.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { createStore, type Store } from "@tauri-apps/plugin-store"; +import { load, type Store } from "@tauri-apps/plugin-store"; export const multipleWindowsOpen = new Error("[persist] - windows open"); @@ -41,6 +41,6 @@ export class TauriKV { } export const createTauriKV = async (): Promise => { - const store = await createStore("~/.synnax/console/persisted-state.dat"); + const store = await load("~/.synnax/console/persisted-state.dat"); return new TauriKV(store); }; diff --git a/console/src/persist/palette.tsx b/console/src/persist/palette.tsx index a23d1793d8..4f646b5417 100644 --- a/console/src/persist/palette.tsx +++ b/console/src/persist/palette.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { PayloadAction } from "@reduxjs/toolkit"; +import { type PayloadAction } from "@reduxjs/toolkit"; import { Icon } from "@synnaxlabs/media"; import { type Command } from "@/palette/Palette"; diff --git a/console/src/range/Select.tsx b/console/src/range/Select.tsx index 82283be28f..a5c02c78be 100644 --- a/console/src/range/Select.tsx +++ b/console/src/range/Select.tsx @@ -13,7 +13,7 @@ import { Button, componentRenderProp, Input, - List, + type List, Ranger, Select, Status, diff --git a/console/src/range/Toolbar.tsx b/console/src/range/Toolbar.tsx index dae314c8ca..b664fa50c9 100644 --- a/console/src/range/Toolbar.tsx +++ b/console/src/range/Toolbar.tsx @@ -9,8 +9,8 @@ import "@/range/Toolbar.css"; -import { Store } from "@reduxjs/toolkit"; -import { type label, ranger, Synnax as Client } from "@synnaxlabs/client"; +import { type Store } from "@reduxjs/toolkit"; +import { type label, ranger, type Synnax as Client } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; import { Align, @@ -50,9 +50,9 @@ import { rename, setActive, type StaticRange, - StoreState, + type StoreState, } from "@/range/slice"; -import { RootState } from "@/store"; +import { type RootState } from "@/store"; export const addToNewPlotMenuItem = ( { store.dispatch(rename({ key: id.key, name })); - store.dispatch(Layout.rename({ key: id.key, name: name })); + store.dispatch(Layout.rename({ key: id.key, name })); }, execute: async ({ client, id, name }) => await client.ranges.rename(id.key, name), rollback: ({ store, id }, prevName) => { diff --git a/console/src/schematic/Schematic.tsx b/console/src/schematic/Schematic.tsx index fd4f0cc846..b8f3536acc 100644 --- a/console/src/schematic/Schematic.tsx +++ b/console/src/schematic/Schematic.tsx @@ -16,6 +16,7 @@ import { Diagram, Haul, type Legend, + Menu as PMenu, Schematic as Core, Text, Theming, @@ -24,7 +25,6 @@ import { useSyncedRef, Viewport, } from "@synnaxlabs/pluto"; -import { Menu as PMenu } from "@synnaxlabs/pluto"; import { box, deep, id, type UnknownRecord } from "@synnaxlabs/x"; import { type ReactElement, @@ -44,7 +44,6 @@ import { useSelect, useSelectHasPermission, useSelectNodeProps, - useSelectViewport, useSelectViewportMode, } from "@/schematic/selectors"; import { @@ -210,9 +209,7 @@ export const Loaded: Layout.Renderer = ({ layoutKey, visible }) => { ); const elRenderer = useCallback( - (props: Diagram.SymbolProps) => { - return ; - }, + (props: Diagram.SymbolProps) => , [layoutKey], ); diff --git a/console/src/schematic/external.ts b/console/src/schematic/external.ts index 8f92a5b4b6..23dc42a9fa 100644 --- a/console/src/schematic/external.ts +++ b/console/src/schematic/external.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; import { ContextMenu, LAYOUT_TYPE, Schematic } from "@/schematic/Schematic"; export * from "@/schematic/file"; diff --git a/console/src/schematic/file.ts b/console/src/schematic/file.ts index ca98b67f94..673ba7550e 100644 --- a/console/src/schematic/file.ts +++ b/console/src/schematic/file.ts @@ -59,9 +59,9 @@ export const fileHandler: Layout.FileHandler = async ({ if (existingState != null) { if ( !(await confirm({ - message: - `${fileName} already exists` + - (existingName != null ? ` as ${existingName}` : ""), + message: `${fileName} already exists${ + existingName != null ? ` as ${existingName}` : "" + }`, description: "Would you like to replace the existing schematic?", cancel: { label: "Cancel" }, confirm: { label: "Replace", variant: "error" }, diff --git a/console/src/schematic/migrations/v0.ts b/console/src/schematic/migrations/v0.ts index c6d528db2c..cf3e57a682 100644 --- a/console/src/schematic/migrations/v0.ts +++ b/console/src/schematic/migrations/v0.ts @@ -9,13 +9,13 @@ import { Color, - Control, + type Control, control, Diagram, Schematic, Viewport, } from "@synnaxlabs/pluto"; -import { migrate, xy } from "@synnaxlabs/x"; +import { type migrate, xy } from "@synnaxlabs/x"; import { z } from "zod"; export type NodeProps = object & { diff --git a/console/src/schematic/services/Icon.tsx b/console/src/schematic/services/Icon.tsx index 399ddc5390..bca337d2eb 100644 --- a/console/src/schematic/services/Icon.tsx +++ b/console/src/schematic/services/Icon.tsx @@ -9,7 +9,7 @@ import { Icon } from "@synnaxlabs/media"; import { Icon as PIcon } from "@synnaxlabs/pluto"; -import { ReactElement } from "react"; +import { type ReactElement } from "react"; export const ImportIcon = (): ReactElement => ( diff --git a/console/src/schematic/services/link.tsx b/console/src/schematic/services/link.tsx index 27774d856e..35329023d5 100644 --- a/console/src/schematic/services/link.tsx +++ b/console/src/schematic/services/link.tsx @@ -7,9 +7,9 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { Link } from "@/link"; +import { type Link } from "@/link"; import { create } from "@/schematic/Schematic"; -import { State } from "@/schematic/slice"; +import { type State } from "@/schematic/slice"; export const linkHandler: Link.Handler = async ({ resource, diff --git a/console/src/schematic/services/ontology.tsx b/console/src/schematic/services/ontology.tsx index 83306f5aa2..21b10a7592 100644 --- a/console/src/schematic/services/ontology.tsx +++ b/console/src/schematic/services/ontology.tsx @@ -69,7 +69,7 @@ const useCopy = (): ((props: Ontology.TreeContextMenuProps) => void) => async (res) => await client.workspaces.schematic.copy( res.id.key, - res.name + " (copy)", + `${res.name} (copy)`, false, ), ), @@ -106,7 +106,7 @@ const useRangeSnapshot = (): ((props: Ontology.TreeContextMenuProps) => void) => async (res) => await client.workspaces.schematic.copy( res.id.key, - res.name + " (snap)", + `${res.name} (snap)`, true, ), ), diff --git a/console/src/schematic/slice.ts b/console/src/schematic/slice.ts index ce78969cfb..866c3cce52 100644 --- a/console/src/schematic/slice.ts +++ b/console/src/schematic/slice.ts @@ -11,8 +11,7 @@ import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; import { type Control, type Diagram, type Viewport } from "@synnaxlabs/pluto"; import { Color } from "@synnaxlabs/pluto/color"; import { type Theming } from "@synnaxlabs/pluto/theming"; -import { box, scale, xy } from "@synnaxlabs/x"; -import { id } from "@synnaxlabs/x"; +import { box, id, scale, xy } from "@synnaxlabs/x"; import * as latest from "@/schematic/migrations"; @@ -282,13 +281,11 @@ export const { actions, reducer } = createSlice({ const { layoutKey, key, props } = payload; const schematic = state.schematics[layoutKey]; if (!schematic.editable) return; - if (key in schematic.props) { + if (key in schematic.props) schematic.props[key] = { ...schematic.props[key], ...props }; - } else { + else { const edge = schematic.edges.findIndex((edge) => edge.key === key); - if (edge !== -1) { - schematic.edges[edge] = { ...schematic.edges[edge], ...props }; - } + if (edge !== -1) schematic.edges[edge] = { ...schematic.edges[edge], ...props }; } }, setNodes: (state, { payload }: PayloadAction) => { @@ -361,9 +358,7 @@ export const { actions, reducer } = createSlice({ const { key: layoutKey, editable } = payload; const schematic = state.schematics[layoutKey]; clearSelections(schematic); - if (schematic.control === "acquired") { - schematic.controlAcquireTrigger -= 1; - } + if (schematic.control === "acquired") schematic.controlAcquireTrigger -= 1; if (schematic.snapshot) return; schematic.editable = editable; }, @@ -379,8 +374,7 @@ export const { actions, reducer } = createSlice({ const { key: layoutKey } = payload; let { status } = payload; const schematic = state.schematics[layoutKey]; - if (status == null) - status = schematic.control === "released" ? "acquired" : "released"; + status ??= schematic.control === "released" ? "acquired" : "released"; if (status === "released") schematic.controlAcquireTrigger -= 1; else schematic.controlAcquireTrigger += 1; }, @@ -412,21 +406,18 @@ export const { actions, reducer } = createSlice({ if ("color" in nodeProps) { const c = new Color.Color(nodeProps.color as string); // check the contrast of the color - if (c.contrast(bgColor) < 1.1) { + if (c.contrast(bgColor) < 1.1) // if the contrast is too low, change the color to the contrast color nodeProps.color = theme.colors.gray.l9; - } } }); edges.forEach((edge) => { if ( edge.color != null && new Color.Color(edge.color as string).contrast(bgColor) < 1.1 - ) { + ) edge.color = theme.colors.gray.l9; - } else if (edge.color == null) { - edge.color = theme.colors.gray.l9; - } + else edge.color ??= theme.colors.gray.l9; }); }); }, diff --git a/console/src/schematic/toolbar/Properties.tsx b/console/src/schematic/toolbar/Properties.tsx index bac1d42dac..d3f8768e47 100644 --- a/console/src/schematic/toolbar/Properties.tsx +++ b/console/src/schematic/toolbar/Properties.tsx @@ -106,19 +106,17 @@ export const PropertiesControls = ({ layoutKey }: PropertiesProps): ReactElement > - {Object.entries(groups).map(([hex, elements]) => { - return ( - { - elements.forEach((e) => { - handleChange(e.key, { color: color.hex }); - }); - }} - /> - ); - })} + {Object.entries(groups).map(([hex, elements]) => ( + { + elements.forEach((e) => { + handleChange(e.key, { color: color.hex }); + }); + }} + /> + ))} diff --git a/console/src/services.tsx b/console/src/services.tsx index 6d87b93d3c..e4f4abce6a 100644 --- a/console/src/services.tsx +++ b/console/src/services.tsx @@ -15,7 +15,7 @@ import { DeviceServices } from "@/hardware/device/services"; import { Task } from "@/hardware/task"; import { LinePlotServices } from "@/lineplot/services"; import { LogServices } from "@/log/services"; -import { Ontology } from "@/ontology"; +import { type Ontology } from "@/ontology"; import { Builtin } from "@/ontology/builtin"; import { RangeServices } from "@/range/services"; import { SchematicServices } from "@/schematic/services"; diff --git a/console/src/user/RegisterModal.tsx b/console/src/user/RegisterModal.tsx index 674990c69b..11db474c22 100644 --- a/console/src/user/RegisterModal.tsx +++ b/console/src/user/RegisterModal.tsx @@ -23,7 +23,7 @@ import { useMutation } from "@tanstack/react-query"; import { type ReactElement } from "react"; import { z } from "zod"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; const formSchema = z.object({ username: z.string().min(1, "Username must not be empty"), diff --git a/console/src/version/Badge.tsx b/console/src/version/Badge.tsx index d8021238b9..c3678604b0 100644 --- a/console/src/version/Badge.tsx +++ b/console/src/version/Badge.tsx @@ -28,7 +28,7 @@ export const Badge = (): ReactElement => { size="medium" color={updateAvailable ? "var(--pluto-secondary-z)" : "var(--pluto-text-color)"} > - {"v" + version} + {`v${version}`} ); }; diff --git a/console/src/version/Info.tsx b/console/src/version/Info.tsx index 8037563e77..d61b0917da 100644 --- a/console/src/version/Info.tsx +++ b/console/src/version/Info.tsx @@ -12,10 +12,10 @@ import { Align, Button, Progress, Status, Text } from "@synnaxlabs/pluto"; import { Size } from "@synnaxlabs/x"; import { useMutation, useQuery } from "@tanstack/react-query"; import { relaunch } from "@tauri-apps/plugin-process"; -import { check, DownloadEvent } from "@tauri-apps/plugin-updater"; +import { check, type DownloadEvent } from "@tauri-apps/plugin-updater"; import { useState } from "react"; -import { Layout } from "@/layout"; +import { type Layout } from "@/layout"; import { useSelectVersion } from "@/version/selectors"; export const infoLayout: Layout.State = { @@ -70,14 +70,14 @@ export const Info: Layout.Renderer = () => { Checking for updates ); - if (updateMutation.isPending) { - if (progressPercent === 100) { + if (updateMutation.isPending) + if (progressPercent === 100) updateContent = ( Update downloaded. Restarting ); - } else { + else updateContent = ( @@ -92,8 +92,7 @@ export const Info: Layout.Renderer = () => { ); - } - } else if (updateQuery.isFetched) { + else if (updateQuery.isFetched) if (updateQuery.data?.available) { const version = updateQuery.data.version; updateContent = ( @@ -110,26 +109,24 @@ export const Info: Layout.Renderer = () => { ); - } else { + } else updateContent = ( Up to date ); - } - } else if (updateQuery.isError) { + else if (updateQuery.isError) updateContent = ( Error checking for update: {updateQuery.error.message} ); - } else if (updateMutation.isError) { + else if (updateMutation.isError) updateContent = ( Error updating: {updateMutation.error.message} ); - } return ( , diff --git a/docs/site/src/components/OnThisPage/OnThisPage.tsx b/docs/site/src/components/OnThisPage/OnThisPage.tsx index b5c38411b7..47765c375d 100644 --- a/docs/site/src/components/OnThisPage/OnThisPage.tsx +++ b/docs/site/src/components/OnThisPage/OnThisPage.tsx @@ -7,25 +7,19 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { type ReactElement, useEffect, useRef, useState } from "react"; - import { Align } from "@synnaxlabs/pluto/align"; import { Header } from "@synnaxlabs/pluto/header"; import { Menu } from "@synnaxlabs/pluto/menu"; import { type MarkdownHeading } from "astro"; import { unescape } from "html-escaper"; -import { OSSelectButton } from "@/components/platform/PlatformTabs"; +import { type ReactElement, useEffect, useRef, useState } from "react"; -interface ItemOffset { - id: string; - topOffset: number; -} +import { OSSelectButton } from "@/components/platform/PlatformTabs"; const ON_THIS_PAGE_ID = "on-this-page-heading"; export const OnThisPage = ({ headings = [], - url, }: { headings?: MarkdownHeading[]; url: string; @@ -41,15 +35,11 @@ export const OnThisPage = ({ ) as unknown as HTMLElement[]; headerLinks.forEach((link) => { // check if there's a matching title - const title = Array.from(titles).find((title) => { - return title.id === link.id; - }); - if (title == null) { + const title = Array.from(titles).find((title) => title.id === link.id); + if (title == null) // set the link display to none link.style.display = "none"; - } else { - link.style.display = "block"; - } + else link.style.display = "block"; }); }, 200); return () => clearInterval(i); @@ -77,14 +67,13 @@ export const OnThisPage = ({ if (toc.current == null) return; const setCurrent: IntersectionObserverCallback = (entries) => { - for (const entry of entries) { + for (const entry of entries) if (entry.isIntersecting) { const { id } = entry.target; if (id === ON_THIS_PAGE_ID) continue; setCurrentID(entry.target.id); break; } - } }; const observerOptions: IntersectionObserverInit = { @@ -119,25 +108,23 @@ export const OnThisPage = ({ {headings .filter(({ depth }) => depth > 1 && depth <= 3) - .map((heading) => { - return ( - { - setCurrentID(heading.slug); - }} - className={`header-link ${heading.slug} depth-${heading.depth} ${ - currentID === heading.slug ? "current-header-link" : "" - }`.trim()} - > - {unescape(heading.text)} - - ); - })} + .map((heading) => ( + { + setCurrentID(heading.slug); + }} + className={`header-link ${heading.slug} depth-${heading.depth} ${ + currentID === heading.slug ? "current-header-link" : "" + }`.trim()} + > + {unescape(heading.text)} + + ))} diff --git a/docs/site/src/components/PackageManagerTabs.tsx b/docs/site/src/components/PackageManagerTabs.tsx index 974fde5d47..b0fc34e375 100644 --- a/docs/site/src/components/PackageManagerTabs.tsx +++ b/docs/site/src/components/PackageManagerTabs.tsx @@ -7,10 +7,9 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { type ReactElement } from "react"; - import { Icon } from "@synnaxlabs/media"; import { Tabs } from "@synnaxlabs/pluto/tabs"; +import { type ReactElement } from "react"; const TABS = [ { diff --git a/docs/site/src/components/PageNav/PageNav.tsx b/docs/site/src/components/PageNav/PageNav.tsx index e995b62841..90e1d4b210 100644 --- a/docs/site/src/components/PageNav/PageNav.tsx +++ b/docs/site/src/components/PageNav/PageNav.tsx @@ -7,13 +7,11 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { type ReactElement, useEffect, useState } from "react"; - import { Icon } from "@synnaxlabs/media"; import { Button } from "@synnaxlabs/pluto/button"; import { Dropdown } from "@synnaxlabs/pluto/dropdown"; -import { Tabs } from "@synnaxlabs/pluto/tabs"; import { Tree } from "@synnaxlabs/pluto/tree"; +import { type ReactElement, useEffect, useState } from "react"; import { componentsPages, guidesPages } from "@/pages/_nav"; diff --git a/docs/site/src/components/Table.tsx b/docs/site/src/components/Table.tsx index c118b2431a..fcfa6ec1e5 100644 --- a/docs/site/src/components/Table.tsx +++ b/docs/site/src/components/Table.tsx @@ -7,15 +7,14 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { type ReactElement } from "react"; - import { - convertRenderV, bounds, + convertRenderV, type direction, type Key, type Keyed, } from "@synnaxlabs/x"; +import { type ReactElement } from "react"; export interface TableColumn> { key: keyof E; @@ -41,35 +40,33 @@ export const Table = >({ columns, data, highlights = [], -}: TableProps): ReactElement => { - return ( -

- - - - {columns.map(({ key, name, width }) => ( - - ))} - - - - {data.map((row, i) => ( - - key={i} - columns={columns} - data={row} - highlights={highlights} - index={i} - dataLength={data.length} - /> +}: TableProps): ReactElement => ( +
+
- {name ?? (key as string)} -
+ + + {columns.map(({ key, name, width }) => ( + ))} - -
+ {name ?? (key as string)} +
-
- ); -}; + + + + {data.map((row, i) => ( + + key={i} + columns={columns} + data={row} + highlights={highlights} + index={i} + dataLength={data.length} + /> + ))} + + + +); interface TableRowProps> { index: number; @@ -85,22 +82,20 @@ const TableRow = >({ columns, data, highlights, -}: TableRowProps): ReactElement => { - return ( - - {columns.map((col) => ( - - key={col.key as string} - index={index} - dataLength={dataLength} - highlights={highlights} - data={data} - column={col} - /> - ))} - - ); -}; +}: TableRowProps): ReactElement => ( + + {columns.map((col) => ( + + key={col.key as string} + index={index} + dataLength={dataLength} + highlights={highlights} + data={data} + column={col} + /> + ))} + +); interface TableCellProps> { index: number; diff --git a/docs/site/src/components/Tabs.tsx b/docs/site/src/components/Tabs.tsx index 4154a447e5..0ec0a8901c 100644 --- a/docs/site/src/components/Tabs.tsx +++ b/docs/site/src/components/Tabs.tsx @@ -7,9 +7,8 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { useEffect, useState, type ReactElement } from "react"; - import { Tabs as Core } from "@synnaxlabs/pluto/tabs"; +import { type ReactElement, useEffect, useState } from "react"; export type TabsProps = { tabs: Core.Tab[]; diff --git a/docs/site/src/components/article/Article.astro b/docs/site/src/components/article/Article.astro index 128ad577ef..0bb0f03540 100644 --- a/docs/site/src/components/article/Article.astro +++ b/docs/site/src/components/article/Article.astro @@ -73,25 +73,6 @@ const { title, description, url, next, prev, nextURL, prevURL } = Astro.props; font-weight: 350; } - h1, - h3, - h4, - h5, - h6, - p, - table { - margin: 3rem 0; - } - - video, - img { - margin: 5rem 0; - } - - h2 { - margin: 4rem 0; - } - pluto-tabs-selector { margin: 1.5rem 0; } diff --git a/docs/site/src/components/console/OSDownloadButton.tsx b/docs/site/src/components/console/OSDownloadButton.tsx index ec84ce7b0b..a49dd11c36 100644 --- a/docs/site/src/components/console/OSDownloadButton.tsx +++ b/docs/site/src/components/console/OSDownloadButton.tsx @@ -7,11 +7,10 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { type ReactElement, useState, useEffect } from "react"; - import { Icon } from "@synnaxlabs/media"; import { Button } from "@synnaxlabs/pluto"; import { runtime } from "@synnaxlabs/x"; +import { type ReactElement, useEffect, useState } from "react"; export interface OSDownloadButtonEntry { os: runtime.OS; diff --git a/docs/site/src/components/platform/PlatformTabs.tsx b/docs/site/src/components/platform/PlatformTabs.tsx index c73a41b812..c2655263fa 100644 --- a/docs/site/src/components/platform/PlatformTabs.tsx +++ b/docs/site/src/components/platform/PlatformTabs.tsx @@ -7,10 +7,9 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { useEffect, useState } from "react"; - import { Icon } from "@synnaxlabs/media"; import { Select, Text } from "@synnaxlabs/pluto"; +import { useEffect, useState } from "react"; import { Tabs as Core } from "@/components/Tabs"; diff --git a/docs/site/src/components/pluto/Plot.tsx b/docs/site/src/components/pluto/Plot.tsx index b77c48eeed..a171ece7d9 100644 --- a/docs/site/src/components/pluto/Plot.tsx +++ b/docs/site/src/components/pluto/Plot.tsx @@ -7,12 +7,10 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -/* eslint-disable react/display-name */ -import { type ReactElement } from "react"; - import { type SynnaxProps } from "@synnaxlabs/client"; import { Canvas, Channel, Pluto } from "@synnaxlabs/pluto"; import { TimeRange, TimeSpan, TimeStamp, xy } from "@synnaxlabs/x"; +import { type ReactElement } from "react"; import WorkerURL from "@/components/pluto/worker?worker&url"; @@ -30,33 +28,22 @@ const provideProps: Pluto.ProviderProps = { }; const AXES: Channel.AxisProps[] = [ - { - key: "x", - label: "Time", - location: "bottom", - type: "time", - }, - { - key: "y", - label: "Value", - location: "left", - }, + { key: "x", label: "Time", location: "bottom", type: "time" }, + { key: "y", label: "Value", location: "left" }, ]; const LINES: Channel.BaseLineProps[] = [ { key: "line1", axes: { x: "x", y: "y" }, - channels: { - x: "stream_write_example_time", - y: "stream_write_example_data_1", - }, + channels: { x: "stream_write_example_time", y: "stream_write_example_data_1" }, color: "#3774d0", label: "Line 1", strokeWidth: 3, }, ]; +// eslint-disable-next-line react/display-name export const factory = (props: Channel.LinePlotProps) => (): ReactElement => ( diff --git a/docs/site/src/components/releases/Release.astro b/docs/site/src/components/releases/Release.astro index 34b969eeef..06b450af1a 100644 --- a/docs/site/src/components/releases/Release.astro +++ b/docs/site/src/components/releases/Release.astro @@ -43,16 +43,16 @@ const firstPart = version.split(".").slice(0, 2).join("."); {title} - +
- +
diff --git a/docs/site/src/pages/_nav.tsx b/docs/site/src/pages/_nav.tsx index c2a57e45c0..3573d9391f 100644 --- a/docs/site/src/pages/_nav.tsx +++ b/docs/site/src/pages/_nav.tsx @@ -8,16 +8,16 @@ // included in the file licenses/APL.txt. import { analystNav } from "@/pages/guides/analyst/_nav"; +import { operationsNav } from "@/pages/guides/operations/_nav"; import { sysAdminNav } from "@/pages/guides/sys-admin/_nav"; import { clusterNav } from "@/pages/reference/cluster/_nav"; import { conceptsNav } from "@/pages/reference/concepts/_nav"; import { consoleNav } from "@/pages/reference/console/_nav"; +import { controlNav } from "@/pages/reference/control/_nav"; import { deviceDriversNav } from "@/pages/reference/device-drivers/_nav"; import { plutoNav } from "@/pages/reference/pluto/_nav"; import { pythonClientNav } from "@/pages/reference/python-client/_nav"; import { typescriptClientNav } from "@/pages/reference/typescript-client/_nav"; -import { operationsNav } from "@/pages/guides/operations/_nav"; -import { controlNav } from "@/pages/reference/control/_nav"; export const componentsPages = [ { diff --git a/docs/site/src/pages/reference/concepts/_nav.tsx b/docs/site/src/pages/reference/concepts/_nav.tsx index f232c89476..7c65a82590 100644 --- a/docs/site/src/pages/reference/concepts/_nav.tsx +++ b/docs/site/src/pages/reference/concepts/_nav.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { PageNavNode } from "@/components/PageNav/PageNav"; +import { type PageNavNode } from "@/components/PageNav/PageNav"; export const conceptsNav: PageNavNode = { key: "concepts", diff --git a/docs/site/src/pages/reference/console/logs.mdx b/docs/site/src/pages/reference/console/logs.mdx index d4b54dfe2f..a553352f69 100644 --- a/docs/site/src/pages/reference/console/logs.mdx +++ b/docs/site/src/pages/reference/console/logs.mdx @@ -9,7 +9,25 @@ nextURL: "/reference/console/users" --- import { Divider } from "@synnaxlabs/pluto"; -import { Video } from "@/components/Media"; + +import { Video, Image } from "@/components/Media"; +import Diagram from "@/components/Diagram.astro"; + + + + Logs are used to view telemetry in a log format. They are useful for viewing low speed sensor values, viewing and communicating control sequences states, and debugging diff --git a/docs/site/src/pages/reference/device-drivers/_nav.tsx b/docs/site/src/pages/reference/device-drivers/_nav.tsx index 9c6a4b8846..6047c3f6f3 100644 --- a/docs/site/src/pages/reference/device-drivers/_nav.tsx +++ b/docs/site/src/pages/reference/device-drivers/_nav.tsx @@ -8,9 +8,9 @@ // included in the file licenses/APL.txt. import { type PageNavNode } from "@/components/PageNav/PageNav"; +import { labjackNav } from "@/pages/reference/device-drivers/labjack/_nav"; import { niNav } from "@/pages/reference/device-drivers/ni/_nav"; import { opcuaNav } from "@/pages/reference/device-drivers/opc-ua/_nav"; -import { labjackNav } from "@/pages/reference/device-drivers/labjack/_nav"; export const deviceDriversNav: PageNavNode = { diff --git a/docs/site/src/pages/reference/pluto/_nav.tsx b/docs/site/src/pages/reference/pluto/_nav.tsx index a9d6669d1b..50e5877c05 100644 --- a/docs/site/src/pages/reference/pluto/_nav.tsx +++ b/docs/site/src/pages/reference/pluto/_nav.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { PageNavNode } from "@/components/PageNav/PageNav"; +import { type PageNavNode } from "@/components/PageNav/PageNav"; export const plutoNav: PageNavNode = { key: "pluto", diff --git a/docs/site/src/pages/releases/0-33-0.mdx b/docs/site/src/pages/releases/0-33-0.mdx new file mode 100644 index 0000000000..0f2bece24b --- /dev/null +++ b/docs/site/src/pages/releases/0-33-0.mdx @@ -0,0 +1,38 @@ +import Release from "@/components/releases/Release.astro"; +import { Image } from "@/components/Media"; +import Diagram from "@/components/Diagram.astro"; +import LabJack from "@/pages/releases/LabJack.astro"; + + + + + + + +We've added a new [log component](/reference/console/logs) to the Synnax +[Console](/reference/console/get-started) that allows you to view channel data in a log +format. This component can be connected to any channel, and is particularly useful for +tracking the progress of [control sequences](/reference/control/get-started) and other +automated hardware control processes. + +### Breaking Changes + +This release does **not** introduce any breaking changes. + + diff --git a/docs/site/src/pages/releases/0-34-0.mdx b/docs/site/src/pages/releases/0-34-0.mdx new file mode 100644 index 0000000000..2f437e9587 --- /dev/null +++ b/docs/site/src/pages/releases/0-34-0.mdx @@ -0,0 +1,42 @@ +import Release from "@/components/releases/Release.astro"; +import { Image } from "@/components/Media"; +import Diagram from "@/components/Diagram.astro"; +import LabJack from "@/pages/releases/LabJack.astro"; + + + + + +Synnax version 0.34 introduces a built-in [LabJack +driver](/reference/device-drivers/labjack) supporting all T-Series devices. + +You can use a [write task](/reference/device-drivers/labjack/write-task) to control +digital and analog outputs on the device, and a [read +task](/reference/device-drivers/labjack/read-task) to acquire data from inputs. + +Synnax currently only supports LabJack devices on Windows, although we plan to add +support for other operating systems soon. + +### Taring Functionality + +Both [National Instruments](/reference/device-drivers/ni) and +[LabJack](/reference/device-drivers/labjack) read tasks now support taring +functionality. This feature allows you to zero out the current value of a read task. + +### Other Minor Improvements and Bug Fixes + +- Improved schematic connection line pathing. +- Implemented [Python client](/reference/python-client) support for configuring and + running [OPC UA read tasks](/reference/device-drivers/opc-ua/read-task). +- Font sizes on a [schematic](/reference/console/schematic) value are now configurable. +- [Schematic](/reference/console/schematic) values can now be displayed in scientific notation. + +### Breaking Changes + +This release does **not** introduce any breaking changes. + + diff --git a/docs/site/src/pages/releases/LabJack.astro b/docs/site/src/pages/releases/LabJack.astro new file mode 100644 index 0000000000..4214729b1a --- /dev/null +++ b/docs/site/src/pages/releases/LabJack.astro @@ -0,0 +1,206 @@ +
+ + + + + + + + + + +
+ + diff --git a/docs/site/src/pages/releases/index.mdx b/docs/site/src/pages/releases/index.mdx index 487ca622be..9ff73e9996 100644 --- a/docs/site/src/pages/releases/index.mdx +++ b/docs/site/src/pages/releases/index.mdx @@ -1,20 +1,31 @@ --- layout: "@/layouts/Releases.astro" --- + +import Release0340 from "@/pages/releases/0-34-0.mdx"; +import Release0330 from "@/pages/releases/0-33-0.mdx"; import Release0320 from "@/pages/releases/0-32-0.mdx"; import Release0310 from "@/pages/releases/0-31-0.mdx"; import { Divider } from "@synnaxlabs/pluto"; -
-###### 0.32 - + ###### 0.34 +
-###### 0.31 - + ###### 0.33 + +
+ +
+ ###### 0.32 + +
+ +
+ ###### 0.31 +
- diff --git a/docs/site/src/util/algoliasearch.js b/docs/site/src/util/algoliasearch.js index abe35fce77..fbc02d3c09 100644 --- a/docs/site/src/util/algoliasearch.js +++ b/docs/site/src/util/algoliasearch.js @@ -8,56 +8,57 @@ // included in the file licenses/APL.txt. import * as dotenv from "dotenv"; +import process from "process"; dotenv.config(); import algoliasearch from "algoliasearch"; const client = algoliasearch( - process.env.DOCS_ALGOLIA_APP_ID, - process.env.DOCS_ALGOLIA_WRITE_API_KEY, + process.env.DOCS_ALGOLIA_APP_ID, + process.env.DOCS_ALGOLIA_WRITE_API_KEY, ); // 1. Build a dataset import fs from "fs"; -import path from "path"; import matter from "gray-matter"; +import path from "path"; import removeMd from "remove-markdown"; const purgeImports = (content) => { - // find the second --- in the file - const secondDash = content.indexOf("---", 3); - // get the content after the second --- - const nc = content.slice(secondDash + 2); - // find the first markdown header in the file - const firstHeader = nc.indexOf("#"); - // find the first 'import' statement in the file - const firstImport = nc.indexOf("import"); - // find the index of the first newline after the first import statement - if (firstImport > firstHeader || firstImport === -1) return nc; - // find the index of the last import statement before the first markdown header - const lastImport = nc.slice(0, firstHeader).lastIndexOf("import"); - const lastNewline = nc.slice(lastImport + 1).indexOf("\n"); - // return the content with the imports removed - return nc.slice(lastImport + lastNewline + 2); + // find the second --- in the file + const secondDash = content.indexOf("---", 3); + // get the content after the second --- + const nc = content.slice(secondDash + 2); + // find the first markdown header in the file + const firstHeader = nc.indexOf("#"); + // find the first 'import' statement in the file + const firstImport = nc.indexOf("import"); + // find the index of the first newline after the first import statement + if (firstImport > firstHeader || firstImport === -1) return nc; + // find the index of the last import statement before the first markdown header + const lastImport = nc.slice(0, firstHeader).lastIndexOf("import"); + const lastNewline = nc.slice(lastImport + 1).indexOf("\n"); + // return the content with the imports removed + return nc.slice(lastImport + lastNewline + 2); }; const filenames = fs.readdirSync(path.join("./src/pages"), { recursive: true }); const data = filenames - .filter((f) => f.endsWith("mdx")) - .map((filename) => { - try { - const markdownWithMeta = fs.readFileSync("./src/pages/" + filename); - const { data: frontmatter, content } = matter(markdownWithMeta); - return { - objectID: filename, - href: "/" + filename.replace(".mdx", "").replace("index", ""), - title: frontmatter.heading ?? frontmatter.title, - description: frontmatter.description, - content: removeMd(purgeImports(content)).replace(/\n/g, " "), - }; - } catch (e) { - console.log(e.message); - } - }); + .filter((f) => f.endsWith("mdx")) + .map((filename) => { + try { + const markdownWithMeta = fs.readFileSync(`./src/pages/${ filename}`); + const { data: frontmatter, content } = matter(markdownWithMeta); + return { + objectID: filename, + href: `/${ filename.replace(".mdx", "").replace("index", "")}`, + title: frontmatter.heading ?? frontmatter.title, + description: frontmatter.description, + content: removeMd(purgeImports(content)).replace(/\n/g, " "), + }; + } catch (e) { + console.log(e.message); + } + }); const idx = client.initIndex("docs_site"); @@ -66,7 +67,7 @@ await idx.clearObjects(); // 2. Send the dataset in JSON format const res = await client - .initIndex("docs_site") - .saveObjects(JSON.parse(JSON.stringify(data))); + .initIndex("docs_site") + .saveObjects(JSON.parse(JSON.stringify(data))); console.log(`Successfully updated ${res.objectIDs.length} pages`); diff --git a/docs/site/src/util/iframe.ts b/docs/site/src/util/iframe.ts index 3e11ee9bf5..1a5005402f 100644 --- a/docs/site/src/util/iframe.ts +++ b/docs/site/src/util/iframe.ts @@ -12,9 +12,7 @@ const updateHref = () => { const path = url.replace(window.location.origin, "").split("?")[0].split("#")[0]; const maybeHeading = url.split("#"); let heading = ""; - if (maybeHeading.length > 1) { - heading = maybeHeading[1].split("&")[0]; - } + if (maybeHeading.length > 1) heading = maybeHeading[1].split("&")[0]; window.parent.postMessage({ path, heading }, "*"); }; diff --git a/drift/eslint.config.js b/drift/eslint.config.js index 36e6d6d08b..38dad56c92 100644 --- a/drift/eslint.config.js +++ b/drift/eslint.config.js @@ -9,4 +9,4 @@ import synnaxConfig from "eslint-config-synnaxlabs"; -export default synnaxConfig; \ No newline at end of file +export default [...synnaxConfig, { ignores: ["examples"] }]; diff --git a/drift/examples/electron/electron.vite.config.ts b/drift/examples/electron/electron.vite.config.ts index b04501128c..593226fc39 100644 --- a/drift/examples/electron/electron.vite.config.ts +++ b/drift/examples/electron/electron.vite.config.ts @@ -7,9 +7,9 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { resolve } from 'path' -import { defineConfig, externalizeDepsPlugin } from 'electron-vite' import react from '@vitejs/plugin-react' +import { defineConfig, externalizeDepsPlugin } from 'electron-vite' +import { resolve } from 'path' export default defineConfig({ main: { diff --git a/drift/examples/electron/package.json b/drift/examples/electron/package.json index 71eca17c02..1b18ff513e 100644 --- a/drift/examples/electron/package.json +++ b/drift/examples/electron/package.json @@ -23,7 +23,7 @@ "dependencies": { "@electron-toolkit/preload": "^3.0.0", "@electron-toolkit/utils": "^3.0.0", - "@reduxjs/toolkit": "^2.2.7", + "@reduxjs/toolkit": "^2.3.0", "@synnaxlabs/drift": "workspace:^", "electron-updater": "^6.1.7", "@fontsource/inter": "^5.0.18", @@ -32,15 +32,15 @@ "@synnaxlabs/pluto": "workspace:*", "@synnaxlabs/x": "workspace:*", "@tanstack/react-query": "^5.32.0", - "proxy-memoize": "^1.2.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "proxy-memoize": "2.0.6", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-error-boundary": "^4.0.13", "react-icons": "^5.1.0", - "react-redux": "^9.1.0", + "react-redux": "^9.1.2", "tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store#v1", "uuid": "^9.0.1", - "zod": "3.23.8" + "zod": "^3.23.8" }, "devDependencies": { "@electron-toolkit/eslint-config-prettier": "^2.0.0", @@ -49,15 +49,15 @@ "@types/node": "^22.7.5", "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", - "@vitejs/plugin-react": "^4.3.1", + "@vitejs/plugin-react": "^4.3.3", "electron": "^28.2.0", "electron-builder": "^24.9.1", "electron-vite": "^2.0.0", - "eslint": "^9.10.0", - "prettier": "3.3.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "typescript": "^5.6.2", - "vite": "5.4.4" + "eslint": "^9.14.0", + "prettier": "^3.3.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "typescript": "^5.6.3", + "vite": "^5.4.10" } } diff --git a/drift/examples/electron/src/main/index.ts b/drift/examples/electron/src/main/index.ts index 740a355c8c..704acbbf72 100644 --- a/drift/examples/electron/src/main/index.ts +++ b/drift/examples/electron/src/main/index.ts @@ -7,12 +7,13 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { app, shell, BrowserWindow, ipcMain } from 'electron' +import { electronApp, is, optimizer } from '@electron-toolkit/utils' +import { configureStore, MAIN_WINDOW } from '@synnaxlabs/drift' +import { ElectronRuntime, listenOnMain } from '@synnaxlabs/drift/electron' +import { app, BrowserWindow, ipcMain, shell } from 'electron' import { join } from 'path' -import { electronApp, optimizer, is } from '@electron-toolkit/utils' + import icon from '../../resources/icon.png?asset' -import { MAIN_WINDOW, configureStore } from '@synnaxlabs/drift' -import { ElectronRuntime, listenOnMain } from '@synnaxlabs/drift/electron' function createWindow(): void { // Create the browser window. diff --git a/drift/examples/electron/src/preload/index.ts b/drift/examples/electron/src/preload/index.ts index 9bc46da7c7..5e6e91b818 100644 --- a/drift/examples/electron/src/preload/index.ts +++ b/drift/examples/electron/src/preload/index.ts @@ -7,7 +7,6 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { contextBridge } from 'electron' import { electronAPI } from '@electron-toolkit/preload' import { configurePreload } from '@synnaxlabs/drift/electron' @@ -24,8 +23,8 @@ if (process.contextIsolated) { console.error(error) } } else { - // @ts-ignore (define in dts) + // @ts-expect-error (define in dts) window.electron = electronAPI - // @ts-ignore (define in dts) + // @ts-expect-error (define in dts) window.api = api } diff --git a/drift/examples/electron/src/renderer/src/App.tsx b/drift/examples/electron/src/renderer/src/App.tsx index b17240c9aa..16e5156baa 100644 --- a/drift/examples/electron/src/renderer/src/App.tsx +++ b/drift/examples/electron/src/renderer/src/App.tsx @@ -7,14 +7,14 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { useSelector, useDispatch } from 'react-redux' - -import reactLogo from './assets/react.svg' import './App.css' -import { incremented, StoreState } from './store' import { createWindow } from '@synnaxlabs/drift' import { useSelectWindow } from '@synnaxlabs/drift/react' +import { useDispatch, useSelector } from 'react-redux' + +import reactLogo from './assets/react.svg' +import { incremented, StoreState } from './store' function App() { const count = useSelector((state: StoreState) => state.counter.value) diff --git a/drift/examples/electron/src/renderer/src/main.tsx b/drift/examples/electron/src/renderer/src/main.tsx index 4df0df7577..c79dcc2d55 100644 --- a/drift/examples/electron/src/renderer/src/main.tsx +++ b/drift/examples/electron/src/renderer/src/main.tsx @@ -7,15 +7,13 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import React from 'react' +import './index.css' import { Provider } from '@synnaxlabs/drift/react' +import React from 'react' import ReactDOM from 'react-dom' import App from './App' - -import './index.css' - import promise from './store' const Main = (): ReactElement => { diff --git a/drift/examples/electron/src/renderer/src/store.ts b/drift/examples/electron/src/renderer/src/store.ts index e753197f33..b42abaf04e 100644 --- a/drift/examples/electron/src/renderer/src/store.ts +++ b/drift/examples/electron/src/renderer/src/store.ts @@ -7,9 +7,8 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { createSlice, combineReducers } from '@reduxjs/toolkit' - -import { reducer as driftReducer, configureStore } from '@synnaxlabs/drift' +import { combineReducers, createSlice } from '@reduxjs/toolkit' +import { configureStore, reducer as driftReducer } from '@synnaxlabs/drift' import { ElectronRuntime } from '@synnaxlabs/drift/electron' const counterSlice = createSlice({ diff --git a/drift/examples/tauri/package.json b/drift/examples/tauri/package.json index 37bfa22eb4..5d479c313b 100644 --- a/drift/examples/tauri/package.json +++ b/drift/examples/tauri/package.json @@ -9,9 +9,9 @@ "preview": "vite preview" }, "dependencies": { - "@reduxjs/toolkit": "^2.2.8", + "@reduxjs/toolkit": "^2.3.0", "@synnaxlabs/drift": "workspace:*", - "@tauri-apps/api": "^2.0.2", + "@tauri-apps/api": "^2.1.0", "react": "^18.3.1", "react-dom": "^18.3.1" }, @@ -19,9 +19,9 @@ "@tauri-apps/cli": "^2.0.2", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.1", - "@vitejs/plugin-react": "^4.3.2", + "@vitejs/plugin-react": "^4.3.3", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vite-tsconfig-paths": "^5.0.1" + "vite": "^5.4.10", + "vite-tsconfig-paths": "^5.1.2" } } diff --git a/drift/examples/tauri/src/App.tsx b/drift/examples/tauri/src/App.tsx index 9cd732b043..f794ce078f 100644 --- a/drift/examples/tauri/src/App.tsx +++ b/drift/examples/tauri/src/App.tsx @@ -7,22 +7,22 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { useSelector, useDispatch } from "react-redux"; - -import reactLogo from "./assets/react.svg"; import "./App.css"; -import { incremented, StoreState } from "./store"; import { createWindow, useSelectWindow } from "@synnaxlabs/drift"; +import { useDispatch, useSelector } from "react-redux"; + +import reactLogo from "./assets/react.svg"; +import { incremented, StoreState } from "./store"; function App() { const count = useSelector((state: StoreState) => state.counter.value); const { windows } = useSelector(({ drift }: StoreState) => drift); const dispatch = useDispatch(); const numOpen = Object.values(windows).filter( - ({ stage }) => stage === "created" + ({ stage }) => stage === "created", ).length; - const w = useSelectWindow(); + useSelectWindow(); return (
@@ -49,7 +49,7 @@ function App() { key: `window-${numOpen}`, title: `Window ${numOpen}`, url: "/", - }) + }), ); }} > diff --git a/drift/examples/tauri/src/store.ts b/drift/examples/tauri/src/store.ts index 28450d2bad..6926cdea0a 100644 --- a/drift/examples/tauri/src/store.ts +++ b/drift/examples/tauri/src/store.ts @@ -7,12 +7,11 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { createSlice, combineReducers } from "@reduxjs/toolkit"; - +import { combineReducers, createSlice } from "@reduxjs/toolkit"; import { + configureStore, reducer as driftReducer, TauriRuntime, - configureStore, } from "@synnaxlabs/drift"; import { appWindow } from "@tauri-apps/api/window"; diff --git a/drift/examples/tauri/vite.config.ts b/drift/examples/tauri/vite.config.ts index 2591c47d32..1d90b6c7ad 100644 --- a/drift/examples/tauri/vite.config.ts +++ b/drift/examples/tauri/vite.config.ts @@ -7,8 +7,8 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; // https://vitejs.dev/config/ export default defineConfig({ diff --git a/drift/package.json b/drift/package.json index a521225ef4..5490da6220 100644 --- a/drift/package.json +++ b/drift/package.json @@ -1,6 +1,6 @@ { "name": "@synnaxlabs/drift", - "version": "0.33.1", + "version": "0.34.0", "description": "State synchronization and Redux state synchronization for Tauri Apps", "repository": "https://github.com/synnaxlabs/synnax/tree/main/drift", "type": "module", @@ -18,13 +18,13 @@ "watch": "tsc --noEmit && vite build --watch", "test": "vitest", "cov": "vitest --coverage", - "lint": "eslint \"src/**/*.ts*\"", - "fix": "eslint \"src/**/*.ts*\" --fix" + "lint": "eslint --cache", + "fix": "eslint --cache --fix" }, "dependencies": { - "@reduxjs/toolkit": "^2.2.8", + "@reduxjs/toolkit": "^2.3.0", "@synnaxlabs/x": "workspace:*", - "@tauri-apps/api": "^2.0.2", + "@tauri-apps/api": "^2.1.0", "proxy-memoize": "2.0.3", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -33,17 +33,18 @@ "devDependencies": { "@synnaxlabs/tsconfig": "workspace:*", "@synnaxlabs/vite-plugin": "workspace:*", - "@tauri-apps/api": "^2.0.2", + "@tauri-apps/api": "^2.1.0", "@types/react": "^18.3.11", - "@vitest/coverage-v8": "^2.1.2", + "@vitest/coverage-v8": "^2.1.4", "electron": "^32.2.0", + "eslint": "^9.12.0", "eslint-config-synnaxlabs": "workspace:*", "react": "^18.3.1", "react-dom": "^18.3.1", "react-redux": "^9.1.2", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vitest": "^2.1.2" + "vite": "^5.4.10", + "vitest": "^2.1.4" }, "files": [ "dist" diff --git a/drift/src/configureStore.ts b/drift/src/configureStore.ts index cc1306f792..a22e31f8e1 100644 --- a/drift/src/configureStore.ts +++ b/drift/src/configureStore.ts @@ -7,15 +7,15 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import type { - Action as CoreAction, - ConfigureStoreOptions as BaseOpts, - EnhancedStore, - StoreEnhancer, - Tuple, - UnknownAction, +import { + type Action as CoreAction, + configureStore as base, + type ConfigureStoreOptions as BaseOpts, + type EnhancedStore, + type StoreEnhancer, + type Tuple, + type UnknownAction, } from "@reduxjs/toolkit"; -import { configureStore as base } from "@reduxjs/toolkit"; import { listen } from "@/listener"; import { configureMiddleware, type Middlewares } from "@/middleware"; @@ -93,11 +93,11 @@ const receivePreloadedState = async < ): Promise => await new Promise((resolve) => { void listen(runtime, store, resolve); - if (runtime.isMain()) { + if (runtime.isMain()) if (typeof preloadedState === "function") preloadedState().then(resolve).catch(console.error); else resolve(preloadedState); - } else void runtime.emit({ sendState: true }, MAIN_WINDOW); + else void runtime.emit({ sendState: true }, MAIN_WINDOW); }); /** diff --git a/drift/src/electron/index.ts b/drift/src/electron/index.ts index 7858befff9..c0ee80cbfd 100644 --- a/drift/src/electron/index.ts +++ b/drift/src/electron/index.ts @@ -8,16 +8,16 @@ // included in the file licenses/APL.txt. import type { Action, UnknownAction } from "@reduxjs/toolkit"; -import { debounce, dimensions, type xy } from "@synnaxlabs/x"; +import { debounce, type dimensions, type xy } from "@synnaxlabs/x"; import { type BrowserWindow, - BrowserWindowConstructorOptions, - IpcMainEvent, + type BrowserWindowConstructorOptions, + type IpcMainEvent, type IpcRendererEvent, } from "electron"; -import { Event, Runtime } from "@/runtime"; -import { setWindowProps, SetWindowPropsPayload, StoreState } from "@/state"; +import { type Event, type Runtime } from "@/runtime"; +import { setWindowProps, type SetWindowPropsPayload, type StoreState } from "@/state"; import { MAIN_WINDOW, type WindowProps } from "@/window"; const ACTION_EVENT = "drift://action"; diff --git a/drift/src/listener.ts b/drift/src/listener.ts index ba9d8b22c3..183b4eafe5 100644 --- a/drift/src/listener.ts +++ b/drift/src/listener.ts @@ -48,7 +48,6 @@ export const listen = async ) => M) | undefined, runtime: Runtime, debug: boolean = false, -): ((def: GetDefaultMiddleware) => M) => { - return (def) => { +): ((def: GetDefaultMiddleware) => M) => (def) => { const base = mw != null ? (typeof mw === "function" ? mw(def) : mw) : def(); return [middleware(runtime, debug), ...base] as unknown as M; }; -}; type ConfigureStoreOptions< S extends StoreState, diff --git a/drift/src/mock/runtime.ts b/drift/src/mock/runtime.ts index 55ffa01256..2e72c56d64 100644 --- a/drift/src/mock/runtime.ts +++ b/drift/src/mock/runtime.ts @@ -33,9 +33,7 @@ export class MockRuntime this._label = initialProps.key; } - async configure(): Promise { - return; - } + async configure(): Promise {} isMain(): boolean { return this._isMain; diff --git a/drift/src/state.ts b/drift/src/state.ts index 8c4180e76c..98bb66d2d9 100644 --- a/drift/src/state.ts +++ b/drift/src/state.ts @@ -309,16 +309,14 @@ const slice = createSlice({ incrementCounter("processCount", true)(s, a); const win = s.windows[a.payload.label]; if (win == null) return; - if (win.processCount === 0) { - if (win.stage === "reloading") { - window.location.reload(); - } else { + if (win.processCount === 0) + if (win.stage === "reloading") window.location.reload(); + else { s.windows[a.payload.label].visible = false; delete s.windows[a.payload.label]; delete s.labelKeys[a.payload.label]; delete s.keyLabels[win.key]; } - } }), setWindowError: (s: SliceState, a: PayloadAction) => { const win = s.windows[a.payload.key]; diff --git a/drift/src/sync.ts b/drift/src/sync.ts index 4d59c48d60..c33dd52b3a 100644 --- a/drift/src/sync.ts +++ b/drift/src/sync.ts @@ -52,16 +52,14 @@ export const syncInitial = async ( log(debug, "syncInitial", state, await runtime.listLabels(), nonMain); // Create windows that are not in runtime, delete windows that are not in state const allLabels = unique([...runtimeLabels, ...nonMain]); - for (const label of allLabels) { - // Only the main runtime is allowed to create windows. + // Only the main runtime is allowed to create windows. + for (const label of allLabels) if (!runtimeLabels.includes(label) && runtime.isMain()) await createRuntimeWindow(runtime, label, state.windows[label], debug); - else if (!nonMain.includes(label)) { + else if (!nonMain.includes(label)) // We're safe to close the window even if we're not in the main runtime // because there's no state to maintain. await closeRuntimeWindow(runtime, label, debug); - } - } const label = runtime.label(); const next = state.windows[label]; if (next == null) return; @@ -105,7 +103,7 @@ export const syncCurrent = async ( await runtime.setVisible(nextWin.visible as boolean); if (nextWin.visible === false) return; let position = nextWin.position; - if (position == null) position = (await runtime.getProps()).position; + position ??= (await runtime.getProps()).position; // This is very much a hack - some times (tauri) won't emit window created events, // so we move the window a smidge to emit events in order to do things like // hide traffic lights diff --git a/drift/src/tauri/index.ts b/drift/src/tauri/index.ts index ee44894dda..5951a38d06 100644 --- a/drift/src/tauri/index.ts +++ b/drift/src/tauri/index.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { type Action, type UnknownAction } from "@reduxjs/toolkit"; -import { debounce as debounceF, type dimensions, type xy } from "@synnaxlabs/x"; +import { debounce as debounceF, dimensions, xy } from "@synnaxlabs/x"; import { emit, type Event as TauriEvent, @@ -131,20 +131,18 @@ export class TauriRuntime) => lis(decode(event.payload)), ); const propsHandlers = newWindowPropsHandlers(); - for (const { key, handler, debounce } of propsHandlers) { + for (const { key, handler, debounce } of propsHandlers) this.unsubscribe[key] = await this.win.listen( key, debounceF(() => { handler(this.win) .then((action) => { - if (action != null) { + if (action != null) this.emit({ action: action as A }, undefined, "WHITELIST"); - } }) .catch(console.error); }, debounce), ); - } } onCloseRequested(cb: () => void): void { @@ -280,8 +278,8 @@ export class TauriRuntime [ maximized: await window.isMaximized(), visible, minimized: !visible, - position: await parsePosition(await window.innerPosition(), scaleFactor), - size: await parseSize(await window.innerSize(), scaleFactor), + position: parsePosition(await window.innerPosition(), scaleFactor), + size: parseSize(await window.innerSize(), scaleFactor), }; return setWindowProps(nextProps); }, @@ -320,7 +318,7 @@ const newWindowPropsHandlers = (): HandlerEntry[] => [ handler: async (window) => { const scaleFactor = await window?.scaleFactor(); if (scaleFactor == null) return null; - const position = await parsePosition(await window.innerPosition(), scaleFactor); + const position = parsePosition(await window.innerPosition(), scaleFactor); const visible = await window.isVisible(); const nextProps: SetWindowPropsPayload = { label: window.label, @@ -333,36 +331,23 @@ const newWindowPropsHandlers = (): HandlerEntry[] => [ { key: TauriEventKey.WINDOW_BLUR, debounce: 0, - handler: async (window) => { - return setWindowProps({ focus: false, label: window.label }); - }, + handler: async (window) => setWindowProps({ focus: false, label: window.label }), }, { key: TauriEventKey.WINDOW_FOCUS, debounce: 0, - handler: async (window) => { - return setWindowProps({ + handler: async (window) => + setWindowProps({ focus: true, visible: true, minimized: false, label: window.label, - }); - }, + }), }, ]; -const parsePosition = async ( - position: PhysicalPosition, - scaleFactor: number, -): Promise => { - const logical = position.toLogical(scaleFactor); - return { x: logical.x, y: logical.y }; -}; +const parsePosition = (position: PhysicalPosition, scaleFactor: number): xy.XY => + xy.scale(position, 1 / scaleFactor); -const parseSize = async ( - size: PhysicalSize, - scaleFactor: number, -): Promise => { - const logical = size.toLogical(scaleFactor); - return { width: logical.width, height: logical.height }; -}; +const parseSize = (size: PhysicalSize, scaleFactor: number): dimensions.Dimensions => + dimensions.scale(size, 1 / scaleFactor); diff --git a/driver/labjack/reader_source.cpp b/driver/labjack/reader_source.cpp index 778e084a83..0514c211c2 100644 --- a/driver/labjack/reader_source.cpp +++ b/driver/labjack/reader_source.cpp @@ -343,6 +343,10 @@ std::pair labjack::ReaderSource::read_stream(breaker::B } std::pair labjack::ReaderSource::read(breaker::Breaker &breaker) { + if (this->ok() == false) { + return std::make_pair( + Frame(0), freighter::Error("Device disconnected or is in error. Please reconfigure task and try again")); + } if (this->reader_config.tc_channels.empty()) return this->read_stream(breaker); return this->read_cmd_response(breaker); @@ -469,14 +473,24 @@ void labjack::ReaderSource::configure_tc_ain_ef(TCConfig tc_config) { } int labjack::ReaderSource::check_err(int err, std::string caller) { - return labjack::check_err_internal( + labjack::check_err_internal( err, caller, "reader", this->ctx, this->ok_state, - this->reader_config.task_key + this->task.key ); + + if (err == LJME_RECONNECT_FAILED || + err == LJME_NO_RESPONSE_BYTES_RECEIVED || + err == LJME_INCORRECT_NUM_COMMAND_BYTES_SENT || + err == LJME_NO_COMMAND_BYTES_SENT || + err == LJME_INCORRECT_NUM_RESPONSE_BYTES_RECEIVED + ) { + this->device_manager->close_device(this->reader_config.serial_number); + } + return err; } bool labjack::ReaderSource::ok() { diff --git a/driver/labjack/util.h b/driver/labjack/util.h index 5b75287a62..578591badb 100644 --- a/driver/labjack/util.h +++ b/driver/labjack/util.h @@ -34,7 +34,6 @@ inline int check_err_internal( if (auto it = ERROR_DESCRIPTIONS.find(err_msg); it != ERROR_DESCRIPTIONS.end()) { description = ": " + it->second; } - ctx->set_state({ .task = task_key, .variant = "error", @@ -71,6 +70,15 @@ class DeviceManager { return device_handles[serial_number]; } + void close_device(std::string serial_number) { + std::lock_guard lock(device_mutex); + if (this->device_handles.find(serial_number) != device_handles.end()) { + int handle = device_handles[serial_number]; + LJM_Close(handle); + device_handles.erase(serial_number); + } + } + private: std::map device_handles; }; diff --git a/driver/labjack/writer_sink.cpp b/driver/labjack/writer_sink.cpp index 30c6a27ac9..fd55bf42a8 100644 --- a/driver/labjack/writer_sink.cpp +++ b/driver/labjack/writer_sink.cpp @@ -270,14 +270,18 @@ std::vector labjack::WriteSink::get_index_keys() { } int labjack::WriteSink::check_err(int err, std::string caller) { - return labjack::check_err_internal( + labjack::check_err_internal( err, caller, "writer", this->ctx, this->ok_state, - this->writer_config.task_key + this->task.key ); + if (err == LJME_RECONNECT_FAILED) { + this->device_manager->close_device(this->writer_config.serial_number); + } + return err; } bool labjack::WriteSink::ok() { diff --git a/driver/ni/analog_read.cpp b/driver/ni/analog_read.cpp index 9b9af3c9bf..c4b4f02db2 100644 --- a/driver/ni/analog_read.cpp +++ b/driver/ni/analog_read.cpp @@ -68,8 +68,7 @@ void ni::AnalogReadSource::parse_channels(config::Parser &parser) { std::shared_ptr ni::AnalogReadSource::parse_channel( config::Parser &parser, const std::string &channel_type, const std::string &channel_name) { - LOG(INFO) << - "[ni.reader] Parsing channel " << channel_name << " of type " << channel_type; + if (channel_type == "ai_accel") return std::make_shared( parser, this->task_handle, channel_name); diff --git a/driver/ni/ni.h b/driver/ni/ni.h index 46ac31fd1a..72fe20896b 100644 --- a/driver/ni/ni.h +++ b/driver/ni/ni.h @@ -435,6 +435,8 @@ class Scanner final { void set_scan_thread(std::shared_ptr scan_thread); + void join_scan_thread(); + void log_err(std::string err_msg); private: @@ -478,7 +480,6 @@ class ScannerTask final : public task::Task { bool ok(); - ~ScannerTask(); private: breaker::Breaker breaker; diff --git a/driver/ni/scanner.cpp b/driver/ni/scanner.cpp index 926c8fa1ec..27a491b054 100644 --- a/driver/ni/scanner.cpp +++ b/driver/ni/scanner.cpp @@ -47,12 +47,12 @@ ni::Scanner::Scanner( NISysCfgBoolTrue ); ni::NiSysCfgInterface::SetFilterProperty( - filter, + this->filter, NISysCfgFilterPropertyIsPresent, NISysCfgIsPresentTypePresent ); ni::NiSysCfgInterface::SetFilterProperty( - filter, + this->filter, NISysCfgFilterPropertyIsChassis, NISysCfgBoolFalse ); @@ -66,10 +66,14 @@ void ni::Scanner::set_scan_thread(std::shared_ptr scan_thread) { this->scan_thread = scan_thread; } +void ni::Scanner::join_scan_thread() { + if (this->scan_thread && this->scan_thread->joinable()) this->scan_thread->join(); +} + ni::Scanner::~Scanner() { + if (this->scan_thread && scan_thread->joinable()) scan_thread->join(); ni::NiSysCfgInterface::CloseHandle(this->filter); ni::NiSysCfgInterface::CloseHandle(this->session); - if (this->scan_thread && scan_thread->joinable()) scan_thread->join(); } void ni::Scanner::scan() { @@ -81,7 +85,6 @@ void ni::Scanner::scan() { this->filter, NULL, &this->resources_handle ); - if (err != NISysCfg_OK) return log_err("failed to find hardware"); while (ni::NiSysCfgInterface::NextResource( diff --git a/driver/ni/task.cpp b/driver/ni/task.cpp index a9f49ef71c..5308488752 100644 --- a/driver/ni/task.cpp +++ b/driver/ni/task.cpp @@ -28,7 +28,10 @@ ni::ScannerTask::ScannerTask( .scale = 1.2, }); - if (!scanner.ok()) { + auto parser = config::Parser(task.config); + bool enabled = parser.optional("enabled", true); + + if (!scanner.ok() || !enabled) { ctx->set_state({ .task = task.key, .variant = "error", @@ -60,6 +63,7 @@ void ni::ScannerTask::exec(task::Command &cmd) { scanner.create_devices(); } else if (cmd.type == "stop") { this->stop(); + this->scanner.join_scan_thread(); } else { LOG(ERROR) << "unknown command type: " << cmd.type; } @@ -72,6 +76,7 @@ void ni::ScannerTask::run() { this->breaker.waitFor(this->scan_rate.period().chrono()); this->exec(scan_cmd); } + LOG(INFO) << "[ni.scanner] stopped scanning " << this->task.name; } @@ -79,10 +84,6 @@ bool ni::ScannerTask::ok() { return this->ok_state; } -ni::ScannerTask::~ScannerTask() { - if (this->thread->joinable() && this->thread->get_id() != std::this_thread::get_id()) - this->thread->detach(); -} /////////////////////////////////////////////////////////////////////////////////// // ReaderTask // diff --git a/freighter/go/go.mod b/freighter/go/go.mod index ba8025e1ad..994e885033 100644 --- a/freighter/go/go.mod +++ b/freighter/go/go.mod @@ -1,22 +1,22 @@ module github.com/synnaxlabs/freighter -go 1.22 +go 1.22.7 -toolchain go1.22.0 +toolchain go1.23.0 require ( github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292 - github.com/fasthttp/websocket v1.5.9 - github.com/gofiber/fiber/v2 v2.52.2 + github.com/fasthttp/websocket v1.5.10 + github.com/gofiber/fiber/v2 v2.52.5 github.com/gofiber/websocket/v2 v2.2.1 - github.com/onsi/ginkgo/v2 v2.19.0 - github.com/onsi/gomega v1.33.1 - github.com/samber/lo v1.44.0 + github.com/onsi/ginkgo/v2 v2.21.0 + github.com/onsi/gomega v1.35.1 + github.com/samber/lo v1.47.0 github.com/synnaxlabs/alamos v0.0.0-00010101000000-000000000000 github.com/synnaxlabs/x v0.0.0-20220801122519-e4a5e96a532d go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.65.0 - google.golang.org/protobuf v1.34.2 + google.golang.org/grpc v1.68.0 + google.golang.org/protobuf v1.35.1 ) replace ( @@ -25,58 +25,58 @@ replace ( ) require ( - github.com/andybalholm/brotli v1.1.0 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cockroachdb/errors v1.11.3 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/getsentry/sentry-go v0.29.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect + github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511 // indirect - github.com/uptrace/uptrace-go v1.27.1 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 // indirect + github.com/uptrace/uptrace-go v1.31.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.54.0 // indirect + github.com/valyala/fasthttp v1.57.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/log v0.3.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.3.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.8.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sync v0.9.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + golang.org/x/tools v0.27.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect google.golang.org/grpc/examples v0.0.0-20230113182548-78ddc05d9b33 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/freighter/go/go.sum b/freighter/go/go.sum index 774cc76b59..ea84da90ce 100644 --- a/freighter/go/go.sum +++ b/freighter/go/go.sum @@ -1,5 +1,7 @@ github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292 h1:dzj1/xcivGjNPwwifh/dWTczkwcuqsXXFHY1X/TZMtw= @@ -15,8 +17,12 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fasthttp/websocket v1.5.9 h1:9deGuzYcCRKjk940kNwSN6Hd14hk4zYwropm4UsUIUQ= github.com/fasthttp/websocket v1.5.9/go.mod h1:NLzHBFur260OMuZHohOfYQwMTpR7sfSpUnuqKxMpgKA= +github.com/fasthttp/websocket v1.5.10 h1:bc7NIGyrg1L6sd5pRzCIbXpro54SZLEluZCu0rOpcN4= +github.com/fasthttp/websocket v1.5.10/go.mod h1:BwHeuXGWzCW1/BIKUKD3+qfCl+cTdsHu/f243NcAI/Q= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -28,6 +34,8 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gofiber/fiber/v2 v2.52.2 h1:b0rYH6b06Df+4NyrbdptQL8ifuxw/Tf2DgfkZkDaxEo= github.com/gofiber/fiber/v2 v2.52.2/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/gofiber/websocket/v2 v2.2.1 h1:C9cjxvloojayOp9AovmpQrk8VqvVnT8Oao3+IUygH7w= github.com/gofiber/websocket/v2 v2.2.1/go.mod h1:Ao/+nyNnX5u/hIFPuHl28a+NIkrqK7PRimyKaj4JxVU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -36,14 +44,20 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -55,10 +69,16 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -72,54 +92,93 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/samber/lo v1.44.0 h1:5il56KxRE+GHsm1IR+sZ/6J42NODigFiqCWpSc2dybA= github.com/samber/lo v1.44.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= +github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511 h1:KanIMPX0QdEdB4R3CiimCAbxFrhB3j7h0/OvpYGVQa8= github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= +github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 h1:D0vL7YNisV2yqE55+q0lFuGse6U8lxlg7fYTctlT5Gc= +github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/uptrace/uptrace-go v1.27.1 h1:CIcBWKucTkw1ussNToZA1HNO7+HXOju9zDcFC+MOpOA= github.com/uptrace/uptrace-go v1.27.1/go.mod h1:/9tKtcIaxb3GAwPOCqkZ8bhXRR/ZYCsXb9Zs5kh14Eo= +github.com/uptrace/uptrace-go v1.31.0 h1:i+AsiXVZ5NHHYWvlmJyTqg5l9sLqYN/KSZeLWr3kAM8= +github.com/uptrace/uptrace-go v1.31.0/go.mod h1:zX5JqvEoLpFbbtGN+G1/vf276rfoHiTFrh7yt1XdVCY= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.54.0 h1:cCL+ZZR3z3HPLMVfEYVUMtJqVaui0+gu7Lx63unHwS0= github.com/valyala/fasthttp v1.54.0/go.mod h1:6dt4/8olwq9QARP/TDuPmWyWcl4byhpvTJ4AAtcz+QM= +github.com/valyala/fasthttp v1.57.0 h1:Xw8SjWGEP/+wAAgyy5XTvgrWlOD1+TxbbvNADYCm1Tg= +github.com/valyala/fasthttp v1.57.0/go.mod h1:h6ZBaPRlzpZ6O3H5t2gEk1Qi33+TmLvfwgLLp0t9CpE= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0 h1:UaQVCH34fQsyDjlgS0L070Kjs9uCrLKoQfzn2Nl7XTY= go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0/go.mod h1:Ks4aHdMgu1vAfEY0cIBHcGx2l1S0+PwFm2BE/HRzqSk= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 h1:kJB5wMVorwre8QzEodzTAbzm9FOOah0zvG+V4abNlEE= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0/go.mod h1:Nup4TgnOyEJWmVq9sf/ASH3ZJiAXwWHd5xZCHG7Sg9M= go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 h1:ccBrA8nCY5mM0y5uO7FT0ze4S0TuFcWdDB2FxGMTjkI= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0/go.mod h1:/9pb6634zi2Lk8LYg9Q0X8Ar6jka4dkFOylBLbVQPCE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= go.opentelemetry.io/otel/log v0.3.0 h1:kJRFkpUFYtny37NQzL386WbznUByZx186DpEMKhEGZs= go.opentelemetry.io/otel/log v0.3.0/go.mod h1:ziCwqZr9soYDwGNbIL+6kAvQC+ANvjgG367HVcyR/ys= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/log v0.3.0 h1:GEjJ8iftz2l+XO1GF2856r7yYVh74URiF9JMcAacr5U= go.opentelemetry.io/otel/sdk/log v0.3.0/go.mod h1:BwCxtmux6ACLuys1wlbc0+vGBd+xytjmjajwqqIul2g= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -137,11 +196,15 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -149,30 +212,44 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/grpc/examples v0.0.0-20230113182548-78ddc05d9b33 h1:8WxuLGirDjuGV4NdWz+zhN6wTZar4Rntk/ZY8iXG5Mk= google.golang.org/grpc/examples v0.0.0-20230113182548-78ddc05d9b33/go.mod h1:Nr5H8+MlGWr5+xX/STzdoEqJrO+YteqFbMyCsrb6mH0= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/freighter/py/pyproject.toml b/freighter/py/pyproject.toml index 1136f8c26f..95170f318a 100644 --- a/freighter/py/pyproject.toml +++ b/freighter/py/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "synnax-freighter" -version = "0.33.0" +version = "0.34.0" description = "" authors = ["emiliano bonilla "] packages = [ diff --git a/freighter/ts/package.json b/freighter/ts/package.json index e2bfc6b319..8cea37a12b 100644 --- a/freighter/ts/package.json +++ b/freighter/ts/package.json @@ -1,6 +1,6 @@ { "name": "@synnaxlabs/freighter", - "version": "0.33.0", + "version": "0.34.0", "type": "module", "description": "a modular transport abstraction", "repository": "https://github.com/synnaxlabs/synnax/tree/main/freighter/ts", @@ -18,8 +18,8 @@ "watch": "tsc --noEmit && vite build --watch", "test": "vitest", "cov": "vitest --coverage", - "lint": "eslint \"src/**/*.ts*\"", - "fix": "eslint \"src/**/*.ts*\" --fix" + "lint": "eslint --cache", + "fix": "eslint --cache --fix" }, "dependencies": { "@synnaxlabs/alamos": "workspace:*", @@ -32,11 +32,12 @@ "@synnaxlabs/tsconfig": "workspace:*", "@synnaxlabs/vite-plugin": "workspace:*", "@types/node": "^22.7.5", - "@vitest/coverage-v8": "^2.1.2", + "@vitest/coverage-v8": "^2.1.4", + "eslint": "^9.12.0", "eslint-config-synnaxlabs": "workspace:*", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vitest": "^2.1.2" + "vite": "^5.4.10", + "vitest": "^2.1.4" }, "main": "dist/freighter.cjs", "module": "dist/freighter.js", diff --git a/freighter/ts/src/errors.spec.ts b/freighter/ts/src/errors.spec.ts index 43f0b41754..c9979ebe30 100644 --- a/freighter/ts/src/errors.spec.ts +++ b/freighter/ts/src/errors.spec.ts @@ -29,9 +29,6 @@ import { class MyCustomError extends BaseTypedError { type = "MyCustomError"; - constructor(message: string) { - super(message); - } } const myCustomErrorEncoder = (error: MyCustomError): ErrorPayload | null => { @@ -39,9 +36,8 @@ const myCustomErrorEncoder = (error: MyCustomError): ErrorPayload | null => { return { type: "MyCustomError", data: error.message }; }; -const myCustomErrorDecoder = (encoded: ErrorPayload): TypedError => { - return new MyCustomError(encoded.data); -}; +const myCustomErrorDecoder = (encoded: ErrorPayload): TypedError => + new MyCustomError(encoded.data); describe("errors", () => { test("isTypedError", () => { diff --git a/freighter/ts/src/errors.ts b/freighter/ts/src/errors.ts index 0db067c3a0..2fff92452e 100644 --- a/freighter/ts/src/errors.ts +++ b/freighter/ts/src/errors.ts @@ -46,10 +46,6 @@ export const errorMatcher = export class BaseTypedError extends Error implements TypedError { readonly discriminator = "FreighterError"; type: string = ""; - - constructor(message?: string) { - super(message); - } } type ErrorDecoder = (encoded: ErrorPayload) => Error | null; @@ -100,12 +96,11 @@ class Registry { encode(error: unknown): ErrorPayload { if (error == null) return { type: NONE, data: "" }; - if (isTypedError(error)) { + if (isTypedError(error)) for (const provider of this.providers) { const payload = provider.encode(error); if (payload != null) return payload; } - } return { type: UNKNOWN, data: JSON.stringify(error) }; } @@ -144,9 +139,7 @@ export const registerError = ({ * @param error - The error to encode. * @returns The encoded error. */ -export const encodeError = (error: unknown): ErrorPayload => { - return REGISTRY.encode(error); -}; +export const encodeError = (error: unknown): ErrorPayload => REGISTRY.encode(error); /** * Decodes an error payload into an exception. If a custom decoder can be found @@ -156,22 +149,18 @@ export const encodeError = (error: unknown): ErrorPayload => { * @param payload - The encoded error payload. * @returns The decoded error. */ -export const decodeError = (payload: ErrorPayload): Error | null => { - return REGISTRY.decode(payload); -}; +export const decodeError = (payload: ErrorPayload): Error | null => + REGISTRY.decode(payload); export class UnknownError extends BaseTypedError implements TypedError { type = "unknown"; - constructor(message: string) { - super(message); - } } const FREIGHTER_ERROR_TYPE = "freighter."; /** Thrown/returned when a stream closed normally. */ export class EOF extends BaseTypedError implements TypedError { - static readonly TYPE = FREIGHTER_ERROR_TYPE + "eof"; + static readonly TYPE = `${FREIGHTER_ERROR_TYPE}eof`; type = EOF.TYPE; static readonly matches = errorMatcher(EOF.TYPE); @@ -182,7 +171,7 @@ export class EOF extends BaseTypedError implements TypedError { /** Thrown/returned when a stream is closed abnormally. */ export class StreamClosed extends BaseTypedError implements TypedError { - static readonly TYPE = FREIGHTER_ERROR_TYPE + "stream_closed"; + static readonly TYPE = `${FREIGHTER_ERROR_TYPE}stream_closed`; static readonly matches = errorMatcher(StreamClosed.TYPE); type = StreamClosed.TYPE; @@ -198,7 +187,7 @@ export interface UnreachableArgs { /** Thrown when a target is unreachable. */ export class Unreachable extends BaseTypedError implements TypedError { - static readonly TYPE = FREIGHTER_ERROR_TYPE + "unreachable"; + static readonly TYPE = `${FREIGHTER_ERROR_TYPE}unreachable`; type = Unreachable.TYPE; static readonly matches = errorMatcher(Unreachable.TYPE); url: URL; diff --git a/freighter/ts/src/websocket.spec.ts b/freighter/ts/src/websocket.spec.ts index 401953b3ff..e15ec6db84 100644 --- a/freighter/ts/src/websocket.spec.ts +++ b/freighter/ts/src/websocket.spec.ts @@ -44,16 +44,15 @@ class MyCustomError extends BaseTypedError { } const encodeTestError = (err: TypedError): ErrorPayload => { - if (!(err instanceof MyCustomError)) { - throw new Error("Unexpected error type"); - } + if (!(err instanceof MyCustomError)) throw new Error("Unexpected error type"); + return { type: "integration.error", data: `${err.code},${err.message}` }; }; const decodeTestError = (encoded: ErrorPayload): TypedError | null => { if (encoded.type !== "integration.error") return null; const [code, message] = encoded.data.split(","); - return new MyCustomError(message, parseInt(code, 10)); + return new MyCustomError(message, parseInt(code)); }; registerError({ diff --git a/go.work b/go.work index 0bfb28c93f..655dbf3ff7 100644 --- a/go.work +++ b/go.work @@ -1,6 +1,6 @@ -go 1.22 +go 1.22.7 -toolchain go1.22.0 +toolchain go1.23.0 use ( ./alamos/go diff --git a/go.work.sum b/go.work.sum index d391180e22..dcf26eb402 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,5 +1,9 @@ cel.dev/expr v0.15.0 h1:O1jzfJCQBfL5BFoYktaxwIhuttaQPsVWerH9/EEKx0w= cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.16.0 h1:yloc84fytn4zmJX2GU3TkXGsaieaV7dQ057Qs4sIG2Y= +cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.16.1 h1:NR0+oFYzR1CqLFhTAqg3ql59G9VfN8fKq1TCHJ6gq1g= +cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -167,6 +171,7 @@ cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNF cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.50.0 h1:RscMV6LbnAmhAzD893Lv9nXXy2WCaJmbxYPWDLbGqNQ= cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= @@ -252,6 +257,8 @@ cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGB cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= cloud.google.com/go/contactcenterinsights v1.6.0 h1:jXIpfcH/VYSE1SYcPzO0n1VVb+sAamiLOgCw45JbOQk= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= cloud.google.com/go/contactcenterinsights v1.10.0 h1:YR2aPedGVQPpFBZXJnPkqRj8M//8veIZZH5ZvICoXnI= @@ -345,6 +352,7 @@ cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRj cloud.google.com/go/dataqna v0.8.5 h1:9ybXs3nr9BzxSGC04SsvtuXaHY0qmJSLIpIAbZo9GqQ= cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/datastore v1.11.0 h1:iF6I/HaLs3Ado8uRKMvZRvF/ZLkWaWE9i8AiHzbC774= cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= @@ -724,6 +732,7 @@ cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd4 cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.30.0 h1:vCge8m7aUKBJYOgrZp7EsNDf6QMd2CAlXZqWTn3yq6s= cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= @@ -1094,29 +1103,21 @@ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= +github.com/bazelbuild/rules_go v0.49.0 h1:5vCbuvy8Q11g41lseGJDc5vxhDjJtfxr6nM/IC4VmqM= +github.com/bazelbuild/rules_go v0.49.0/go.mod h1:Dhcz716Kqg1RHNWos+N6MlXNkjNP2EwZQ0LukRKJfMs= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/blevesearch/bleve/v2 v2.4.2 h1:NooYP1mb3c0StkiY9/xviiq2LGSaE8BQBCc/pirMx0U= -github.com/blevesearch/bleve/v2 v2.4.2/go.mod h1:ATNKj7Yl2oJv/lGuF4kx39bST2dveX6w0th2FFYLkc8= -github.com/blevesearch/bleve_index_api v1.1.10 h1:PDLFhVjrjQWr6jCuU7TwlmByQVCSEURADHdCqVS9+g0= -github.com/blevesearch/bleve_index_api v1.1.10/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8= github.com/blevesearch/cld2 v0.0.0-20200327141045-8b5f551d37f5 h1:/4ikScMMYMqsRFWJjCyzd3CNWB0lxvqDkqa5nEv6NMc= -github.com/blevesearch/go-faiss v1.0.20 h1:AIkdTQFWuZ5LQmKQSebgMR4RynGNw8ZseJXaan5kvtI= -github.com/blevesearch/go-faiss v1.0.20/go.mod h1:jrxHrbl42X/RnDPI+wBoZU8joxxuRwedrxqswQ3xfU8= github.com/blevesearch/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:kDy+zgJFJJoJYBvdfBSiZYBbdsUL0XcjHYWezpQBGPA= github.com/blevesearch/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:9eJDeqxJ3E7WnLebQUlPD7ZjSce7AnDb9vjGmMCbD0A= github.com/blevesearch/goleveldb v1.0.1 h1:iAtV2Cu5s0GD1lwUiekkFHe2gTMCCNVj2foPclDLIFI= github.com/blevesearch/goleveldb v1.0.1/go.mod h1:WrU8ltZbIp0wAoig/MHbrPCXSOLpe79nz5lv5nqfYrQ= -github.com/blevesearch/scorch_segment_api/v2 v2.2.15 h1:prV17iU/o+A8FiZi9MXmqbagd8I0bCqM7OKUYPbnb5Y= -github.com/blevesearch/scorch_segment_api/v2 v2.2.15/go.mod h1:db0cmP03bPNadXrCDuVkKLV6ywFSiRgPFT1YVrestBc= github.com/blevesearch/snowball v0.6.1 h1:cDYjn/NCH+wwt2UdehaLpr2e4BwLIjN4V/TdLsL+B5A= github.com/blevesearch/snowball v0.6.1/go.mod h1:ZF0IBg5vgpeoUhnMza2v0A/z8m1cWPlwhke08LpNusg= github.com/blevesearch/stempel v0.2.0 h1:CYzVPaScODMvgE9o+kf6D4RJ/VRomyi9uHF+PtB+Afc= github.com/blevesearch/stempel v0.2.0/go.mod h1:wjeTHqQv+nQdbPuJ/YcvOjTInA2EIc6Ks1FoSUzSLvc= -github.com/blevesearch/zapx/v16 v16.1.5 h1:b0sMcarqNFxuXvjoXsF8WtwVahnxyhEvBSRJi/AUHjU= -github.com/blevesearch/zapx/v16 v16.1.5/go.mod h1:J4mSF39w1QELc11EWRSBFkPeZuO7r/NPKkHzDCoiaI8= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= @@ -1167,6 +1168,10 @@ github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipa github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0TxYVST9h4Ie192jJWpHvthBBgg= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= @@ -1236,6 +1241,8 @@ github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1 github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= +github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.9.1 h1:PS7VIOgmSVhWUEeZwTe7z7zouA22Cr590PzXKbZHOVY= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= @@ -1243,6 +1250,8 @@ github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBF github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= @@ -1366,6 +1375,8 @@ github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1441,6 +1452,7 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= @@ -1452,8 +1464,7 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= @@ -1658,6 +1669,8 @@ github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NB github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.10.0 h1:5CiyngihEO4HXsz3vVsJn7f8xAlWwRr3aY6Ih280ZKA= github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= @@ -1671,6 +1684,8 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o= github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE= +github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= @@ -1751,13 +1766,11 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042 github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= -github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw= -github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= +github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= @@ -1781,6 +1794,8 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= @@ -1791,6 +1806,7 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1806,6 +1822,7 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1841,8 +1858,6 @@ github.com/sagikazarmark/crypt v0.17.0 h1:ZA/7pXyjkHoK4bW4mIdnCLvL8hd+Nrbiw7Dqk7 github.com/sagikazarmark/crypt v0.17.0/go.mod h1:SMtHTvdmsZMuY/bpZoqokSoChIrcJ/epOxZN58PbZDg= github.com/sagikazarmark/crypt v0.19.0 h1:WMyLTjHBo64UvNcWqpzY3pbZTYgnemZU8FBZigKc42E= github.com/sagikazarmark/crypt v0.19.0/go.mod h1:c6vimRziqqERhtSe0MhIvzE1w54FrCHtrXb5NH/ja78= -github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= -github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 h1:rmMl4fXJhKMNWl+K+r/fq4FbbKI+Ia2m9hYBLm2h4G4= @@ -1917,6 +1932,8 @@ github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0 github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/urfave/negroni/v3 v3.1.1 h1:6MS4nG9Jk/UuCACaUlNXCbiKa0ywF9LXz5dGu09v8hw= +github.com/urfave/negroni/v3 v3.1.1/go.mod h1:jWvnX03kcSjDBl/ShB0iHvx5uOs7mAzZXW+JvJ5XYAs= github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= @@ -1941,6 +1958,7 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= @@ -2024,6 +2042,7 @@ go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZV go.opentelemetry.io/otel v1.23.0/go.mod h1:YCycw9ZeKhcJFrb34iVSkyT0iczq/zYDtZYFufObyB0= go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA= go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.23.1/go.mod h1:D7ynngPWlGJrqyGSDOdscuv7uqttfCE3jcBvffDv9y4= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1/go.mod h1:SEVfdK4IoBnbT2FXNM/k8yC08MrfbhWk3U4ljM8B3HE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.23.1/go.mod h1:OClrnXUjBqQbInvjJFjYSnMxBSCXBF8r3b34WqjiIrQ= @@ -2033,6 +2052,7 @@ go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xC go.opentelemetry.io/otel/metric v1.23.0/go.mod h1:MqUW2X2a6Q8RN96E2/nqNoT+z9BSms20Jb7Bbp+HiTo= go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI= go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= go.opentelemetry.io/otel/sdk v1.23.1/go.mod h1:LzdEVR5am1uKOOwfBWFef2DCi1nu3SA8XQxx2IerWFk= @@ -2042,6 +2062,7 @@ go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40 go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5UkggkflQwDScNUsk= go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI= go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -2069,8 +2090,9 @@ golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOM golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2087,8 +2109,6 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= @@ -2144,6 +2164,8 @@ golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2196,8 +2218,8 @@ golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2220,6 +2242,10 @@ golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2236,8 +2262,6 @@ golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2307,8 +2331,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808 h1:+Kc94D8UVEVxJnLXp/+FMfqQARZtWHfVrcRtcG8aT3g= golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= @@ -2335,6 +2359,8 @@ golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -2350,8 +2376,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2415,8 +2441,7 @@ golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= -golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= -golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= @@ -2552,6 +2577,10 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240304161311-37d4d3c04a78/go. google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= +google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc h1:g3hIDl0jRNd9PPTs2uBzYuaD5mQuwOkZY0vSc0LR32o= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f/go.mod h1:iIgEblxoG4klcXsG0d9cpoxJ4xndv6+1FkDROCHhPRI= @@ -2590,6 +2619,10 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -2622,6 +2655,7 @@ google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFL google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/integration/ts/package.json b/integration/ts/package.json index d4577721df..584fc2f539 100644 --- a/integration/ts/package.json +++ b/integration/ts/package.json @@ -13,8 +13,8 @@ ], "scripts": { "watch": "tsc --noEmit && vite build --watch", - "lint": "eslint \"src/**/*.ts*\"", - "fix": "eslint \"src/**/*.ts*\" --fix" + "lint": "eslint --cache", + "fix": "eslint --cache --fix" }, "dependencies": { "@synnaxlabs/client": "workspace:*", @@ -25,12 +25,12 @@ "@synnaxlabs/tsconfig": "workspace:*", "@synnaxlabs/vite-plugin": "workspace:*", "@types/node": "^22.7.5", - "@vitest/coverage-v8": "^2.1.2", - "eslint": "^9.12.0", + "@vitest/coverage-v8": "^2.1.4", + "eslint": "^9.14.0", "eslint-config-synnaxlabs": "workspace:*", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vitest": "^2.1.2" + "vite": "^5.4.10", + "vitest": "^2.1.4" }, "main": "dist/client.cjs", "module": "dist/client.js", diff --git a/integration/ts/src/delete.ts b/integration/ts/src/delete.ts index 215074b747..e4e5b40922 100644 --- a/integration/ts/src/delete.ts +++ b/integration/ts/src/delete.ts @@ -1,74 +1,69 @@ import { Synnax } from "@synnaxlabs/client"; -import { TimeRange, TimeSpan, TimeStamp } from "@synnaxlabs/x"; -import * as fs from 'fs'; +import { TimeRange, type TimeSpan, TimeStamp } from "@synnaxlabs/x"; +import * as fs from "fs"; import { argv } from "process"; class TestConfig { - identifier: string = ""; - expectedError: string = ""; - channels: string[] = []; - timeRange: TimeRange = TimeRange.ZERO; + identifier: string = ""; + expectedError: string = ""; + channels: string[] = []; + timeRange: TimeRange = TimeRange.ZERO; } const client = new Synnax({ - host: "localhost", - port: 9090, - username: "synnax", - password: "seldon", - secure: false, + host: "localhost", + port: 9090, + username: "synnax", + password: "seldon", + secure: false, }); class DeleteTest { - tc: TestConfig; - constructor(argv: string[]) { - let argvCounter = 2 - const identifier = argv[argvCounter++]; - const timeRangeStart = BigInt(argv[argvCounter++]); - const timeRangeEnd = BigInt(argv[argvCounter++]); - const expectedError = argv[argvCounter++]; - const number_of_channels = parseInt(argv[argvCounter++]); - const channels = []; - for (let i = 0; i < number_of_channels; i++) { - channels.push(argv[argvCounter++]); - } + tc: TestConfig; + constructor(argv: string[]) { + let argvCounter = 2; + const identifier = argv[argvCounter++]; + const timeRangeStart = BigInt(argv[argvCounter++]); + const timeRangeEnd = BigInt(argv[argvCounter++]); + const expectedError = argv[argvCounter++]; + const number_of_channels = parseInt(argv[argvCounter++]); + const channels = []; + for (let i = 0; i < number_of_channels; i++) channels.push(argv[argvCounter++]); - this.tc = { - identifier, - expectedError: expectedError, - timeRange: new TimeRange(timeRangeStart, timeRangeEnd), - channels, - }; - } + this.tc = { + identifier, + expectedError, + timeRange: new TimeRange(timeRangeStart, timeRangeEnd), + channels, + }; + } - async testWithTiming(): Promise { - const start = TimeStamp.now(); - let errorAssertion = false; - let actualError = ""; - let caught = false; - await this.test().catch((e: unknown) => { - console.log("CAUGHT: ", e) - if (e instanceof Error) { - caught = true; - actualError = e.message; - if (this.tc.expectedError != "no_error" && e.message.includes(this.tc.expectedError)) { - errorAssertion = true; - } else { - throw e; - } - } else { - throw e; - } - }); - if (!caught) { - if (this.tc.expectedError == "no_error") { - errorAssertion = true; - } - actualError = "no_error"; - } - const end = TimeStamp.now(); + async testWithTiming(): Promise { + const start = TimeStamp.now(); + let errorAssertion = false; + let actualError = ""; + let caught = false; + await this.test().catch((e: unknown) => { + console.log("CAUGHT: ", e); + if (e instanceof Error) { + caught = true; + actualError = e.message; + if ( + this.tc.expectedError != "no_error" && + e.message.includes(this.tc.expectedError) + ) + errorAssertion = true; + else throw e; + } else throw e; + }); + if (!caught) { + if (this.tc.expectedError == "no_error") errorAssertion = true; + actualError = "no_error"; + } + const end = TimeStamp.now(); - const time: TimeSpan = start.span(end); - const s = ` + const time: TimeSpan = start.span(end); + const s = ` -- TypeScript Delete (${this.tc.identifier}) -- Time taken: ${time.isZero ? 0 : time} Configuration: @@ -77,21 +72,20 @@ Configuration: Expected error: ${this.tc.expectedError}; Actual error: ${actualError}: ${errorAssertion ? "PASS!!" : "FAIL!!!!"} `; - fs.appendFileSync("../../timing.log", s); - } + fs.appendFileSync("../../timing.log", s); + } - async test(): Promise { - client.delete(this.tc.channels, this.tc.timeRange); - } + async test(): Promise { + client.delete(this.tc.channels, this.tc.timeRange); + } } - async function main() { - try { - await new DeleteTest(argv).testWithTiming() - } finally { - client.close() - } + try { + await new DeleteTest(argv).testWithTiming(); + } finally { + client.close(); + } } -await main() +await main(); diff --git a/integration/ts/src/read.ts b/integration/ts/src/read.ts index b81b257a8f..3e25b6ece7 100644 --- a/integration/ts/src/read.ts +++ b/integration/ts/src/read.ts @@ -1,113 +1,121 @@ import { Synnax } from "@synnaxlabs/client"; -import { Iterator } from "@synnaxlabs/client/dist/framer/iterator"; -import { CrudeTimeStamp, TimeRange, TimeSpan, TimeStamp } from "@synnaxlabs/x" -import * as fs from 'fs' -import { argv } from 'process'; +import { type Iterator } from "@synnaxlabs/client/dist/framer/iterator"; +import { type CrudeTimeStamp, TimeRange, TimeSpan, TimeStamp } from "@synnaxlabs/x"; +import * as fs from "fs"; +import { argv } from "process"; -const FILE_NAME = "../../timing.log" +const FILE_NAME = "../../timing.log"; function approxEqual(a: number, b: number, tol = 0.01): boolean { - return Math.abs(b - a) < tol * b; + return Math.abs(b - a) < tol * b; } - class TestConfig { - identifier: string = ""; - numIterators: number = 0; - chunkSize: number = 1e5; - bounds: TimeRange = TimeRange.ZERO; - samplesExpected: number = 0; - expectedError: string; - channels: string[][] = []; - - constructor( - identifier: string, - numIterators: number, - chunkSize: number, - boundStart: CrudeTimeStamp, - boundEnd: CrudeTimeStamp, - samplesExpected: number, - expectedError: string, - channels: string[][], - ) { - this.identifier = identifier; - this.numIterators = numIterators; - this.chunkSize = chunkSize; - this.bounds = new TimeRange(boundStart, boundEnd); - this.samplesExpected = samplesExpected; - this.expectedError = expectedError; - this.channels = channels; - } - - numChannels(): number { return this.channels.reduce((a, l) => a + l.length, 0) } + identifier: string = ""; + numIterators: number = 0; + chunkSize: number = 1e5; + bounds: TimeRange = TimeRange.ZERO; + samplesExpected: number = 0; + expectedError: string; + channels: string[][] = []; + + constructor( + identifier: string, + numIterators: number, + chunkSize: number, + boundStart: CrudeTimeStamp, + boundEnd: CrudeTimeStamp, + samplesExpected: number, + expectedError: string, + channels: string[][], + ) { + this.identifier = identifier; + this.numIterators = numIterators; + this.chunkSize = chunkSize; + this.bounds = new TimeRange(boundStart, boundEnd); + this.samplesExpected = samplesExpected; + this.expectedError = expectedError; + this.channels = channels; + } + + numChannels(): number { + return this.channels.reduce((a, l) => a + l.length, 0); + } } const client = new Synnax({ - host: "localhost", - port: 9090, - username: "synnax", - password: "seldon", - secure: false, + host: "localhost", + port: 9090, + username: "synnax", + password: "seldon", + secure: false, }); - class ReadTest { - tc: TestConfig; - constructor(argv: string[]) { - let argvCounter = 2 - const identifier = argv[argvCounter++]; - const numIterators = parseInt(argv[argvCounter++]); - const chunkSize = parseInt(argv[argvCounter++]); - const boundStart = BigInt(argv[argvCounter++]); - const boundEnd = BigInt(argv[argvCounter++]); - const samplesExpected = parseInt(argv[argvCounter++]); - const expectedError = argv[argvCounter++]; - const number_of_channel_groups = parseInt(argv[argvCounter++]); - const channels = []; - for (let i = 0; i < number_of_channel_groups; i++) { - const number_of_channels_in_group = parseInt(argv[argvCounter++]); - const group = []; - for (let j = 0; j < number_of_channels_in_group; j++) { - group.push(argv[argvCounter++]); - } - channels.push(group); - } - this.tc = new TestConfig(identifier, numIterators, chunkSize, boundStart, boundEnd, samplesExpected, expectedError, channels); + tc: TestConfig; + constructor(argv: string[]) { + let argvCounter = 2; + const identifier = argv[argvCounter++]; + const numIterators = parseInt(argv[argvCounter++]); + const chunkSize = parseInt(argv[argvCounter++]); + const boundStart = BigInt(argv[argvCounter++]); + const boundEnd = BigInt(argv[argvCounter++]); + const samplesExpected = parseInt(argv[argvCounter++]); + const expectedError = argv[argvCounter++]; + const number_of_channel_groups = parseInt(argv[argvCounter++]); + const channels = []; + for (let i = 0; i < number_of_channel_groups; i++) { + const number_of_channels_in_group = parseInt(argv[argvCounter++]); + const group = []; + for (let j = 0; j < number_of_channels_in_group; j++) + group.push(argv[argvCounter++]); + channels.push(group); } - - async testWithTiming(): Promise { - const start = TimeStamp.now(); - let samples = 0; - let errorAssertion = false; - let actualError = ""; - let caught = false; - await this.test().then(result => samples = result).catch((e: unknown) => { - if (e instanceof Error) { - caught = true; - actualError = e.message; - if (this.tc.expectedError != "no_error" && e.message.includes(this.tc.expectedError)) { - errorAssertion = true; - } else { - throw e; - } - } else { - throw e; - } - }); - - if (!caught) { - if (this.tc.expectedError == "no_error") { - errorAssertion = true; - } - actualError = "no_error"; - } - const end = TimeStamp.now(); - - const time: TimeSpan = start.span(end); - const samplesPerSecond = samples / (Number(time) / Number(TimeSpan.SECOND)); - const assertionPassed = this.tc.samplesExpected == 0 || approxEqual(samples, this.tc.samplesExpected); - const assertionResult = `Expected samples: ${formatNumber(this.tc.samplesExpected)}; Actual samples: ${formatNumber(samples)}`; - const s = ` + this.tc = new TestConfig( + identifier, + numIterators, + chunkSize, + boundStart, + boundEnd, + samplesExpected, + expectedError, + channels, + ); + } + + async testWithTiming(): Promise { + const start = TimeStamp.now(); + let samples = 0; + let errorAssertion = false; + let actualError = ""; + let caught = false; + await this.test() + .then((result) => (samples = result)) + .catch((e: unknown) => { + if (e instanceof Error) { + caught = true; + actualError = e.message; + if ( + this.tc.expectedError != "no_error" && + e.message.includes(this.tc.expectedError) + ) + errorAssertion = true; + else throw e; + } else throw e; + }); + + if (!caught) { + if (this.tc.expectedError == "no_error") errorAssertion = true; + actualError = "no_error"; + } + const end = TimeStamp.now(); + + const time: TimeSpan = start.span(end); + const samplesPerSecond = samples / (Number(time) / Number(TimeSpan.SECOND)); + const assertionPassed = + this.tc.samplesExpected == 0 || approxEqual(samples, this.tc.samplesExpected); + const assertionResult = `Expected samples: ${formatNumber(this.tc.samplesExpected)}; Actual samples: ${formatNumber(samples)}`; + const s = ` -- TypeScript Read (${this.tc.identifier}) -- Samples read: ${formatNumber(samples)} Time taken: ${time} @@ -120,48 +128,45 @@ ${assertionResult}\n${assertionPassed ? "PASS!!" : "FAIL!!!!"} Expected error: ${this.tc.expectedError}; Actual error: ${actualError}\n${errorAssertion ? "PASS!!" : "FAIL!!!!"} `; - fs.appendFileSync(FILE_NAME, s); - }; - - async test(): Promise { - const iterators: Iterator[] = new Array(this.tc.numIterators).fill(null); - let samples_read = 0; - - for (let i = 0; i < this.tc.numIterators; i++) { - iterators[i] = await client.openIterator( - this.tc.bounds, - this.tc.channels[i], - { chunkSize: this.tc.chunkSize }, - ); - } - - try { - for (const i of iterators) { - await i.seekFirst(); - for await (const frame of i) { - samples_read += frame.series.reduce((a, s) => a + s.length, 0); - } - } - } finally { - for (const i of iterators) { - await i.close(); - } - } - - return samples_read; + fs.appendFileSync(FILE_NAME, s); + } + + async test(): Promise { + const iterators: Iterator[] = new Array(this.tc.numIterators).fill(null); + let samples_read = 0; + + for (let i = 0; i < this.tc.numIterators; i++) + iterators[i] = await client.openIterator(this.tc.bounds, this.tc.channels[i], { + chunkSize: this.tc.chunkSize, + }); + + try { + for (const i of iterators) { + await i.seekFirst(); + for await (const frame of i) + samples_read += frame.series.reduce((a, s) => a + s.length, 0); + } + } finally { + for (const i of iterators) await i.close(); } + + return samples_read; + } } function formatNumber(x: number): string { - return x.toFixed(2).toString().replace(/\B(? { } const numDataChannelsPerIndex = Math.floor(tc.numData / tc.numIndex); - for (let ind = 0; ind < tc.numIndex; ind++) { + for (let ind = 0; ind < tc.numIndex; ind++) for (let k = 0; k < numDataChannelsPerIndex; k++) { const ch = await client.channels.create( { @@ -47,7 +47,6 @@ async function createChannels(tc: SetUpConfig): Promise { ); channels.push(ch.key); } - } } async function main() { diff --git a/integration/ts/src/stream.ts b/integration/ts/src/stream.ts index e6738de3ef..e937ffe8de 100644 --- a/integration/ts/src/stream.ts +++ b/integration/ts/src/stream.ts @@ -44,9 +44,7 @@ class StreamTest { const numberOfChannels = parseInt(argv[argvCounter++]); const channels: string[] = []; - for (let i = 0; i < numberOfChannels; i++) { - channels.push(argv[argvCounter++]); - } + for (let i = 0; i < numberOfChannels; i++) channels.push(argv[argvCounter++]); this.tc = new TestConfig( identifier, @@ -74,19 +72,13 @@ class StreamTest { if ( this.tc.expectedError != "no_error" && e.message.includes(this.tc.expectedError) - ) { + ) errorAssertion = true; - } else { - throw e; - } - } else { - throw e; - } + else throw e; + } else throw e; }); if (!caught) { - if (this.tc.expectedError == "no_error") { - errorAssertion = true; - } + if (this.tc.expectedError == "no_error") errorAssertion = true; actualError = "no_error"; } @@ -120,9 +112,7 @@ Expected error: ${this.tc.expectedError}; Actual error: ${actualError}\n${errorA try { for await (const frame of streamer) { samplesStreamed += frame.series.reduce((total, s) => total + s.length, 0); - if (samplesStreamed >= 0.95 * this.tc.samplesExpected) { - return samplesStreamed; - } + if (samplesStreamed >= 0.95 * this.tc.samplesExpected) return samplesStreamed; } } finally { streamer.close(); diff --git a/integration/ts/src/write.ts b/integration/ts/src/write.ts index 06af988fc5..9809f6d916 100644 --- a/integration/ts/src/write.ts +++ b/integration/ts/src/write.ts @@ -29,9 +29,8 @@ class TestConfig { expectedError: string; channels: IndexWriterGroup[] = []; - numChannels: () => number = () => { - return this.channels.reduce((a, l: IndexWriterGroup) => a + l.together().length, 0); - }; + numChannels: () => number = () => + this.channels.reduce((a, l: IndexWriterGroup) => a + l.together().length, 0); constructor( identifier: string, @@ -126,20 +125,14 @@ class WriteTest { if ( this.tc.expectedError != "no_error" && e.message.includes(this.tc.expectedError) - ) { + ) errorAssertion = true; - } else { - throw e; - } - } else { - throw e; - } + else throw e; + } else throw e; }); if (!caught) { - if (this.tc.expectedError == "no_error") { - errorAssertion = true; - } + if (this.tc.expectedError == "no_error") errorAssertion = true; actualError = "no_error"; } @@ -172,7 +165,7 @@ Expected error: ${this.tc.expectedError}; Actual error: ${actualError}\n${errorA const writers = new Array(this.tc.numWriters).fill(null); const timeSpanPerDomain = Number(this.tc.timeRange.span) / this.tc.domains; - for (let i = 0; i < this.tc.numWriters; i++) { + for (let i = 0; i < this.tc.numWriters; i++) writers[i] = await client.openWriter({ start: this.tc.timeRange.start, channels: this.tc.channels[i].together(), @@ -180,7 +173,6 @@ Expected error: ${this.tc.expectedError}; Actual error: ${actualError}\n${errorA enableAutoCommit: this.tc.autoCommit, autoIndexPersistInterval: this.tc.indexPersistInterval, }); - } try { let tsHwm = this.tc.timeRange.start; @@ -207,9 +199,7 @@ Expected error: ${this.tc.expectedError}; Actual error: ${actualError}\n${errorA await writer.write(dataDict); - if (!this.tc.autoCommit) { - await writer.commit(); - } + if (!this.tc.autoCommit) await writer.commit(); if (!this.tc.allInOneDomain) { await writer.close(); @@ -225,9 +215,7 @@ Expected error: ${this.tc.expectedError}; Actual error: ${actualError}\n${errorA } } } finally { - for (const writer of writers) { - await writer.close(); - } + for (const writer of writers) await writer.close(); } } } diff --git a/package.json b/package.json index 9aa24a9d45..4e208d7f4f 100644 --- a/package.json +++ b/package.json @@ -1,37 +1,37 @@ { - "version": "0.33.1", + "version": "0.34.0", "private": true, "scripts": { - "build": "npx turbo build --cache-dir=./.turbo-cache", - "build:pluto": "npx turbo build --filter @synnaxlabs/pluto --cache-dir=.turbo-cache", - "build:console": "npx turbo build --filter @synnaxlabs/console --cache-dir=.turbo-cache", - "build:freighter": "npx turbo build --filter @synnaxlabs/freighter --cache-dir=.turbo-cache", + "build": "npx turbo build --cache-dir=.turbo-cache", + "build:alamos": "npx turbo build --filter @synnaxlabs/alamos --cache-dir=.turbo-cache", "build:client": "npx turbo build --filter @synnaxlabs/client --cache-dir=.turbo-cache", + "build:console": "npx turbo build --filter @synnaxlabs/console --cache-dir=.turbo-cache", + "build:docs": "npx turbo build --filter @synnaxlabs/docs --cache-dir=.turbo-cache", "build:drift": "npx turbo build --filter @synnaxlabs/drift --cache-dir=.turbo-cache", - "build:alamos": "npx turbo build --filter @synnaxlabs/alamos --cache-dir=.turbo-cache", + "build:freighter": "npx turbo build --filter @synnaxlabs/freighter --cache-dir=.turbo-cache", + "build:media": "npx turbo build --filter @synnaxlabs/media --cache-dir=.turbo-cache", + "build:pluto": "npx turbo build --filter @synnaxlabs/pluto --cache-dir=.turbo-cache", "build:vite-plugin": "npx turbo build --filter @synnaxlabs/vite-plugin --cache-dir=.turbo-cache", "build:x": "npx turbo build --filter @synnaxlabs/x --cache-dir=.turbo-cache", - "build:docs": "npx turbo build --filter @synnaxlabs/docs --cache-dir=.turbo-cache", - "build:media": "npx turbo build --filter @synnaxlabs/media --cache-dir=.turbo-cache", "watch": "npx turbo watch --parallel", - "watch:pluto": "npx turbo watch --filter @synnaxlabs/pluto", - "watch:freighter": "npx turbo watch --filter @synnaxlabs/freighter", + "watch:alamos": "npx turbo watch --filter @synnaxlabs/alamos", "watch:client": "npx turbo watch --filter @synnaxlabs/client", "watch:drift": "npx turbo watch --filter @synnaxlabs/drift", - "watch:media": "npx turbo watch --filter media", - "watch:alamos": "npx turbo watch --filter @synnaxlabs/alamos", - "dev:pluto": "npx turbo dev --filter @synnaxlabs/pluto", + "watch:freighter": "npx turbo watch --filter @synnaxlabs/freighter", + "watch:media": "npx turbo watch --filter @synnaxlabs/media", + "watch:pluto": "npx turbo watch --filter @synnaxlabs/pluto", "dev:console": "npx turbo dev --filter @synnaxlabs/console", - "dev:console-vite": "npx turbo dev-vite --filter console", + "dev:console-vite": "npx turbo dev-vite --filter @synnaxlabs/console", "dev:docs": "npx turbo dev --filter @synnaxlabs/docs", + "dev:pluto": "npx turbo dev --filter @synnaxlabs/pluto", "test": "npx turbo test", + "test:alamos": "npx turbo test --filter @synnaxlabs/alamos", + "test:client": "npx turbo test --filter @synnaxlabs/client", "test:console": "npx turbo test --filter @synnaxlabs/console", - "test:pluto": "npx turbo test --filter @synnaxlabs/pluto", "test:drift": "npx turbo test --filter @synnaxlabs/drift", "test:freighter": "npx turbo test --filter @synnaxlabs/freighter", - "test:client": "npx turbo test --filter @synnaxlabs/client", + "test:pluto": "npx turbo test --filter @synnaxlabs/pluto", "test:x": "npx turbo test --filter @synnaxlabs/x", - "test:alamos": "npx turbo test --filter @synnaxlabs/alamos", "cov": "npx turbo cov", "cov:client": "npx turbo cov --filter @synnaxlabs/client", "cov:pluto": "npx turbo cov --filter @synnaxlabs/pluto", @@ -39,25 +39,33 @@ "cov:freighter": "npx turbo cov --filter @synnaxlabs/freighter", "cov:x": "npx turbo cov --filter @synnaxlabs/x", "cov:alamos": "npx turbo cov --filter @synnaxlabs/alamos", - "lint": "npx turbo lint", - "lint:pluto": "npx turbo lint --filter @synnaxlabs/pluto", - "lint:console": "npx turbo lint --filter console", - "lint:freighter": "npx turbo lint --filter @synnaxlabs/freighter", + "lint": "npx turbo lint --continue", + "lint:alamos": "npx turbo lint --filter @synnaxlabs/alamos", "lint:client": "npx turbo lint --filter @synnaxlabs/client", + "lint:console": "npx turbo lint --filter @synnaxlabs/console", + "lint:docs": "npx turbo lint --filter @synnaxlabs/docs", "lint:drift": "npx turbo lint --filter @synnaxlabs/drift", - "lint:alamos": "npx turbo lint --filter @synnaxlabs/alamos", - "fix": "npx turbo fix", - "fix:pluto": "npx turbo fix --filter @synnaxlabs/pluto", - "fix:console": "npx turbo fix --filter console", - "fix:freighter": "npx turbo fix --filter @synnaxlabs/freighter", + "lint:freighter": "npx turbo lint --filter @synnaxlabs/freighter", + "lint:integration": "npx turbo lint --filter @synnaxlabs/integration", + "lint:media": "npx turbo lint --filter @synnaxlabs/media", + "lint:pluto": "npx turbo lint --filter @synnaxlabs/pluto", + "lint:x": "npx turbo lint --filter @synnaxlabs/x", + "fix": "npx turbo fix --continue", + "fix:alamos": "npx turbo fix --filter @synnaxlabs/alamos", "fix:client": "npx turbo fix --filter @synnaxlabs/client", + "fix:console": "npx turbo fix --filter @synnaxlabs/console", + "fix:docs": "npx turbo fix --filter @synnaxlabs/docs", "fix:drift": "npx turbo fix --filter @synnaxlabs/drift", - "fix:alamos": "npx turbo fix --filter @synnaxlabs/alamos", + "fix:freighter": "npx turbo fix --filter @synnaxlabs/freighter", + "fix:integration": "npx turbo fix --filter @synnaxlabs/integration", + "fix:media": "npx turbo fix --filter @synnaxlabs/media", + "fix:pluto": "npx turbo fix --filter @synnaxlabs/pluto", + "fix:x": "npx turbo fix --filter @synnaxlabs/x", "genApi": "npx turbo genApi", "genApi:client": "npx turbo genApi --filter @synnaxlabs/client", "checkApi": "npx turbo checkApi", "checkApi:client": "npx turbo checkApi --filter @synnaxlabs/client", - "devtools": "npx turbo devtools --filter console" + "devtools": "npx turbo devtools --filter @synnaxlabs/console" }, "devDependencies": { "@microsoft/api-extractor": "^7.47.9", @@ -71,22 +79,22 @@ "overrides": { "react": "^18.3.1", "react-dom": "^18.3.1", - "@reduxjs/toolkit": "^2.2.8", + "@reduxjs/toolkit": "^2.3.0", "react-redux": "^9.1.2", - "vite": "^5.4.8", - "vite-tsconfig-paths": "^5.0.1", - "vite-plugin-dts": "^4.2.3", - "@vitejs/plugin-react": "^4.3.2", - "vitest": "^2.1.2", - "@vitest/coverage-v8": "^2.1.2", + "vite": "^5.4.10", + "vite-tsconfig-paths": "^5.1.2", + "vite-plugin-dts": "^4.3.0", + "@vitejs/plugin-react": "^4.3.3", + "vitest": "^2.1.4", + "@vitest/coverage-v8": "^2.1.4", "typescript": "^5.6.3", "proxy-memoize": "2.0.3", - "@tanstack/react-virtual": "^3.10.8", + "@tanstack/react-virtual": "^3.10.9", "zod": "^3.23.8", "node-fetch": "^2.7.0", "prettier": "^3.3.3", - "@tauri-apps/api": "^2.0.2", - "eslint": "^9.12.0" + "@tauri-apps/api": "^2.1.0", + "eslint": "^9.14.0" } }, "packageManager": "pnpm@9.7.0", diff --git a/pluto/eslint.config.js b/pluto/eslint.config.js index da67e44641..38dad56c92 100644 --- a/pluto/eslint.config.js +++ b/pluto/eslint.config.js @@ -9,4 +9,4 @@ import synnaxConfig from "eslint-config-synnaxlabs"; -export default synnaxConfig; +export default [...synnaxConfig, { ignores: ["examples"] }]; diff --git a/pluto/examples/.eslintrc.cjs b/pluto/examples/.eslintrc.cjs deleted file mode 100644 index 6fd6f84a0e..0000000000 --- a/pluto/examples/.eslintrc.cjs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2024 Synnax Labs, Inc. -// -// Use of this software is governed by the Business Source License included in the file -// licenses/BSL.txt. -// -// As of the Change Date specified in that file, in accordance with the Business Source -// License, use of this software will be governed by the Apache License, Version 2.0, -// included in the file licenses/APL.txt. - -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:react-hooks/recommended", - ], - ignorePatterns: ["dist", ".eslintrc.cjs"], - parser: "@typescript-eslint/parser", - plugins: ["react-refresh"], - rules: { - "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], - }, -}; diff --git a/pluto/examples/package.json b/pluto/examples/package.json index 87ae2160cf..88e0332793 100644 --- a/pluto/examples/package.json +++ b/pluto/examples/package.json @@ -5,8 +5,6 @@ "type": "module", "scripts": { "dev": "vite", - "lint": "eslint \"src/**/*.ts*\"", - "fix": "eslint \"src/**/*.ts*\" --fix", "preview": "vite preview" }, "dependencies": { @@ -19,11 +17,11 @@ "@types/react-dom": "^18.3.1", "@typescript-eslint/eslint-plugin": "^8.8.1", "@typescript-eslint/parser": "^8.8.1", - "@vitejs/plugin-react": "^4.3.2", - "eslint": "^9.12.0", + "@vitejs/plugin-react": "^4.3.3", + "eslint": "^9.14.0", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.12", "typescript": "^5.6.3", - "vite": "^5.4.8" + "vite": "^5.4.10" } } diff --git a/pluto/package.json b/pluto/package.json index 7af068c2cb..9a885a402e 100644 --- a/pluto/package.json +++ b/pluto/package.json @@ -1,14 +1,14 @@ { "name": "@synnaxlabs/pluto", - "version": "0.33.2", + "version": "0.34.0", "type": "module", "scripts": { "build": "tsc --noEmit && vite build", "watch": "vite build --watch", "test": "vitest", "cov": "vitest --coverage", - "lint": "eslint \"src/**/*.ts*\"", - "fix": "eslint \"src/**/*.ts*\" --fix", + "lint": "eslint --cache", + "fix": "eslint --cache --fix", "preview": "vite preview" }, "dependencies": { @@ -18,17 +18,16 @@ "@synnaxlabs/client": "workspace:*", "@synnaxlabs/media": "workspace:*", "@synnaxlabs/x": "workspace:*", - "@tanstack/react-virtual": "^3.10.8", + "@tanstack/react-virtual": "^3.10.9", + "@xyflow/react": "^12.3.4", "async-mutex": "^0.5.0", "clsx": "^2.1.1", "d3-scale": "^4.0.2", "fuse.js": "^7.0.0", - "mathjs": "^13.2.0", - "proxy-memoize": "2.0.3", + "mathjs": "^13.2.1", + "proxy-memoize": "2.0.6", "react": "^18.3.1", "react-color": "^2.19.3", - "react-query": "^3.39.3", - "reactflow": "^11.11.4", "zod": "^3.23.8" }, "devDependencies": { @@ -43,15 +42,16 @@ "@types/react-color": "^3.0.12", "@types/react-dom": "^18.3.1", "@types/webgl2": "^0.0.11", - "@vitejs/plugin-react": "^4.3.2", - "@vitest/coverage-v8": "^2.1.2", + "@vitejs/plugin-react": "^4.3.3", + "@vitest/coverage-v8": "^2.1.4", + "eslint": "^9.12.0", "eslint-config-synnaxlabs": "workspace:*", "jsdom": "^25.0.1", "react-dom": "^18.3.1", "stylelint-config-synnaxlabs": "workspace:*", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vitest": "^2.1.2" + "vite": "^5.4.10", + "vitest": "^2.1.4" }, "files": [ "dist" diff --git a/pluto/src/aether/aether/aether.ts b/pluto/src/aether/aether/aether.ts index 09d9cb4588..ce8d404227 100644 --- a/pluto/src/aether/aether/aether.ts +++ b/pluto/src/aether/aether/aether.ts @@ -235,7 +235,7 @@ export class Leaf implements Compone private get _schema(): S { if (this.schema == null) throw new ValidationError( - `[AetherLeaf] - expected subclass to define component schema, but none was found. + `[AetherLeaf] - expected subclass to define component schema, but none was found. Make sure to defne a property 'schema' on the class.`, ); return this.schema; @@ -290,18 +290,14 @@ export class Leaf implements Compone if (variant === "state") { this.validatePath(path); const state_ = prettyParse(this._schema, state, `${this.type}:${this.key}`); - if (this._state != null) { + if (this._state != null) this.instrumentation.L.debug("updating state", () => ({ diff: deep.difference(this.state, state_), })); - } else { - this.instrumentation.L.debug("setting initial state", { state }); - } + else this.instrumentation.L.debug("setting initial state", { state }); this._prevState = this._state ?? state_; this._state = state_; - } else { - this.instrumentation.L.debug("updating context"); - } + } else this.instrumentation.L.debug("updating context"); await this.afterUpdate(); } @@ -436,11 +432,10 @@ export class Composite< async internalDelete(path: string[]): Promise { const [key, subPath] = this.getRequiredKey(path); if (subPath.length === 0) { - if (key !== this.key) { + if (key !== this.key) throw new Error( `[Composite.delete] - ${this.type}:${this.key} received a key ${key} but expected ${this.key}`, ); - } const children = this.children; this._children = new Map(); for (const c of children) await c.internalDelete([c.key]); @@ -459,8 +454,9 @@ export class Composite< const [key, ...subPath] = path; if (key == null) throw new Error( - `Composite ${this.type}:${this.key} received an empty path` + - (type != null ? ` for ${type}` : ""), + `Composite ${this.type}:${this.key} received an empty path${ + type != null ? ` for ${type}` : "" + }`, ); return [key, subPath]; } diff --git a/pluto/src/aether/main.tsx b/pluto/src/aether/main.tsx index b65b9d17e0..bd37242ee7 100644 --- a/pluto/src/aether/main.tsx +++ b/pluto/src/aether/main.tsx @@ -186,12 +186,13 @@ const useLifecycle = ({ }, [type, path, onReceive, setState]); // Destroy the component on unmount. - useLayoutEffect(() => { - return () => { + useLayoutEffect( + () => () => { comms.current?.delete(); comms.current = null; - }; - }, []); + }, + [], + ); return useMemo(() => ({ setState, path }), [setState, key, path]); }; diff --git a/pluto/src/align/Pack.tsx b/pluto/src/align/Pack.tsx index 15e7d2798c..68accb2755 100644 --- a/pluto/src/align/Pack.tsx +++ b/pluto/src/align/Pack.tsx @@ -13,7 +13,7 @@ import { type ForwardedRef, forwardRef, type ReactElement } from "react"; import { Space, type SpaceElementType, type SpaceProps } from "@/align/Space"; import { CSS } from "@/css"; -import { text } from "@/text/core"; +import { type text } from "@/text/core"; /** Props for the {@link Pack} component. */ export type PackProps = Omit< diff --git a/pluto/src/align/Space.tsx b/pluto/src/align/Space.tsx index 149e533b22..17fcbef282 100644 --- a/pluto/src/align/Space.tsx +++ b/pluto/src/align/Space.tsx @@ -19,7 +19,7 @@ import { import { CSS } from "@/css"; import { Generic } from "@/generic"; -import { Theming } from "@/theming"; +import { type Theming } from "@/theming"; import { type ComponentSize } from "@/util/component"; /** All possible alignments for the cross axis of a space */ @@ -177,7 +177,7 @@ const flexDirection = ( reverse: boolean, ): FlexDirection => { const base = direction === "x" ? "row" : "column"; - return reverse ? ((base + "-reverse") as FlexDirection) : base; + return reverse ? (`${base}-reverse` as FlexDirection) : base; }; const justifications: Record = { diff --git a/pluto/src/breadcrumb/Breadcrumb.tsx b/pluto/src/breadcrumb/Breadcrumb.tsx index 7a194d50c1..4468b50dc6 100644 --- a/pluto/src/breadcrumb/Breadcrumb.tsx +++ b/pluto/src/breadcrumb/Breadcrumb.tsx @@ -128,7 +128,7 @@ export const URL = ({ .split(separator) .slice(0, idx + 1) .join("/"); - href = "/" + href; + href = `/${href}`; return ( {el diff --git a/pluto/src/button/Button.tsx b/pluto/src/button/Button.tsx index 06015e0602..96653ecdce 100644 --- a/pluto/src/button/Button.tsx +++ b/pluto/src/button/Button.tsx @@ -15,7 +15,7 @@ import { toArray } from "@synnaxlabs/x/toArray"; import { type ComponentPropsWithoutRef, type ReactElement, - ReactNode, + type ReactNode, useCallback, useRef, } from "react"; @@ -23,7 +23,7 @@ import { import { type Align } from "@/align"; import { Color } from "@/color"; import { CSS } from "@/css"; -import { status } from "@/status/aether"; +import { type status } from "@/status/aether"; import { Text } from "@/text"; import { Tooltip } from "@/tooltip"; import { Triggers } from "@/triggers"; @@ -115,7 +115,7 @@ export const Button = Tooltip.wrap( const parsedDelay = TimeSpan.fromMilliseconds(onClickDelay); if (loading) startIcon = [...toArray(startIcon), ]; - if (iconSpacing == null) iconSpacing = size === "small" ? "small" : "medium"; + iconSpacing ??= size === "small" ? "small" : "medium"; // We implement the shadow variant to maintain compatibility with the input // component API. if (variant == "shadow") variant = "text"; @@ -173,7 +173,7 @@ export const Button = Tooltip.wrap( if (size == null && level != null) size = Text.LevelComponentSizes[level]; else if (size != null && level == null) level = Text.ComponentSizeLevels[size]; - else if (size == null) size = "medium"; + else size ??= "medium"; return ( diff --git a/pluto/src/button/Link.tsx b/pluto/src/button/Link.tsx index d65aded554..19e2ba174c 100644 --- a/pluto/src/button/Link.tsx +++ b/pluto/src/button/Link.tsx @@ -20,7 +20,7 @@ export interface LinkProps } const SCHEME_SEPARATOR = "://"; -const HTTP_SECURE_SCHEME = "https" + SCHEME_SEPARATOR; +const HTTP_SECURE_SCHEME = `https${SCHEME_SEPARATOR}`; /** * Use.Link renders a button that looks like a link and redirects to the given href diff --git a/pluto/src/caret/Animated.tsx b/pluto/src/caret/Animated.tsx index a312e42467..abb1449bc5 100644 --- a/pluto/src/caret/Animated.tsx +++ b/pluto/src/caret/Animated.tsx @@ -10,7 +10,7 @@ import "@/caret/Animated.css"; import { Icon } from "@synnaxlabs/media"; -import { location } from "@synnaxlabs/x"; +import { type location } from "@synnaxlabs/x"; import { CSS } from "@/css"; diff --git a/pluto/src/channel/AliasProvider.tsx b/pluto/src/channel/AliasProvider.tsx index 2fd72e1bc3..93bcba99a2 100644 --- a/pluto/src/channel/AliasProvider.tsx +++ b/pluto/src/channel/AliasProvider.tsx @@ -37,9 +37,7 @@ const AliasContext = createContext({ setAlias: null, }); -export const useContext = (): AliasContextValue => { - return reactUseContext(AliasContext); -}; +export const useContext = (): AliasContextValue => reactUseContext(AliasContext); export interface AliasProviderProps extends PropsWithChildren { activeRange?: string | null; diff --git a/pluto/src/channel/LinePlot.tsx b/pluto/src/channel/LinePlot.tsx index d4037972e8..240d5f7335 100644 --- a/pluto/src/channel/LinePlot.tsx +++ b/pluto/src/channel/LinePlot.tsx @@ -10,7 +10,7 @@ import "@/channel/LinePlot.css"; import { type channel } from "@synnaxlabs/client"; -import { box, location as loc, xy } from "@synnaxlabs/x/spatial"; +import { box, location as loc, type xy } from "@synnaxlabs/x/spatial"; import { type TimeRange, type TimeSpan } from "@synnaxlabs/x/telem"; import { type ReactElement, useCallback, useRef } from "react"; diff --git a/pluto/src/color/core/color.ts b/pluto/src/color/core/color.ts index 8386ba5172..f580e2a5a4 100644 --- a/pluto/src/color/core/color.ts +++ b/pluto/src/color/core/color.ts @@ -23,9 +23,9 @@ export type Hex = z.infer; const crudeColor = z.object({ rgba255: rgbaZ }); type CrudeBase = z.infer; -export const toHex = ((color?: Crude): string | undefined => { - return color == null ? undefined : new Color(color).hex; -}) as ((color: Crude) => string) & ((color?: Crude) => string | undefined); +export const toHex = ((color?: Crude): string | undefined => + color == null ? undefined : new Color(color).hex) as ((color: Crude) => string) & + ((color?: Crude) => string | undefined); /** * An unparsed representation of a color i.e. a value that can be converted into @@ -73,9 +73,8 @@ export class Color { * alpha value, this value will be ignored. Defaults to 1. */ constructor(color: Crude, alpha: number = 1) { - if (typeof color === "string") { - this.rgba255 = Color.fromHex(color, alpha); - } else if (Array.isArray(color)) { + if (typeof color === "string") this.rgba255 = Color.fromHex(color, alpha); + else if (Array.isArray(color)) { if (color.length < 3 || color.length > 4) throw new Error(`Invalid color: [${color.join(", ")}]`); this.rgba255 = color.length === 3 ? [...color, alpha ?? 1] : color; @@ -180,7 +179,7 @@ export class Color { const [r, g, b] = this.rgba255; if (alpha > 100) throw new Error(`Color opacity must be between 0 and 100, got ${alpha}`); - if (alpha > 1) alpha = alpha / 100; + if (alpha > 1) alpha /= 100; return new Color([r, g, b, alpha]); } @@ -188,9 +187,9 @@ export class Color { * @returns the luminance of the color, between 0 and 1. */ get luminance(): number { - const [r, g, b] = this.rgb1.map((v) => { - return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; - }); + const [r, g, b] = this.rgb1.map((v) => + v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4, + ); return Number((0.2126 * r + 0.7152 * g + 0.0722 * b).toFixed(3)); } @@ -257,9 +256,9 @@ export const fromHSLA = (hsla: RGBA): RGBA => { l /= 100; let r, g, b; - if (s === 0) { + if (s === 0) r = g = b = l; // achromatic - } else { + else { const q = l < 0.5 ? l * (1 + s) : l + s - l * s; const p = 2 * l - q; r = hueToRgb(p, q, h + 1 / 3); @@ -296,18 +295,14 @@ const rgbaToHSLA = (rgba: RGBA): HSLA => { let s: number; let l: number = (max + min) / 2; - if (max === min) { + if (max === min) h = s = 0; // achromatic - } else { + else { const d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - if (max === r) { - h = (g - b) / d + (g < b ? 6 : 0); - } else if (max === g) { - h = (b - r) / d + 2; - } else { - h = (r - g) / d + 4; - } + if (max === r) h = (g - b) / d + (g < b ? 6 : 0); + else if (max === g) h = (b - r) / d + 2; + else h = (r - g) / d + 4; h /= 6; } diff --git a/pluto/src/css/css.ts b/pluto/src/css/css.ts index 1a89291b4a..18e1635ad2 100644 --- a/pluto/src/css/css.ts +++ b/pluto/src/css/css.ts @@ -55,7 +55,7 @@ const newCSS = (prefix: string): CSSType => { CSS.rounded = (rounded) => !(rounded === false) && CSS.M("rounded"); CSS.bordered = (location) => { if (typeof location === "boolean") return location && CSS.M("bordered"); - return location != null ? CSS.M("bordered-" + location) : CSS.M("bordered"); + return location != null ? CSS.M(`bordered-${location}`) : CSS.M("bordered"); }; CSS.selected = (selected) => selected && CSS.M("selected"); CSS.altColor = (secondary) => secondary && CSS.M("alt-color"); diff --git a/pluto/src/divider/Divider.tsx b/pluto/src/divider/Divider.tsx index dbcce97f71..f7bcf63da8 100644 --- a/pluto/src/divider/Divider.tsx +++ b/pluto/src/divider/Divider.tsx @@ -9,7 +9,7 @@ import "@/divider/Divider.css"; -import { type direction, location } from "@synnaxlabs/x/spatial"; +import { type direction, type location } from "@synnaxlabs/x/spatial"; import { type HTMLAttributes, type PropsWithChildren, type ReactElement } from "react"; import { CSS } from "@/css"; diff --git a/pluto/src/dropdown/Dropdown.tsx b/pluto/src/dropdown/Dropdown.tsx index 9de60fcacf..301b7a2ebc 100644 --- a/pluto/src/dropdown/Dropdown.tsx +++ b/pluto/src/dropdown/Dropdown.tsx @@ -15,7 +15,6 @@ import { type location as loc, location, position, - runtime, xy, } from "@synnaxlabs/x"; import { @@ -35,7 +34,7 @@ import { CSS } from "@/css"; import { Dialog as CoreDialog } from "@/dialog"; import { useClickOutside, useCombinedRefs, useResize, useSyncedRef } from "@/hooks"; import { Triggers } from "@/triggers"; -import { ComponentSize } from "@/util/component"; +import { type ComponentSize } from "@/util/component"; import { findParent } from "@/util/findParent"; import { getRootElement } from "@/util/rootElement"; @@ -196,7 +195,7 @@ export const Dialog = ({ ); if (variant === "floating") child = createPortal(child, getRootElement()); - else if (variant === "modal") { + else if (variant === "modal") child = createPortal( , getRootElement(), ); - } const ctxValue = useMemo(() => ({ close }), [close]); return ( diff --git a/pluto/src/form/Field.tsx b/pluto/src/form/Field.tsx index 703d95c7a1..1993bafebf 100644 --- a/pluto/src/form/Field.tsx +++ b/pluto/src/form/Field.tsx @@ -7,21 +7,21 @@ // Source License, use of this software will be governed by the Apache License, // Version 2.0, included in the file licenses/APL.txt. -import { caseconv, deep, Key, Keyed } from "@synnaxlabs/x"; -import { FC, ReactElement } from "react"; +import { caseconv, deep, type Key, type Keyed } from "@synnaxlabs/x"; +import { type FC, type ReactElement } from "react"; import { CSS } from "@/css"; import { - ContextValue, - FieldState, + type ContextValue, + type FieldState, useContext, useField, - UseFieldProps, - UseNullableFieldProps, + type UseFieldProps, + type UseNullableFieldProps, } from "@/form/Form"; import { Input } from "@/input"; import { Select } from "@/select"; -import { componentRenderProp, RenderProp } from "@/util/renderProp"; +import { componentRenderProp, type RenderProp } from "@/util/renderProp"; interface FieldChild extends Input.Control { @@ -68,7 +68,7 @@ export const Field = < const ctx = useContext(); if (field == null) return null; if (path == null) throw new Error("No path provided to Form Field"); - if (label == null) label = caseconv.capitalize(deep.element(path, -1)); + label ??= caseconv.capitalize(deep.element(path, -1)); visible = typeof visible === "function" ? visible(field, ctx) : visible; if (!visible) return null; const helpText = field.status.message; diff --git a/pluto/src/form/Form.tsx b/pluto/src/form/Form.tsx index 58278b79c0..51c416a219 100644 --- a/pluto/src/form/Form.tsx +++ b/pluto/src/form/Form.tsx @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. /* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */ -import { compare, type Destructor, shallowCopy, toArray } from "@synnaxlabs/x"; +import { type compare, type Destructor, shallowCopy, toArray } from "@synnaxlabs/x"; import { deep } from "@synnaxlabs/x/deep"; import { zodutil } from "@synnaxlabs/x/zodutil"; import { @@ -25,7 +25,7 @@ import { import { z } from "zod"; import { useSyncedRef } from "@/hooks/ref"; -import { Input } from "@/input"; +import { type Input } from "@/input"; import { state } from "@/state"; import { type status } from "@/status/aether"; @@ -620,13 +620,12 @@ export const use = ({ // If we can't find the field value, this means the user never set it, so // instead we just to a best effort construction of the field state. This means // that if the user has a field rendered for this path, the error will be displayed. - if (fs == null) - fs = { - value: undefined, - status: statuses.get(issuePath) ?? NO_ERROR_STATUS(issuePath), - touched: false, - required: false, - }; + fs ??= { + value: undefined, + status: statuses.get(issuePath) ?? NO_ERROR_STATUS(issuePath), + touched: false, + required: false, + }; listeners.get(issuePath)?.forEach((l) => l(fs)); }); @@ -740,6 +739,6 @@ export const use = ({ ); }; -export const Form = (props: PropsWithChildren): ReactElement => { - return {props.children}; -}; +export const Form = (props: PropsWithChildren): ReactElement => ( + {props.children} +); diff --git a/pluto/src/form/synced.ts b/pluto/src/form/synced.ts index 7eb1446ca4..4ccd9b3f3c 100644 --- a/pluto/src/form/synced.ts +++ b/pluto/src/form/synced.ts @@ -7,12 +7,18 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { Synnax as Client } from "@synnaxlabs/client"; -import { observe, Primitive } from "@synnaxlabs/x"; +import { type Synnax as Client } from "@synnaxlabs/client"; +import { type observe, type Primitive } from "@synnaxlabs/x"; import { useCallback } from "react"; -import { z } from "zod"; +import { type z } from "zod"; -import { ContextValue, OnChangeProps, use, UseProps, UseReturn } from "@/form/Form"; +import { + type ContextValue, + type OnChangeProps, + use, + type UseProps, + type UseReturn, +} from "@/form/Form"; import { useAsyncEffect } from "@/hooks"; import { useMemoPrimitiveArray } from "@/memo"; import { Observe } from "@/observe"; diff --git a/pluto/src/hardware/device/Select.tsx b/pluto/src/hardware/device/Select.tsx index be39a8c1d1..ef7473c80c 100644 --- a/pluto/src/hardware/device/Select.tsx +++ b/pluto/src/hardware/device/Select.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { device } from "@synnaxlabs/client"; +import { type device } from "@synnaxlabs/client"; import { type AsyncTermSearcher } from "@synnaxlabs/x"; import { type ReactElement } from "react"; diff --git a/pluto/src/haul/Haul.tsx b/pluto/src/haul/Haul.tsx index f15d2de0ed..5efb1c2e92 100644 --- a/pluto/src/haul/Haul.tsx +++ b/pluto/src/haul/Haul.tsx @@ -11,10 +11,10 @@ import "@/haul/Haul.css"; import { box, - Destructor, + type Destructor, type Key, type Optional, - UnknownRecord, + type UnknownRecord, xy, } from "@synnaxlabs/x"; import React, { @@ -320,14 +320,12 @@ export const useDropOutside = ({ type, key, ...rest }: UseDropOutsideProps): voi return { target, dropped }; }); const handleMouseEnter = () => { - const { canDrop } = propsRef.current; isOutside.current = false; - if (!canDrop(dragging.current)) return; }; const handleMouseLeave = (e: globalThis.DragEvent) => { const { onDragOver, canDrop } = propsRef.current; const windowBox = box.construct(window.document.documentElement); - if ((box.contains(windowBox, xy.construct(e.clientX, e.clientY)), false)) return; + if (box.contains(windowBox, xy.construct(e.clientX, e.clientY))) return; isOutside.current = true; if (!canDrop(dragging.current)) return; onDragOver?.(dragging.current); diff --git a/pluto/src/hooks/useClickOutside.ts b/pluto/src/hooks/useClickOutside.ts index a09b66e11f..e0b5513e4f 100644 --- a/pluto/src/hooks/useClickOutside.ts +++ b/pluto/src/hooks/useClickOutside.ts @@ -38,11 +38,10 @@ export const useClickOutside = ({ const pos = xy.construct(e); const exclude = excludeRef.current; - if (exclude != null) { + if (exclude != null) if (typeof exclude === "function") { if (exclude(e)) return; } else if (exclude.some((r) => r.current?.contains(e.target as Node))) return; - } if ( el == null || diff --git a/pluto/src/hooks/useRequiredContext.ts b/pluto/src/hooks/useRequiredContext.ts index 99e25f2650..405e0ae99d 100644 --- a/pluto/src/hooks/useRequiredContext.ts +++ b/pluto/src/hooks/useRequiredContext.ts @@ -11,8 +11,6 @@ import { useContext } from "react"; export const useRequiredContext = (context: React.Context): T => { const value = useContext(context); - if (value === null) { - throw new Error(`useRequiredContext: context value is null`); - } + if (value === null) throw new Error(`useRequiredContext: context value is null`); return value; }; diff --git a/pluto/src/hooks/useResize.ts b/pluto/src/hooks/useResize.ts index 149828cceb..50ea57608e 100644 --- a/pluto/src/hooks/useResize.ts +++ b/pluto/src/hooks/useResize.ts @@ -50,7 +50,7 @@ export const useResize = ( const startObserving = useCallback( (el: HTMLElement) => { if (obs.current != null) obs.current.disconnect(); - if (prev.current == null) prev.current = box.ZERO; + prev.current ??= box.ZERO; const deb = debounceF(() => { const next = box.construct(el); if (shouldResize(memoTriggers, prev.current, next)) { diff --git a/pluto/src/icon/Icon.tsx b/pluto/src/icon/Icon.tsx index ee49a49f98..c3f74bc78a 100644 --- a/pluto/src/icon/Icon.tsx +++ b/pluto/src/icon/Icon.tsx @@ -10,7 +10,7 @@ import "@/icon/Icon.css"; import { Icon as MediaIcon } from "@synnaxlabs/media"; -import { deep, location } from "@synnaxlabs/x"; +import { deep, type location } from "@synnaxlabs/x"; import { cloneElement, type ComponentPropsWithoutRef, diff --git a/pluto/src/input/Item.tsx b/pluto/src/input/Item.tsx index 0521ed8c18..11220f822d 100644 --- a/pluto/src/input/Item.tsx +++ b/pluto/src/input/Item.tsx @@ -16,7 +16,7 @@ import { Align } from "@/align"; import { CSS } from "@/css"; import { HelpText } from "@/input/HelpText"; import { Label } from "@/input/Label"; -import { status } from "@/status/aether"; +import { type status } from "@/status/aether"; export interface ItemProps extends Align.SpaceProps { label?: string; diff --git a/pluto/src/input/Label.tsx b/pluto/src/input/Label.tsx index eddcdf227f..49a8f37607 100644 --- a/pluto/src/input/Label.tsx +++ b/pluto/src/input/Label.tsx @@ -34,10 +34,8 @@ export const Label = ({ required = false, children, ...props -}: LabelProps): ReactElement => { - return ( - - ); -}; +}: LabelProps): ReactElement => ( + +); diff --git a/pluto/src/input/Numeric.tsx b/pluto/src/input/Numeric.tsx index ba1162d128..fefdba250e 100644 --- a/pluto/src/input/Numeric.tsx +++ b/pluto/src/input/Numeric.tsx @@ -83,7 +83,7 @@ export const Numeric = forwardRef( // This just means we never actually modified the input if (isValueValidRef.current) return; setIsValueValid(true); - let ok = false; + let ok: boolean; let v = 0; try { const ev = evaluate(internalValueRef.current); @@ -120,18 +120,7 @@ export const Numeric = forwardRef( // If the value is valid, use the actual value, otherwise use the internal value. const value_ = isValueValid ? value : internalValue; - // We don't communicate the actual value until the user is done dragging, this - // prevents a bunch of re-renders every time the user moves the mouse. const onDragChange = useCallback( - (value: number) => { - setIsValueValid(false); - setInternalValue(Math.round(bounds.clamp(propsBounds, value)).toString()); - }, - [setInternalValue, setIsValueValid], - ); - - // See not above. - const onDragEnd = useCallback( (value: number) => { setIsValueValid(true); onChange?.(bounds.clamp(propsBounds, Math.round(value))); @@ -139,13 +128,12 @@ export const Numeric = forwardRef( [onChange, setIsValueValid], ); - if (dragScale == null && bounds.isFinite(propsBounds)) { + if (dragScale == null && bounds.isFinite(propsBounds)) // make X 5% of the bounds and Y 10% of the bounds dragScale = { x: bounds.span(propsBounds) * 0.01, y: bounds.span(propsBounds) * 0.02, }; - } if (variant === "preview" || disabled) showDragHandle = false; @@ -175,7 +163,6 @@ export const Numeric = forwardRef( onChange={onDragChange} dragScale={dragScale} resetValue={resetValue} - onDragEnd={onDragEnd} onBlur={handleBlur} /> )} diff --git a/pluto/src/input/Text.tsx b/pluto/src/input/Text.tsx index 814036f72d..d557a9abc3 100644 --- a/pluto/src/input/Text.tsx +++ b/pluto/src/input/Text.tsx @@ -16,7 +16,7 @@ import { Color } from "@/color"; import { CSS } from "@/css"; import { useCombinedRefs } from "@/hooks"; import { type BaseProps } from "@/input/types"; -import { Status } from "@/status"; +import { type Status } from "@/status"; import { Text as CoreText } from "@/text"; export interface TextExtraProps { @@ -83,9 +83,7 @@ export const Text = forwardRef( focusedRef.current = false; if (resetOnBlurIfEmpty && e.target.value === "") onChange?.(cachedFocusRef.current); - else if (onlyChangeOnBlur) { - if (tempValue != null) onChange?.(tempValue); - } + else if (onlyChangeOnBlur) if (tempValue != null) onChange?.(tempValue); setTempValue(null); onBlur?.(e); }; diff --git a/pluto/src/input/types.ts b/pluto/src/input/types.ts index ae11c49eb8..33b7a6e000 100644 --- a/pluto/src/input/types.ts +++ b/pluto/src/input/types.ts @@ -9,7 +9,7 @@ import { type ComponentPropsWithoutRef, type ReactNode } from "react"; -import { Align } from "@/align"; +import { type Align } from "@/align"; import { type Text } from "@/text"; import { type ComponentSize } from "@/util/component"; diff --git a/pluto/src/label/Select.tsx b/pluto/src/label/Select.tsx index 2ec4ad0d23..f48fc68ede 100644 --- a/pluto/src/label/Select.tsx +++ b/pluto/src/label/Select.tsx @@ -7,12 +7,12 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { label } from "@synnaxlabs/client"; +import { type label } from "@synnaxlabs/client"; import { Icon } from "@synnaxlabs/media"; -import { AsyncTermSearcher, nullToArr, toArray, unique } from "@synnaxlabs/x"; +import { type AsyncTermSearcher, nullToArr, toArray, unique } from "@synnaxlabs/x"; import { type DragEvent, - FC, + type FC, type ReactElement, useCallback, useId, diff --git a/pluto/src/list/Column.tsx b/pluto/src/list/Column.tsx index e12026d018..523720dc59 100644 --- a/pluto/src/list/Column.tsx +++ b/pluto/src/list/Column.tsx @@ -102,7 +102,7 @@ const Header = >({ const onSort = (k: keyof E): void => { const [prevSort, prevDir] = sort; - if (prevSort === k) { + if (prevSort === k) if (!prevDir) { setSort([null, false]); deleteTransform(SORT_TRANSFORM); @@ -110,7 +110,7 @@ const Header = >({ setSort([k, !prevDir]); setTransform(SORT_TRANSFORM, sortTransform(k, !prevDir)); } - } else { + else { setSort([k, true]); setTransform(SORT_TRANSFORM, sortTransform(k, true)); } diff --git a/pluto/src/list/Core.tsx b/pluto/src/list/Core.tsx index 8053ea704f..4080366bed 100644 --- a/pluto/src/list/Core.tsx +++ b/pluto/src/list/Core.tsx @@ -41,7 +41,7 @@ const scrollToRelevantChild = ( ref: HTMLDivElement, ) => { const dirMultiplier = hover > prevHover ? 1 : -1; - let scrollTo = hover; + let scrollTo: number; const idealHover = hover + dirMultiplier * 2; if (bounds.contains({ lower: 0, upper: ref.children.length }, idealHover)) scrollTo = hover + dirMultiplier * 2; diff --git a/pluto/src/list/Item.tsx b/pluto/src/list/Item.tsx index 8542f42c77..863a5ce8ea 100644 --- a/pluto/src/list/Item.tsx +++ b/pluto/src/list/Item.tsx @@ -9,7 +9,7 @@ import "@/list/Item.css"; -import { type Key, type Keyed, Optional } from "@synnaxlabs/x"; +import { type Key, type Keyed, type Optional } from "@synnaxlabs/x"; import { type ReactElement } from "react"; import { Align } from "@/align"; diff --git a/pluto/src/list/List.tsx b/pluto/src/list/List.tsx index 8920da9f90..97a5d54caa 100644 --- a/pluto/src/list/List.tsx +++ b/pluto/src/list/List.tsx @@ -42,10 +42,10 @@ export const List = = Keyed>({ const omittedData = useMemoCompare( () => (omit != null ? data?.filter((e) => !omit.includes(e.key)) : data), ([prevOmit, prevData], [omit, data]) => { - let omitsEqual = false; - if (prevOmit != null && omit != null) { + let omitsEqual: boolean; + if (prevOmit != null && omit != null) omitsEqual = compare.unorderedPrimitiveArrays(prevOmit, omit) === compare.EQUAL; - } else omitsEqual = prevOmit == omit; + else omitsEqual = prevOmit == omit; return prevData === data && omitsEqual; }, [omit, data] as [K[] | undefined, E[] | undefined], diff --git a/pluto/src/list/useSelect.ts b/pluto/src/list/useSelect.ts index 5f02d97781..b5bb8e87b6 100644 --- a/pluto/src/list/useSelect.ts +++ b/pluto/src/list/useSelect.ts @@ -187,12 +187,13 @@ export const useSelect = >({ // Simple case. If we can't allow multiple, then just toggle the key. if (allowMultiple === false) nextSelected = value.includes(key) ? [] : [key]; // If the control key is held, we can still allow multiple selection. - else if (ctrl.current.held && replaceOnSingle) { - // Remove the key if it's already selected. - if (value.includes(key)) nextSelected = value.filter((k) => k !== key); + else if (ctrl.current.held && replaceOnSingle) + if (value.includes(key)) + // Remove the key if it's already selected. + nextSelected = value.filter((k) => k !== key); // Add it if its not. else nextSelected = [...value, key]; - } else if (shift.current.held && shiftValue !== null) { + else if (shift.current.held && shiftValue !== null) { // We might select in reverse order, so we need to sort the indexes. const [start, end] = [ data.findIndex((v) => v.key === key), @@ -216,7 +217,7 @@ export const useSelect = >({ else nextSelected = [...value, key]; } const v = unique(nextSelected); - if (allowNone === false && v.length === 0) { + if (allowNone === false && v.length === 0) // If we're not allowed to have no select, still call handleChange with the same // value. This is useful when you want to close a dialog on selection. return handleChange(value, { @@ -224,7 +225,6 @@ export const useSelect = >({ clicked: key, clickedIndex: data.findIndex(({ key: k }) => k === key), }); - } if (v.length === 0) shiftValueRef.current = null; handleChange(v, { entries: data.filter(({ key }) => nextSelected.includes(key)), diff --git a/pluto/src/memo/useMemoCompare.ts b/pluto/src/memo/useMemoCompare.ts index 4bbf174a33..da39884d1c 100644 --- a/pluto/src/memo/useMemoCompare.ts +++ b/pluto/src/memo/useMemoCompare.ts @@ -7,8 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import type { Primitive } from "@synnaxlabs/x"; -import { compare, deep } from "@synnaxlabs/x"; +import { compare, deep, type Primitive } from "@synnaxlabs/x"; import { type DependencyList, useRef } from "react"; export const useMemoCompare = ( diff --git a/pluto/src/menu/ContextMenu.tsx b/pluto/src/menu/ContextMenu.tsx index 575fd52a7d..a32c9265b4 100644 --- a/pluto/src/menu/ContextMenu.tsx +++ b/pluto/src/menu/ContextMenu.tsx @@ -12,7 +12,7 @@ import "@/menu/ContextMenu.css"; import { box, position, unique, xy } from "@synnaxlabs/x"; import { type ComponentPropsWithoutRef, - FC, + type FC, type ForwardedRef, forwardRef, type ReactElement, @@ -109,7 +109,7 @@ export const useContextMenu = (): UseContextMenuReturn => { // Prevent parent context menus from opening. e.stopPropagation(); const selected = findSelected(e.target as HTMLElement); - keys = keys ?? unique(selected.map((el) => el.id).filter((id) => id.length > 0)); + keys ??= unique(selected.map((el) => el.id).filter((id) => id.length > 0)); } else keys = []; setMenuState({ visible: true, keys, position: p, cursor: p }); }; diff --git a/pluto/src/menu/Item.tsx b/pluto/src/menu/Item.tsx index 81e319cf43..8cfe4858c5 100644 --- a/pluto/src/menu/Item.tsx +++ b/pluto/src/menu/Item.tsx @@ -7,7 +7,7 @@ import { Button } from "@/button"; import { CSS } from "@/css"; import { useMenuContext } from "@/menu/Menu"; import { Text as TriggersText } from "@/triggers/Text"; -import { Trigger } from "@/triggers/triggers"; +import { type Trigger } from "@/triggers/triggers"; export interface MenuItemExtraProps { itemKey: string; diff --git a/pluto/src/modal/Modal.tsx b/pluto/src/modal/Modal.tsx index e53dce5991..c3eaa96b07 100644 --- a/pluto/src/modal/Modal.tsx +++ b/pluto/src/modal/Modal.tsx @@ -9,12 +9,12 @@ import "@/modal/Modal.css"; -import { ReactElement, useCallback, useRef } from "react"; +import { type ReactElement, useCallback, useRef } from "react"; import { createPortal } from "react-dom"; import { Align } from "@/align"; import { CSS } from "@/css"; -import { Dialog as Core } from "@/dialog"; +import { type Dialog as Core } from "@/dialog"; import { useClickOutside } from "@/hooks"; import { Triggers } from "@/triggers"; import { findParent } from "@/util/findParent"; diff --git a/pluto/src/mosaic/Mosaic.tsx b/pluto/src/mosaic/Mosaic.tsx index 46a8d8a100..b8a584d15e 100644 --- a/pluto/src/mosaic/Mosaic.tsx +++ b/pluto/src/mosaic/Mosaic.tsx @@ -11,9 +11,9 @@ import "@/mosaic/Mosaic.css"; import { type box, type location } from "@synnaxlabs/x"; import { - DragEvent, + type DragEvent, memo, - MutableRefObject, + type MutableRefObject, type ReactElement, useCallback, useRef, diff --git a/pluto/src/mosaic/tree.ts b/pluto/src/mosaic/tree.ts index 3ff41b5268..58825ac3b8 100644 --- a/pluto/src/mosaic/tree.ts +++ b/pluto/src/mosaic/tree.ts @@ -334,7 +334,7 @@ const _gc = (node: Node): [Node, boolean] => { if (node.first == null || node.last == null) return [node, false]; if (shouldGc(node.first)) return [liftUp(node.last, true), true]; if (shouldGc(node.last)) return [liftUp(node.first, false), true]; - let [sGC, eGC] = [false, false]; + let sGC: boolean, eGC: boolean; [node.first, sGC] = _gc(node.first); [node.last, eGC] = _gc(node.last); return [node, sGC || eGC]; diff --git a/pluto/src/notation/SelectNotation.tsx b/pluto/src/notation/SelectNotation.tsx new file mode 100644 index 0000000000..60d6ae6236 --- /dev/null +++ b/pluto/src/notation/SelectNotation.tsx @@ -0,0 +1,52 @@ +// Copyright 2024 Synnax Labs, Inc. +// +// Use of this software is governed by the Business Source License included in the file +// licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with the Business Source +// License, use of this software will be governed by the Apache License, Version 2.0, +// included in the file licenses/APL.txt. + +import { type ReactElement } from "react"; + +import { Button as CoreButton } from "@/button"; +import { type Notation } from "@/notation/notation"; +import { Button, type ButtonOptionProps, type ButtonProps } from "@/select/Button"; + +interface Entry { + key: Notation; + label: string; +} + +const DATA: Entry[] = [ + { key: "standard", label: "Standard" }, + { key: "scientific", label: "Scientific" }, + { key: "engineering", label: "Engineering" }, +]; + +const defaultSelectNotationButton = ({ + key, + entry, + onClick, + selected, +}: ButtonOptionProps): ReactElement => ( + + {entry.label} + +); + +export interface SelectNotationProps + extends Omit, "data" | "entryRenderKey"> {} + +export const SelectNotation = ({ + children = defaultSelectNotationButton, + ...props +}: SelectNotationProps): ReactElement => ( + +); diff --git a/pluto/src/notation/notation.spec.ts b/pluto/src/notation/notation.spec.ts new file mode 100644 index 0000000000..b7b85ecfb3 --- /dev/null +++ b/pluto/src/notation/notation.spec.ts @@ -0,0 +1,88 @@ +// Copyright 2024 Synnax Labs, Inc. +// +// Use of this software is governed by the Business Source License included in the file +// licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with the Business Source +// License, use of this software will be governed by the Apache License, Version 2.0, +// included in the file licenses/APL.txt. + +import { describe, expect, it } from "vitest"; + +import { type Notation, NOTATIONS, stringifyNumber } from "@/notation/notation"; + +interface TestCase { + number: number; + precision: number; + expected: Record; +} + +const TEST_CASES: TestCase[] = [ + { + number: 12345.678, + precision: 1, + expected: { standard: "12345.7", scientific: "1.2ᴇ4", engineering: "12.3ᴇ3" }, + }, + { + number: 12345.678, + precision: 0, + expected: { standard: "12346", scientific: "1ᴇ4", engineering: "12ᴇ3" }, + }, + { + number: 0, + precision: 1, + expected: { standard: "0.0", scientific: "0.0ᴇ0", engineering: "0.0ᴇ0" }, + }, + { + number: 0, + precision: 0, + expected: { standard: "0", scientific: "0ᴇ0", engineering: "0ᴇ0" }, + }, + { + number: -1234.5678, + precision: 1, + expected: { standard: "-1234.6", scientific: "-1.2ᴇ3", engineering: "-1.2ᴇ3" }, + }, + { + number: -1234.5678, + precision: 0, + expected: { standard: "-1235", scientific: "-1ᴇ3", engineering: "-1ᴇ3" }, + }, + { + number: NaN, + precision: 0, + expected: { standard: "NaN", scientific: "NaN", engineering: "NaN" }, + }, + { + number: Infinity, + precision: 0, + expected: { standard: "∞", scientific: "∞", engineering: "∞" }, + }, + { + number: -Infinity, + precision: 0, + expected: { standard: "-∞", scientific: "-∞", engineering: "-∞" }, + }, + { + number: 0.0001234, + precision: 1, + expected: { standard: "0.0", scientific: "1.2ᴇ-4", engineering: "123.4ᴇ-6" }, + }, + { + number: 0.0001234, + precision: 0, + expected: { standard: "0", scientific: "1ᴇ-4", engineering: "123ᴇ-6" }, + }, +]; + +describe("stringifyNumber", () => { + TEST_CASES.forEach(({ number, precision, expected }) => + describe(`number: ${number}, precision: ${precision}`, () => + NOTATIONS.forEach((notation) => + it(`should format correctly in ${notation} notation`, () => { + const result = stringifyNumber(number, precision, notation); + expect(result).toBe(expected[notation]); + }), + )), + ); +}); diff --git a/pluto/src/notation/notation.ts b/pluto/src/notation/notation.ts new file mode 100644 index 0000000000..b8285c0108 --- /dev/null +++ b/pluto/src/notation/notation.ts @@ -0,0 +1,63 @@ +// Copyright 2024 Synnax Labs, Inc. +// +// Use of this software is governed by the Business Source License included in the file +// licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with the Business Source +// License, use of this software will be governed by the Apache License, Version 2.0, +// included in the file licenses/APL.txt. + +import { z } from "zod"; + +export const NOTATIONS = ["standard", "scientific", "engineering"] as const; +export const notationZ = z.enum(NOTATIONS); +export type Notation = z.infer; + +// precision must be between 0 and 20 + +/** + * Converts a number to a string representation with a specified precision and notation. + * + * @param value - The number to be converted. + * @param precision - The number of decimal places to include in the output. Must be between 0 and 20. + * @param notation - The notation to use for the conversion. Can be "standard", "scientific", or "engineering". + * @returns The string representation of the number. + * + * Edge cases: + * - If the value is `NaN`, returns "NaN". + * - If the value is `Infinity`, returns "∞". + * - If the value is `-Infinity`, returns "-∞". + * + * Examples: + * + * ```typescript + * stringifyNumber(1234.5678, 2, "standard"); // "1234.57" + * stringifyNumber(1234.5678, 2, "scientific"); // "1.23ᴇ3" + * stringifyNumber(1234.5678, 2, "engineering"); // "1.23ᴇ3" + * stringifyNumber(0.0001234, 4, "standard"); // "0.0001" + * stringifyNumber(0.0001234, 4, "scientific"); // "1.2340ᴇ-4" + * stringifyNumber(0.0001234, 4, "engineering"); // "123.4000ᴇ-6" + * stringifyNumber(NaN, 2, "standard"); // "NaN" + * stringifyNumber(Infinity, 2, "standard"); // "∞" + * stringifyNumber(-Infinity, 2, "standard"); // "-∞" + * ``` + */ +export const stringifyNumber = ( + value: number, + precision: number, + notation: Notation, +): string => { + if (Number.isNaN(value)) return "NaN"; + if (value === Infinity) return "∞"; + if (value === -Infinity) return "-∞"; + if (notation === "standard") return value.toFixed(precision); + if (value === 0) { + if (precision === 0) return "0ᴇ0"; + return `0.${"0".repeat(precision)}ᴇ0`; + } + let exp: number; + if (notation === "scientific") exp = Math.floor(Math.log10(Math.abs(value))); + else exp = Math.floor(Math.log10(Math.abs(value)) / 3) * 3; + const mantissa = value / 10 ** exp; + return `${mantissa.toFixed(precision)}ᴇ${exp}`; +}; diff --git a/pluto/src/note/Note.tsx b/pluto/src/note/Note.tsx index ff7829bb8f..a845b4cb50 100644 --- a/pluto/src/note/Note.tsx +++ b/pluto/src/note/Note.tsx @@ -11,7 +11,7 @@ import "@/note/Note.css"; import { Align } from "@/align"; import { CSS } from "@/css"; -import { Status } from "@/status"; +import { type Status } from "@/status"; export interface NoteProps extends Align.SpaceProps<"div"> { variant: Status.Variant; diff --git a/pluto/src/observe/use.ts b/pluto/src/observe/use.ts index 040b57be13..be55d1d25c 100644 --- a/pluto/src/observe/use.ts +++ b/pluto/src/observe/use.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { observe, Primitive } from "@synnaxlabs/x"; +import { type observe, type Primitive } from "@synnaxlabs/x"; import { useState as reactUseState } from "react"; import { useAsyncEffect } from "@/hooks"; diff --git a/pluto/src/pluto/Pluto.tsx b/pluto/src/pluto/Pluto.tsx index 2961de5ebc..d9090fe594 100644 --- a/pluto/src/pluto/Pluto.tsx +++ b/pluto/src/pluto/Pluto.tsx @@ -9,7 +9,7 @@ import "@synnaxlabs/media/dist/style.css"; -import { FC, type PropsWithChildren, type ReactElement } from "react"; +import { type FC, type PropsWithChildren, type ReactElement } from "react"; import { Aether } from "@/aether"; import { Alamos } from "@/alamos"; diff --git a/pluto/src/progress/Progress.tsx b/pluto/src/progress/Progress.tsx index 7c825a34e6..f76389cd45 100644 --- a/pluto/src/progress/Progress.tsx +++ b/pluto/src/progress/Progress.tsx @@ -17,10 +17,8 @@ interface ProgressProps { value: number; } -export const Progress = ({ value }: ProgressProps): ReactElement => { - return ( -
-
-
- ); -}; +export const Progress = ({ value }: ProgressProps): ReactElement => ( +
+
+
+); diff --git a/pluto/src/ranger/Select.tsx b/pluto/src/ranger/Select.tsx index 6a4a27e680..4c2fc4f431 100644 --- a/pluto/src/ranger/Select.tsx +++ b/pluto/src/ranger/Select.tsx @@ -7,8 +7,8 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { ranger } from "@synnaxlabs/client"; -import { AsyncTermSearcher, nullToArr, toArray, unique } from "@synnaxlabs/x"; +import { type ranger } from "@synnaxlabs/client"; +import { type AsyncTermSearcher, nullToArr, toArray, unique } from "@synnaxlabs/x"; import { type DragEvent, type ReactElement, useCallback, useId, useMemo } from "react"; import { CSS } from "@/css"; diff --git a/pluto/src/resize/Multiple.tsx b/pluto/src/resize/Multiple.tsx index b0f73f0e5e..57e304305b 100644 --- a/pluto/src/resize/Multiple.tsx +++ b/pluto/src/resize/Multiple.tsx @@ -258,7 +258,7 @@ export const calculateDiffPercentage = ( // If the caller provided a target size, prefer that. if (targetSize != null) { // If the target size is a pixel value, convert it to a percentage. - if (targetSize > 1) targetSize = targetSize / parentSize; + if (targetSize > 1) targetSize /= parentSize; diff = targetSize - prev.sizeDistribution[dragging]; } else if (clientPos != null) { if (prev.root === null) throw new Error("resize root is null during handle drag"); diff --git a/pluto/src/select/Alignment.tsx b/pluto/src/select/Alignment.tsx index d188301ab9..3ae5e052d4 100644 --- a/pluto/src/select/Alignment.tsx +++ b/pluto/src/select/Alignment.tsx @@ -10,7 +10,7 @@ import { Icon } from "@synnaxlabs/media"; import { type ReactElement } from "react"; -import { Align } from "@/align"; +import { type Align } from "@/align"; import { Button as CoreButton } from "@/button"; import { Button, type ButtonOptionProps, type ButtonProps } from "@/select/Button"; @@ -45,25 +45,21 @@ const defaultSelectTextAlignmentButton = ({ entry, onClick, selected, -}: ButtonOptionProps): ReactElement => { - return ( - - {entry.icon} - - ); -}; +}: ButtonOptionProps): ReactElement => ( + + {entry.icon} + +); export const TextAlignment = ({ children = defaultSelectTextAlignmentButton, ...props -}: AlignmentProps): ReactElement => { - return ( - - ); -}; +}: AlignmentProps): ReactElement => ( + +); diff --git a/pluto/src/select/Button.tsx b/pluto/src/select/Button.tsx index 2b230c82a0..1d45d1202d 100644 --- a/pluto/src/select/Button.tsx +++ b/pluto/src/select/Button.tsx @@ -78,15 +78,15 @@ export const Button = = Keyed>({ className={CSS(CSS.B("select-button"), className)} {...props} > - {data?.map((e) => { - return children({ + {data?.map((e) => + children({ key: e.key, onClick: () => onSelect(e.key), selected: e.key === value, entry: e, title: e[entryRenderKey], - }); - })} + }), + )} ); }; diff --git a/pluto/src/select/List.tsx b/pluto/src/select/List.tsx index 50fd20afb3..03ee7ff3f8 100644 --- a/pluto/src/select/List.tsx +++ b/pluto/src/select/List.tsx @@ -71,7 +71,7 @@ export const Core = >({ ); - if (variant !== "connected") { + if (variant !== "connected") dialogContent = ( >({ {dialogContent} ); - } return ( data={data} emptyContent={emptyContent} omit={omit}> diff --git a/pluto/src/select/Multiple.tsx b/pluto/src/select/Multiple.tsx index fd37513307..bd1ece9ceb 100644 --- a/pluto/src/select/Multiple.tsx +++ b/pluto/src/select/Multiple.tsx @@ -21,7 +21,7 @@ import { } from "@synnaxlabs/x"; import { type ReactElement, - ReactNode, + type ReactNode, useCallback, useLayoutEffect, useMemo, @@ -40,7 +40,7 @@ import { List as CoreList } from "@/list"; import { selectValueIsZero, type UseSelectMultipleProps, - UseSelectOnChangeExtra, + type UseSelectOnChangeExtra, } from "@/list/useSelect"; import { ClearButton } from "@/select/ClearButton"; import { Core } from "@/select/List"; @@ -123,15 +123,14 @@ export const Multiple = = Keyed>({ if (compare.unorderedPrimitiveArrays(inSelected, nextValue) === compare.EQUAL) return; let nextSelected: E[] = []; - if (searchMode) { + if (searchMode) // Wrap this in a try-except clause just in case the searcher throws an error. try { nextSelected = await searcher.retrieve(nextValue); } finally { setLoading(false); } - } else if (data != null) - nextSelected = data.filter((v) => nextValue.includes(v.key)); + else if (data != null) nextSelected = data.filter((v) => nextValue.includes(v.key)); setSelected(nextSelected); }, [searcher, searchMode, value, data]); @@ -151,7 +150,7 @@ export const Multiple = = Keyed>({ let searchInput: ReactElement | undefined; let trigger: ReactElement; - if (dropdownVariant === "connected") { + if (dropdownVariant === "connected") trigger = ( searcher={searcher}> {({ onChange, value: inputValue }) => ( @@ -176,7 +175,7 @@ export const Multiple = = Keyed>({ )} ); - } else { + else { const arrValue = toArray(value); trigger = ( diff --git a/pluto/src/select/Single.tsx b/pluto/src/select/Single.tsx index 24ef4cf1f5..cbd03519d1 100644 --- a/pluto/src/select/Single.tsx +++ b/pluto/src/select/Single.tsx @@ -16,10 +16,9 @@ import { primitiveIsZero, } from "@synnaxlabs/x"; import { - FC, type FocusEventHandler, type ReactElement, - ReactNode, + type ReactNode, useCallback, useEffect, useMemo, @@ -32,7 +31,7 @@ import { CSS } from "@/css"; import { Dropdown } from "@/dropdown"; import { useAsyncEffect } from "@/hooks"; import { Input } from "@/input"; -import { List as CoreList, List } from "@/list"; +import { List as CoreList, type List } from "@/list"; import { selectValueIsZero, type UseSelectOnChangeExtra, diff --git a/pluto/src/status/Circle.tsx b/pluto/src/status/Circle.tsx index d91f4f786c..8649503c5e 100644 --- a/pluto/src/status/Circle.tsx +++ b/pluto/src/status/Circle.tsx @@ -17,12 +17,10 @@ export interface CircleProps extends IconProps { variant: status.Variant; } -export const Circle = ({ variant, ...props }: CircleProps): ReactElement => { - return ( - - ); -}; +export const Circle = ({ variant, ...props }: CircleProps): ReactElement => ( + +); diff --git a/pluto/src/status/Notification.tsx b/pluto/src/status/Notification.tsx index a12b2654c9..c1b1ec72c5 100644 --- a/pluto/src/status/Notification.tsx +++ b/pluto/src/status/Notification.tsx @@ -11,12 +11,12 @@ import "@/status/Notification.css"; import { Icon } from "@synnaxlabs/media"; import { toArray } from "@synnaxlabs/x"; -import { isValidElement, ReactElement } from "react"; +import { isValidElement, type ReactElement } from "react"; import { Align } from "@/align"; import { Button } from "@/button"; import { CSS } from "@/css"; -import { NotificationSpec } from "@/status/Aggregator"; +import { type NotificationSpec } from "@/status/Aggregator"; import { Circle } from "@/status/Circle"; import { Text } from "@/text"; @@ -33,80 +33,78 @@ export const Notification = ({ className, children, ...props -}: NotificationProps): ReactElement => { - return ( - - - - - - {`x${count}`} - - - {time} - - - silence(key)} +}: NotificationProps): ReactElement => ( + + + + + + {`x${count}`} + + - - + {time} + - silence(key)} > - {children != null ? ( - children - ) : ( - - {message} - - )} - {description != null && ( - - {description} - - )} - - {actions != null && ( - + + + + {children != null ? ( + children + ) : ( + + {message} + + )} + {description != null && ( + - {toArray(actions).map((a) => ( - - ))} - + {description} + )} - ); -}; + {actions != null && ( + + {toArray(actions).map((a) => ( + + ))} + + )} + +); interface ActionProps { action: ReactElement | Button.ButtonProps; diff --git a/pluto/src/synnax/Provider.tsx b/pluto/src/synnax/Provider.tsx index acbb7fdffc..472b8eab5a 100644 --- a/pluto/src/synnax/Provider.tsx +++ b/pluto/src/synnax/Provider.tsx @@ -7,7 +7,12 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { connection, Synnax, type SynnaxProps, TimeSpan } from "@synnaxlabs/client"; +import { + type connection, + Synnax, + type SynnaxProps, + TimeSpan, +} from "@synnaxlabs/client"; import { caseconv, migrate } from "@synnaxlabs/x"; import { createContext, @@ -46,7 +51,7 @@ const generateErrorDescription = ( clientVersion: string, nodeVersion?: string, ): string => - `Cluster version ${nodeVersion != null ? nodeVersion + " " : ""}is ${oldServer ? "older" : "newer"} than client version ${clientVersion}. Compatibility issues may arise.`; + `Cluster version ${nodeVersion != null ? `${nodeVersion} ` : ""}is ${oldServer ? "older" : "newer"} than client version ${clientVersion}. Compatibility issues may arise.`; export const Provider = Aether.wrap( synnax.Provider.TYPE, @@ -66,12 +71,11 @@ export const Provider = Aether.wrap( const handleChange = useCallback( (state: connection.State) => { - if (ref.current.state.status !== state.status) { + if (ref.current.state.status !== state.status) addStatus({ variant: CONNECTION_STATE_VARIANT[state.status], message: state.message ?? caseconv.capitalize(state.status), }); - } setState((prev) => ({ ...prev, state })); }, [addStatus], diff --git a/pluto/src/synnax/aether/provider.ts b/pluto/src/synnax/aether/provider.ts index 8ad1be00d6..5eeda54e24 100644 --- a/pluto/src/synnax/aether/provider.ts +++ b/pluto/src/synnax/aether/provider.ts @@ -49,9 +49,8 @@ export class Provider extends aether.Composite { this.prevState.props != null && deep.equal(this.state.props, this.prevState.props) && this.internal.synnax != null - ) { + ) return; - } this.internal.synnax = new Synnax(this.state.props); this.internal.synnax.connectivity.onChange((state) => diff --git a/pluto/src/tabs/Selector.tsx b/pluto/src/tabs/Selector.tsx index 8b01979bbc..abe957e4ed 100644 --- a/pluto/src/tabs/Selector.tsx +++ b/pluto/src/tabs/Selector.tsx @@ -21,7 +21,7 @@ import { CSS } from "@/css"; import { Icon as PIcon } from "@/icon"; import { Menu } from "@/menu"; import { useContext } from "@/tabs/Tabs"; -import { Spec } from "@/tabs/types"; +import { type Spec } from "@/tabs/types"; import { Text } from "@/text"; import { type ComponentSize } from "@/util/component"; diff --git a/pluto/src/tabs/Tabs.tsx b/pluto/src/tabs/Tabs.tsx index 28147afbda..6c9512b5e9 100644 --- a/pluto/src/tabs/Tabs.tsx +++ b/pluto/src/tabs/Tabs.tsx @@ -23,7 +23,7 @@ import { CSS } from "@/css"; import { useSyncedRef } from "@/hooks"; import { state } from "@/state"; import { Selector, type SelectorProps } from "@/tabs/Selector"; -import { type RenderProp, type Spec, Tab } from "@/tabs/types"; +import { type RenderProp, type Spec, type Tab } from "@/tabs/types"; import { type ComponentSize } from "@/util/component"; /** @@ -56,7 +56,7 @@ export const rename = (key: string, name: string, tabs: Tab[]): Tab[] => { if (name.length === 0) return tabs; const t = tabs.find((t) => t.tabKey === key); if (t == null || t.name === name) return tabs; - return tabs.map((t) => (t.tabKey === key ? { ...t, name: name } : t)); + return tabs.map((t) => (t.tabKey === key ? { ...t, name } : t)); }; /** Props for the {@link useStatic} hook. */ @@ -300,10 +300,10 @@ export const Content = (): ReactNode | null => { let content: ReactNode = null; const selectedTab = tabs.find((tab) => tab.tabKey === selected); if (selected == null || selectedTab == null) return emptyContent ?? null; - if (renderProp != null) { + if (renderProp != null) if (typeof renderProp === "function") content = renderProp(selectedTab); else content = renderProp; - } else if (selectedTab.content != null) content = selectedTab.content as ReactNode; + else if (selectedTab.content != null) content = selectedTab.content as ReactNode; return (
onSelect?.(selected)}> {content} diff --git a/pluto/src/tabs/types.ts b/pluto/src/tabs/types.ts index eed7bd862c..00016459a1 100644 --- a/pluto/src/tabs/types.ts +++ b/pluto/src/tabs/types.ts @@ -7,10 +7,10 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { ReactElement, ReactNode } from "react"; +import { type ReactElement, type ReactNode } from "react"; import { z } from "zod"; -import { RenderProp as BaseRenderProp } from "@/util/renderProp"; +import { type RenderProp as BaseRenderProp } from "@/util/renderProp"; export const specZ = z.object({ tabKey: z.string(), diff --git a/pluto/src/tag/Tag.tsx b/pluto/src/tag/Tag.tsx index 6284aa9b98..e32bde4dbf 100644 --- a/pluto/src/tag/Tag.tsx +++ b/pluto/src/tag/Tag.tsx @@ -10,7 +10,7 @@ import "@/tag/Tag.css"; import { Icon } from "@synnaxlabs/media"; -import { Optional } from "@synnaxlabs/x"; +import { type Optional } from "@synnaxlabs/x"; import { type ReactElement } from "react"; import { Button } from "@/button"; diff --git a/pluto/src/telem/Pipeline.tsx b/pluto/src/telem/Pipeline.tsx index e2be450800..75a4cc2564 100644 --- a/pluto/src/telem/Pipeline.tsx +++ b/pluto/src/telem/Pipeline.tsx @@ -9,6 +9,4 @@ import { type ReactElement } from "react"; -export const PipelineAssembler = (): ReactElement => { - return <>; -}; +export const PipelineAssembler = (): ReactElement => <>; diff --git a/pluto/src/telem/aether/noop.ts b/pluto/src/telem/aether/noop.ts index 1683ca7572..b0e1cd1284 100644 --- a/pluto/src/telem/aether/noop.ts +++ b/pluto/src/telem/aether/noop.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { bounds, observe, Series, TimeStamp } from "@synnaxlabs/x"; +import { bounds, observe, type Series, TimeStamp } from "@synnaxlabs/x"; import { color } from "@/color/core"; import { type status } from "@/status/aether"; @@ -23,8 +23,8 @@ import { type NumberSinkSpec, type NumberSource, type NumberSourceSpec, - SeriesSource, - SeriesSourceSpec, + type SeriesSource, + type SeriesSourceSpec, type Spec, type StatusSourceSpec, type StringSourceSpec, diff --git a/pluto/src/telem/aether/pipeline.ts b/pluto/src/telem/aether/pipeline.ts index 8b1a63aca4..93ce0ac6e1 100644 --- a/pluto/src/telem/aether/pipeline.ts +++ b/pluto/src/telem/aether/pipeline.ts @@ -114,14 +114,12 @@ export class SourcePipeline export const sourcePipeline = ( valueType: V, props: SourcePipelineProps, -): SourceSpec => { - return { - variant: "source", - props, - type: SourcePipeline.TYPE, - valueType, - }; -}; +): SourceSpec => ({ + variant: "source", + props, + type: SourcePipeline.TYPE, + valueType, +}); export const sinkPipelinePropsZ = z.object({ connections: z.array(connectionZ), @@ -163,9 +161,7 @@ export class SinkPipeline const fromSink = this.sinks[from]; const toSink = this.sinks[to]; if (fromSink == null || toSink == null) return; - if ("setSinks" in fromSink) { - fromSink.setSinks({ [to]: toSink }); - } + if ("setSinks" in fromSink) fromSink.setSinks({ [to]: toSink }); }); } diff --git a/pluto/src/telem/aether/remote.spec.ts b/pluto/src/telem/aether/remote.spec.ts index fc9abc3170..0c9638324f 100644 --- a/pluto/src/telem/aether/remote.spec.ts +++ b/pluto/src/telem/aether/remote.spec.ts @@ -207,12 +207,8 @@ describe("remote", () => { async retrieveChannel(key: channel.KeyOrName): Promise { this.retrieveChannelMock(key); - if (key === this.channel.key) { - return this.channel; - } - if (key === this.channel.index) { - return this.indexChannel; - } + if (key === this.channel.key) return this.channel; + if (key === this.channel.index) return this.indexChannel; throw new Error(`Channel with key ${key} not found`); } @@ -346,12 +342,8 @@ describe("remote", () => { }; async retrieveChannel(key: channel.KeyOrName): Promise { - if (key === this.channel.key) { - return this.channel; - } - if (key === this.channel.index) { - return this.indexChannel; - } + if (key === this.channel.key) return this.channel; + if (key === this.channel.index) return this.indexChannel; throw new Error(`Channel with key ${key} not found`); } diff --git a/pluto/src/telem/aether/telem.ts b/pluto/src/telem/aether/telem.ts index ac7cccd35b..e95e3e8c3f 100644 --- a/pluto/src/telem/aether/telem.ts +++ b/pluto/src/telem/aether/telem.ts @@ -139,12 +139,11 @@ export class Base

extends observe.BaseObserver { if (this.props_ == null) { const res = this._schema.safeParse(this.uProps_); if (res.success) this.props_ = res.data; - else { + else throw new ValidationError( `[BaseTelem] - expected props to be valid, but found the following errors: ${res.error.message}`, ); - } } return this.props_; } diff --git a/pluto/src/telem/aether/transformers.ts b/pluto/src/telem/aether/transformers.ts index 38cf692b53..e62b496aa4 100644 --- a/pluto/src/telem/aether/transformers.ts +++ b/pluto/src/telem/aether/transformers.ts @@ -10,6 +10,7 @@ import { bounds } from "@synnaxlabs/x"; import { z } from "zod"; +import { notationZ, stringifyNumber as stringify } from "@/notation/notation"; import { status } from "@/status/aether"; import { type Factory } from "@/telem/aether/factory"; import { @@ -158,6 +159,7 @@ export const stringifyNumberProps = z.object({ precision: z.number().optional().default(2), prefix: z.string().optional().default(""), suffix: z.string().optional().default(""), + notation: notationZ.optional().default("standard"), }); export class StringifyNumber extends UnarySourceTransformer< @@ -170,9 +172,7 @@ export class StringifyNumber extends UnarySourceTransformer< schema = StringifyNumber.propsZ; protected transform(value: number): string { - return `${this.props.prefix}${value.toFixed(this.props.precision)}${ - this.props.suffix - }`; + return `${this.props.prefix}${stringify(value, this.props.precision, this.props.notation)}${this.props.suffix}`; } } @@ -206,9 +206,7 @@ export class RollingAverage extends UnarySourceTransformer< protected shouldNotify(value: number): boolean { if (this.props.windowSize < 2) return true; - if (this.values.length > this.props.windowSize) { - this.values = []; - } + if (this.values.length > this.props.windowSize) this.values = []; this.values.push(value); return this.values.length === this.props.windowSize; } diff --git a/pluto/src/telem/client/cache/cache.ts b/pluto/src/telem/client/cache/cache.ts index beb7aeddc2..968b5fa5d4 100644 --- a/pluto/src/telem/client/cache/cache.ts +++ b/pluto/src/telem/client/cache/cache.ts @@ -10,7 +10,7 @@ import { type channel, TimeSpan, UnexpectedError } from "@synnaxlabs/client"; import { type Required } from "@synnaxlabs/x"; -import { DynamicProps } from "@/telem/client/cache/dynamic"; +import { type DynamicProps } from "@/telem/client/cache/dynamic"; import { DEFAULT_STATIC_PROPS, type StaticProps, diff --git a/pluto/src/telem/client/cache/dynamic.spec.ts b/pluto/src/telem/client/cache/dynamic.spec.ts index 6c60fa2934..59b1b4a75c 100644 --- a/pluto/src/telem/client/cache/dynamic.spec.ts +++ b/pluto/src/telem/client/cache/dynamic.spec.ts @@ -150,9 +150,7 @@ describe("DynamicCache", () => { }); it("should allocate a buffer properly using a TimeSpan", () => { let nowF = () => TimeStamp.seconds(1); - const now = () => { - return nowF(); - }; + const now = () => nowF(); const cache = new Dynamic({ dynamicBufferSize: TimeSpan.minutes(5), dataType: DataType.FLOAT32, diff --git a/pluto/src/telem/client/cache/dynamic.ts b/pluto/src/telem/client/cache/dynamic.ts index 3cb17d7427..971d360c22 100644 --- a/pluto/src/telem/client/cache/dynamic.ts +++ b/pluto/src/telem/client/cache/dynamic.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { DataType, math, Series, TimeSpan, TimeStamp } from "@synnaxlabs/x"; +import { DataType, math, Series, type TimeSpan, TimeStamp } from "@synnaxlabs/x"; import { convertSeriesFloat32 } from "@/telem/aether/convertSeries"; diff --git a/pluto/src/telem/client/cache/static.ts b/pluto/src/telem/client/cache/static.ts index 4ad14d8498..e90cbe1ac4 100644 --- a/pluto/src/telem/client/cache/static.ts +++ b/pluto/src/telem/client/cache/static.ts @@ -162,13 +162,13 @@ export class Static { instrumentation: { L }, } = this.props; const allBounds = this.data.map((s) => s.data.alignmentBounds); - const invalid = allBounds.some((b, i) => { - return allBounds.some((b2, j) => { + const invalid = allBounds.some((b, i) => + allBounds.some((b2, j) => { if (i === j) return false; const ok = bounds.overlapsWith(b, b2); return ok; - }); - }); + }), + ); if (invalid) { L.debug("Cache is in an invalid state - bounds overlap!", () => ({ write: write.map((s) => s.digest), diff --git a/pluto/src/telem/client/reader.ts b/pluto/src/telem/client/reader.ts index afa7ae518b..709d68aac2 100644 --- a/pluto/src/telem/client/reader.ts +++ b/pluto/src/telem/client/reader.ts @@ -186,9 +186,7 @@ export class Reader { r.end.span(tr.end).lessThan(TimeSpan.milliseconds(5)), ); if (groupWith == null) compressedToFetch.push([tr, keys]); - else { - groupWith[1] = new Set([...groupWith[1], ...keys]); - } + else groupWith[1] = new Set([...groupWith[1], ...keys]); }); L.debug("batch read", { toFetch: compressedToFetch.map(([r, k]) => ({ diff --git a/pluto/src/telem/control/Controller.tsx b/pluto/src/telem/control/Controller.tsx index 9652a668b3..0c79794741 100644 --- a/pluto/src/telem/control/Controller.tsx +++ b/pluto/src/telem/control/Controller.tsx @@ -51,9 +51,7 @@ export const Controller = Aether.wrap( useEffect(() => { setState((state) => ({ ...state, ...memoProps })); }, [memoProps, setState]); - useEffect(() => { - return () => onStatusChange?.("released"); - }, []); + useEffect(() => () => onStatusChange?.("released"), []); return ( diff --git a/pluto/src/telem/control/Legend.tsx b/pluto/src/telem/control/Legend.tsx index ea3a37b91d..bfa5b4ec9b 100644 --- a/pluto/src/telem/control/Legend.tsx +++ b/pluto/src/telem/control/Legend.tsx @@ -40,9 +40,7 @@ export const Legend = Aether.wrap( const subjects = unique(states.map((s) => s.subject.key)); const data = subjects.map((s) => { const d = states.find((s2) => s2.subject.key === s); - if (d == null) { - throw new UnexpectedError("Legend subject not found"); - } + if (d == null) throw new UnexpectedError("Legend subject not found"); return { key: d.subject.key, label: d.subject.name, color: d.subjectColor }; }); diff --git a/pluto/src/telem/control/aether/chip.ts b/pluto/src/telem/control/aether/chip.ts index f0c8caf694..cf964b34fb 100644 --- a/pluto/src/telem/control/aether/chip.ts +++ b/pluto/src/telem/control/aether/chip.ts @@ -42,11 +42,10 @@ export class Chip extends aether.Leaf { ); this.internal.sink = await telem.useSink(this.ctx, sinkProps, this.internal.sink); - if (this.state.triggered && !this.prevState.triggered) { + if (this.state.triggered && !this.prevState.triggered) this.internal.sink .set(this.state.status.data?.authority !== Authority.Absolute.valueOf()) .catch(console.error); - } await this.updateEnabledState(); this.internal.stopListening?.(); @@ -57,9 +56,8 @@ export class Chip extends aether.Leaf { private async updateEnabledState(): Promise { const nextStatus = await this.internal.source.value(); - if (!nextStatus.time.equals(this.state.status.time)) { + if (!nextStatus.time.equals(this.state.status.time)) this.setState((p) => ({ ...p, status: nextStatus, triggered: false })); - } } async afterDelete(): Promise { diff --git a/pluto/src/telem/control/aether/controller.ts b/pluto/src/telem/control/aether/controller.ts index 0b877b7f0b..ed9cdceb35 100644 --- a/pluto/src/telem/control/aether/controller.ts +++ b/pluto/src/telem/control/aether/controller.ts @@ -11,13 +11,17 @@ import { type Instrumentation } from "@synnaxlabs/alamos"; import { channel, control, - framer, + type framer, type Synnax, TimeStamp, UnexpectedError, } from "@synnaxlabs/client"; -import { compare, CrudeSeries, type Destructor } from "@synnaxlabs/x"; -import { control as xControl } from "@synnaxlabs/x"; +import { + compare, + control as xControl, + type CrudeSeries, + type Destructor, +} from "@synnaxlabs/x"; import { z } from "zod"; import { aether } from "@/aether/aether"; @@ -102,9 +106,8 @@ export class Controller } private async updateNeedsControlOf(): Promise { - if (this.internal.client == null) { + if (this.internal.client == null) throw new UnexpectedError("No cluster connected but channelKeys were requested"); - } const keys = new Set([]); for (const telem of this.registry.keys()) { diff --git a/pluto/src/telem/control/aether/state.ts b/pluto/src/telem/control/aether/state.ts index 2ded989acb..d5e9e4a703 100644 --- a/pluto/src/telem/control/aether/state.ts +++ b/pluto/src/telem/control/aether/state.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { type Instrumentation } from "@synnaxlabs/alamos"; -import { channel, control, type Synnax, UnexpectedError } from "@synnaxlabs/client"; +import { type channel, control, type Synnax, UnexpectedError } from "@synnaxlabs/client"; import { type Destructor, observe, unique } from "@synnaxlabs/x"; import { z } from "zod"; diff --git a/pluto/src/text/DateTime.tsx b/pluto/src/text/DateTime.tsx index fde8fca8fa..555683366f 100644 --- a/pluto/src/text/DateTime.tsx +++ b/pluto/src/text/DateTime.tsx @@ -16,8 +16,7 @@ import { import { type ForwardedRef, forwardRef, type ReactElement } from "react"; import { type text } from "@/text/core"; -import type { TextProps } from "@/text/Text"; -import { Text } from "@/text/Text"; +import { Text, type TextProps } from "@/text/Text"; export type DateTimeProps = Omit< TextProps, diff --git a/pluto/src/text/Editable.tsx b/pluto/src/text/Editable.tsx index 4b7cea894a..f002393032 100644 --- a/pluto/src/text/Editable.tsx +++ b/pluto/src/text/Editable.tsx @@ -9,8 +9,14 @@ import "@/text/Editable.css"; -import type { KeyboardEvent, ReactElement } from "react"; -import { useEffect, useLayoutEffect, useRef, useState } from "react"; +import { + type KeyboardEvent, + type ReactElement, + useEffect, + useLayoutEffect, + useRef, + useState, +} from "react"; import { CSS } from "@/css"; import { type Input } from "@/input"; diff --git a/pluto/src/text/SelectLevel.tsx b/pluto/src/text/SelectLevel.tsx index ba7e09f085..9c10276a0c 100644 --- a/pluto/src/text/SelectLevel.tsx +++ b/pluto/src/text/SelectLevel.tsx @@ -22,26 +22,11 @@ export interface SelectLevelProps extends Omit, "data" | "entryRenderKey"> {} const DATA: Entry[] = [ - { - key: "h2", - label: "XL", - }, - { - key: "h3", - label: "L", - }, - { - key: "h4", - label: "M", - }, - { - key: "h5", - label: "S", - }, - { - key: "small", - label: "XS", - }, + { key: "h2", label: "XL" }, + { key: "h3", label: "L" }, + { key: "h4", label: "M" }, + { key: "h5", label: "S" }, + { key: "small", label: "XS" }, ]; const defaultSelectDirectionButton = ({ @@ -49,25 +34,21 @@ const defaultSelectDirectionButton = ({ entry, onClick, selected, -}: ButtonOptionProps): ReactElement => { - return ( - - {entry.label} - - ); -}; +}: ButtonOptionProps): ReactElement => ( + + {entry.label} + +); export const SelectLevel = ({ children = defaultSelectDirectionButton, ...props -}: SelectLevelProps): ReactElement => { - return ( - - ); -}; +}: SelectLevelProps): ReactElement => ( + +); diff --git a/pluto/src/text/WithIcon.tsx b/pluto/src/text/WithIcon.tsx index 2d4c3ed869..a65b583251 100644 --- a/pluto/src/text/WithIcon.tsx +++ b/pluto/src/text/WithIcon.tsx @@ -99,9 +99,9 @@ export const formatChildren = ( typeof child === "string" || typeof child === "number" || !isValidElement(child) - ) { + ) buff.push(child); - } else { + else { if (buff.length > 0) { o.push( // @ts-expect-error - level type errors diff --git a/pluto/src/text/dimensions.ts b/pluto/src/text/dimensions.ts index dba04d6bd2..2d04f57c15 100644 --- a/pluto/src/text/dimensions.ts +++ b/pluto/src/text/dimensions.ts @@ -12,7 +12,7 @@ import { type dimensions as core, runtime } from "@synnaxlabs/x"; let canvas: HTMLCanvasElement | null = null; const getCanvas = (): HTMLCanvasElement => { - if (canvas == null) canvas = document.createElement("canvas"); + canvas ??= document.createElement("canvas"); return canvas; }; @@ -22,8 +22,7 @@ export const dimensions = ( context?: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D, ): core.Dimensions => { if (runtime.RUNTIME === "node") return { width: 0, height: 0 }; - if (context == null) - context = getCanvas().getContext("2d") as CanvasRenderingContext2D; + context ??= getCanvas().getContext("2d") as CanvasRenderingContext2D; context.font = font; const metrics = context.measureText(text); return { diff --git a/pluto/src/theming/theming.spec.tsx b/pluto/src/theming/theming.spec.tsx index 994b20d8f4..0f1a63c650 100644 --- a/pluto/src/theming/theming.spec.tsx +++ b/pluto/src/theming/theming.spec.tsx @@ -23,13 +23,11 @@ const TestThemeContent = (): ReactElement => { ); }; -const TestTheme = (): ReactElement => { - return ( - - - - ); -}; +const TestTheme = (): ReactElement => ( + + + +); describe("Theming", () => { it("should render a theme", () => { diff --git a/pluto/src/tooltip/Dialog.tsx b/pluto/src/tooltip/Dialog.tsx index 0b86d4edf8..1a31e2ad9b 100644 --- a/pluto/src/tooltip/Dialog.tsx +++ b/pluto/src/tooltip/Dialog.tsx @@ -96,16 +96,15 @@ export const chooseLocation = ( const parse = location.location.safeParse(cornerOrLocation); const chooseRemainingLocation = (first: location.Location): location.Location => { let preferences: location.Location[]; - if (first === "center") { - preferences = OUTER_LOCATION_PREFERENCES; - } else if (location.isX(first)) preferences = ["center", ...Y_LOCATION_PREFERENCES]; + if (first === "center") preferences = OUTER_LOCATION_PREFERENCES; + else if (location.isX(first)) preferences = ["center", ...Y_LOCATION_PREFERENCES]; else preferences = ["center", ...X_LOCATION_PREFERENCES]; return location.construct(bestLocation(target, window, preferences)); }; - if (parse.success) { + if (parse.success) return location.constructXY(parse.data, chooseRemainingLocation(parse.data)); - } else if (cornerOrLocation != null) { + if (cornerOrLocation != null) { const v = { ...(cornerOrLocation as Partial) }; if (v.x == null && v.y != null) v.x = chooseRemainingLocation(location.construct(v.y)) as location.X; @@ -298,8 +297,7 @@ export const Dialog = ({ }; export const formatTip = (tip: ReactNode): ReactNode => { - if (typeof tip === "string" || typeof tip === "number" || !isValidElement(tip)) { + if (typeof tip === "string" || typeof tip === "number" || !isValidElement(tip)) return {tip as string | number}; - } return tip; }; diff --git a/pluto/src/tree/Tree.tsx b/pluto/src/tree/Tree.tsx index 76d4f721d1..467fa2f8d3 100644 --- a/pluto/src/tree/Tree.tsx +++ b/pluto/src/tree/Tree.tsx @@ -10,7 +10,7 @@ import "@/tree/Tree.css"; import { Icon } from "@synnaxlabs/media"; -import { Optional, unique } from "@synnaxlabs/x"; +import { type Optional, unique } from "@synnaxlabs/x"; import { type FC, memo, @@ -27,7 +27,7 @@ import { Haul } from "@/haul"; import { useCombinedStateAndRef, useSyncedRef } from "@/hooks"; import { List } from "@/list"; import { - UseSelectMultipleProps, + type UseSelectMultipleProps, type UseSelectOnChangeExtra, type UseSelectProps, } from "@/list/useSelect"; @@ -83,9 +83,10 @@ export const use = (props: UseProps): UseReturn => { value: propsSelected, onChange: onSelectedChange, }); - const flat = useMemo(() => { - return flatten({ nodes, expanded, sort }); - }, [nodes, expanded, sort]); + const flat = useMemo( + () => flatten({ nodes, expanded, sort }), + [nodes, expanded, sort], + ); const flatRef = useSyncedRef(flat); const shiftRef = Triggers.useHeldRef({ triggers: SHIFT_TRIGGERS }); @@ -103,7 +104,7 @@ export const use = (props: UseProps): UseReturn => { const action = currentlyExpanded.some((key) => key === clicked) ? "contract" : "expand"; - let nextExpanded = currentlyExpanded; + let nextExpanded: string[]; if (action === "contract") nextExpanded = currentlyExpanded.filter((key) => key !== clicked); else nextExpanded = [...currentlyExpanded, clicked]; diff --git a/pluto/src/tree/core.ts b/pluto/src/tree/core.ts index bbb89a89c3..5f9b955392 100644 --- a/pluto/src/tree/core.ts +++ b/pluto/src/tree/core.ts @@ -48,9 +48,7 @@ export interface FlattenProps { } export const sortAndSplice = (nodes: Node[], sort: boolean): Node[] => { - if (sort) { - nodes.sort((a, b) => compare.stringsWithNumbers(a.name, b.name)); - } + if (sort) nodes.sort((a, b) => compare.stringsWithNumbers(a.name, b.name)); let found = false; for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; @@ -135,7 +133,7 @@ export const setNode = ({ tree, destination, additions }: SetNodeProps): Node[] additions = toArray(additions); const node = findNode({ tree, key: destination }); if (node == null) throw new Error(`Could not find node with key ${destination}`); - if (node.children == null) node.children = []; + node.children ??= []; const addedKeys = additions.map((node) => node.key); node.children = [ ...additions, @@ -167,14 +165,14 @@ export const updateNode = ({ // splice the updated node into the parent's children const index = parent.children?.findIndex((child) => child.key === key); if (index != null && index !== -1) parent.children?.splice(index, 1, updater(node)); - } else { - // we're in the root, so just update the node + } + // we're in the root, so just update the node + else tree.splice( tree.findIndex((node) => node.key === key), 1, updater(node), ); - } return tree; }; @@ -247,13 +245,12 @@ export interface FindNodeParentProps { } export const findNodeParent = ({ tree, key }: FindNodeParentProps): Node | null => { - for (const node of tree) { + for (const node of tree) if (node.children != null) { if (node.children.some((child) => child.key === key)) return node; const found = findNodeParent({ tree: node.children, key }); if (found != null) return found; } - } return null; }; diff --git a/pluto/src/triggers/Provider.tsx b/pluto/src/triggers/Provider.tsx index 17c297fc19..67bd6f1b54 100644 --- a/pluto/src/triggers/Provider.tsx +++ b/pluto/src/triggers/Provider.tsx @@ -24,7 +24,7 @@ import { type Callback, eventKey, match, - MatchOptions, + type MatchOptions, MOUSE_KEYS, type MouseKey, type Trigger, diff --git a/pluto/src/triggers/hooks.tsx b/pluto/src/triggers/hooks.tsx index c9564eb2ae..41ea330c91 100644 --- a/pluto/src/triggers/hooks.tsx +++ b/pluto/src/triggers/hooks.tsx @@ -22,7 +22,7 @@ import { useContext } from "@/triggers/Provider"; import { diff, filter, - MatchOptions, + type MatchOptions, purge, type Stage, type Trigger, @@ -117,12 +117,9 @@ export const useHeldRef = ({ triggers, callback: useCallback((e: UseEvent) => { setRef((prev) => { - let next: Trigger[] = []; - if (e.stage === "start") { - next = unique([...prev.triggers, ...e.triggers]); - } else { - next = purge(prev.triggers, e.triggers); - } + let next: Trigger[]; + if (e.stage === "start") next = unique([...prev.triggers, ...e.triggers]); + else next = purge(prev.triggers, e.triggers); return { triggers: next, held: next.length > 0 }; }); }, []), @@ -137,7 +134,7 @@ export const useHeld = ({ triggers, loose }: UseHeldProps): UseHeldReturn => { triggers, callback: useCallback((e: UseEvent) => { setHeld((prev) => { - let next: Trigger[] = []; + let next: Trigger[]; if (e.stage === "start") next = unique([...prev.triggers, ...e.triggers]); else next = purge(prev.triggers, e.triggers); return { triggers: next, held: next.length > 0 }; diff --git a/pluto/src/util/zod.ts b/pluto/src/util/zod.ts index 3e22bf0be6..25d75759d7 100644 --- a/pluto/src/util/zod.ts +++ b/pluto/src/util/zod.ts @@ -19,15 +19,10 @@ export const prettyParse = ( } catch (e) { if (e instanceof z.ZodError) { const errors = e.errors.map((err) => { - if (err.path.length === 0) { - return err.message; - } else { - return `${err.path.join(".")}: ${err.message}`; - } + if (err.path.length === 0) return err.message; + return `${err.path.join(".")}: ${err.message}`; }); throw new Error(`${prefix} - ${errors.join("\n")}`); - } else { - throw e; - } + } else throw e; } }; diff --git a/pluto/src/vis/button/aether/button.ts b/pluto/src/vis/button/aether/button.ts index 2a8c80f02f..4343790ce8 100644 --- a/pluto/src/vis/button/aether/button.ts +++ b/pluto/src/vis/button/aether/button.ts @@ -29,10 +29,8 @@ export class Button extends aether.Leaf { async afterUpdate(): Promise { const { sink: sinkProps } = this.state; - if (this.internal.prevTrigger == null) - this.internal.prevTrigger = this.state.trigger; + this.internal.prevTrigger ??= this.state.trigger; this.internal.sink = await telem.useSink(this.ctx, sinkProps, this.internal.sink); - const prevTrigger = this.internal.prevTrigger; this.internal.prevTrigger = this.state.trigger; if (this.state.trigger <= prevTrigger) return; diff --git a/pluto/src/vis/canvas/Canvas.tsx b/pluto/src/vis/canvas/Canvas.tsx index 52ae0ff638..9a600b63e6 100644 --- a/pluto/src/vis/canvas/Canvas.tsx +++ b/pluto/src/vis/canvas/Canvas.tsx @@ -21,7 +21,7 @@ import { import { Aether } from "@/aether"; import { CSS } from "@/css"; -import { useResize, type UseResizeHandler, UseResizeOpts } from "@/hooks"; +import { useResize, type UseResizeHandler, type UseResizeOpts } from "@/hooks"; import { canvas } from "@/vis/canvas/aether"; type HTMLDivProps = DetailedHTMLProps< diff --git a/pluto/src/vis/canvas/aether/canvas.ts b/pluto/src/vis/canvas/aether/canvas.ts index 015e124fdc..f11983c051 100644 --- a/pluto/src/vis/canvas/aether/canvas.ts +++ b/pluto/src/vis/canvas/aether/canvas.ts @@ -37,11 +37,10 @@ export class Canvas extends aether.Composite { async afterUpdate(): Promise { let renderCtx = render.Context.useOptional(this.ctx); if (renderCtx == null) { - if (this.renderContextSet) { + if (this.renderContextSet) throw new UnexpectedError( "[vis.worker.Canvas] - expected render context to be set", ); - } if (!this.state.bootstrap) return; const { glCanvas, lower2dCanvas, upper2dCanvas, os } = this.state; if (glCanvas == null || lower2dCanvas == null || upper2dCanvas == null) diff --git a/pluto/src/vis/diagram/Diagram.tsx b/pluto/src/vis/diagram/Diagram.tsx index 352dd3abd9..e51b53d633 100644 --- a/pluto/src/vis/diagram/Diagram.tsx +++ b/pluto/src/vis/diagram/Diagram.tsx @@ -8,23 +8,11 @@ // included in the file licenses/APL.txt. import "@/vis/diagram/Diagram.css"; -import "reactflow/dist/style.css"; +import "@xyflow/react/dist/base.css"; import { Icon } from "@synnaxlabs/media"; import { box, location, xy } from "@synnaxlabs/x"; import { - type ComponentPropsWithoutRef, - createContext, - memo, - type ReactElement, - useCallback, - useContext as reactUseContext, - useEffect, - useMemo, - useRef, - useState, -} from "react"; -import ReactFlow, { addEdge as rfAddEdge, applyEdgeChanges as rfApplyEdgeChanges, applyNodeChanges as rfApplyNodeChanges, @@ -35,9 +23,12 @@ import ReactFlow, { type EdgeChange as RFEdgeChange, type EdgeProps as RFEdgeProps, type FitViewOptions, + type IsValidConnection, + type Node as RFNode, type NodeChange as RFNodeChange, type NodeProps as RFNodeProps, type ProOptions, + ReactFlow, type ReactFlowProps, ReactFlowProvider, reconnectEdge, @@ -45,8 +36,20 @@ import ReactFlow, { useOnViewportChange as useRFOnViewportChange, useReactFlow, type Viewport as RFViewport, -} from "reactflow"; -import { z } from "zod"; +} from "@xyflow/react"; +import { + type ComponentPropsWithoutRef, + createContext, + memo, + type ReactElement, + useCallback, + useContext as reactUseContext, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { type z } from "zod"; import { Aether } from "@/aether"; import { Align } from "@/align"; @@ -66,6 +69,7 @@ import { edgeConverter, type Node, nodeConverter, + type RFEdgeData, translateEdgesForward, translateNodesForward, translateViewportBackward, @@ -115,8 +119,7 @@ export const use = ({ }; }; -const isValidConnection = (connection: RFConnection): boolean => - connection.source !== connection.target; +const isValidConnection: IsValidConnection = (): boolean => true; export interface UseReturn { edges: Edge[]; @@ -149,9 +152,9 @@ const NOT_EDITABLE_PROPS: ReactFlowProps = { zoomOnDoubleClick: false, zoomOnPinch: false, edgesFocusable: false, - edgesUpdatable: false, + edgesReconnectable: false, nodesFocusable: false, - edgeUpdaterRadius: 0, + reconnectRadius: 0, }; const FIT_VIEW_OPTIONS: FitViewOptions = { @@ -291,15 +294,18 @@ const Core = Aether.wrap( const nodeTypes = useMemo( () => ({ - custom: ({ id, xPos: x, yPos: y, selected }: RFNodeProps) => { - return renderer({ symbolKey: id, position: { x, y }, selected }); - }, + custom: ({ + id, + positionAbsoluteX: x, + positionAbsoluteY: y, + selected = false, + }: RFNodeProps) => renderer({ symbolKey: id, position: { x, y }, selected }), }), [renderer], ); const edgesRef = useRef(edges); - const edges_ = useMemo(() => { + const edges_ = useMemo[]>(() => { edgesRef.current = edges; return translateEdgesForward(edges); }, [edges]); @@ -318,7 +324,7 @@ const Core = Aether.wrap( ); const handleEdgesChange = useCallback( - (changes: RFEdgeChange[]) => + (changes: RFEdgeChange>[]) => onEdgesChange( edgeConverter( edgesRef.current, @@ -330,7 +336,7 @@ const Core = Aether.wrap( ); const handleEdgeUpdate = useCallback( - (oldEdge: RFEdge, newConnection: RFConnection) => + (oldEdge: RFEdge, newConnection: RFConnection) => onEdgesChange( edgeConverter( edgesRef.current, @@ -368,12 +374,12 @@ const Core = Aether.wrap( const edgeTypes = useMemo( () => ({ - default: (props: RFEdgeProps) => ( + default: (props: RFEdgeProps>) => ( handleEdgeSegmentsChangeRef.current(props.id, segment), [props.id], @@ -426,10 +432,11 @@ const Core = Aether.wrap( {visible && ( - > {...triggerProps} className={CSS(CSS.B("diagram"), CSS.editable(editable))} nodes={nodes_} + // @ts-expect-error - edge types edges={edges_} nodeTypes={nodeTypes} edgeTypes={edgeTypes} @@ -438,7 +445,7 @@ const Core = Aether.wrap( onNodesChange={handleNodesChange} onEdgesChange={handleEdgesChange} onConnect={handleConnect} - onEdgeUpdate={handleEdgeUpdate} + onReconnect={handleEdgeUpdate} defaultViewport={translateViewportForward(viewport)} connectionLineComponent={CustomConnectionLine} elevateEdgesOnSelect diff --git a/pluto/src/vis/diagram/aether/types.ts b/pluto/src/vis/diagram/aether/types.ts index 6900c7c348..2c3262a7b8 100644 --- a/pluto/src/vis/diagram/aether/types.ts +++ b/pluto/src/vis/diagram/aether/types.ts @@ -8,7 +8,7 @@ // included in the file licenses/APL.txt. import { xy } from "@synnaxlabs/x"; -import type * as rf from "reactflow"; +import type * as rf from "@xyflow/react"; import { z } from "zod"; import { color } from "@/color/core"; @@ -135,11 +135,11 @@ export const nodeZ = z.object({ */ zIndex: z.number().optional(), - id: z.string().optional(), type: z.string().optional(), - data: z.unknown().optional(), - width: z.number().optional().nullable(), - height: z.number().optional().nullable(), + data: z.record(z.unknown()).optional(), + measured: z + .object({ width: z.number().optional(), height: z.number().optional() }) + .optional(), }); /** @@ -152,10 +152,12 @@ export type Node = z.infer; */ export const translateNodesForward = (nodes: Node[]): rf.Node[] => nodes.map((node) => ({ - ...node, id: node.key, type: "custom", zIndex: node.zIndex, + measured: { ...node.measured }, + position: { ...node.position }, + selected: node.selected, data: {}, })); @@ -181,7 +183,7 @@ export const translateEdgesBackward = ( defaultColor: color.Crude, ): Edge[] => edges.map((edge) => { - if (edge.data == null) edge.data = { segments: [], color: defaultColor }; + edge.data ??= { segments: [], color: defaultColor }; return { key: edge.id, segments: edge.data?.segments ?? [], @@ -214,6 +216,6 @@ export const nodeConverter = ( export const edgeConverter = ( edges: Edge[], - f: (edges: rf.Edge[]) => rf.Edge[], + f: (edges: rf.Edge[]) => rf.Edge[], color: color.Crude, ): Edge[] => translateEdgesBackward(f(translateEdgesForward(edges)), color); diff --git a/pluto/src/vis/diagram/align.spec.ts b/pluto/src/vis/diagram/align.spec.ts index 43e40e29fa..27a5988e4a 100644 --- a/pluto/src/vis/diagram/align.spec.ts +++ b/pluto/src/vis/diagram/align.spec.ts @@ -7,11 +7,11 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { box,xy } from "@synnaxlabs/x"; +import { box, xy } from "@synnaxlabs/x"; import { describe, expect, it } from "vitest"; import { alignNodes } from "@/vis/diagram/align"; -import { HandleLayout,NodeLayout } from "@/vis/diagram/util"; +import { HandleLayout, NodeLayout } from "@/vis/diagram/util"; describe("align", () => { interface Spec { @@ -156,10 +156,9 @@ describe("align", () => { THREE_NODES_SAME_DIMS_DIFF_HANDLES, ]; - for (const spec of SPECS) { + for (const spec of SPECS) it(spec.name, () => { const outputs = alignNodes(spec.inputs); expect(outputs.map((o) => box.topLeft(o.box))).toEqual(spec.outputs); }); - } }); diff --git a/pluto/src/vis/diagram/edge/Edge.tsx b/pluto/src/vis/diagram/edge/Edge.tsx index f4c2c55812..970c6ab6c4 100644 --- a/pluto/src/vis/diagram/edge/Edge.tsx +++ b/pluto/src/vis/diagram/edge/Edge.tsx @@ -10,6 +10,13 @@ import "@/vis/diagram/edge/Edge.css"; import { box, direction, location, xy } from "@synnaxlabs/x"; +import { + BaseEdge, + type ConnectionLineComponentProps, + type EdgeProps as RFEdgeProps, + type Position, + useReactFlow, +} from "@xyflow/react"; import { type DragEvent, Fragment, @@ -17,13 +24,6 @@ import { useCallback, useRef, } from "react"; -import { - BaseEdge, - type ConnectionLineComponentProps, - type EdgeProps as RFEdgeProps, - type Position, - useReactFlow, -} from "reactflow"; import { Color } from "@/color"; import { CSS } from "@/css"; @@ -62,15 +62,15 @@ export const CustomConnectionLine = ({ const res = location.outer.safeParse(toNodeHandle[1]); if (res.success) toPosition = res.data as Position; } + const flow = useReactFlow(); const conn = connector.buildNew({ sourcePos: xy.construct(fromX, fromY), targetPos: xy.construct(toX, toY), sourceOrientation: fromPosition, targetOrientation: toPosition, - sourceBox: selectNodeBox(useReactFlow(), fromNode?.id ?? ""), - targetBox: selectNodeBox(useReactFlow(), fromNode?.id ?? ""), + sourceBox: selectNodeBox(flow, fromNode?.id ?? ""), + targetBox: selectNodeBox(flow, fromNode?.id ?? ""), }); - const flow = useReactFlow(); const points = connector.segmentsToPoints( xy.construct(fromX, fromY), conn, @@ -160,7 +160,7 @@ export const Edge = ({ targetBox: selectNodeBox(flow, target), }); } - if (!connector.checkIntegrity({ sourcePos, targetPos, next, prev: segments })) { + if (!connector.checkIntegrity({ sourcePos, targetPos, next, prev: segments })) next = connector.buildNew({ sourcePos, targetPos, @@ -169,7 +169,6 @@ export const Edge = ({ sourceBox: selectNodeBox(flow, source), targetBox: selectNodeBox(flow, target), }); - } sourcePosRef.current = sourcePos; } else if (!targetPosEq) { next = connector.moveTargetNode({ delta: targetDelta, segments: next }); @@ -184,7 +183,7 @@ export const Edge = ({ targetBox: selectNodeBox(flow, target), }); } - if (!connector.checkIntegrity({ sourcePos, targetPos, next, prev: segments })) { + if (!connector.checkIntegrity({ sourcePos, targetPos, next, prev: segments })) next = connector.buildNew({ sourcePos, targetPos, @@ -193,7 +192,6 @@ export const Edge = ({ sourceBox: selectNodeBox(flow, source), targetBox: selectNodeBox(flow, target), }); - } targetPosRef.current = targetPos; } debouncedOnSegmentsChange(next); @@ -298,9 +296,8 @@ export const calcPath = (coords: xy.XY[]): string => { return path; }; -export const calcMidPoints = (points: xy.XY[]): xy.XY[] => { - return points.slice(1).map((p, i) => { +export const calcMidPoints = (points: xy.XY[]): xy.XY[] => + points.slice(1).map((p, i) => { const prev = points[i]; return xy.construct((p.x + prev.x) / 2, (p.y + prev.y) / 2); }); -}; diff --git a/pluto/src/vis/diagram/edge/connector/connector.spec.ts b/pluto/src/vis/diagram/edge/connector/connector.spec.ts index c8fb450301..6797802b39 100644 --- a/pluto/src/vis/diagram/edge/connector/connector.spec.ts +++ b/pluto/src/vis/diagram/edge/connector/connector.spec.ts @@ -154,12 +154,11 @@ describe("connector", () => { BOTTOM_EQUAL_FALSE, ]; - for (const spec of SPECS) { + for (const spec of SPECS) it(spec.name, () => { const actual = connector.needToGoAround(spec.props); expect(actual).toEqual(spec.expected); }); - } }); describe("travelSegments", () => { @@ -200,12 +199,11 @@ describe("connector", () => { const SPECS = [TO_RIGHT, TO_LEFT, TO_TOP, TO_BOTTOM]; - for (const spec of SPECS) { + for (const spec of SPECS) it(spec.name, () => { const actual = connector.travelSegments(spec.source, ...spec.segments); expect(actual).toEqual(spec.expected); }); - } }); describe("stump", () => { @@ -275,12 +273,11 @@ describe("connector", () => { RIGHT_LEFT_TRUE_LONG_WAY, ]; - for (const spec of SPECS) { + for (const spec of SPECS) it(spec.description, () => { const actual = connector.prepareNode(spec.props); expect(actual).toEqual(spec.expected); }); - } }); describe("new connector formation", () => { @@ -440,7 +437,7 @@ describe("connector", () => { LEFT_LEFT_TARGET_EQ_LEFT, ]; - for (const spec of SPECS) { + for (const spec of SPECS) it(spec.name, () => { const actual = connector.buildNew(spec.props); expect(actual).toEqual(spec.expected); @@ -449,7 +446,6 @@ describe("connector", () => { const target = connector.travelSegments(spec.props.sourcePos, ...actual); expect(target).toEqual(spec.props.targetPos); }); - } }); describe("dragging segments", () => { @@ -581,7 +577,7 @@ describe("connector", () => { ADD_SOURCE_STUMP, ]; - for (const spec of SPECS) { + for (const spec of SPECS) it(spec.name, () => { const actual = connector.dragSegment(spec.props); const propsTarget = connector.travelSegments(xy.ZERO, ...spec.props.segments); @@ -591,7 +587,6 @@ describe("connector", () => { expect(actual).toEqual(spec.expected); expect(propsTarget).toEqual(actualTarget); }); - } }); describe("moving nodes", () => { @@ -782,23 +777,6 @@ describe("connector", () => { ], }; - const TIGHT_COMPRESSION: Spec = { - name: "tight compression", - props: { - delta: { x: 1, y: 0 }, - segments: [ - { direction: "x", length: 11 }, - { direction: "y", length: 1 }, - { direction: "x", length: 11 }, - ], - }, - expected: [ - { direction: "x", length: 10 }, - { direction: "y", length: 1 }, - { direction: "x", length: 11 }, - ], - }; - const TIGHT_SINGLE_COMPRESSION: Spec = { name: "tight single compression", props: { @@ -823,29 +801,30 @@ describe("connector", () => { ], }; - // Props: - // | - // T - // | - // S-| - // - // Expected: - // | - // T - // | - // | - // S| - const ORTHOGONAL_REVERSE_STUMP: Spec = { - name: "orthogonal reverse stump", - props: { - delta: { x: 10, y: 0 }, + const TIGHT_COMPRESSION: Spec = { + name: "orthogonal reverse stump -2 ", + props: { + delta: { x: 5, y: 0 }, segments: [ - { direction: "x", length: 10 }, - { direction: "y", length: 30 }, - { direction: "y", length: -10 }, + { direction: "x", length: 2 }, + { direction: "y", length: -133 }, + { direction: "x", length: 9 }, ], }, - expected: [{ direction: "y", length: 20 }], + expected: [ + { + direction: "x", + length: 2, + }, + { + direction: "y", + length: -133, + }, + { + direction: "x", + length: 4, + }, + ], }; const SPECS: Spec[] = [ @@ -858,12 +837,11 @@ describe("connector", () => { DOUBLE_OPPOSITE_ORIENTATION_COMPRESSION_DISCONNECT, OPPOSITE_ORIENTATION_COMPRESSED_DISCONNECT, PARALLEL_ORIENTATION_COMPRESSION, - TIGHT_COMPRESSION, TIGHT_SINGLE_COMPRESSION, ORTHOGONAL_DOWN, - ORTHOGONAL_REVERSE_STUMP, + TIGHT_COMPRESSION, ]; - for (const spec of SPECS) { + for (const spec of SPECS) it(spec.name, () => { const actual = connector.moveSourceNode(spec.props); const expectedTarget = connector.travelSegments(xy.ZERO, ...spec.expected); @@ -871,6 +849,5 @@ describe("connector", () => { expect(actual).toEqual(spec.expected); expect(actualTarget).toEqual(expectedTarget); }); - } }); }); diff --git a/pluto/src/vis/diagram/edge/connector/connector.ts b/pluto/src/vis/diagram/edge/connector/connector.ts index 72a81962d3..7b5983df57 100644 --- a/pluto/src/vis/diagram/edge/connector/connector.ts +++ b/pluto/src/vis/diagram/edge/connector/connector.ts @@ -48,20 +48,20 @@ const internalChangeOrientation = ( { orientation, segments }: ChangeOrientationProps, reverse: boolean, ): Segment[] => { - const stumschematicx = reverse ? segments.length - 1 : 0; + const stumpsPidX = reverse ? segments.length - 1 : 0; let next = [...segments]; - const stump = next[stumschematicx]; + const stump = next[stumpsPidX]; const currOrientation = segmentOrientation(stump); if (currOrientation === orientation) return next; const dir = direction.construct(orientation); const newStumpLength = setOrientationOnLength(orientation, STUMP_LENGTH); next = moveNodeInDirection(dir, xy.set(xy.ZERO, dir, -newStumpLength), next, reverse); - const newStump = { direction: dir, length: newStumpLength }; if (reverse) next.push(newStump); else next.unshift(newStump); return next; }; + export interface PrepareNodeProps { sourceStumpTip: xy.XY; sourceOrientation: location.Outer; @@ -123,9 +123,8 @@ export type Segment = z.infer; export const travelSegments = (source: xy.XY, ...segments: Segment[]): xy.XY => { let current = source; - for (const segment of segments) { + for (const segment of segments) current = xy.translate(current, segment.direction, segment.length); - } return current; }; @@ -230,11 +229,10 @@ const STUMPS = { const COMPRESSION_THRESHOLD = 4; const DIRECT_REMOVAL_THRESHOLD = 0.25; -export const compressSegments = (segments: Segment[]): Segment[] => { - return removeSameOrientationSegments( +export const compressSegments = (segments: Segment[]): Segment[] => + removeSameOrientationSegments( removeShortSegments(removeSameOrientationSegments(segments)), ); -}; const removeShortSegments = (segments: Segment[]): Segment[] => { const next: Segment[] = [...segments]; @@ -243,8 +241,8 @@ const removeShortSegments = (segments: Segment[]): Segment[] => { // then we compress. const mag = Math.abs(seg.length); if (mag < COMPRESSION_THRESHOLD) { - if (mag < DIRECT_REMOVAL_THRESHOLD) return true; if (i === 0 || i === segments.length - 1) return false; + if (mag < DIRECT_REMOVAL_THRESHOLD) return true; if (segments.length <= 3) return false; if (i + 2 < segments.length) { const toAdjust = next[i + 2]; @@ -274,7 +272,7 @@ const removeSameOrientationSegments = (segments: Segment[]): Segment[] => { if (i === 0 || seg.direction !== prevSeg.direction) return false; if (i === 1) { - const stumschematicx = i - 1; + const stumpIdx = i - 1; const segIdx = i; const stumpOrientation = segmentOrientation(prevSeg); const segOrientation = segmentOrientation(seg); @@ -289,16 +287,16 @@ const removeSameOrientationSegments = (segments: Segment[]): Segment[] => { if (Math.abs(prevSeg.length) === STUMP_LENGTH) return false; const stumpLength = setOrientationOnLength(stumpOrientation, STUMP_LENGTH); - const delta = next[stumschematicx].length - stumpLength; + const delta = next[stumpIdx].length - stumpLength; const nextLength = next[segIdx].length + delta; if (Math.abs(nextLength) < STUMP_LENGTH) return false; - next[stumschematicx] = { ...next[stumschematicx], length: stumpLength }; + next[stumpIdx] = { ...next[stumpIdx], length: stumpLength }; next[segIdx] = { ...next[segIdx], length: nextLength }; return true; } if (i === segments.length - 1) { - const stumschematicx = i; + const stumpIdx = i; const segIdx = i - 1; const stumpOrientation = segmentOrientation(seg); const segOrientation = segmentOrientation(prevSeg); @@ -314,10 +312,10 @@ const removeSameOrientationSegments = (segments: Segment[]): Segment[] => { if (Math.abs(seg.length) === STUMP_LENGTH) return false; const stumpLength = setOrientationOnLength(stumpOrientation, STUMP_LENGTH); - const delta = next[stumschematicx].length - stumpLength; + const delta = next[stumpIdx].length - stumpLength; const nextLength = next[segIdx].length + delta; if (Math.abs(nextLength) < STUMP_LENGTH) return false; - next[stumschematicx] = { ...next[stumschematicx], length: stumpLength }; + next[stumpIdx] = { ...next[stumpIdx], length: stumpLength }; next[segIdx] = { ...next[segIdx], length: nextLength }; return true; } @@ -354,6 +352,15 @@ const internalNewConnector = ({ const targetStump = { ...STUMPS[targetOrientation] }; let targetStumpTip = travelSegments(targetPos, targetStump); + const xDist = Math.abs(sourceStumpTip.x - targetStumpTip.x); + const yDist = Math.abs(sourceStumpTip.y - targetStumpTip.y); + if (xDist < 2 * STUMP_LENGTH && yDist < 10) { + sourceStump.length -= xDist / 2; + targetStump.length += xDist / 2; + sourceStumpTip = travelSegments(sourcePos, sourceStump); + targetStumpTip = travelSegments(targetPos, targetStump); + } + const segments = [sourceStump]; const extraSourceSeg = prepareNode({ sourceStumpTip, @@ -432,13 +439,13 @@ const internalNewConnector = ({ if ( orientationFromLength(sourceStump.direction, delta) === sourceStumpOrientation && orientationFromLength(swapped, swappedDelta) === targetStumpOrientation - ) { + ) // This means we're good to go in this direction firstSeg = { direction: sourceStump.direction, length: delta, }; - } else { + else { // This means we need to go orthogonally firstSeg = { direction: swapped, @@ -501,12 +508,11 @@ const internalDragSegment = ({ const stumpLength = setOrientationOnLength(orientation, STUMP_LENGTH); next.push({ direction: seg.direction, length: stumpLength }); next[index] = { ...next[index], length: next[index].length - stumpLength }; - } else { + } else next[index + 1] = { direction: next[index + 1].direction, length: next[index + 1].length - magnitude, }; - } return next; }; @@ -515,9 +521,7 @@ const findIndexBackwards = ( segments: Segment[], cb: (seg: Segment, i: number) => boolean, ): number => { - for (let i = segments.length - 1; i >= 0; i--) { - if (cb(segments[i], i)) return i; - } + for (let i = segments.length - 1; i >= 0; i--) if (cb(segments[i], i)) return i; return -1; }; @@ -565,7 +569,10 @@ const canAdjustStump = ( const next = { ...seg, length: seg.length - delta[dir] }; const firstSegOrientation = segmentOrientation(seg); const nextFirstSegOrientation = segmentOrientation(next); - const isAboveMinLength = Math.abs(next.length) > STUMP_LENGTH; + const nextLengthMag = Math.abs(next.length); + const prevLengthMag = Math.abs(seg.length); + const isAboveMinLength = + nextLengthMag > prevLengthMag || nextLengthMag > STUMP_LENGTH; const isSameOrientation = firstSegOrientation === nextFirstSegOrientation; return isAboveMinLength && isSameOrientation; }; @@ -579,34 +586,42 @@ const moveNodeInDirection = ( const swappedDirection = direction.swap(dir); // We'd always like to adjust the stump closest to the node if possible, but only // if compressing it won't make it too small OR cause it to reverse its orientation. - const stumschematicx = reverse ? segments.length - 1 : 0; - const stump = segments[stumschematicx]; + const stumpIdx = reverse ? segments.length - 1 : 0; + const stump = segments[stumpIdx]; if (canAdjustStump(dir, stump, delta)) { - segments[stumschematicx] = { ...stump, length: stump.length - delta[dir] }; + const oppositeStump = segments[segments.length - 1]; + if (oppositeStump.direction === dir && Math.abs(stump.length) < STUMP_LENGTH) { + segments[segments.length - 1] = { + ...oppositeStump, + length: oppositeStump.length - delta[dir], + }; + return segments; + } + segments[stumpIdx] = { ...stump, length: stump.length - delta[dir] }; return segments; } - const oppositeStumschematicx = reverse ? 0 : segments.length - 1; + const oppositeStumpIdx = reverse ? 0 : segments.length - 1; const isX = (seg: Segment): boolean => seg.direction === dir; - const idxToAdjust = findNonTargetIdx(segments, isX, reverse, stumschematicx); - if (idxToAdjust === oppositeStumschematicx) { - const oppositeStump = segments[oppositeStumschematicx]; + const idxToAdjust = findNonTargetIdx(segments, isX, reverse, stumpIdx); + if (idxToAdjust === oppositeStumpIdx) { + const oppositeStump = segments[oppositeStumpIdx]; if (canAdjustStump(dir, oppositeStump, delta)) { - segments[oppositeStumschematicx] = { + segments[oppositeStumpIdx] = { ...oppositeStump, length: oppositeStump.length - delta[dir], }; return segments; - } else { - if (stump.direction === dir) - segments[stumschematicx] = { ...stump, length: stump.length - delta[dir] }; - else - segments[oppositeStumschematicx] = { - ...oppositeStump, - length: oppositeStump.length - delta[dir], - }; - return segments; } + // If the stump is in the right direction and its larger than the opposite stump + if (stump.direction === dir && Math.abs(stump.length) > oppositeStump.length) + segments[stumpIdx] = { ...stump, length: stump.length - delta[dir] }; + else + segments[oppositeStumpIdx] = { + ...oppositeStump, + length: oppositeStump.length - delta[dir], + }; + return segments; } // This means that there is only one segment in the 'swappedDirection' direction in the whole // connector, so we split it in half and add a new segment. @@ -622,15 +637,14 @@ const moveNodeInDirection = ( } else { if (stump.direction === dir) { // just adjust the stump - segments[stumschematicx] = { ...stump, length: stump.length - delta[dir] }; + segments[stumpIdx] = { ...stump, length: stump.length - delta[dir] }; return segments; - } else { - return [ - { direction: swappedDirection, length: segments[0].length }, - { direction: dir, length: -delta[dir] }, - ...segments.slice(1), - ]; } + return [ + { direction: swappedDirection, length: segments[0].length }, + { direction: dir, length: -delta[dir] }, + ...segments.slice(1), + ]; } const prev = segments[idxToAdjust]; diff --git a/pluto/src/vis/diagram/util.ts b/pluto/src/vis/diagram/util.ts index 54fcb69871..079dbe5417 100644 --- a/pluto/src/vis/diagram/util.ts +++ b/pluto/src/vis/diagram/util.ts @@ -7,8 +7,8 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { box, location,xy } from "@synnaxlabs/x"; -import { type ReactFlowInstance } from "reactflow"; +import { box, dimensions, location, xy } from "@synnaxlabs/x"; +import { type ReactFlowInstance } from "@xyflow/react"; export const selectNode = (key: string): HTMLDivElement => { const el = document.querySelector(`[data-id="${key}"]`); @@ -20,12 +20,14 @@ export const selectNodeBox = (flow: ReactFlowInstance, key: string): box.Box => const n = selectNode(key); const flowN = flow.getNodes().find((n) => n.id === key); if (flowN == null) throw new Error(`[diagram] - cannot find node with key: ${key}`); - return box.construct(flowN.position, xy.scale(box.dims(box.construct(n)), 1 / flow.getZoom())); + return box.construct( + flowN.position, + dimensions.scale(box.dims(box.construct(n)), 1 / flow.getZoom()), + ); }; -export const selectNodeLayout = (key: string, flow: ReactFlowInstance): NodeLayout => { - return NodeLayout.fromFlow(key, flow); -}; +export const selectNodeLayout = (key: string, flow: ReactFlowInstance): NodeLayout => + NodeLayout.fromFlow(key, flow); export class HandleLayout { node_: NodeLayout | null = null; @@ -54,7 +56,6 @@ export class HandleLayout { export class NodeLayout { key: string; box: box.Box; - handles: HandleLayout[]; constructor(key: string, box: box.Box, handles: HandleLayout[]) { diff --git a/pluto/src/vis/draw2d/canvas.ts b/pluto/src/vis/draw2d/canvas.ts index e3f3198ee7..2f0418008b 100644 --- a/pluto/src/vis/draw2d/canvas.ts +++ b/pluto/src/vis/draw2d/canvas.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { box, Destructor, dimensions, scale, xy } from "@synnaxlabs/x"; +import { box, type Destructor, dimensions, scale, xy } from "@synnaxlabs/x"; import { applyOverScan } from "@/vis/render/util"; diff --git a/pluto/src/vis/draw2d/index.ts b/pluto/src/vis/draw2d/index.ts index b737a9583e..a8f8a62bba 100644 --- a/pluto/src/vis/draw2d/index.ts +++ b/pluto/src/vis/draw2d/index.ts @@ -9,7 +9,7 @@ import { box, - Destructor, + type Destructor, type dimensions, direction, location, @@ -22,7 +22,7 @@ import { type text } from "@/text/core"; import { dimensions as textDimensions } from "@/text/dimensions"; import { type theming } from "@/theming/aether"; import { fontString } from "@/theming/core/fontString"; -import { SugaredOffscreenCanvasRenderingContext2D } from "@/vis/draw2d/canvas"; +import { type SugaredOffscreenCanvasRenderingContext2D } from "@/vis/draw2d/canvas"; export interface Draw2DLineProps { stroke: color.Color; @@ -151,7 +151,7 @@ export class Draw2D { ctx.strokeStyle = this.resolveColor(color, this.theme.colors.border).hex; ctx.lineWidth = width ?? this.theme.sizes.border.width; radius ??= this.theme.sizes.border.radius; - if (location == null || location === true) { + if (location == null || location === true) if (radius > 0) { ctx.roundRect( ...xy.couple(box.topLeft(region)), @@ -164,7 +164,7 @@ export class Draw2D { ctx.rect(...xy.couple(box.topLeft(region)), ...xy.couple(box.dims(region))); ctx.stroke(); } - } else + else toArray(location).forEach((loc) => { const [start, end] = box.edgePoints(region, loc); ctx.beginPath(); @@ -183,8 +183,8 @@ export class Draw2D { borderWidth, backgroundColor, }: Draw2DContainerProps): void { - if (borderRadius == null) borderRadius = this.theme.sizes.border.radius; - if (borderWidth == null) borderWidth = 1; + borderRadius ??= this.theme.sizes.border.radius; + borderWidth ??= 1; const ctx = this.canvas; ctx.fillStyle = this.resolveColor(backgroundColor, this.theme.colors.gray.l1).hex; ctx.strokeStyle = this.resolveColor(borderColor, this.theme.colors.border).hex; @@ -215,16 +215,10 @@ export class Draw2D { dims.height += 12; const { root = location.TOP_LEFT, offset = xy.ZERO } = props; const position = { ...props.position }; - if (root.x === "right") { - position.x -= dims.width + offset.x; - } else { - position.x += offset.x; - } - if (root.y === "bottom") { - position.y -= dims.height + offset.y; - } else { - position.y += offset.y; - } + if (root.x === "right") position.x -= dims.width + offset.x; + else position.x += offset.x; + if (root.y === "bottom") position.y -= dims.height + offset.y; + else position.y += offset.y; this.container({ region: box.construct(position, dims.width, dims.height), ...props, diff --git a/pluto/src/vis/grid/grid.spec.ts b/pluto/src/vis/grid/grid.spec.ts index 351737c332..47c4f6d233 100644 --- a/pluto/src/vis/grid/grid.spec.ts +++ b/pluto/src/vis/grid/grid.spec.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { box, xy } from "@synnaxlabs/x"; +import { box, type xy } from "@synnaxlabs/x"; import { describe, expect, it } from "vitest"; import { grid } from "@/vis/grid"; diff --git a/pluto/src/vis/legend/Container.tsx b/pluto/src/vis/legend/Container.tsx index 3890dcb7b7..7c6604a5ee 100644 --- a/pluto/src/vis/legend/Container.tsx +++ b/pluto/src/vis/legend/Container.tsx @@ -69,18 +69,14 @@ const stickyToDecimalXY = (pos: StickyXY, ref: RefObject): xy.XY const parentBox = box.construct(ref.current.parentElement as HTMLDivElement); if (pos.units?.x === "decimal") { if (pos.root?.x === "right") ret.x = 1 - pos.x; - } else { - if (pos.root?.x === "right") - ret.x = 1 - (pos.x + box.width(b)) / box.width(parentBox); - else ret.x /= box.width(parentBox); - } + } else if (pos.root?.x === "right") + ret.x = 1 - (pos.x + box.width(b)) / box.width(parentBox); + else ret.x /= box.width(parentBox); if (pos.units?.y === "decimal") { if (pos.root?.y === "bottom") ret.y = 1 - pos.y; - } else { - if (pos.root?.y === "bottom") - ret.y = 1 - (pos.y + box.height(b)) / box.height(parentBox); - else ret.y /= box.height(parentBox); - } + } else if (pos.root?.y === "bottom") + ret.y = 1 - (pos.y + box.height(b)) / box.height(parentBox); + else ret.y /= box.height(parentBox); return ret; }; diff --git a/pluto/src/vis/legend/Simple.tsx b/pluto/src/vis/legend/Simple.tsx index 229d72ed23..aec43c161d 100644 --- a/pluto/src/vis/legend/Simple.tsx +++ b/pluto/src/vis/legend/Simple.tsx @@ -31,8 +31,8 @@ export const legendSwatches = ( data: SimpleEntry[], onEntryChange: SimpleProps["onEntryChange"], onVisibleChange?: (visible: boolean) => void, -): ReactElement[] => { - return data +): ReactElement[] => + data .sort((a, b) => a.label.localeCompare(b.label)) .map(({ key, color, label }) => ( )); -}; export const Simple = ({ data = [], diff --git a/pluto/src/vis/line/aether/line.ts b/pluto/src/vis/line/aether/line.ts index 06b5ddde2e..6713c8e94a 100644 --- a/pluto/src/vis/line/aether/line.ts +++ b/pluto/src/vis/line/aether/line.ts @@ -11,10 +11,10 @@ import { type Instrumentation } from "@synnaxlabs/alamos"; import { UnexpectedError } from "@synnaxlabs/client"; import { bounds, - box, + type box, clamp, DataType, - Destructor, + type Destructor, type direction, scale, type Series, @@ -336,11 +336,10 @@ export class Line extends aether.Leaf { /** Just makes sure that the lines we draw to make stuff thick are really close together. */ const THICKNESS_DIVISOR = 5000; -const newTranslationBuffer = (aspect: number, strokeWidth: number): Float32Array => { - return replicateBuffer(newDirectionBuffer(aspect), strokeWidth).map( +const newTranslationBuffer = (aspect: number, strokeWidth: number): Float32Array => + replicateBuffer(newDirectionBuffer(aspect), strokeWidth).map( (v, i) => Math.floor(i / DIRECTION_COUNT) * (1 / (THICKNESS_DIVISOR * aspect)) * v, ); -}; const DIRECTION_COUNT = 5; diff --git a/pluto/src/vis/lineplot/LinePlot.tsx b/pluto/src/vis/lineplot/LinePlot.tsx index b8a433ceb7..20ab0e7d59 100644 --- a/pluto/src/vis/lineplot/LinePlot.tsx +++ b/pluto/src/vis/lineplot/LinePlot.tsx @@ -75,9 +75,7 @@ export const useGridEntry = (meta: grid.Region, component: string): CSSPropertie ([a], [b]) => deep.equal(a, b), [meta], ); - useEffect(() => { - return () => removeGridEntry(key); - }, []); + useEffect(() => () => removeGridEntry(key), []); const dir = direction.swap(location.direction(meta.loc)); const gridArea = dir === "x" diff --git a/pluto/src/vis/lineplot/aether/axis.ts b/pluto/src/vis/lineplot/aether/axis.ts index 38b21be585..ec674bb38e 100644 --- a/pluto/src/vis/lineplot/aether/axis.ts +++ b/pluto/src/vis/lineplot/aether/axis.ts @@ -120,13 +120,10 @@ export class CoreAxis< ...this.state, }); render.Controller.requestRender(this.ctx, render.REASON_LAYOUT); - - if (this.internal.updateBounds == null) { - this.internal.updateBounds = throttle( - (b) => this.setState((p) => ({ ...p, bounds: b })), - this.state.autoBoundUpdateInterval.milliseconds, - ); - } + this.internal.updateBounds ??= throttle( + (b) => this.setState((p) => ({ ...p, bounds: b })), + this.state.autoBoundUpdateInterval.milliseconds, + ); } async afterDelete(): Promise { diff --git a/pluto/src/vis/lineplot/range/Annotation.tsx b/pluto/src/vis/lineplot/range/Annotation.tsx index 9b5cf2b335..2261e876a7 100644 --- a/pluto/src/vis/lineplot/range/Annotation.tsx +++ b/pluto/src/vis/lineplot/range/Annotation.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { z } from "zod"; +import { type z } from "zod"; import { Aether } from "@/aether"; import { range } from "@/vis/lineplot/range/aether"; diff --git a/pluto/src/vis/lineplot/range/Provider.tsx b/pluto/src/vis/lineplot/range/Provider.tsx index 46c68649b8..390a3daa2f 100644 --- a/pluto/src/vis/lineplot/range/Provider.tsx +++ b/pluto/src/vis/lineplot/range/Provider.tsx @@ -8,13 +8,13 @@ // included in the file licenses/APL.txt. import { box, xy } from "@synnaxlabs/x"; -import { ReactElement, useCallback } from "react"; +import { type ReactElement, useCallback } from "react"; import { Aether } from "@/aether"; import { Align } from "@/align"; import { useSyncedRef } from "@/hooks"; import { Menu } from "@/menu"; -import { RenderProp } from "@/util/renderProp"; +import { type RenderProp } from "@/util/renderProp"; import { useContext, useGridEntry } from "@/vis/lineplot/LinePlot"; import { range } from "@/vis/lineplot/range/aether"; diff --git a/pluto/src/vis/lineplot/range/aether/external.ts b/pluto/src/vis/lineplot/range/aether/external.ts index 3ef56b82ab..ca4dad8d14 100644 --- a/pluto/src/vis/lineplot/range/aether/external.ts +++ b/pluto/src/vis/lineplot/range/aether/external.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { aether } from "@/aether/aether"; +import { type aether } from "@/aether/aether"; import { Annotation } from "@/vis/lineplot/range/aether/annotation"; import { Provider } from "@/vis/lineplot/range/aether/provider"; diff --git a/pluto/src/vis/lineplot/range/aether/provider.ts b/pluto/src/vis/lineplot/range/aether/provider.ts index 46dc78daa1..731424b2aa 100644 --- a/pluto/src/vis/lineplot/range/aether/provider.ts +++ b/pluto/src/vis/lineplot/range/aether/provider.ts @@ -7,8 +7,8 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { ranger, signals, Synnax } from "@synnaxlabs/client"; -import { bounds, box, clamp, scale, TimeRange, TimeSpan, xy } from "@synnaxlabs/x"; +import { ranger, type signals, type Synnax } from "@synnaxlabs/client"; +import { bounds, box, clamp, type scale, TimeRange, TimeSpan, xy } from "@synnaxlabs/x"; import { z } from "zod"; import { color } from "@/color/core"; @@ -57,7 +57,7 @@ export class Provider extends aether.Leaf i.render = render.Context.use(this.ctx); i.draw = new Draw2D(i.render.upper2d, theming.use(this.ctx)); - if (i.ranges == null) i.ranges = new Map(); + i.ranges ??= new Map(); const client = synnax.use(this.ctx); if (client == null) return; i.client = client; diff --git a/pluto/src/vis/log/Log.tsx b/pluto/src/vis/log/Log.tsx index 3f4523f666..a64827abcd 100644 --- a/pluto/src/vis/log/Log.tsx +++ b/pluto/src/vis/log/Log.tsx @@ -10,12 +10,12 @@ import "@/vis/log/Log.css"; import { Icon } from "@synnaxlabs/media"; -import { box, Optional } from "@synnaxlabs/x"; -import { ReactElement, useCallback, useEffect } from "react"; -import { z } from "zod"; +import { box, type Optional } from "@synnaxlabs/x"; +import { type ReactElement, useCallback, useEffect } from "react"; +import { type z } from "zod"; import { Aether } from "@/aether"; -import { Align } from "@/align"; +import { type Align } from "@/align"; import { Button } from "@/button"; import { CSS } from "@/css"; import { useMemoDeepEqualProps } from "@/memo"; diff --git a/pluto/src/vis/log/aether/Log.ts b/pluto/src/vis/log/aether/Log.ts index 0bfb843463..c71b41a6a7 100644 --- a/pluto/src/vis/log/aether/Log.ts +++ b/pluto/src/vis/log/aether/Log.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { DataType, Destructor, MultiSeries, TelemValue } from "@synnaxlabs/x"; +import { DataType, type Destructor, MultiSeries, type TelemValue } from "@synnaxlabs/x"; import { box, xy } from "@synnaxlabs/x/spatial"; import { z } from "zod"; diff --git a/pluto/src/vis/measure/Measure.tsx b/pluto/src/vis/measure/Measure.tsx index ac2c5121cd..90908bda09 100644 --- a/pluto/src/vis/measure/Measure.tsx +++ b/pluto/src/vis/measure/Measure.tsx @@ -59,8 +59,7 @@ export const Measure = Aether.wrap("Measure", ({ aetherKey }) => { ); if (["one", "two"].includes(measureMode)) return setState((p) => ({ ...p, [measureMode]: cursor })); - else if (measureMode === "clear") - setState((p) => ({ ...p, one: null, two: null })); + if (measureMode === "clear") setState((p) => ({ ...p, one: null, two: null })); else setState((p) => ({ ...p, diff --git a/pluto/src/vis/render/loop.ts b/pluto/src/vis/render/loop.ts index 61a872a657..1923a2ec36 100644 --- a/pluto/src/vis/render/loop.ts +++ b/pluto/src/vis/render/loop.ts @@ -102,9 +102,8 @@ export class Loop { let releaser: (() => void) | undefined; if (req.priority === "high") releaser = await this.mutex.acquire(); const existing = this.requests.get(req.key); - if (existing == null) { - this.requests.set(req.key, req); - } else { + if (existing == null) this.requests.set(req.key, req); + else { const priorityOK = PRIORITY_ORDER[req.priority] >= PRIORITY_ORDER[existing.priority]; const canvasesOK = req.canvases.length >= existing.canvases.length; @@ -124,11 +123,10 @@ export class Loop { const end = performance.now(); const span = TimeSpan.milliseconds(end - start); - if (span.greaterThan(TARGET_LOOP_RATE.period)) { + if (span.greaterThan(TARGET_LOOP_RATE.period)) console.warn( `Render loop for ${this.requests.size} took longer than ${TARGET_LOOP_RATE.period.toString()} to execute: ${span.milliseconds}`, ); - } this.requests.clear(); this.afterRender?.(); }); @@ -149,7 +147,7 @@ export class Loop { private async renderSync() { /** Render components. */ const { requests } = this; - for (const req of requests.values()) { + for (const req of requests.values()) try { const cleanup = await req.render(); // We're safe to set the cleanup function here because we know that req.key @@ -158,7 +156,6 @@ export class Loop { } catch (e) { console.error(e); } - } } /** Starts the rendering loop. */ diff --git a/pluto/src/vis/render/performance.ts b/pluto/src/vis/render/performance.ts index ac80cd9f86..579f26163c 100644 --- a/pluto/src/vis/render/performance.ts +++ b/pluto/src/vis/render/performance.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { Destructor, TimeSpan } from "@synnaxlabs/x"; +import { type Destructor, TimeSpan } from "@synnaxlabs/x"; class TrackerEntry { level: number; diff --git a/pluto/src/vis/render/util.ts b/pluto/src/vis/render/util.ts index 9a2446dc54..dad8f80d6f 100644 --- a/pluto/src/vis/render/util.ts +++ b/pluto/src/vis/render/util.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { box, xy } from "@synnaxlabs/x"; +import { box, type xy } from "@synnaxlabs/x"; export const applyOverScan = (b: box.Box, overScan: xy.XY): box.Box => box.construct( diff --git a/pluto/src/vis/schematic/Forms.tsx b/pluto/src/vis/schematic/Forms.tsx index e6412d4d00..6db2ce1261 100644 --- a/pluto/src/vis/schematic/Forms.tsx +++ b/pluto/src/vis/schematic/Forms.tsx @@ -21,6 +21,8 @@ import { Color } from "@/color"; import { CSS } from "@/css"; import { Form } from "@/form"; import { Input } from "@/input"; +import { type Notation } from "@/notation/notation"; +import { SelectNotation } from "@/notation/SelectNotation"; import { Select } from "@/select"; import { Tabs } from "@/tabs"; import { telem } from "@/telem/aether"; @@ -30,7 +32,7 @@ import { type Button as CoreButton } from "@/vis/button"; import { type LabelExtensionProps } from "@/vis/schematic/Labeled"; import { SelectOrientation } from "@/vis/schematic/SelectOrientation"; import { type ControlStateProps } from "@/vis/schematic/Symbols"; -import { Setpoint } from "@/vis/setpoint"; +import { type Setpoint } from "@/vis/setpoint"; import { type Toggle } from "@/vis/toggle"; export interface SymbolFormProps {} @@ -77,10 +79,7 @@ const OrientationControl = ({ onChange({ ...value, orientation: v.inner, - label: { - ...value.label, - orientation: v.outer, - }, + label: { ...value.label, orientation: v.outer }, }) } /> @@ -95,13 +94,13 @@ interface LabelControlsProps { const LabelControls = ({ path, omit = [] }: LabelControlsProps): ReactElement => ( - path={path + ".label"} label="Label" padHelpText={false} grow> + path={`${path}.label`} label="Label" padHelpText={false} grow> {(p) => } hideIfNull visible={!omit.includes("level")} - path={path + ".level"} + path={`${path}.level`} label="Label Size" padHelpText={false} > @@ -117,7 +116,7 @@ const LabelControls = ({ path, omit = [] }: LabelControlsProps): ReactElement => visible={!omit.includes("align")} - path={path + ".align"} + path={`${path}.align`} label="Label Alignment" padHelpText={false} hideIfNull @@ -184,14 +183,9 @@ const ToggleControlForm = ({ path }: { path: string }): ReactElement => { const sink = control.setChannelValuePropsZ.parse(sinkP.segments.setter.props); const handleSourceChange = (v: channel.Key | null): void => { - v = v ?? 0; + v ??= 0; const t = telem.sourcePipeline("boolean", { - connections: [ - { - from: "valueStream", - to: "threshold", - }, - ], + connections: [{ from: "valueStream", to: "threshold" }], segments: { valueStream: telem.streamChannelValue({ channel: v }), threshold: telem.withinBounds({ trueBound: { lower: 0.9, upper: 1.1 } }), @@ -202,20 +196,12 @@ const ToggleControlForm = ({ path }: { path: string }): ReactElement => { }; const handleSinkChange = (v: channel.Key | null): void => { - v = v ?? 0; + v ??= 0; const t = telem.sinkPipeline("boolean", { - connections: [ - { - from: "setpoint", - to: "setter", - }, - ], + connections: [{ from: "setpoint", to: "setter" }], segments: { setter: control.setChannelValue({ channel: v }), - setpoint: telem.setpoint({ - truthy: 1, - falsy: 0, - }), + setpoint: telem.setpoint({ truthy: 1, falsy: 0 }), }, inlet: "setpoint", }); @@ -234,13 +220,8 @@ const ToggleControlForm = ({ path }: { path: string }): ReactElement => { showChip: true, showIndicator: true, ...value.control, - chip: { - sink: controlChipSink, - source: authSource, - }, - indicator: { - statusSource: authSource, - }, + chip: { sink: controlChipSink, source: authSource }, + indicator: { statusSource: authSource }, }, }); }; @@ -267,14 +248,8 @@ const ToggleControlForm = ({ path }: { path: string }): ReactElement => { }; const COMMON_TOGGLE_FORM_TABS: Tabs.Tab[] = [ - { - tabKey: "style", - name: "Style", - }, - { - tabKey: "control", - name: "Control", - }, + { tabKey: "style", name: "Style" }, + { tabKey: "control", name: "Control" }, ]; export const CommonToggleForm = (): ReactElement => { @@ -293,6 +268,7 @@ export const CommonToggleForm = (): ReactElement => { const DIMENSIONS_DRAG_SCALE: xy.Crude = { y: 2, x: 0.25 }; const DIMENSIONS_BOUNDS: bounds.Bounds = { lower: 0, upper: 2000 }; +const BORDER_RADIUS_BOUNDS: bounds.Bounds = { lower: 0, upper: 51 }; export interface TankFormProps { includeBorderRadius?: boolean; @@ -318,7 +294,7 @@ export const TankForm = ({ @@ -335,7 +311,7 @@ export const TankForm = ({ @@ -389,14 +365,8 @@ export const TankForm = ({ ); const VALUE_FORM_TABS: Tabs.Tab[] = [ - { - tabKey: "style", - name: "Style", - }, - { - tabKey: "telemetry", - name: "Telemetry", - }, + { tabKey: "style", name: "Style" }, + { tabKey: "telemetry", name: "Telemetry" }, ]; interface ValueTelemFormT { @@ -419,19 +389,14 @@ const ValueTelemForm = ({ path }: { path: string }): ReactElement => { const handleSourceChange = (v: channel.Key | null): void => { const t = telem.sourcePipeline("string", { connections: [ - { - from: "valueStream", - to: "rollingAverage", - }, - { - from: "rollingAverage", - to: "stringifier", - }, + { from: "valueStream", to: "rollingAverage" }, + { from: "rollingAverage", to: "stringifier" }, ], segments: { valueStream: telem.streamChannelValue({ channel: v ?? 0 }), stringifier: telem.stringifyNumber({ precision: stringifier.precision ?? 2, + notation: stringifier.notation, }), rollingAverage: telem.rollingAverage({ windowSize: rollingAverage.windowSize ?? 1, @@ -442,21 +407,31 @@ const ValueTelemForm = ({ path }: { path: string }): ReactElement => { onChange({ ...value, telem: t }); }; + const handleNotationChange = (notation: Notation): void => { + const t = telem.sourcePipeline("string", { + connections: [ + { from: "valueStream", to: "rollingAverage" }, + { from: "rollingAverage", to: "stringifier" }, + ], + segments: { + valueStream: telem.streamChannelValue(source), + stringifier: telem.stringifyNumber({ ...stringifier, notation }), + rollingAverage: telem.rollingAverage(rollingAverage), + }, + outlet: "stringifier", + }); + onChange({ ...value, telem: t }); + }; + const handlePrecisionChange = (precision: number): void => { const t = telem.sourcePipeline("string", { connections: [ - { - from: "valueStream", - to: "rollingAverage", - }, - { - from: "rollingAverage", - to: "stringifier", - }, + { from: "valueStream", to: "rollingAverage" }, + { from: "rollingAverage", to: "stringifier" }, ], segments: { valueStream: telem.streamChannelValue({ channel: source.channel }), - stringifier: telem.stringifyNumber({ precision }), + stringifier: telem.stringifyNumber({ ...stringifier, precision }), rollingAverage: telem.rollingAverage({ windowSize: rollingAverage.windowSize }), }, outlet: "stringifier", @@ -467,17 +442,14 @@ const ValueTelemForm = ({ path }: { path: string }): ReactElement => { const handleRollingAverageChange = (windowSize: number): void => { const t = telem.sourcePipeline("string", { connections: [ - { - from: "valueStream", - to: "rollingAverage", - }, - { - from: "rollingAverage", - to: "stringifier", - }, + { from: "valueStream", to: "rollingAverage" }, + { from: "rollingAverage", to: "stringifier" }, ], segments: { - stringifier: telem.stringifyNumber({ precision: stringifier.precision ?? 2 }), + stringifier: telem.stringifyNumber({ + ...stringifier, + precision: stringifier.precision ?? 2, + }), valueStream: telem.streamChannelValue({ channel: source.channel }), rollingAverage: telem.rollingAverage({ windowSize }), }, @@ -487,32 +459,38 @@ const ValueTelemForm = ({ path }: { path: string }): ReactElement => { }; const c = Channel.useName(source.channel as number); - useEffect(() => { - onChange({ ...value, tooltip: [c] }); - }, [c]); + useEffect(() => onChange({ ...value, tooltip: [c] }), [c]); return ( - + - - - - - - + + + + + + + + + + + ); }; @@ -576,14 +554,9 @@ const LightTelemForm = ({ path }: { path: string }): ReactElement => { ); const handleSourceChange = (v: channel.Key | null): void => { - v = v ?? 0; + v ??= 0; const t = telem.sourcePipeline("boolean", { - connections: [ - { - from: "valueStream", - to: "threshold", - }, - ], + connections: [{ from: "valueStream", to: "threshold" }], segments: { valueStream: telem.streamChannelValue({ channel: v }), threshold: telem.withinBounds({ trueBound: { lower: 0.9, upper: 1.1 } }), @@ -632,7 +605,7 @@ export const ButtonTelemForm = ({ path }: { path: string }): ReactElement => { const sink = control.setChannelValuePropsZ.parse(sinkP.segments.setter.props); const handleSinkChange = (v: channel.Key): void => { - v = v ?? 0; + v ??= 0; const t = telem.sinkPipeline("boolean", { connections: [{ from: "setpoint", to: "setter" }], segments: { @@ -710,24 +683,20 @@ export const SetpointTelemForm = ({ path }: { path: string }): ReactElement => { const sink = control.setChannelValuePropsZ.parse(sinkP.segments.setter.props); const handleSourceChange = (v: channel.Key | null): void => { - v = v ?? 0; + v ??= 0; const t = telem.sourcePipeline("number", { connections: [], - segments: { - valueStream: telem.streamChannelValue({ channel: v }), - }, + segments: { valueStream: telem.streamChannelValue({ channel: v }) }, outlet: "valueStream", }); onChange({ ...value, source: t }); }; const handleSinkChange = (v: channel.Key | null): void => { - v = v ?? 0; + v ??= 0; const t = telem.sinkPipeline("number", { connections: [], - segments: { - setter: control.setChannelValue({ channel: v }), - }, + segments: { setter: control.setChannelValue({ channel: v }) }, inlet: "setter", }); @@ -744,14 +713,9 @@ export const SetpointTelemForm = ({ path }: { path: string }): ReactElement => { control: { ...value.control, showChip: true, - chip: { - sink: controlChipSink, - source: authSource, - }, + chip: { sink: controlChipSink, source: authSource }, showIndicator: true, - indicator: { - statusSource: authSource, - }, + indicator: { statusSource: authSource }, }, }); }; diff --git a/pluto/src/vis/schematic/Labeled.tsx b/pluto/src/vis/schematic/Labeled.tsx index 82e277db4d..2e4cf22042 100644 --- a/pluto/src/vis/schematic/Labeled.tsx +++ b/pluto/src/vis/schematic/Labeled.tsx @@ -42,45 +42,43 @@ export const Labeled = forwardRef( ...props }, ref, - ) => { - return ( - - {value.length > 0 && ( - - onChange({ - label: { label, level, orientation }, - }), - [onChange, level], - )} - level={level} - /> - )} - {children} - - ); - }, + ) => ( + + {value.length > 0 && ( + + onChange({ + label: { label, level, orientation }, + }), + [onChange, level], + )} + level={level} + /> + )} + {children} + + ), ); Labeled.displayName = "Labeled"; diff --git a/pluto/src/vis/schematic/SelectOrientation.tsx b/pluto/src/vis/schematic/SelectOrientation.tsx index 10367fb949..f9c6fbe272 100644 --- a/pluto/src/vis/schematic/SelectOrientation.tsx +++ b/pluto/src/vis/schematic/SelectOrientation.tsx @@ -10,7 +10,7 @@ import "@/vis/schematic/OrientationControl.css"; import { type location } from "@synnaxlabs/x"; -import { CSSProperties, type ReactElement } from "react"; +import { type CSSProperties, type ReactElement } from "react"; import { Align } from "@/align"; import { Button as CoreButton } from "@/button"; diff --git a/pluto/src/vis/schematic/Symbols.tsx b/pluto/src/vis/schematic/Symbols.tsx index a66ac67c58..d6e47f7f13 100644 --- a/pluto/src/vis/schematic/Symbols.tsx +++ b/pluto/src/vis/schematic/Symbols.tsx @@ -17,8 +17,8 @@ import { type UnknownRecord, xy, } from "@synnaxlabs/x"; +import { useReactFlow } from "@xyflow/react"; import { type ReactElement, useCallback, useState } from "react"; -import { useReactFlow } from "reactflow"; import { Aether } from "@/aether"; import { Align } from "@/align"; @@ -675,6 +675,7 @@ export const Value = Aether.wrap>( onChange, tooltip, inlineSize, + notation, }): ReactElement => { const font = Theming.useTypography(level); const [dims, setDims] = useState({ @@ -720,6 +721,7 @@ export const Value = Aether.wrap>( box: adjustedBox, telem, minWidth: inlineSize, + notation, }); return ( diff --git a/pluto/src/vis/schematic/primitives/Primitives.tsx b/pluto/src/vis/schematic/primitives/Primitives.tsx index 5e622c6043..e56afbc458 100644 --- a/pluto/src/vis/schematic/primitives/Primitives.tsx +++ b/pluto/src/vis/schematic/primitives/Primitives.tsx @@ -10,24 +10,25 @@ import "@/vis/schematic/primitives/Primitives.css"; import { dimensions, direction, type location, xy } from "@synnaxlabs/x"; +import { + Handle as RFHandle, + type HandleProps as RFHandleProps, + Position as RFPosition, + useUpdateNodeInternals, +} from "@xyflow/react"; import { type ComponentPropsWithoutRef, - CSSProperties, + type CSSProperties, type MouseEventHandler, type PropsWithChildren, type ReactElement, useEffect, + useMemo, useRef, useState, } from "react"; -import { - Handle as RFHandle, - type HandleProps as RFHandleProps, - Position as RFPosition, - useUpdateNodeInternals, -} from "reactflow"; -import { Align } from "@/align"; +import { type Align } from "@/align"; import { Button as CoreButton } from "@/button"; import { Color } from "@/color"; import { CSS } from "@/css"; @@ -127,9 +128,15 @@ interface OrientableProps { orientation?: location.Outer; } -interface SmartHandlesProps extends PropsWithChildren<{}>, OrientableProps {} +interface SmartHandlesProps extends PropsWithChildren<{}>, OrientableProps { + refreshDeps?: unknown; +} -const HandleBoundary = ({ children, orientation }: SmartHandlesProps): ReactElement => { +const HandleBoundary = ({ + children, + orientation, + refreshDeps, +}: SmartHandlesProps): ReactElement => { let updateInternals: ReturnType | undefined; try { updateInternals = useUpdateNodeInternals(); @@ -148,7 +155,7 @@ const HandleBoundary = ({ children, orientation }: SmartHandlesProps): ReactElem const id = node?.getAttribute("data-id"); if (id == null) return; updateInternals?.(id); - }, [orientation]); + }, [orientation, refreshDeps]); return ( <> @@ -819,6 +826,17 @@ export const Tank = ({ const detailedRadius = parseBorderRadius(borderRadius); const hasCornerBoundaries = boxBorderRadius == null; const t = Theming.use(); + const refreshDeps = useMemo( + () => [dimensions, borderRadius, detailedRadius], + [ + detailedRadius.bottomLeft, + detailedRadius.bottomRight, + detailedRadius.topLeft, + detailedRadius.topRight, + dimensions.height, + dimensions.width, + ], + ); return (

- + {hasCornerBoundaries && ( <> @@ -1187,8 +1205,8 @@ export const TextBox = ({ textAlign: align as CSSProperties["textAlign"], }; if (direction.construct(orientation) === "y") - style["height"] = autoFit ? "fit-content" : width; - else style["width"] = autoFit ? "fit-content" : width; + style.height = autoFit ? "fit-content" : width; + else style.width = autoFit ? "fit-content" : width; return (
= ({ }) => { const element = document.querySelector(`[data-id="${id}"]`); // add the orientation to the class list - if (element) { - element.classList.add(orientation); - } + if (element) element.classList.add(orientation); const swap = direction.construct(orientation) === "y"; diff --git a/pluto/src/vis/schematic/registry.ts b/pluto/src/vis/schematic/registry.ts index f35d2f8b4b..373a823cc0 100644 --- a/pluto/src/vis/schematic/registry.ts +++ b/pluto/src/vis/schematic/registry.ts @@ -30,7 +30,7 @@ import { DEFAULT_BORDER_RADIUS } from "@/vis/schematic/primitives/Primitives"; import { Agitator, AgitatorPreview, - AgitatorProps, + type AgitatorProps, AngledReliefValve, AngledReliefValvePreview, AngledValve, @@ -95,7 +95,7 @@ import { type PistonPumpProps, PropellerAgitator, PropellerAgitatorPreview, - PropellerAgitatorProps, + type PropellerAgitatorProps, Pump, PumpPreview, type PumpProps, @@ -203,7 +203,6 @@ export const typeZ = z.enum(VARIANTS); export type Variant = z.infer; const ZERO_PROPS = { orientation: "left" as const, scale: 1 }; - const ZERO_NUMERIC_STRINGER_SOURCE_PROPS = { ...ZERO_PROPS, source: telem.sourcePipeline("string", { @@ -214,7 +213,7 @@ const ZERO_NUMERIC_STRINGER_SOURCE_PROPS = { segments: { valueStream: telem.streamChannelValue({ channel: 0 }), rollingAverage: telem.rollingAverage({ windowSize: 1 }), - stringifier: telem.stringifyNumber({ precision: 2 }), + stringifier: telem.stringifyNumber({ precision: 2, notation: "standard" }), }, outlet: "stringifier", }), diff --git a/pluto/src/vis/value/aether/value.ts b/pluto/src/vis/value/aether/value.ts index b464327a46..1d1ad89c0a 100644 --- a/pluto/src/vis/value/aether/value.ts +++ b/pluto/src/vis/value/aether/value.ts @@ -12,6 +12,7 @@ import { z } from "zod"; import { aether } from "@/aether/aether"; import { color } from "@/color/core"; +import { notationZ } from "@/notation/notation"; import { telem } from "@/telem/aether"; import { text } from "@/text/core"; import { dimensions } from "@/text/dimensions"; @@ -27,6 +28,7 @@ const valueState = z.object({ precision: z.number().optional().default(2), minWidth: z.number().optional().default(60), width: z.number().optional(), + notation: notationZ.optional().default("standard"), }); const CANVAS_VARIANT: render.Canvas2DVariant = "upper2d"; @@ -128,14 +130,13 @@ export class Value canvas.fillStyle = this.internal.textColor.hex; // If the value is negative, chop of the negative sign and draw it separately // so that the first digit always stays in the same position, regardless of the sign. - if (isNegative) { + if (isNegative) canvas.fillText( "-", // 0.55 is a multiplier of the font height that seems to keep the sign in // the right place. ...xy.couple(xy.translateX(labelPosition, -fontHeight * 0.6)), ); - } canvas.fillText(value, ...xy.couple(labelPosition)); } } diff --git a/pluto/src/vis/value/use.ts b/pluto/src/vis/value/use.ts index aaf00bb114..cb49d5598d 100644 --- a/pluto/src/vis/value/use.ts +++ b/pluto/src/vis/value/use.ts @@ -35,6 +35,7 @@ export const use = ({ precision, minWidth, level = "small", + notation, }: UseProps): UseReturn => { const memoProps = useMemoDeepEqualProps({ box, @@ -43,6 +44,7 @@ export const use = ({ precision, level, minWidth, + notation, }); const [, state, setState] = Aether.use({ aetherKey, diff --git a/pluto/src/worker/Context.tsx b/pluto/src/worker/Context.tsx index 74e53f572f..56d11075d3 100644 --- a/pluto/src/worker/Context.tsx +++ b/pluto/src/worker/Context.tsx @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { RoutedWorker, type SenderHandler,type TypedWorker } from "@synnaxlabs/x"; +import { RoutedWorker, type SenderHandler, type TypedWorker } from "@synnaxlabs/x"; import { createContext, memo, diff --git a/pluto/stylelint.config.js b/pluto/stylelint.config.js new file mode 100644 index 0000000000..6dbb9bd438 --- /dev/null +++ b/pluto/stylelint.config.js @@ -0,0 +1,12 @@ +// Copyright 2024 Synnax Labs, Inc. +// +// Use of this software is governed by the Business Source License included in the file +// licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with the Business Source +// License, use of this software will be governed by the Apache License, Version 2.0, +// included in the file licenses/APL.txt. + +import synnaxConfig from "stylelint-config-synnaxlabs"; + +export default synnaxConfig; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d85f99f15..e0b7a3a692 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,22 +7,22 @@ settings: overrides: react: ^18.3.1 react-dom: ^18.3.1 - '@reduxjs/toolkit': ^2.2.8 + '@reduxjs/toolkit': ^2.3.0 react-redux: ^9.1.2 - vite: ^5.4.8 - vite-tsconfig-paths: ^5.0.1 - vite-plugin-dts: ^4.2.3 - '@vitejs/plugin-react': ^4.3.2 - vitest: ^2.1.2 - '@vitest/coverage-v8': ^2.1.2 + vite: ^5.4.10 + vite-tsconfig-paths: ^5.1.2 + vite-plugin-dts: ^4.3.0 + '@vitejs/plugin-react': ^4.3.3 + vitest: ^2.1.4 + '@vitest/coverage-v8': ^2.1.4 typescript: ^5.6.3 proxy-memoize: 2.0.3 - '@tanstack/react-virtual': ^3.10.8 + '@tanstack/react-virtual': ^3.10.9 zod: ^3.23.8 node-fetch: ^2.7.0 prettier: ^3.3.3 - '@tauri-apps/api': ^2.0.2 - eslint: ^9.12.0 + '@tauri-apps/api': ^2.1.0 + eslint: ^9.14.0 importers: @@ -30,7 +30,7 @@ importers: devDependencies: '@microsoft/api-extractor': specifier: ^7.47.9 - version: 7.47.9(@types/node@22.7.5) + version: 7.47.11(@types/node@22.9.0) prettier: specifier: ^3.3.3 version: 3.3.3 @@ -45,13 +45,13 @@ importers: version: 1.9.0 '@opentelemetry/context-zone': specifier: ^1.26.0 - version: 1.26.0(@opentelemetry/api@1.9.0) + version: 1.27.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-document-load': specifier: ^0.40.0 version: 0.40.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-web': specifier: ^1.26.0 - version: 1.26.0(@opentelemetry/api@1.9.0) + version: 1.27.0(@opentelemetry/api@1.9.0) '@synnaxlabs/x': specifier: workspace:* version: link:../../x/ts @@ -69,8 +69,11 @@ importers: specifier: workspace:* version: link:../../configs/vite '@vitest/coverage-v8': - specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)) + specifier: ^2.1.4 + version: 2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1)) + eslint: + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../../configs/eslint @@ -78,11 +81,11 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) client/ts: dependencies: @@ -107,16 +110,16 @@ importers: version: link:../../configs/vite '@types/node': specifier: ^22.7.5 - version: 22.7.5 + version: 22.9.0 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 '@vitest/coverage-v8': - specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)) + specifier: ^2.1.4 + version: 2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1)) eslint: - specifier: ^9.12.0 - version: 9.12.0 + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../../configs/eslint @@ -127,50 +130,57 @@ importers: specifier: ^10.0.0 version: 10.0.0 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) configs/eslint: devDependencies: '@eslint/compat': specifier: ^1.2.0 - version: 1.2.0(eslint@9.12.0) + version: 1.2.2(eslint@9.14.0) '@eslint/js': specifier: ^9.12.0 - version: 9.12.0 + version: 9.14.0 eslint: - specifier: ^9.12.0 - version: 9.12.0 + specifier: ^9.14.0 + version: 9.14.0 eslint-plugin-react: specifier: ^7.37.1 - version: 7.37.1(eslint@9.12.0) + version: 7.37.2(eslint@9.14.0) eslint-plugin-simple-import-sort: specifier: ^12.1.1 - version: 12.1.1(eslint@9.12.0) + version: 12.1.1(eslint@9.14.0) globals: specifier: ^15.11.0 - version: 15.11.0 + version: 15.12.0 typescript: specifier: ^5.6.3 version: 5.6.3 typescript-eslint: - specifier: ^8.8.1 - version: 8.8.1(eslint@9.12.0)(typescript@5.6.3) + specifier: ^8.13.0 + version: 8.13.0(eslint@9.14.0)(typescript@5.6.3) configs/stylelint: dependencies: stylelint: specifier: ^16.9.0 - version: 16.9.0(typescript@5.6.3) + version: 16.10.0(typescript@5.6.3) stylelint-config-prettier: specifier: ^9.0.5 - version: 9.0.5(stylelint@16.9.0(typescript@5.6.3)) + version: 9.0.5(stylelint@16.10.0(typescript@5.6.3)) stylelint-config-standard: specifier: ^36.0.1 - version: 36.0.1(stylelint@16.9.0(typescript@5.6.3)) + version: 36.0.1(stylelint@16.10.0(typescript@5.6.3)) + devDependencies: + eslint: + specifier: ^9.14.0 + version: 9.14.0 + eslint-config-synnaxlabs: + specifier: workspace:* + version: link:../eslint configs/ts: devDependencies: @@ -183,18 +193,24 @@ importers: '@synnaxlabs/tsconfig': specifier: workspace:* version: link:../ts + eslint: + specifier: ^9.14.0 + version: 9.14.0 + eslint-config-synnaxlabs: + specifier: workspace:* + version: link:../eslint typescript: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vite-plugin-dts: - specifier: ^4.2.3 - version: 4.2.4(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)) + specifier: ^4.3.0 + version: 4.3.0(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)) vite-tsconfig-paths: - specifier: ^5.0.1 - version: 5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)) + specifier: ^5.1.2 + version: 5.1.2(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)) console: dependencies: @@ -202,8 +218,8 @@ importers: specifier: ^5.1.0 version: 5.1.0 '@reduxjs/toolkit': - specifier: ^2.2.8 - version: 2.2.8(react-redux@9.1.2(@types/react@18.3.11)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + specifier: ^2.3.0 + version: 2.3.0(react-redux@9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1))(react@18.3.1) '@synnaxlabs/client': specifier: workspace:* version: link:../client/ts @@ -220,26 +236,26 @@ importers: specifier: workspace:* version: link:../x/ts '@tanstack/react-query': - specifier: ^5.59.9 - version: 5.59.9(react@18.3.1) + specifier: ^5.59.20 + version: 5.59.20(react@18.3.1) '@tauri-apps/api': - specifier: ^2.0.2 - version: 2.0.2 + specifier: ^2.1.0 + version: 2.1.0 '@tauri-apps/plugin-deep-link': specifier: ^2.0.0 version: 2.0.0 '@tauri-apps/plugin-dialog': - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^2.0.1 + version: 2.0.1 '@tauri-apps/plugin-fs': - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^2.0.2 + version: 2.0.2 '@tauri-apps/plugin-process': specifier: ^2.0.0 version: 2.0.0 '@tauri-apps/plugin-store': - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^2.1.0 + version: 2.1.0 '@tauri-apps/plugin-updater': specifier: ^2.0.0 version: 2.0.0 @@ -256,30 +272,33 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-error-boundary: - specifier: ^4.0.13 - version: 4.0.13(react@18.3.1) + specifier: ^4.1.2 + version: 4.1.2(react@18.3.1) react-icons: specifier: ^5.3.0 version: 5.3.0(react@18.3.1) react-redux: specifier: ^9.1.2 - version: 9.1.2(@types/react@18.3.11)(react@18.3.1)(redux@5.0.1) + version: 9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1) uuid: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^11.0.3 + version: 11.0.3 zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: + '@eslint/compat': + specifier: ^1.2.0 + version: 1.2.2(eslint@9.14.0) '@synnaxlabs/tsconfig': specifier: workspace:* version: link:../configs/ts '@tauri-apps/cli': - specifier: ^2.0.2 - version: 2.0.2 + specifier: ^2.1.0 + version: 2.1.0 '@types/react': specifier: ^18.3.11 - version: 18.3.11 + version: 18.3.12 '@types/react-dom': specifier: ^18.3.1 version: 18.3.1 @@ -287,8 +306,11 @@ importers: specifier: ^10.0.0 version: 10.0.0 '@vitejs/plugin-react': - specifier: ^4.3.2 - version: 4.3.2(vite@5.4.8(@types/node@22.7.5)) + specifier: ^4.3.3 + version: 4.3.3(vite@5.4.10(@types/node@22.9.0)) + eslint: + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../configs/eslint @@ -299,26 +321,26 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vite-tsconfig-paths: - specifier: ^5.0.1 - version: 5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)) + specifier: ^5.1.2 + version: 5.1.2(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) docs/site: dependencies: '@astrojs/mdx': specifier: ^3.1.8 - version: 3.1.8(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) + version: 3.1.9(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) '@astrojs/react': specifier: ^3.6.2 - version: 3.6.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.8(@types/node@22.7.5)) + version: 3.6.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.10(@types/node@22.9.0)) '@astrojs/vercel': specifier: ^7.8.1 - version: 7.8.1(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3))(react@18.3.1) + version: 7.8.2(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3))(react@18.3.1) '@fontsource/geist-mono': specifier: ^5.1.0 version: 5.1.0 @@ -339,10 +361,10 @@ importers: version: 2019.7.3 astro: specifier: ^4.16.0 - version: 4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3) + version: 4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3) astro-embed: specifier: ^0.7.4 - version: 0.7.4(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) + version: 0.7.4(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) astro-seo: specifier: ^0.8.4 version: 0.8.4(prettier@3.3.3)(typescript@5.6.3) @@ -357,7 +379,7 @@ importers: version: 3.0.3 posthog-js: specifier: ^1.174.2 - version: 1.174.2 + version: 1.181.0 react: specifier: ^18.3.1 version: 18.3.1 @@ -366,20 +388,23 @@ importers: version: 18.3.1(react@18.3.1) shiki: specifier: ^1.22.0 - version: 1.22.0 + version: 1.22.2 devDependencies: '@synnaxlabs/tsconfig': specifier: workspace:* version: link:../../configs/ts '@types/react': specifier: ^18.3.11 - version: 18.3.11 + version: 18.3.12 '@types/react-dom': specifier: ^18.3.1 version: 18.3.1 algoliasearch: specifier: ^4.23.3 version: 4.24.0 + eslint: + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../../configs/eslint @@ -396,14 +421,14 @@ importers: drift: dependencies: '@reduxjs/toolkit': - specifier: ^2.2.8 - version: 2.2.8(react-redux@9.1.2(@types/react@18.3.11)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + specifier: ^2.3.0 + version: 2.3.0(react-redux@9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1))(react@18.3.1) '@synnaxlabs/x': specifier: workspace:* version: link:../x/ts '@tauri-apps/api': - specifier: ^2.0.2 - version: 2.0.2 + specifier: ^2.1.0 + version: 2.1.0 proxy-memoize: specifier: 2.0.3 version: 2.0.3 @@ -415,7 +440,7 @@ importers: version: 18.3.1(react@18.3.1) react-redux: specifier: ^9.1.2 - version: 9.1.2(@types/react@18.3.11)(react@18.3.1)(redux@5.0.1) + version: 9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1) devDependencies: '@synnaxlabs/tsconfig': specifier: workspace:* @@ -425,13 +450,16 @@ importers: version: link:../configs/vite '@types/react': specifier: ^18.3.11 - version: 18.3.11 + version: 18.3.12 '@vitest/coverage-v8': - specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)) + specifier: ^2.1.4 + version: 2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1)) electron: specifier: ^32.2.0 - version: 32.2.0 + version: 32.2.3 + eslint: + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../configs/eslint @@ -439,23 +467,23 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) drift/examples/tauri: dependencies: '@reduxjs/toolkit': - specifier: ^2.2.8 - version: 2.2.8(react-redux@9.1.2(@types/react@18.3.11)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + specifier: ^2.3.0 + version: 2.3.0(react-redux@9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1))(react@18.3.1) '@synnaxlabs/drift': specifier: workspace:* version: link:../.. '@tauri-apps/api': - specifier: ^2.0.2 - version: 2.0.2 + specifier: ^2.1.0 + version: 2.1.0 react: specifier: ^18.3.1 version: 18.3.1 @@ -465,25 +493,25 @@ importers: devDependencies: '@tauri-apps/cli': specifier: ^2.0.2 - version: 2.0.2 + version: 2.1.0 '@types/react': specifier: ^18.3.11 - version: 18.3.11 + version: 18.3.12 '@types/react-dom': specifier: ^18.3.1 version: 18.3.1 '@vitejs/plugin-react': - specifier: ^4.3.2 - version: 4.3.2(vite@5.4.8(@types/node@22.7.5)) + specifier: ^4.3.3 + version: 4.3.3(vite@5.4.10(@types/node@22.9.0)) typescript: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vite-tsconfig-paths: - specifier: ^5.0.1 - version: 5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)) + specifier: ^5.1.2 + version: 5.1.2(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)) freighter/ts: dependencies: @@ -511,10 +539,13 @@ importers: version: link:../../configs/vite '@types/node': specifier: ^22.7.5 - version: 22.7.5 + version: 22.9.0 '@vitest/coverage-v8': - specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)) + specifier: ^2.1.4 + version: 2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1)) + eslint: + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../../configs/eslint @@ -522,11 +553,11 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) integration/ts: dependencies: @@ -538,7 +569,7 @@ importers: version: link:../../x/ts tsx: specifier: ^4.19.1 - version: 4.19.1 + version: 4.19.2 devDependencies: '@synnaxlabs/tsconfig': specifier: workspace:* @@ -548,13 +579,13 @@ importers: version: link:../../configs/vite '@types/node': specifier: ^22.7.5 - version: 22.7.5 + version: 22.9.0 '@vitest/coverage-v8': - specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)) + specifier: ^2.1.4 + version: 2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1)) eslint: - specifier: ^9.12.0 - version: 9.12.0 + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../../configs/eslint @@ -562,11 +593,11 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) pluto: dependencies: @@ -589,8 +620,11 @@ importers: specifier: workspace:* version: link:../x/ts '@tanstack/react-virtual': - specifier: ^3.10.8 - version: 3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.10.9 + version: 3.10.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@xyflow/react': + specifier: ^12.3.4 + version: 12.3.5(@types/react@18.3.12)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) async-mutex: specifier: ^0.5.0 version: 0.5.0 @@ -604,8 +638,8 @@ importers: specifier: ^7.0.0 version: 7.0.0 mathjs: - specifier: ^13.2.0 - version: 13.2.0 + specifier: ^13.2.1 + version: 13.2.1 proxy-memoize: specifier: 2.0.3 version: 2.0.3 @@ -615,12 +649,6 @@ importers: react-color: specifier: ^2.19.3 version: 2.19.3(react@18.3.1) - react-query: - specifier: ^3.39.3 - version: 3.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - reactflow: - specifier: ^11.11.4 - version: 11.11.4(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) zod: specifier: ^3.23.8 version: 3.23.8 @@ -636,7 +664,7 @@ importers: version: link:../configs/vite '@testing-library/react': specifier: ^16.0.1 - version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^14.5.2 version: 14.5.2(@testing-library/dom@10.4.0) @@ -648,7 +676,7 @@ importers: version: 2019.7.3 '@types/react': specifier: ^18.3.11 - version: 18.3.11 + version: 18.3.12 '@types/react-color': specifier: ^3.0.12 version: 3.0.12 @@ -659,11 +687,14 @@ importers: specifier: ^0.0.11 version: 0.0.11 '@vitejs/plugin-react': - specifier: ^4.3.2 - version: 4.3.2(vite@5.4.8(@types/node@22.7.5)) + specifier: ^4.3.3 + version: 4.3.3(vite@5.4.10(@types/node@22.9.0)) '@vitest/coverage-v8': - specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)) + specifier: ^2.1.4 + version: 2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1)) + eslint: + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../configs/eslint @@ -680,11 +711,11 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) pluto/examples: dependencies: @@ -700,34 +731,34 @@ importers: devDependencies: '@types/react': specifier: ^18.3.11 - version: 18.3.11 + version: 18.3.12 '@types/react-dom': specifier: ^18.3.1 version: 18.3.1 '@typescript-eslint/eslint-plugin': specifier: ^8.8.1 - version: 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3) + version: 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3))(eslint@9.14.0)(typescript@5.6.3) '@typescript-eslint/parser': specifier: ^8.8.1 - version: 8.8.1(eslint@9.12.0)(typescript@5.6.3) + version: 8.13.0(eslint@9.14.0)(typescript@5.6.3) '@vitejs/plugin-react': - specifier: ^4.3.2 - version: 4.3.2(vite@5.4.8(@types/node@22.7.5)) + specifier: ^4.3.3 + version: 4.3.3(vite@5.4.10(@types/node@22.9.0)) eslint: - specifier: ^9.12.0 - version: 9.12.0 + specifier: ^9.14.0 + version: 9.14.0 eslint-plugin-react-hooks: specifier: ^4.6.2 - version: 4.6.2(eslint@9.12.0) + version: 4.6.2(eslint@9.14.0) eslint-plugin-react-refresh: specifier: ^0.4.12 - version: 0.4.12(eslint@9.12.0) + version: 0.4.14(eslint@9.14.0) typescript: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) x/media: dependencies: @@ -736,7 +767,7 @@ importers: version: link:../ts '@types/react': specifier: ^18.3.11 - version: 18.3.11 + version: 18.3.12 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -758,19 +789,22 @@ importers: version: link:../../configs/vite '@types/node': specifier: ^22.7.5 - version: 22.7.5 + version: 22.9.0 '@vitejs/plugin-react': - specifier: ^4.3.2 - version: 4.3.2(vite@5.4.8(@types/node@22.7.5)) + specifier: ^4.3.3 + version: 4.3.3(vite@5.4.10(@types/node@22.9.0)) + eslint: + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../../configs/eslint vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) x/ts: dependencies: @@ -779,7 +813,7 @@ importers: version: 4.2.0 nanoid: specifier: ^5.0.7 - version: 5.0.7 + version: 5.0.8 zod: specifier: ^3.23.8 version: 3.23.8 @@ -792,10 +826,13 @@ importers: version: link:../../configs/vite '@types/node': specifier: ^22.7.5 - version: 22.7.5 + version: 22.9.0 '@vitest/coverage-v8': - specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)) + specifier: ^2.1.4 + version: 2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1)) + eslint: + specifier: ^9.14.0 + version: 9.14.0 eslint-config-synnaxlabs: specifier: workspace:* version: link:../../configs/eslint @@ -803,11 +840,11 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.4.8 - version: 5.4.8(@types/node@22.7.5) + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.9.0) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) packages: @@ -913,8 +950,8 @@ packages: '@astrojs/markdown-remark@5.3.0': resolution: {integrity: sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==} - '@astrojs/mdx@3.1.8': - resolution: {integrity: sha512-4o/+pvgoLFG0eG96cFs4t3NzZAIAOYu57fKAprWHXJrnq/qdBV0av6BYDjoESxvxNILUYoj8sdZVWtlPWVDLog==} + '@astrojs/mdx@3.1.9': + resolution: {integrity: sha512-3jPD4Bff6lIA20RQoonnZkRtZ9T3i0HFm6fcDF7BMsKIZ+xBP2KXzQWiuGu62lrVCmU612N+SQVGl5e0fI+zWg==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} peerDependencies: astro: ^4.8.0 @@ -936,8 +973,8 @@ packages: resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - '@astrojs/vercel@7.8.1': - resolution: {integrity: sha512-2PIVmv2/nI527DQsaZnf2jeUr+ddJjaQLXwqnVPXQn0LfIE8mi8BgYC5SUU9hJWIaFwEWTwJh90POaA2L3RpWQ==} + '@astrojs/vercel@7.8.2': + resolution: {integrity: sha512-U2JsfN0LzFMX5CPrcb+5bAAyqyYURP6Dk/mUIXX87r5x4baQy+juU+ntvf926YA0tR7u6jPRXHymE2axQ/l3NQ==} peerDependencies: astro: ^4.2.0 @@ -948,58 +985,66 @@ packages: resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.8': - resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.25.8': - resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==} + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.7': - resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.7': - resolution: {integrity: sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==} + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.7': - resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.7': - resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.7': - resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.25.7': - resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.25.7': - resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.7': resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.7': resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.7': - resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.7': - resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} '@babel/highlight@7.25.7': @@ -1011,8 +1056,13 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.25.7': - resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==} + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1029,8 +1079,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.25.7': - resolution: {integrity: sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==} + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1039,18 +1089,26 @@ packages: resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.7': - resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.7': - resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} '@babel/types@7.25.8': resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1390,21 +1448,25 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^9.12.0 + eslint: ^9.14.0 '@eslint-community/regexpp@4.11.1': resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.2.0': - resolution: {integrity: sha512-CkPWddN7J9JPrQedEr2X7AjK9y1jaMJtxZ4A/+jTMFA2+n5BWhcKHW/EbJyARqg2zzQfgtWUtVmG3hrG6+nGpg==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.2.2': + resolution: {integrity: sha512-jhgiIrsw+tRfcBQ4BFl2C3vCrIUw2trCY0cnDvGZpwTtKCEDmZhAtMfrEUP/KpnwM6PrO0T+Ltm+ccW74olG3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^9.12.0 + eslint: ^9.14.0 peerDependenciesMeta: eslint: optional: true @@ -1413,16 +1475,16 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.6.0': - resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.12.0': - resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} + '@eslint/js@9.14.0': + resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': @@ -1451,12 +1513,12 @@ packages: engines: {node: '>=6'} hasBin: true - '@humanfs/core@0.19.0': - resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.5': - resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -1467,6 +1529,10 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + '@icons/material@0.2.4': resolution: {integrity: sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==} peerDependencies: @@ -1613,21 +1679,14 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - '@mdx-js/mdx@3.0.1': - resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} - - '@microsoft/api-extractor-model@7.29.6': - resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} '@microsoft/api-extractor-model@7.29.8': resolution: {integrity: sha512-t3Z/xcO6TRbMcnKGVMs4uMzv/gd5j0NhMiJIGjD4cJMeFJ1Hf8wnLSx37vxlRlL0GWlGJhnFgxvnaL6JlS+73g==} - '@microsoft/api-extractor@7.47.7': - resolution: {integrity: sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==} - hasBin: true - - '@microsoft/api-extractor@7.47.9': - resolution: {integrity: sha512-TTq30M1rikVsO5wZVToQT/dGyJY7UXJmjiRtkHPLb74Prx3Etw8+bX7Bv7iLuby6ysb7fuu1NFWqma+csym8Jw==} + '@microsoft/api-extractor@7.47.11': + resolution: {integrity: sha512-lrudfbPub5wzBhymfFtgZKuBvXxoSIAdrvS2UbHjoMT2TjIEddq6Z13pcve7A03BAouw0x8sW8G4txdgfiSwpQ==} hasBin: true '@microsoft/tsdoc-config@0.17.0': @@ -1682,15 +1741,15 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/context-zone-peer-dep@1.26.0': - resolution: {integrity: sha512-Mgdy0WsHR52h5AnN2nhZJrelDK6unOFr8aSn3ToETk6DLSOijayOi0M0SZM72qhWr7iFrJ1oxGEIK8uzVaSC8Q==} + '@opentelemetry/context-zone-peer-dep@1.27.0': + resolution: {integrity: sha512-gVeOOpqnLgP51F0EJGHeoAJmAHxXXroT1Tk2WVnMf/22jTiAunYzFFsMaqmcH8mNqjTYBLJb28Rz0tInO7uClg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' zone.js: ^0.10.2 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0 - '@opentelemetry/context-zone@1.26.0': - resolution: {integrity: sha512-ckBEUKo7jZnZ2jARcntv365413cTe9Ra7uMQWvdk10K3tWOUsLnBG8dSMRbkaA+XL9hWGrZ1MMI8UXrwnbp0FA==} + '@opentelemetry/context-zone@1.27.0': + resolution: {integrity: sha512-8lg/QKHNS8zGH5YPpenqXoA7L4pFPvGgxKFBAKoPvLx378posut7yXDl4XA10+yw2QRwIwMDBJ/8d6cOQ9G00Q==} engines: {node: '>=14'} '@opentelemetry/core@1.24.1': @@ -1711,6 +1770,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@1.27.0': + resolution: {integrity: sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/exporter-logs-otlp-http@0.52.1': resolution: {integrity: sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA==} engines: {node: '>=14'} @@ -2159,6 +2224,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/resources@1.27.0': + resolution: {integrity: sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-logs@0.51.1': resolution: {integrity: sha512-ULQQtl82b673PpZc5/0EtH4V+BrwVOgKJZEB7tYZnGTG3I98tQVk89S9/JSixomDr++F4ih+LSJTCqIKBz+MQQ==} engines: {node: '>=14'} @@ -2208,8 +2279,8 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-base@1.26.0': - resolution: {integrity: sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==} + '@opentelemetry/sdk-trace-base@1.27.0': + resolution: {integrity: sha512-btz6XTQzwsyJjombpeqCX6LhiMQYpzt2pIYNPnw0IPO/3AhT6yjnf8Mnv3ZC2A4eRYOjqrg+bfaXg9XHDRJDWQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -2232,8 +2303,8 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-web@1.26.0': - resolution: {integrity: sha512-sxeKPcG/gUyxZ8iB8X1MI8/grfSCGgo1n2kxOE73zjVaO9yW/7JuVC3gqUaWRjtZ6VD/V3lo2/ZSwMlm6n2mdg==} + '@opentelemetry/sdk-trace-web@1.27.0': + resolution: {integrity: sha512-ORZfG8Sm5IkJeI+P8MyW8v4m5OcmjEtD7VsjBghv5sDKH3f5p2mQpEEoJWlCr5GiW50Y1MaI2R4uFGIsxmDE9A==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -2293,44 +2364,8 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@reactflow/background@11.3.14': - resolution: {integrity: sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==} - peerDependencies: - react: ^18.3.1 - react-dom: ^18.3.1 - - '@reactflow/controls@11.2.14': - resolution: {integrity: sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==} - peerDependencies: - react: ^18.3.1 - react-dom: ^18.3.1 - - '@reactflow/core@11.11.4': - resolution: {integrity: sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==} - peerDependencies: - react: ^18.3.1 - react-dom: ^18.3.1 - - '@reactflow/minimap@11.7.14': - resolution: {integrity: sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==} - peerDependencies: - react: ^18.3.1 - react-dom: ^18.3.1 - - '@reactflow/node-resizer@2.2.14': - resolution: {integrity: sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==} - peerDependencies: - react: ^18.3.1 - react-dom: ^18.3.1 - - '@reactflow/node-toolbar@1.3.14': - resolution: {integrity: sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==} - peerDependencies: - react: ^18.3.1 - react-dom: ^18.3.1 - - '@reduxjs/toolkit@2.2.8': - resolution: {integrity: sha512-eK/ieXftPRQfaBSmzsamXEyDwkntMTY0e9SG5ETsEOv5JIPKhu3mj992t6B8FJjlnSrZBAAqdT8oMkPe4j+P9g==} + '@reduxjs/toolkit@2.3.0': + resolution: {integrity: sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA==} peerDependencies: react: ^18.3.1 react-redux: ^9.1.2 @@ -2344,8 +2379,8 @@ packages: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} - '@rollup/pluginutils@5.1.2': - resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2433,14 +2468,6 @@ packages: cpu: [x64] os: [win32] - '@rushstack/node-core-library@5.7.0': - resolution: {integrity: sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - '@rushstack/node-core-library@5.9.0': resolution: {integrity: sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==} peerDependencies: @@ -2452,14 +2479,6 @@ packages: '@rushstack/rig-package@0.5.3': resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - '@rushstack/terminal@0.14.0': - resolution: {integrity: sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - '@rushstack/terminal@0.14.2': resolution: {integrity: sha512-2fC1wqu1VCExKC0/L+0noVcFQEXEnoBOtCIex1TOjBzEDWcw8KzJjjj7aTP6mLxepG0XIyn9OufeFb6SFsa+sg==} peerDependencies: @@ -2468,23 +2487,20 @@ packages: '@types/node': optional: true - '@rushstack/ts-command-line@4.22.6': - resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} - - '@rushstack/ts-command-line@4.22.8': - resolution: {integrity: sha512-XbFjOoV7qZHJnSuFUHv0pKaFA4ixyCuki+xMjsMfDwfvQjs5MYG0IK5COal3tRnG7KCDe2l/G+9LrzYE/RJhgg==} + '@rushstack/ts-command-line@4.23.0': + resolution: {integrity: sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==} - '@shikijs/core@1.22.0': - resolution: {integrity: sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==} + '@shikijs/core@1.22.2': + resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} - '@shikijs/engine-javascript@1.22.0': - resolution: {integrity: sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==} + '@shikijs/engine-javascript@1.22.2': + resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} - '@shikijs/engine-oniguruma@1.22.0': - resolution: {integrity: sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==} + '@shikijs/engine-oniguruma@1.22.2': + resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} - '@shikijs/types@1.22.0': - resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==} + '@shikijs/types@1.22.2': + resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} '@shikijs/vscode-textmate@9.3.0': resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} @@ -2497,105 +2513,105 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tanstack/query-core@5.59.9': - resolution: {integrity: sha512-vFGnblfJOKlOPyTR5M0ohWKb/03eGubh5KuGyzsDfc7VQ6F0nsB75kQIoLpwp3Wfj6fKv0wGoTUX8BsIfhxDfw==} + '@tanstack/query-core@5.59.20': + resolution: {integrity: sha512-e8vw0lf7KwfGe1if4uPFhvZRWULqHjFcz3K8AebtieXvnMOz5FSzlZe3mTLlPuUBcydCnBRqYs2YJ5ys68wwLg==} - '@tanstack/react-query@5.59.9': - resolution: {integrity: sha512-g2cbiw/ZIIrnUaQqhGtarTAsuLdKDNLtY5HNfRHVWY9kHDj96M4qs4ygJxHc119tPQpzZe4i9W7d2Gc2Gvng2A==} + '@tanstack/react-query@5.59.20': + resolution: {integrity: sha512-Zly0egsK0tFdfSbh5/mapSa+Zfc3Et0Zkar7Wo5sQkFzWyB3p3uZWOHR2wrlAEEV2L953eLuDBtbgFvMYiLvUw==} peerDependencies: react: ^18.3.1 - '@tanstack/react-virtual@3.10.8': - resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} + '@tanstack/react-virtual@3.10.9': + resolution: {integrity: sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g==} peerDependencies: react: ^18.3.1 react-dom: ^18.3.1 - '@tanstack/virtual-core@3.10.8': - resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} + '@tanstack/virtual-core@3.10.9': + resolution: {integrity: sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw==} - '@tauri-apps/api@2.0.2': - resolution: {integrity: sha512-3wSwmG+1kr6WrgAFKK5ijkNFPp8TT3FLj3YHUb5EwMO+3FxX4uWlfSWkeeBy+Kc1RsKzugtYLuuya+98Flj+3w==} + '@tauri-apps/api@2.1.0': + resolution: {integrity: sha512-1w/JygZOiUtdOU7qart78MaB4/qayZ2heB793KhbZRS7I9q4sxXcXaB7He6uFlprD8w5TI9P8HCuEByCvWRtfw==} - '@tauri-apps/cli-darwin-arm64@2.0.2': - resolution: {integrity: sha512-B+/a8Q6wAqmB4A4HVeK0oQP5TdQGKW60ZLOI9O2ktH2HPr9ETr3XkwXPuJ2uAOuGEgtRZHBgFOIgG000vMnKlg==} + '@tauri-apps/cli-darwin-arm64@2.1.0': + resolution: {integrity: sha512-ESc6J6CE8hl1yKH2vJ+ALF+thq4Be+DM1mvmTyUCQObvezNCNhzfS6abIUd3ou4x5RGH51ouiANeT3wekU6dCw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tauri-apps/cli-darwin-x64@2.0.2': - resolution: {integrity: sha512-kaurhn6XT4gAVCPAQSSHl/CHFxTS0ljc47N7iGTSlYJ03sCWPRZeNuVa/bn6rolz9MA2JfnRnFqB1pUL6jzp9Q==} + '@tauri-apps/cli-darwin-x64@2.1.0': + resolution: {integrity: sha512-TasHS442DFs8cSH2eUQzuDBXUST4ECjCd0yyP+zZzvAruiB0Bg+c8A+I/EnqCvBQ2G2yvWLYG8q/LI7c87A5UA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tauri-apps/cli-linux-arm-gnueabihf@2.0.2': - resolution: {integrity: sha512-bVrofjlacMxmGMcqK18iBW05tsZXOd19/MnqruFFcHSVjvkGGIXHMtUbMXnZNXBPkHDsnfytNtkY9SZGfCFaBA==} + '@tauri-apps/cli-linux-arm-gnueabihf@2.1.0': + resolution: {integrity: sha512-aP7ZBGNL4ny07Cbb6kKpUOSrmhcIK2KhjviTzYlh+pPhAptxnC78xQGD3zKQkTi2WliJLPmBYbOHWWQa57lQ9w==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tauri-apps/cli-linux-arm64-gnu@2.0.2': - resolution: {integrity: sha512-7XCBn0TTBVQGnV42dXcbHPLg/9W8kJoVzuliIozvNGyRWxfXqDbQYzpI48HUQG3LgHMabcw8+pVZAfGhevLrCA==} + '@tauri-apps/cli-linux-arm64-gnu@2.1.0': + resolution: {integrity: sha512-ZTdgD5gLeMCzndMT2f358EkoYkZ5T+Qy6zPzU+l5vv5M7dHVN9ZmblNAYYXmoOuw7y+BY4X/rZvHV9pcGrcanQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-arm64-musl@2.0.2': - resolution: {integrity: sha512-1xi2SreGVlpAL68MCsDUY63rdItUdPZreXIAcOVqvUehcJRYOa1XGSBhrV0YXRgZeh0AtKC19z6PRzcv4rosZA==} + '@tauri-apps/cli-linux-arm64-musl@2.1.0': + resolution: {integrity: sha512-NzwqjUCilhnhJzusz3d/0i0F1GFrwCQbkwR6yAHUxItESbsGYkZRJk0yMEWkg3PzFnyK4cWTlQJMEU52TjhEzA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-x64-gnu@2.0.2': - resolution: {integrity: sha512-WVjwYzPWFqZVg1fx6KSU5w47Q0VbMyaCp34qs5EcS8EIU0/RnofdzqUoOYqvgGVgNgoz7Pj5dXK2SkS8BHXMmA==} + '@tauri-apps/cli-linux-x64-gnu@2.1.0': + resolution: {integrity: sha512-TyiIpMEtZxNOQmuFyfJwaaYbg3movSthpBJLIdPlKxSAB2BW0VWLY3/ZfIxm/G2YGHyREkjJvimzYE0i37PnMA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-linux-x64-musl@2.0.2': - resolution: {integrity: sha512-h5miE2mctgaQNn/BbG9o1pnJcrx+VGBi2A6JFqGu934lFgSV5+s28M8Gc8AF2JgFH4hQV4IuMkeSw8Chu5Dodg==} + '@tauri-apps/cli-linux-x64-musl@2.1.0': + resolution: {integrity: sha512-/dQd0TlaxBdJACrR72DhynWftzHDaX32eBtS5WBrNJ+nnNb+znM3gON6nJ9tSE9jgDa6n1v2BkI/oIDtypfUXw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-win32-arm64-msvc@2.0.2': - resolution: {integrity: sha512-2b8oO0+dYonahG5PfA/zoq0zlafLclfmXgqoWDZ++UiPtQHJNpNeEQ8GWbSFKGHQ494Jo6jHvazOojGRE1kqAg==} + '@tauri-apps/cli-win32-arm64-msvc@2.1.0': + resolution: {integrity: sha512-NdQJO7SmdYqOcE+JPU7bwg7+odfZMWO6g8xF9SXYCMdUzvM2Gv/AQfikNXz5yS7ralRhNFuW32i5dcHlxh4pDg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tauri-apps/cli-win32-ia32-msvc@2.0.2': - resolution: {integrity: sha512-axgICLunFi0To3EibdCBgbST5RocsSmtM4c04+CbcX8WQQosJ9ziWlCSrrOTRr+gJERAMSvEyVUS98f6bWMw9A==} + '@tauri-apps/cli-win32-ia32-msvc@2.1.0': + resolution: {integrity: sha512-f5h8gKT/cB8s1ticFRUpNmHqkmaLutT62oFDB7N//2YTXnxst7EpMIn1w+QimxTvTk2gcx6EcW6bEk/y2hZGzg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@tauri-apps/cli-win32-x64-msvc@2.0.2': - resolution: {integrity: sha512-JR17cM6+DyExZRgpXr2/DdqvcFYi/EKvQt8dI5R1/uQoesWd8jeNnrU7c1FG1Zmw9+pTzDztsNqEKsrNq2sNIg==} + '@tauri-apps/cli-win32-x64-msvc@2.1.0': + resolution: {integrity: sha512-P/+LrdSSb5Xbho1LRP4haBjFHdyPdjWvGgeopL96OVtrFpYnfC+RctB45z2V2XxqFk3HweDDxk266btjttfjGw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tauri-apps/cli@2.0.2': - resolution: {integrity: sha512-R4ontHZvXORArERAHIidp5zRfZEshZczTiK+poslBv7AGKpQZoMw+E49zns7mOmP64i2Cq9Ci0pJvi4Rm8Okzw==} + '@tauri-apps/cli@2.1.0': + resolution: {integrity: sha512-K2VhcKqBhAeS5pNOVdnR/xQRU6jwpgmkSL2ejHXcl0m+kaTggT0WRDQnFtPq6NljA7aE03cvwsbCAoFG7vtkJw==} engines: {node: '>= 10'} hasBin: true '@tauri-apps/plugin-deep-link@2.0.0': resolution: {integrity: sha512-cDa2k1OrRU5DoKc0IXl1Y8RlFOU107u2phdZfT7FkApsC6TL/VAPs3YOUTT8p9/PZ50EjOKP104HFMqVqnQ0bw==} - '@tauri-apps/plugin-dialog@2.0.0': - resolution: {integrity: sha512-ApNkejXP2jpPBSifznPPcHTXxu9/YaRW+eJ+8+nYwqp0lLUtebFHG4QhxitM43wwReHE81WAV1DQ/b+2VBftOA==} + '@tauri-apps/plugin-dialog@2.0.1': + resolution: {integrity: sha512-fnUrNr6EfvTqdls/ufusU7h6UbNFzLKvHk/zTuOiBq01R3dTODqwctZlzakdbfSp/7pNwTKvgKTAgl/NAP/Z0Q==} - '@tauri-apps/plugin-fs@2.0.0': - resolution: {integrity: sha512-BNEeQQ5aH8J5SwYuWgRszVyItsmquRuzK2QRkVj8Z0sCsLnSvJFYI3JHRzzr3ltZGq1nMPtblrlZzuKqVzRawA==} + '@tauri-apps/plugin-fs@2.0.2': + resolution: {integrity: sha512-4YZaX2j7ta81M5/DL8aN10kTnpUkEpkPo1FTYPT8Dd0ImHe3azM8i8MrtjrDGoyBYLPO3zFv7df/mSCYF8oA0Q==} '@tauri-apps/plugin-process@2.0.0': resolution: {integrity: sha512-OYzi0GnkrF4NAnsHZU7U3tjSoP0PbeAlO7T1Z+vJoBUH9sFQ1NSLqWYWQyf8hcb3gVWe7P1JggjiskO+LST1ug==} - '@tauri-apps/plugin-store@2.0.0': - resolution: {integrity: sha512-l4xsbxAXrKGdBdYNNswrLfcRv3v1kOatdycOcVPYW+jKwkznCr1HEOrPXkPhXsZLSLyYmNXpgfOmdSZNmcykDg==} + '@tauri-apps/plugin-store@2.1.0': + resolution: {integrity: sha512-GADqrc17opUKYIAKnGHIUgEeTZ2wJGu1ZITKQ1WMuOFdv8fvXRFBAqsqPjE3opgWohbczX6e1NpwmZK1AnuWVw==} '@tauri-apps/plugin-updater@2.0.0': resolution: {integrity: sha512-N0cl71g7RPr7zK2Fe5aoIwzw14NcdLcz7XMGFWZVjprsqgDRWoxbnUkknyCQMZthjhGkppCd/wN2MIsUz+eAhQ==} @@ -2676,99 +2692,30 @@ packages: '@types/cookies@0.9.0': resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} - '@types/d3-array@3.2.1': - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - - '@types/d3-axis@3.0.6': - resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} - - '@types/d3-brush@3.0.6': - resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} - - '@types/d3-chord@3.0.6': - resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} - '@types/d3-color@3.1.3': resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - '@types/d3-contour@3.0.6': - resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} - - '@types/d3-delaunay@6.0.4': - resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} - - '@types/d3-dispatch@3.0.6': - resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} - '@types/d3-drag@3.0.7': resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} - '@types/d3-dsv@3.0.7': - resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-fetch@3.0.7': - resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} - - '@types/d3-force@3.0.10': - resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} - - '@types/d3-format@3.0.4': - resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - - '@types/d3-geo@3.1.0': - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} - - '@types/d3-hierarchy@3.1.7': - resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} - '@types/d3-interpolate@3.0.4': resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - '@types/d3-path@3.1.0': - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - - '@types/d3-polygon@3.0.2': - resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} - - '@types/d3-quadtree@3.0.6': - resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - - '@types/d3-random@3.0.3': - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} - - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - '@types/d3-scale@4.0.8': resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} '@types/d3-selection@3.0.11': resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} - '@types/d3-shape@3.1.6': - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} - - '@types/d3-time-format@4.0.3': - resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - '@types/d3-time@3.0.3': resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - '@types/d3-transition@3.0.9': resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} '@types/d3-zoom@3.0.8': resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} - '@types/d3@7.4.3': - resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -2784,9 +2731,6 @@ packages: '@types/express@5.0.0': resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} - '@types/geojson@7946.0.14': - resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} - '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -2838,14 +2782,14 @@ packages: '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node@18.19.55': - resolution: {integrity: sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw==} + '@types/node@18.19.64': + resolution: {integrity: sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==} - '@types/node@20.16.11': - resolution: {integrity: sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==} + '@types/node@20.17.6': + resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==} - '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/node@22.9.0': + resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} @@ -2871,8 +2815,8 @@ packages: '@types/react-dom@18.3.1': resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - '@types/react@18.3.11': - resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} '@types/reactcss@1.2.12': resolution: {integrity: sha512-BrXUQ86/wbbFiZv8h/Q1/Q1XOsaHneYmCb/tHe9+M8XBAAUc2EHfdY0DY22ZZjVSaXr5ix7j+zsqO2eGZub8lQ==} @@ -2910,33 +2854,33 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.8.1': - resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} + '@typescript-eslint/eslint-plugin@8.13.0': + resolution: {integrity: sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^9.12.0 + eslint: ^9.14.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@8.8.1': - resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} + '@typescript-eslint/parser@8.13.0': + resolution: {integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^9.12.0 + eslint: ^9.14.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@8.8.1': - resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} + '@typescript-eslint/scope-manager@8.13.0': + resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.8.1': - resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} + '@typescript-eslint/type-utils@8.13.0': + resolution: {integrity: sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2944,12 +2888,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.8.1': - resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} + '@typescript-eslint/types@8.13.0': + resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.8.1': - resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} + '@typescript-eslint/typescript-estree@8.13.0': + resolution: {integrity: sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2957,14 +2901,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.8.1': - resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} + '@typescript-eslint/utils@8.13.0': + resolution: {integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^9.12.0 + eslint: ^9.14.0 - '@typescript-eslint/visitor-keys@8.8.1': - resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} + '@typescript-eslint/visitor-keys@8.13.0': + resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': @@ -3001,50 +2945,49 @@ packages: engines: {node: '>=16'} hasBin: true - '@vitejs/plugin-react@4.3.2': - resolution: {integrity: sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==} + '@vitejs/plugin-react@4.3.3': + resolution: {integrity: sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^5.4.8 + vite: ^5.4.10 - '@vitest/coverage-v8@2.1.2': - resolution: {integrity: sha512-b7kHrFrs2urS0cOk5N10lttI8UdJ/yP3nB4JYTREvR5o18cR99yPpK4gK8oQgI42BVv0ILWYUSYB7AXkAUDc0g==} + '@vitest/coverage-v8@2.1.4': + resolution: {integrity: sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==} peerDependencies: - '@vitest/browser': 2.1.2 - vitest: ^2.1.2 + '@vitest/browser': 2.1.4 + vitest: ^2.1.4 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@2.1.2': - resolution: {integrity: sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==} + '@vitest/expect@2.1.4': + resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==} - '@vitest/mocker@2.1.2': - resolution: {integrity: sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==} + '@vitest/mocker@2.1.4': + resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==} peerDependencies: - '@vitest/spy': 2.1.2 - msw: ^2.3.5 - vite: ^5.4.8 + msw: ^2.4.9 + vite: ^5.4.10 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@2.1.2': - resolution: {integrity: sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==} + '@vitest/pretty-format@2.1.4': + resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==} - '@vitest/runner@2.1.2': - resolution: {integrity: sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==} + '@vitest/runner@2.1.4': + resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==} - '@vitest/snapshot@2.1.2': - resolution: {integrity: sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==} + '@vitest/snapshot@2.1.4': + resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==} - '@vitest/spy@2.1.2': - resolution: {integrity: sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==} + '@vitest/spy@2.1.4': + resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==} - '@vitest/utils@2.1.2': - resolution: {integrity: sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==} + '@vitest/utils@2.1.4': + resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} '@volar/kit@2.4.6': resolution: {integrity: sha512-OaMtpmLns6IYD1nOSd0NdG/F5KzJ7Jr4B7TLeb4byPzu+ExuuRVeO56Dn1C7Frnw6bGudUQd90cpQAmxdB+RlQ==} @@ -3092,6 +3035,15 @@ packages: '@vue/shared@3.5.12': resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} + '@xyflow/react@12.3.5': + resolution: {integrity: sha512-wAYqpicdrVo1rxCu0X3M9s3YIF45Agqfabw0IBryTGqjWvr2NyfciI8gIP4MB+NKpWWN5kxZ9tiZ9u8lwC7iAg==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + + '@xyflow/system@0.0.46': + resolution: {integrity: sha512-bmFXvboVdiydIFZmDCjrbBCYgB0d5pYdkcZPWbAxGmhMRUZ+kW3CksYgYxWabrw51rwpWitLEadvLrivG0mVfA==} + abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -3110,6 +3062,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -3262,8 +3219,8 @@ packages: astro-seo@0.8.4: resolution: {integrity: sha512-Ou1vzQSXAxa0K8rtNtXNvSpYqOGEgMhh0immMxJeXmbVZac3UKCNWAoXWyOQDFYsZvBugCRSg0N1phBqPMVgCw==} - astro@4.16.0: - resolution: {integrity: sha512-R5voBFy0yOg57uFnW24WV+RvqPerp9eOoDQoT0pQYqECuGuyV1PsZaSb9Nm0ec+KMLrfO9jvvESFw9LIN6XiUw==} + astro@4.16.10: + resolution: {integrity: sha512-a+nB4bZE50NXHLzVXUHtx/lYct2Aa8kbqZnWNrWqkU97RuhBuWJ5H5/LQbKRnBWGvqChKfJBiMWJe53TY9ieYQ==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true @@ -3296,10 +3253,6 @@ packages: base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} @@ -3315,6 +3268,7 @@ packages: boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. boxen@8.0.1: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} @@ -3330,11 +3284,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - broadcast-channel@3.7.0: - resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} - - browserslist@4.24.0: - resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3365,14 +3316,14 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001668: - resolution: {integrity: sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==} + caniuse-lite@1.0.30001679: + resolution: {integrity: sha512-j2YqID/YwpLnKzCmBOS4tlZdWprXm3ZmQLBH9ZBXFOhoxLA46fwyBvx6toCBWBmnuwUY/qB3kEU6gFx8qgCroA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} chalk@2.4.2: @@ -3538,8 +3489,8 @@ packages: css-selector-parser@1.4.1: resolution: {integrity: sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + css-tree@3.0.1: + resolution: {integrity: sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-what@6.1.0: @@ -3746,11 +3697,11 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.36: - resolution: {integrity: sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==} + electron-to-chromium@1.5.55: + resolution: {integrity: sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==} - electron@32.2.0: - resolution: {integrity: sha512-Xy82QBQrEiQysoxsv6lnhHAcWNNe6vV6QqH3OPFXhEj/T9oAsBHEhZuuYHINSSsUE7zRSj+J9sNwJYOjisT0Vw==} + electron@32.2.3: + resolution: {integrity: sha512-ClTJrFuwBdZpDNEnVZSV1gTIYSq7c/TYoUv9AmOypL43/xtbfxXkz2vE67ehVoamFobWsIU2by087R5Av8cxJg==} engines: {node: '>= 12.20.55'} hasBin: true @@ -3817,6 +3768,12 @@ packages: es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -3850,38 +3807,38 @@ packages: resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: - eslint: ^9.12.0 + eslint: ^9.14.0 - eslint-plugin-react-refresh@0.4.12: - resolution: {integrity: sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==} + eslint-plugin-react-refresh@0.4.14: + resolution: {integrity: sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA==} peerDependencies: - eslint: ^9.12.0 + eslint: ^9.14.0 - eslint-plugin-react@7.37.1: - resolution: {integrity: sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==} + eslint-plugin-react@7.37.2: + resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} engines: {node: '>=4'} peerDependencies: - eslint: ^9.12.0 + eslint: ^9.14.0 eslint-plugin-simple-import-sort@12.1.1: resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} peerDependencies: - eslint: ^9.12.0 + eslint: ^9.14.0 - eslint-scope@8.1.0: - resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.1.0: - resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.12.0: - resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} + eslint@9.14.0: + resolution: {integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3890,8 +3847,8 @@ packages: jiti: optional: true - espree@10.2.0: - resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -3920,6 +3877,9 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} @@ -3939,6 +3899,10 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -4152,8 +4116,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.11.0: - resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -4241,8 +4205,8 @@ packages: hast-util-to-html@9.0.3: resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} - hast-util-to-jsx-runtime@2.3.0: - resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + hast-util-to-jsx-runtime@2.3.2: + resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} @@ -4307,6 +4271,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + engines: {node: '>= 4'} + immer@10.1.1: resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} @@ -4472,9 +4440,6 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -4564,9 +4529,6 @@ packages: js-convert-case@4.2.0: resolution: {integrity: sha512-i4mHCxiBNj6ajjMnZnC70qAOMA8gb+YgYipy2VR7a+Q5EBgEQ2/SgSAUBdNEyObk++B4AIUiFWeDEX2ggOd8cQ==} - js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4752,9 +4714,6 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - match-sorter@6.3.4: - resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} - matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -4762,8 +4721,8 @@ packages: material-colors@1.2.6: resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} - mathjs@13.2.0: - resolution: {integrity: sha512-P5PZoiUX2Tkghkv3tsSqlK0B9My/ErKapv1j6wdxd0MOrYQ30cnGE4LH/kzYB2gA5rN46Njqc4cFgJjaxgijoQ==} + mathjs@13.2.1: + resolution: {integrity: sha512-HEKNV0hckO5Y4uY/KHucmQMMiXgdNUXfJ+SkExRJHLlD3f7mt4DZMJzndQOoTp/dX8ROwk4zl2xO+iq49OEliQ==} engines: {node: '>= 18'} hasBin: true @@ -4779,6 +4738,9 @@ packages: mdast-util-from-markdown@2.0.1: resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-gfm-autolink-literal@2.0.1: resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} @@ -4818,11 +4780,14 @@ packages: mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdn-data@2.12.1: + resolution: {integrity: sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==} meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} @@ -4941,9 +4906,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - microseconds@0.2.0: - resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -5011,16 +4973,13 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - nano-time@1.0.0: - resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} - nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.0.7: - resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + nanoid@5.0.8: + resolution: {integrity: sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ==} engines: {node: ^18 || >=20} hasBin: true @@ -5101,9 +5060,6 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - oblivious-set@1.0.0: - resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -5118,8 +5074,8 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@8.1.0: - resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==} + ora@8.1.1: + resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==} engines: {node: '>=18'} p-cancelable@2.1.1: @@ -5214,9 +5170,6 @@ packages: pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -5231,10 +5184,17 @@ packages: picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -5286,8 +5246,8 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - posthog-js@1.174.2: - resolution: {integrity: sha512-UgS7eRcDVvVz2XSJ09NMX8zBcdpFnPayfiWDNF3xEbJTsIu1GipkkYNrVlsWlq8U1PIrviNm6i0Dyq8daaxssw==} + posthog-js@1.181.0: + resolution: {integrity: sha512-bI+J+f4E8x4JwbGtG6LReQv1Xvss01F6cs7UDlvffHySpVhNq4ptkNjV88B92IVEsrCtNYhy/TjFnGxk6RN0Qw==} preact@10.24.3: resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} @@ -5361,8 +5321,8 @@ packages: peerDependencies: react: ^18.3.1 - react-error-boundary@4.0.13: - resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + react-error-boundary@4.1.2: + resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} peerDependencies: react: ^18.3.1 @@ -5377,18 +5337,6 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-query@3.39.3: - resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==} - peerDependencies: - react: ^18.3.1 - react-dom: '*' - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - react-redux@9.1.2: resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} peerDependencies: @@ -5414,12 +5362,6 @@ packages: peerDependencies: react: ^18.3.1 - reactflow@11.11.4: - resolution: {integrity: sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==} - peerDependencies: - react: ^18.3.1 - react-dom: ^18.3.1 - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -5428,6 +5370,18 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + redux-thunk@3.1.0: resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} peerDependencies: @@ -5443,8 +5397,8 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex@4.3.3: - resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} + regex@4.4.0: + resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} regexp.prototype.flags@1.5.3: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} @@ -5456,6 +5410,9 @@ packages: rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + rehype-stringify@10.0.1: resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} @@ -5465,8 +5422,8 @@ packages: remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} - remark-mdx@3.0.1: - resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -5481,9 +5438,6 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - remove-accents@0.5.0: - resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - remove-markdown@0.5.5: resolution: {integrity: sha512-lMR8tOtDqazFT6W2bZidoXwkptMdF3pCxpri0AEokHg0sZlC2GdoLqnoaxsEj1o7/BtXV1MKtT3YviA1t7rW7g==} @@ -5648,8 +5602,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.22.0: - resolution: {integrity: sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==} + shiki@1.22.2: + resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} @@ -5798,8 +5752,8 @@ packages: peerDependencies: stylelint: ^16.1.0 - stylelint@16.9.0: - resolution: {integrity: sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==} + stylelint@16.10.0: + resolution: {integrity: sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -5857,8 +5811,8 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.0: - resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} tinypool@1.0.1: resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} @@ -5910,6 +5864,12 @@ packages: peerDependencies: typescript: ^5.6.3 + ts-api-utils@1.4.0: + resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: ^5.6.3 + tsconfck@3.1.4: resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} engines: {node: ^18 || >=20} @@ -5923,8 +5883,8 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - tsx@4.19.1: - resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} engines: {node: '>=18.0.0'} hasBin: true @@ -6000,8 +5960,8 @@ packages: typescript-auto-import-cache@0.3.3: resolution: {integrity: sha512-ojEC7+Ci1ij9eE6hp8Jl9VUNnsEKzztktP5gtYNRMrTmfXVwA1PITYYAkpxCvvupdSYa/Re51B6KMcv1CTZEUA==} - typescript-eslint@8.8.1: - resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==} + typescript-eslint@8.13.0: + resolution: {integrity: sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -6072,9 +6032,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - unload@2.2.0: - resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} - update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -6096,6 +6053,10 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@11.0.3: + resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==} + hasBin: true + uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -6109,31 +6070,31 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@2.1.2: - resolution: {integrity: sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==} + vite-node@2.1.4: + resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-plugin-dts@4.2.4: - resolution: {integrity: sha512-REcYoxO90Pi8c0P1J7XAa/nVwNVGkX2eYkBEIfFSfcKE4g1W8sB0R23a7SU3aLEMfdOdb0SVHq3JlJ+Qb6gjgA==} + vite-plugin-dts@4.3.0: + resolution: {integrity: sha512-LkBJh9IbLwL6/rxh0C1/bOurDrIEmRE7joC+jFdOEEciAFPbpEKOLSAr5nNh5R7CJ45cMbksTrFfy52szzC5eA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: typescript: ^5.6.3 - vite: ^5.4.8 + vite: ^5.4.10 peerDependenciesMeta: vite: optional: true - vite-tsconfig-paths@5.0.1: - resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} + vite-tsconfig-paths@5.1.2: + resolution: {integrity: sha512-gEIbKfJzSEv0yR3XS2QEocKetONoWkbROj6hGx0FHM18qKUojhvcokQsxQx5nMkelZq2n37zbSGCJn+FSODSjA==} peerDependencies: - vite: ^5.4.8 + vite: ^5.4.10 peerDependenciesMeta: vite: optional: true - vite@5.4.8: - resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} + vite@5.4.10: + resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6163,23 +6124,23 @@ packages: terser: optional: true - vitefu@1.0.2: - resolution: {integrity: sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==} + vitefu@1.0.3: + resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==} peerDependencies: - vite: ^5.4.8 + vite: ^5.4.10 peerDependenciesMeta: vite: optional: true - vitest@2.1.2: - resolution: {integrity: sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==} + vitest@2.1.4: + resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.2 - '@vitest/ui': 2.1.2 + '@vitest/browser': 2.1.4 + '@vitest/ui': 2.1.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -6475,8 +6436,8 @@ packages: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} - zod-to-json-schema@3.23.3: - resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} + zod-to-json-schema@3.23.5: + resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} peerDependencies: zod: ^3.23.8 @@ -6593,38 +6554,38 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@astro-community/astro-embed-integration@0.7.2(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3))': + '@astro-community/astro-embed-integration@0.7.2(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3))': dependencies: '@astro-community/astro-embed-link-preview': 0.2.2 - '@astro-community/astro-embed-twitter': 0.5.6(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) - '@astro-community/astro-embed-vimeo': 0.3.10(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) - '@astro-community/astro-embed-youtube': 0.5.5(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) + '@astro-community/astro-embed-twitter': 0.5.6(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) + '@astro-community/astro-embed-vimeo': 0.3.10(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) + '@astro-community/astro-embed-youtube': 0.5.5(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) '@types/unist': 2.0.11 - astro: 4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3) - astro-auto-import: 0.4.4(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) + astro: 4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3) + astro-auto-import: 0.4.4(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) unist-util-select: 4.0.3 '@astro-community/astro-embed-link-preview@0.2.2': dependencies: '@astro-community/astro-embed-utils': 0.1.3 - '@astro-community/astro-embed-twitter@0.5.6(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3))': + '@astro-community/astro-embed-twitter@0.5.6(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3))': dependencies: '@astro-community/astro-embed-utils': 0.1.3 - astro: 4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3) + astro: 4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3) '@astro-community/astro-embed-utils@0.1.3': dependencies: linkedom: 0.14.26 - '@astro-community/astro-embed-vimeo@0.3.10(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3))': + '@astro-community/astro-embed-vimeo@0.3.10(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3))': dependencies: '@astro-community/astro-embed-utils': 0.1.3 - astro: 4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3) + astro: 4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3) - '@astro-community/astro-embed-youtube@0.5.5(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3))': + '@astro-community/astro-embed-youtube@0.5.5(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3))': dependencies: - astro: 4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3) + astro: 4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3) lite-youtube-embed: 0.3.3 '@astrojs/check@0.5.10(prettier@3.3.3)(typescript@5.6.3)': @@ -6682,7 +6643,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.1 remark-smartypants: 3.0.2 - shiki: 1.22.0 + shiki: 1.22.2 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 @@ -6691,12 +6652,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@3.1.8(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3))': + '@astrojs/mdx@3.1.9(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3))': dependencies: '@astrojs/markdown-remark': 5.3.0 - '@mdx-js/mdx': 3.0.1 - acorn: 8.12.1 - astro: 4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3) + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + acorn: 8.14.0 + astro: 4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3) es-module-lexer: 1.5.4 estree-util-visit: 2.0.0 gray-matter: 4.0.3 @@ -6715,11 +6676,11 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/react@3.6.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.8(@types/node@22.7.5))': + '@astrojs/react@3.6.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.10(@types/node@22.9.0))': dependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@vitejs/plugin-react': 4.3.2(vite@5.4.8(@types/node@22.7.5)) + '@vitejs/plugin-react': 4.3.3(vite@5.4.10(@types/node@22.9.0)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.5.3 @@ -6739,13 +6700,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/vercel@7.8.1(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3))(react@18.3.1)': + '@astrojs/vercel@7.8.2(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3))(react@18.3.1)': dependencies: '@astrojs/internal-helpers': 0.4.1 '@vercel/analytics': 1.3.1(react@18.3.1) '@vercel/edge': 1.1.2 '@vercel/nft': 0.27.4 - astro: 4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3) + astro: 4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3) esbuild: 0.21.5 fast-glob: 3.3.2 web-vitals: 3.5.2 @@ -6764,20 +6725,26 @@ snapshots: '@babel/highlight': 7.25.7 picocolors: 1.1.0 - '@babel/compat-data@7.25.8': {} + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.2': {} - '@babel/core@7.25.8': + '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.25.7 - '@babel/generator': 7.25.7 - '@babel/helper-compilation-targets': 7.25.7 - '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8) - '@babel/helpers': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/template': 7.25.7 - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 convert-source-map: 2.0.0 debug: 4.3.7 gensync: 1.0.0-beta.2 @@ -6786,65 +6753,62 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.25.7': + '@babel/generator@7.26.2': dependencies: - '@babel/types': 7.25.8 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 - '@babel/helper-annotate-as-pure@7.25.7': + '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.25.8 + '@babel/types': 7.26.0 - '@babel/helper-compilation-targets@7.25.7': + '@babel/helper-compilation-targets@7.25.9': dependencies: - '@babel/compat-data': 7.25.8 - '@babel/helper-validator-option': 7.25.7 - browserslist: 4.24.0 + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.25.7': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.8)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-module-imports': 7.25.7 - '@babel/helper-simple-access': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 - '@babel/traverse': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.25.7': {} - - '@babel/helper-simple-access@7.25.7': - dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 - transitivePeerDependencies: - - supports-color + '@babel/helper-plugin-utils@7.25.9': {} '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-validator-identifier@7.25.7': {} - '@babel/helper-validator-option@7.25.7': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helpers@7.25.7': + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': dependencies: - '@babel/template': 7.25.7 - '@babel/types': 7.25.8 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 '@babel/highlight@7.25.7': dependencies: - '@babel/helper-validator-identifier': 7.25.7 + '@babel/helper-validator-identifier': 7.25.9 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.0 @@ -6853,29 +6817,33 @@ snapshots: dependencies: '@babel/types': 7.25.8 - '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.8)': + '@babel/parser@7.26.2': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/types': 7.26.0 - '@babel/plugin-transform-react-jsx-self@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-react-jsx-source@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-transform-react-jsx-self@7.25.7(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-transform-react-jsx-source@7.25.7(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-annotate-as-pure': 7.25.7 - '@babel/helper-module-imports': 7.25.7 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.8) - '@babel/types': 7.25.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -6883,19 +6851,23 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.7': + '@babel/runtime@7.26.0': dependencies: - '@babel/code-frame': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/types': 7.25.8 + regenerator-runtime: 0.14.1 - '@babel/traverse@7.25.7': + '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.25.7 - '@babel/generator': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/template': 7.25.7 - '@babel/types': 7.25.8 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: @@ -6907,6 +6879,11 @@ snapshots: '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@bcoe/v8-coverage@0.2.3': {} '@csstools/css-parser-algorithms@3.0.2(@csstools/css-tokenizer@3.0.2)': @@ -7109,16 +7086,18 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.14.0)': dependencies: - eslint: 9.12.0 + eslint: 9.14.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} - '@eslint/compat@1.2.0(eslint@9.12.0)': + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/compat@1.2.2(eslint@9.14.0)': optionalDependencies: - eslint: 9.12.0 + eslint: 9.14.0 '@eslint/config-array@0.18.0': dependencies: @@ -7128,13 +7107,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.6.0': {} + '@eslint/core@0.7.0': {} '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 debug: 4.3.7 - espree: 10.2.0 + espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 @@ -7144,7 +7123,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.12.0': {} + '@eslint/js@9.14.0': {} '@eslint/object-schema@2.1.4': {} @@ -7170,17 +7149,19 @@ snapshots: protobufjs: 7.4.0 yargs: 17.7.2 - '@humanfs/core@0.19.0': {} + '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.5': + '@humanfs/node@0.16.6': dependencies: - '@humanfs/core': 0.19.0 + '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/retry@0.4.1': {} + '@icons/material@0.2.4(react@18.3.1)': dependencies: react: 18.3.1 @@ -7307,7 +7288,7 @@ snapshots: - encoding - supports-color - '@mdx-js/mdx@3.0.1': + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': dependencies: '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 @@ -7315,15 +7296,16 @@ snapshots: '@types/mdx': 2.0.13 collapse-white-space: 2.1.0 devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 + estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 + hast-util-to-jsx-runtime: 2.3.2 markdown-extensions: 2.0.0 - periscopic: 3.1.0 - remark-mdx: 3.0.1 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 remark-parse: 11.0.0 remark-rehype: 11.1.1 source-map: 0.7.4 @@ -7333,51 +7315,26 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 transitivePeerDependencies: + - acorn - supports-color - '@microsoft/api-extractor-model@7.29.6(@types/node@22.7.5)': + '@microsoft/api-extractor-model@7.29.8(@types/node@22.9.0)': dependencies: '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.7.0(@types/node@22.7.5) + '@rushstack/node-core-library': 5.9.0(@types/node@22.9.0) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.29.8(@types/node@22.7.5)': + '@microsoft/api-extractor@7.47.11(@types/node@22.9.0)': dependencies: + '@microsoft/api-extractor-model': 7.29.8(@types/node@22.9.0) '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.9.0(@types/node@22.7.5) - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor@7.47.7(@types/node@22.7.5)': - dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@22.7.5) - '@microsoft/tsdoc': 0.15.0 - '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.7.0(@types/node@22.7.5) - '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@22.7.5) - '@rushstack/ts-command-line': 4.22.6(@types/node@22.7.5) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.6.3 - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor@7.47.9(@types/node@22.7.5)': - dependencies: - '@microsoft/api-extractor-model': 7.29.8(@types/node@22.7.5) - '@microsoft/tsdoc': 0.15.0 - '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.9.0(@types/node@22.7.5) + '@rushstack/node-core-library': 5.9.0(@types/node@22.9.0) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.2(@types/node@22.7.5) - '@rushstack/ts-command-line': 4.22.8(@types/node@22.7.5) + '@rushstack/terminal': 0.14.2(@types/node@22.9.0) + '@rushstack/ts-command-line': 4.23.0(@types/node@22.9.0) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -7483,14 +7440,14 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-zone-peer-dep@1.26.0(@opentelemetry/api@1.9.0)(zone.js@0.14.10)': + '@opentelemetry/context-zone-peer-dep@1.27.0(@opentelemetry/api@1.9.0)(zone.js@0.14.10)': dependencies: '@opentelemetry/api': 1.9.0 zone.js: 0.14.10 - '@opentelemetry/context-zone@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-zone@1.27.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/context-zone-peer-dep': 1.26.0(@opentelemetry/api@1.9.0)(zone.js@0.14.10) + '@opentelemetry/context-zone-peer-dep': 1.27.0(@opentelemetry/api@1.9.0)(zone.js@0.14.10) zone.js: 0.14.10 transitivePeerDependencies: - '@opentelemetry/api' @@ -7510,6 +7467,11 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/exporter-logs-otlp-http@0.52.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -7690,10 +7652,10 @@ snapshots: '@opentelemetry/instrumentation-document-load@0.40.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-web': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-web': 1.27.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color @@ -8125,6 +8087,12 @@ snapshots: '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/resources@1.27.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/sdk-logs@0.51.1(@opentelemetry/api-logs@0.51.1)(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -8205,11 +8173,11 @@ snapshots: '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.27.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 '@opentelemetry/sdk-trace-node@1.24.1(@opentelemetry/api@1.9.0)': @@ -8239,11 +8207,11 @@ snapshots: '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/sdk-trace-web@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-web@1.27.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 '@opentelemetry/semantic-conventions@1.24.1': {} @@ -8285,85 +8253,7 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@reactflow/background@11.3.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classcat: 5.0.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.5(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/controls@11.2.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classcat: 5.0.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.5(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/core@11.11.4(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@types/d3': 7.4.3 - '@types/d3-drag': 3.0.7 - '@types/d3-selection': 3.0.11 - '@types/d3-zoom': 3.0.8 - classcat: 5.0.5 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.5(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/minimap@11.7.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@types/d3-selection': 3.0.11 - '@types/d3-zoom': 3.0.8 - classcat: 5.0.5 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.5(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/node-resizer@2.2.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classcat: 5.0.5 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.5(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/node-toolbar@1.3.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classcat: 5.0.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.5(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reduxjs/toolkit@2.2.8(react-redux@9.1.2(@types/react@18.3.11)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': + '@reduxjs/toolkit@2.3.0(react-redux@9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': dependencies: immer: 10.1.1 redux: 5.0.1 @@ -8371,18 +8261,18 @@ snapshots: reselect: 5.1.1 optionalDependencies: react: 18.3.1 - react-redux: 9.1.2(@types/react@18.3.11)(react@18.3.1)(redux@5.0.1) + react-redux: 9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1) '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.1.2(rollup@4.24.0)': + '@rollup/pluginutils@5.1.3(rollup@4.24.0)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.2 optionalDependencies: rollup: 4.24.0 @@ -8434,20 +8324,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true - '@rushstack/node-core-library@5.7.0(@types/node@22.7.5)': - dependencies: - ajv: 8.13.0 - ajv-draft-04: 1.0.0(ajv@8.13.0) - ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - optionalDependencies: - '@types/node': 22.7.5 - - '@rushstack/node-core-library@5.9.0(@types/node@22.7.5)': + '@rushstack/node-core-library@5.9.0(@types/node@22.9.0)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -8458,66 +8335,50 @@ snapshots: resolve: 1.22.8 semver: 7.5.4 optionalDependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.0(@types/node@22.7.5)': - dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@22.7.5) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 22.7.5 - - '@rushstack/terminal@0.14.2(@types/node@22.7.5)': + '@rushstack/terminal@0.14.2(@types/node@22.9.0)': dependencies: - '@rushstack/node-core-library': 5.9.0(@types/node@22.7.5) + '@rushstack/node-core-library': 5.9.0(@types/node@22.9.0) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.7.5 - - '@rushstack/ts-command-line@4.22.6(@types/node@22.7.5)': - dependencies: - '@rushstack/terminal': 0.14.0(@types/node@22.7.5) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' + '@types/node': 22.9.0 - '@rushstack/ts-command-line@4.22.8(@types/node@22.7.5)': + '@rushstack/ts-command-line@4.23.0(@types/node@22.9.0)': dependencies: - '@rushstack/terminal': 0.14.2(@types/node@22.7.5) + '@rushstack/terminal': 0.14.2(@types/node@22.9.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - '@shikijs/core@1.22.0': + '@shikijs/core@1.22.2': dependencies: - '@shikijs/engine-javascript': 1.22.0 - '@shikijs/engine-oniguruma': 1.22.0 - '@shikijs/types': 1.22.0 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 - '@shikijs/engine-javascript@1.22.0': + '@shikijs/engine-javascript@1.22.2': dependencies: - '@shikijs/types': 1.22.0 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 oniguruma-to-js: 0.4.3 - '@shikijs/engine-oniguruma@1.22.0': + '@shikijs/engine-oniguruma@1.22.2': dependencies: - '@shikijs/types': 1.22.0 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 - '@shikijs/types@1.22.0': + '@shikijs/types@1.22.2': dependencies: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 @@ -8530,94 +8391,94 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tanstack/query-core@5.59.9': {} + '@tanstack/query-core@5.59.20': {} - '@tanstack/react-query@5.59.9(react@18.3.1)': + '@tanstack/react-query@5.59.20(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.59.9 + '@tanstack/query-core': 5.59.20 react: 18.3.1 - '@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.10.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/virtual-core': 3.10.8 + '@tanstack/virtual-core': 3.10.9 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/virtual-core@3.10.8': {} + '@tanstack/virtual-core@3.10.9': {} - '@tauri-apps/api@2.0.2': {} + '@tauri-apps/api@2.1.0': {} - '@tauri-apps/cli-darwin-arm64@2.0.2': + '@tauri-apps/cli-darwin-arm64@2.1.0': optional: true - '@tauri-apps/cli-darwin-x64@2.0.2': + '@tauri-apps/cli-darwin-x64@2.1.0': optional: true - '@tauri-apps/cli-linux-arm-gnueabihf@2.0.2': + '@tauri-apps/cli-linux-arm-gnueabihf@2.1.0': optional: true - '@tauri-apps/cli-linux-arm64-gnu@2.0.2': + '@tauri-apps/cli-linux-arm64-gnu@2.1.0': optional: true - '@tauri-apps/cli-linux-arm64-musl@2.0.2': + '@tauri-apps/cli-linux-arm64-musl@2.1.0': optional: true - '@tauri-apps/cli-linux-x64-gnu@2.0.2': + '@tauri-apps/cli-linux-x64-gnu@2.1.0': optional: true - '@tauri-apps/cli-linux-x64-musl@2.0.2': + '@tauri-apps/cli-linux-x64-musl@2.1.0': optional: true - '@tauri-apps/cli-win32-arm64-msvc@2.0.2': + '@tauri-apps/cli-win32-arm64-msvc@2.1.0': optional: true - '@tauri-apps/cli-win32-ia32-msvc@2.0.2': + '@tauri-apps/cli-win32-ia32-msvc@2.1.0': optional: true - '@tauri-apps/cli-win32-x64-msvc@2.0.2': + '@tauri-apps/cli-win32-x64-msvc@2.1.0': optional: true - '@tauri-apps/cli@2.0.2': + '@tauri-apps/cli@2.1.0': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.0.2 - '@tauri-apps/cli-darwin-x64': 2.0.2 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.2 - '@tauri-apps/cli-linux-arm64-gnu': 2.0.2 - '@tauri-apps/cli-linux-arm64-musl': 2.0.2 - '@tauri-apps/cli-linux-x64-gnu': 2.0.2 - '@tauri-apps/cli-linux-x64-musl': 2.0.2 - '@tauri-apps/cli-win32-arm64-msvc': 2.0.2 - '@tauri-apps/cli-win32-ia32-msvc': 2.0.2 - '@tauri-apps/cli-win32-x64-msvc': 2.0.2 + '@tauri-apps/cli-darwin-arm64': 2.1.0 + '@tauri-apps/cli-darwin-x64': 2.1.0 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.1.0 + '@tauri-apps/cli-linux-arm64-gnu': 2.1.0 + '@tauri-apps/cli-linux-arm64-musl': 2.1.0 + '@tauri-apps/cli-linux-x64-gnu': 2.1.0 + '@tauri-apps/cli-linux-x64-musl': 2.1.0 + '@tauri-apps/cli-win32-arm64-msvc': 2.1.0 + '@tauri-apps/cli-win32-ia32-msvc': 2.1.0 + '@tauri-apps/cli-win32-x64-msvc': 2.1.0 '@tauri-apps/plugin-deep-link@2.0.0': dependencies: - '@tauri-apps/api': 2.0.2 + '@tauri-apps/api': 2.1.0 - '@tauri-apps/plugin-dialog@2.0.0': + '@tauri-apps/plugin-dialog@2.0.1': dependencies: - '@tauri-apps/api': 2.0.2 + '@tauri-apps/api': 2.1.0 - '@tauri-apps/plugin-fs@2.0.0': + '@tauri-apps/plugin-fs@2.0.2': dependencies: - '@tauri-apps/api': 2.0.2 + '@tauri-apps/api': 2.1.0 '@tauri-apps/plugin-process@2.0.0': dependencies: - '@tauri-apps/api': 2.0.2 + '@tauri-apps/api': 2.1.0 - '@tauri-apps/plugin-store@2.0.0': + '@tauri-apps/plugin-store@2.1.0': dependencies: - '@tauri-apps/api': 2.0.2 + '@tauri-apps/api': 2.1.0 '@tauri-apps/plugin-updater@2.0.0': dependencies: - '@tauri-apps/api': 2.0.2 + '@tauri-apps/api': 2.1.0 '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.25.7 - '@babel/runtime': 7.25.7 + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.0 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -8625,14 +8486,14 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.7 '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.12 '@types/react-dom': 18.3.1 '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': @@ -8641,7 +8502,7 @@ snapshots: '@types/accepts@1.3.7': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/acorn@4.0.6': dependencies: @@ -8677,26 +8538,26 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/bunyan@1.8.9': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.16.11 + '@types/node': 22.9.0 '@types/responselike': 1.0.3 '@types/connect@3.4.36': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/connect@3.4.38': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/content-disposition@0.5.8': {} @@ -8707,83 +8568,26 @@ snapshots: '@types/connect': 3.4.38 '@types/express': 5.0.0 '@types/keygrip': 1.0.6 - '@types/node': 22.7.5 - - '@types/d3-array@3.2.1': {} - - '@types/d3-axis@3.0.6': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-brush@3.0.6': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-chord@3.0.6': {} + '@types/node': 22.9.0 '@types/d3-color@3.1.3': {} - '@types/d3-contour@3.0.6': - dependencies: - '@types/d3-array': 3.2.1 - '@types/geojson': 7946.0.14 - - '@types/d3-delaunay@6.0.4': {} - - '@types/d3-dispatch@3.0.6': {} - '@types/d3-drag@3.0.7': dependencies: '@types/d3-selection': 3.0.11 - '@types/d3-dsv@3.0.7': {} - - '@types/d3-ease@3.0.2': {} - - '@types/d3-fetch@3.0.7': - dependencies: - '@types/d3-dsv': 3.0.7 - - '@types/d3-force@3.0.10': {} - - '@types/d3-format@3.0.4': {} - - '@types/d3-geo@3.1.0': - dependencies: - '@types/geojson': 7946.0.14 - - '@types/d3-hierarchy@3.1.7': {} - '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 - '@types/d3-path@3.1.0': {} - - '@types/d3-polygon@3.0.2': {} - - '@types/d3-quadtree@3.0.6': {} - - '@types/d3-random@3.0.3': {} - - '@types/d3-scale-chromatic@3.0.3': {} - '@types/d3-scale@4.0.8': dependencies: '@types/d3-time': 3.0.3 '@types/d3-selection@3.0.11': {} - '@types/d3-shape@3.1.6': - dependencies: - '@types/d3-path': 3.1.0 - - '@types/d3-time-format@4.0.3': {} - '@types/d3-time@3.0.3': {} - '@types/d3-timer@3.0.2': {} - '@types/d3-transition@3.0.9': dependencies: '@types/d3-selection': 3.0.11 @@ -8793,39 +8597,6 @@ snapshots: '@types/d3-interpolate': 3.0.4 '@types/d3-selection': 3.0.11 - '@types/d3@7.4.3': - dependencies: - '@types/d3-array': 3.2.1 - '@types/d3-axis': 3.0.6 - '@types/d3-brush': 3.0.6 - '@types/d3-chord': 3.0.6 - '@types/d3-color': 3.1.3 - '@types/d3-contour': 3.0.6 - '@types/d3-delaunay': 6.0.4 - '@types/d3-dispatch': 3.0.6 - '@types/d3-drag': 3.0.7 - '@types/d3-dsv': 3.0.7 - '@types/d3-ease': 3.0.2 - '@types/d3-fetch': 3.0.7 - '@types/d3-force': 3.0.10 - '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 - '@types/d3-hierarchy': 3.1.7 - '@types/d3-interpolate': 3.0.4 - '@types/d3-path': 3.1.0 - '@types/d3-polygon': 3.0.2 - '@types/d3-quadtree': 3.0.6 - '@types/d3-random': 3.0.3 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 - '@types/d3-selection': 3.0.11 - '@types/d3-shape': 3.1.6 - '@types/d3-time': 3.0.3 - '@types/d3-time-format': 4.0.3 - '@types/d3-timer': 3.0.2 - '@types/d3-transition': 3.0.9 - '@types/d3-zoom': 3.0.8 - '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 @@ -8838,7 +8609,7 @@ snapshots: '@types/express-serve-static-core@5.0.0': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -8850,8 +8621,6 @@ snapshots: '@types/qs': 6.9.16 '@types/serve-static': 1.15.7 - '@types/geojson@7946.0.14': {} - '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -8868,7 +8637,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.16.11 + '@types/node': 22.9.0 '@types/koa-compose@3.2.8': dependencies: @@ -8883,7 +8652,7 @@ snapshots: '@types/http-errors': 2.0.4 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/koa__router@12.0.3': dependencies: @@ -8897,7 +8666,7 @@ snapshots: '@types/memcached@2.2.10': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/mime@1.3.5': {} @@ -8905,21 +8674,21 @@ snapshots: '@types/mysql@2.15.22': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/nlcst@2.0.3': dependencies: '@types/unist': 3.0.3 - '@types/node@18.19.55': + '@types/node@18.19.64': dependencies: undici-types: 5.26.5 - '@types/node@20.16.11': + '@types/node@20.17.6': dependencies: undici-types: 6.19.8 - '@types/node@22.7.5': + '@types/node@22.9.0': dependencies: undici-types: 6.19.8 @@ -8931,7 +8700,7 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 pg-protocol: 1.7.0 pg-types: 2.2.0 @@ -8943,42 +8712,42 @@ snapshots: '@types/react-color@3.0.12': dependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.12 '@types/reactcss': 1.2.12 '@types/react-dom@18.3.1': dependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.12 - '@types/react@18.3.11': + '@types/react@18.3.12': dependencies: '@types/prop-types': 15.7.13 csstype: 3.1.3 '@types/reactcss@1.2.12': dependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.12 '@types/responselike@1.0.3': dependencies: - '@types/node': 20.16.11 + '@types/node': 22.9.0 '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/send': 0.17.4 '@types/shimmer@1.2.0': {} '@types/tedious@4.0.14': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 '@types/unist@2.0.11': {} @@ -8992,18 +8761,18 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.16.11 + '@types/node': 22.9.0 optional: true - '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3))(eslint@9.14.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.8.1 - eslint: 9.12.0 + '@typescript-eslint/parser': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.13.0 + eslint: 9.14.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -9013,28 +8782,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.13.0 debug: 4.3.7 - eslint: 9.12.0 + eslint: 9.14.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.8.1': + '@typescript-eslint/scope-manager@8.13.0': dependencies: - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/visitor-keys': 8.13.0 - '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.13.0(eslint@9.14.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: @@ -9043,37 +8812,37 @@ snapshots: - eslint - supports-color - '@typescript-eslint/types@8.8.1': {} + '@typescript-eslint/types@8.13.0': {} - '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/visitor-keys': 8.13.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.3) + ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.13.0(eslint@9.14.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - eslint: 9.12.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0) + '@typescript-eslint/scope-manager': 8.13.0 + '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + eslint: 9.14.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.8.1': + '@typescript-eslint/visitor-keys@8.13.0': dependencies: - '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/types': 8.13.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -9148,18 +8917,18 @@ snapshots: - encoding - supports-color - '@vitejs/plugin-react@4.3.2(vite@5.4.8(@types/node@22.7.5))': + '@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@22.9.0))': dependencies: - '@babel/core': 7.25.8 - '@babel/plugin-transform-react-jsx-self': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-transform-react-jsx-source': 7.25.7(@babel/core@7.25.8) + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx-self': 7.25.7(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.7(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.8(@types/node@22.7.5) + vite: 5.4.10(@types/node@22.9.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1))': + '@vitest/coverage-v8@2.1.4(vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -9173,47 +8942,47 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1) + vitest: 2.1.4(@types/node@22.9.0)(jsdom@25.0.1) transitivePeerDependencies: - supports-color - '@vitest/expect@2.1.2': + '@vitest/expect@2.1.4': dependencies: - '@vitest/spy': 2.1.2 - '@vitest/utils': 2.1.2 - chai: 5.1.1 + '@vitest/spy': 2.1.4 + '@vitest/utils': 2.1.4 + chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@22.7.5))': + '@vitest/mocker@2.1.4(vite@5.4.10(@types/node@22.9.0))': dependencies: - '@vitest/spy': 2.1.2 + '@vitest/spy': 2.1.4 estree-walker: 3.0.3 magic-string: 0.30.12 optionalDependencies: - vite: 5.4.8(@types/node@22.7.5) + vite: 5.4.10(@types/node@22.9.0) - '@vitest/pretty-format@2.1.2': + '@vitest/pretty-format@2.1.4': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.2': + '@vitest/runner@2.1.4': dependencies: - '@vitest/utils': 2.1.2 + '@vitest/utils': 2.1.4 pathe: 1.1.2 - '@vitest/snapshot@2.1.2': + '@vitest/snapshot@2.1.4': dependencies: - '@vitest/pretty-format': 2.1.2 + '@vitest/pretty-format': 2.1.4 magic-string: 0.30.12 pathe: 1.1.2 - '@vitest/spy@2.1.2': + '@vitest/spy@2.1.4': dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.2': + '@vitest/utils@2.1.4': dependencies: - '@vitest/pretty-format': 2.1.2 + '@vitest/pretty-format': 2.1.4 loupe: 3.1.2 tinyrainbow: 1.2.0 @@ -9269,7 +9038,7 @@ snapshots: '@vue/compiler-core@3.5.12': dependencies: - '@babel/parser': 7.25.8 + '@babel/parser': 7.26.2 '@vue/shared': 3.5.12 entities: 4.5.0 estree-walker: 2.0.2 @@ -9300,18 +9069,45 @@ snapshots: '@vue/shared@3.5.12': {} + '@xyflow/react@12.3.5(@types/react@18.3.12)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@xyflow/system': 0.0.46 + classcat: 5.0.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + zustand: 4.5.5(@types/react@18.3.12)(immer@10.1.1)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - immer + + '@xyflow/system@0.0.46': + dependencies: + '@types/d3-drag': 3.0.7 + '@types/d3-selection': 3.0.11 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + abbrev@1.1.1: {} acorn-import-attributes@1.9.5(acorn@8.12.1): dependencies: acorn: 8.12.1 - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 acorn@8.12.1: {} + acorn@8.14.0: {} + agent-base@6.0.2: dependencies: debug: 4.3.7 @@ -9488,20 +9284,20 @@ snapshots: astring@1.9.0: {} - astro-auto-import@0.4.4(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)): + astro-auto-import@0.4.4(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)): dependencies: - '@types/node': 18.19.55 - acorn: 8.12.1 - astro: 4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3) + '@types/node': 18.19.64 + acorn: 8.14.0 + astro: 4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3) - astro-embed@0.7.4(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)): + astro-embed@0.7.4(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)): dependencies: - '@astro-community/astro-embed-integration': 0.7.2(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) + '@astro-community/astro-embed-integration': 0.7.2(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) '@astro-community/astro-embed-link-preview': 0.2.2 - '@astro-community/astro-embed-twitter': 0.5.6(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) - '@astro-community/astro-embed-vimeo': 0.3.10(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) - '@astro-community/astro-embed-youtube': 0.5.5(astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)) - astro: 4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3) + '@astro-community/astro-embed-twitter': 0.5.6(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) + '@astro-community/astro-embed-vimeo': 0.3.10(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) + '@astro-community/astro-embed-youtube': 0.5.5(astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)) + astro: 4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3) astro-seo@0.8.4(prettier@3.3.3)(typescript@5.6.3): dependencies: @@ -9511,20 +9307,20 @@ snapshots: - prettier-plugin-astro - typescript - astro@4.16.0(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3): + astro@4.16.10(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.1 '@astrojs/markdown-remark': 5.3.0 '@astrojs/telemetry': 3.1.0 - '@babel/core': 7.25.8 - '@babel/plugin-transform-react-jsx': 7.25.7(@babel/core@7.25.8) - '@babel/types': 7.25.8 + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) + '@rollup/pluginutils': 5.1.3(rollup@4.24.0) '@types/babel__core': 7.20.5 '@types/cookie': 0.6.0 - acorn: 8.12.1 + acorn: 8.14.0 aria-query: 5.3.2 axobject-query: 4.1.0 boxen: 8.0.1 @@ -9543,7 +9339,6 @@ snapshots: esbuild: 0.21.5 estree-walker: 3.0.3 fast-glob: 3.3.2 - fastq: 1.17.1 flattie: 1.1.1 github-slugger: 2.0.0 gray-matter: 4.0.3 @@ -9556,26 +9351,25 @@ snapshots: micromatch: 4.0.8 mrmime: 2.0.0 neotraverse: 0.6.18 - ora: 8.1.0 + ora: 8.1.1 p-limit: 6.1.0 p-queue: 8.0.1 preferred-pm: 4.0.0 prompts: 2.4.2 rehype: 13.0.2 semver: 7.6.3 - shiki: 1.22.0 - string-width: 7.2.0 - tinyexec: 0.3.0 + shiki: 1.22.2 + tinyexec: 0.3.1 tsconfck: 3.1.4(typescript@5.6.3) unist-util-visit: 5.0.0 vfile: 6.0.3 - vite: 5.4.8(@types/node@22.7.5) - vitefu: 1.0.2(vite@5.4.8(@types/node@22.7.5)) + vite: 5.4.10(@types/node@22.9.0) + vitefu: 1.0.3(vite@5.4.10(@types/node@22.9.0)) which-pm: 3.0.0 xxhash-wasm: 1.0.2 yargs-parser: 21.1.1 zod: 3.23.8 - zod-to-json-schema: 3.23.3(zod@3.23.8) + zod-to-json-schema: 3.23.5(zod@3.23.8) zod-to-ts: 1.2.0(typescript@5.6.3)(zod@3.23.8) optionalDependencies: sharp: 0.33.5 @@ -9614,8 +9408,6 @@ snapshots: base-64@1.0.0: {} - big-integer@1.6.52: {} - bignumber.js@9.1.2: {} binary-extensions@2.3.0: {} @@ -9653,23 +9445,12 @@ snapshots: dependencies: fill-range: 7.1.1 - broadcast-channel@3.7.0: + browserslist@4.24.2: dependencies: - '@babel/runtime': 7.25.7 - detect-node: 2.1.0 - js-sha3: 0.8.0 - microseconds: 0.2.0 - nano-time: 1.0.0 - oblivious-set: 1.0.0 - rimraf: 3.0.2 - unload: 2.2.0 - - browserslist@4.24.0: - dependencies: - caniuse-lite: 1.0.30001668 - electron-to-chromium: 1.5.36 + caniuse-lite: 1.0.30001679 + electron-to-chromium: 1.5.55 node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.0) + update-browserslist-db: 1.1.1(browserslist@4.24.2) buffer-crc32@0.2.13: {} @@ -9699,11 +9480,11 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001668: {} + caniuse-lite@1.0.30001679: {} ccount@2.0.1: {} - chai@5.1.1: + chai@5.1.2: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 @@ -9863,9 +9644,9 @@ snapshots: css-selector-parser@1.4.1: {} - css-tree@2.3.1: + css-tree@3.0.1: dependencies: - mdn-data: 2.0.30 + mdn-data: 2.12.1 source-map-js: 1.2.1 css-what@6.1.0: {} @@ -10003,7 +9784,8 @@ snapshots: detect-libc@2.0.3: {} - detect-node@2.1.0: {} + detect-node@2.1.0: + optional: true deterministic-object-hash@2.0.2: dependencies: @@ -10053,12 +9835,12 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.36: {} + electron-to-chromium@1.5.55: {} - electron@32.2.0: + electron@32.2.3: dependencies: '@electron/get': 2.0.3 - '@types/node': 20.16.11 + '@types/node': 20.17.6 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -10183,6 +9965,20 @@ snapshots: es6-error@4.1.1: optional: true + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -10246,15 +10042,15 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-plugin-react-hooks@4.6.2(eslint@9.12.0): + eslint-plugin-react-hooks@4.6.2(eslint@9.14.0): dependencies: - eslint: 9.12.0 + eslint: 9.14.0 - eslint-plugin-react-refresh@0.4.12(eslint@9.12.0): + eslint-plugin-react-refresh@0.4.14(eslint@9.14.0): dependencies: - eslint: 9.12.0 + eslint: 9.14.0 - eslint-plugin-react@7.37.1(eslint@9.12.0): + eslint-plugin-react@7.37.2(eslint@9.14.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -10262,7 +10058,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.1.0 - eslint: 9.12.0 + eslint: 9.14.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -10276,31 +10072,31 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.12.0): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.14.0): dependencies: - eslint: 9.12.0 + eslint: 9.14.0 - eslint-scope@8.1.0: + eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.1.0: {} + eslint-visitor-keys@4.2.0: {} - eslint@9.12.0: + eslint@9.14.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) - '@eslint-community/regexpp': 4.11.1 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0) + '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.18.0 - '@eslint/core': 0.6.0 + '@eslint/core': 0.7.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.12.0 + '@eslint/js': 9.14.0 '@eslint/plugin-kit': 0.2.0 - '@humanfs/node': 0.16.5 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.1 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -10308,9 +10104,9 @@ snapshots: cross-spawn: 7.0.3 debug: 4.3.7 escape-string-regexp: 4.0.0 - eslint-scope: 8.1.0 - eslint-visitor-keys: 4.1.0 - espree: 10.2.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -10329,11 +10125,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.2.0: + espree@10.3.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.1.0 + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 esprima@4.0.1: {} @@ -10360,6 +10156,11 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -10381,6 +10182,8 @@ snapshots: eventemitter3@5.0.1: {} + expect-type@1.1.0: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -10632,7 +10435,7 @@ snapshots: globals@14.0.0: {} - globals@15.11.0: {} + globals@15.12.0: {} globalthis@1.0.4: dependencies: @@ -10784,7 +10587,7 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.0: + hast-util-to-jsx-runtime@2.3.2: dependencies: '@types/estree': 1.0.6 '@types/hast': 3.0.4 @@ -10888,6 +10691,8 @@ snapshots: ignore@5.3.2: {} + ignore@6.0.2: {} + immer@10.1.1: {} import-fresh@3.3.0: @@ -10897,15 +10702,15 @@ snapshots: import-in-the-middle@1.11.2: dependencies: - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) cjs-module-lexer: 1.4.1 module-details-from-path: 1.0.3 import-in-the-middle@1.7.4: dependencies: - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) cjs-module-lexer: 1.4.1 module-details-from-path: 1.0.3 @@ -11030,10 +10835,6 @@ snapshots: is-potential-custom-element-name@1.0.1: {} - is-reference@3.0.2: - dependencies: - '@types/estree': 1.0.6 - is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -11123,8 +10924,6 @@ snapshots: js-convert-case@4.2.0: {} - js-sha3@0.8.0: {} - js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -11312,11 +11111,6 @@ snapshots: markdown-table@3.0.3: {} - match-sorter@6.3.4: - dependencies: - '@babel/runtime': 7.25.7 - remove-accents: 0.5.0 - matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 @@ -11324,9 +11118,9 @@ snapshots: material-colors@1.2.6: {} - mathjs@13.2.0: + mathjs@13.2.1: dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 complex.js: 2.3.0 decimal.js: 10.4.3 escape-latex: 1.2.0 @@ -11368,6 +11162,23 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-gfm-autolink-literal@2.0.1: dependencies: '@types/mdast': 4.0.4 @@ -11431,8 +11242,8 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -11444,8 +11255,8 @@ snapshots: '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 parse-entities: 4.0.1 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 @@ -11455,11 +11266,11 @@ snapshots: mdast-util-mdx@3.0.0: dependencies: - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.2 mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.1.3 mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -11469,8 +11280,8 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -11502,11 +11313,23 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 - mdn-data@2.0.30: {} + mdn-data@2.12.1: {} meow@13.2.0: {} @@ -11632,8 +11455,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) micromark-extension-mdx-expression: 3.0.0 micromark-extension-mdx-jsx: 3.0.1 micromark-extension-mdx-md: 2.0.0 @@ -11783,8 +11606,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - microseconds@0.2.0: {} - mime-db@1.52.0: {} mime-types@2.1.35: @@ -11826,7 +11647,7 @@ snapshots: mlly@1.7.2: dependencies: - acorn: 8.12.1 + acorn: 8.14.0 pathe: 1.1.2 pkg-types: 1.2.1 ufo: 1.5.4 @@ -11839,13 +11660,9 @@ snapshots: muggle-string@0.4.1: {} - nano-time@1.0.0: - dependencies: - big-integer: 1.6.52 - nanoid@3.3.7: {} - nanoid@5.0.7: {} + nanoid@5.0.8: {} natural-compare@1.4.0: {} @@ -11916,8 +11733,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - oblivious-set@1.0.0: {} - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -11928,7 +11743,7 @@ snapshots: oniguruma-to-js@0.4.3: dependencies: - regex: 4.3.3 + regex: 4.4.0 optionator@0.9.4: dependencies: @@ -11939,7 +11754,7 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@8.1.0: + ora@8.1.1: dependencies: chalk: 5.3.0 cli-cursor: 5.0.0 @@ -12042,12 +11857,6 @@ snapshots: pend@1.2.0: {} - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.6 - estree-walker: 3.0.3 - is-reference: 3.0.2 - pg-int8@1.0.1: {} pg-protocol@1.7.0: {} @@ -12062,8 +11871,12 @@ snapshots: picocolors@1.1.0: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@4.0.1: {} pkg-dir@4.2.0: @@ -12107,7 +11920,7 @@ snapshots: dependencies: xtend: 4.0.2 - posthog-js@1.174.2: + posthog-js@1.181.0: dependencies: core-js: 3.38.1 fflate: 0.4.8 @@ -12161,7 +11974,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.7.5 + '@types/node': 22.9.0 long: 5.2.3 proxy-compare@2.4.0: {} @@ -12198,9 +12011,9 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-error-boundary@4.0.13(react@18.3.1): + react-error-boundary@4.1.2(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 react: 18.3.1 react-icons@5.3.0(react@18.3.1): @@ -12211,22 +12024,13 @@ snapshots: react-is@17.0.2: {} - react-query@3.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.25.7 - broadcast-channel: 3.7.0 - match-sorter: 6.3.4 - react: 18.3.1 - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - - react-redux@9.1.2(@types/react@18.3.11)(react@18.3.1)(redux@5.0.1): + react-redux@9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.3 react: 18.3.1 use-sync-external-store: 1.2.2(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.12 redux: 5.0.1 react-refresh@0.14.2: {} @@ -12240,20 +12044,6 @@ snapshots: lodash: 4.17.21 react: 18.3.1 - reactflow@11.11.4(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@reactflow/background': 11.3.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@reactflow/controls': 11.2.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@reactflow/core': 11.11.4(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@reactflow/minimap': 11.7.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@reactflow/node-resizer': 2.2.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@reactflow/node-toolbar': 1.3.14(@types/react@18.3.11)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -12264,6 +12054,36 @@ snapshots: dependencies: picomatch: 2.3.1 + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.6 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + redux-thunk@3.1.0(redux@5.0.1): dependencies: redux: 5.0.1 @@ -12282,7 +12102,7 @@ snapshots: regenerator-runtime@0.14.1: {} - regex@4.3.3: {} + regex@4.4.0: {} regexp.prototype.flags@1.5.3: dependencies: @@ -12303,6 +12123,14 @@ snapshots: hast-util-raw: 9.0.4 vfile: 6.0.3 + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.0 + transitivePeerDependencies: + - supports-color + rehype-stringify@10.0.1: dependencies: '@types/hast': 3.0.4 @@ -12327,7 +12155,7 @@ snapshots: transitivePeerDependencies: - supports-color - remark-mdx@3.0.1: + remark-mdx@3.1.0: dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 @@ -12364,8 +12192,6 @@ snapshots: mdast-util-to-markdown: 2.1.0 unified: 11.0.5 - remove-accents@0.5.0: {} - remove-markdown@0.5.5: {} request-light@0.5.8: {} @@ -12585,12 +12411,12 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.22.0: + shiki@1.22.2: dependencies: - '@shikijs/core': 1.22.0 - '@shikijs/engine-javascript': 1.22.0 - '@shikijs/engine-oniguruma': 1.22.0 - '@shikijs/types': 1.22.0 + '@shikijs/core': 1.22.2 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 @@ -12733,20 +12559,20 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - stylelint-config-prettier@9.0.5(stylelint@16.9.0(typescript@5.6.3)): + stylelint-config-prettier@9.0.5(stylelint@16.10.0(typescript@5.6.3)): dependencies: - stylelint: 16.9.0(typescript@5.6.3) + stylelint: 16.10.0(typescript@5.6.3) - stylelint-config-recommended@14.0.1(stylelint@16.9.0(typescript@5.6.3)): + stylelint-config-recommended@14.0.1(stylelint@16.10.0(typescript@5.6.3)): dependencies: - stylelint: 16.9.0(typescript@5.6.3) + stylelint: 16.10.0(typescript@5.6.3) - stylelint-config-standard@36.0.1(stylelint@16.9.0(typescript@5.6.3)): + stylelint-config-standard@36.0.1(stylelint@16.10.0(typescript@5.6.3)): dependencies: - stylelint: 16.9.0(typescript@5.6.3) - stylelint-config-recommended: 14.0.1(stylelint@16.9.0(typescript@5.6.3)) + stylelint: 16.10.0(typescript@5.6.3) + stylelint-config-recommended: 14.0.1(stylelint@16.10.0(typescript@5.6.3)) - stylelint@16.9.0(typescript@5.6.3): + stylelint@16.10.0(typescript@5.6.3): dependencies: '@csstools/css-parser-algorithms': 3.0.2(@csstools/css-tokenizer@3.0.2) '@csstools/css-tokenizer': 3.0.2 @@ -12757,7 +12583,7 @@ snapshots: colord: 2.9.3 cosmiconfig: 9.0.0(typescript@5.6.3) css-functions-list: 3.2.3 - css-tree: 2.3.1 + css-tree: 3.0.1 debug: 4.3.7 fast-glob: 3.3.2 fastest-levenshtein: 1.0.16 @@ -12766,7 +12592,7 @@ snapshots: globby: 11.1.0 globjoin: 0.1.4 html-tags: 3.3.1 - ignore: 5.3.2 + ignore: 6.0.2 imurmurhash: 0.1.4 is-plain-object: 5.0.0 known-css-properties: 0.34.0 @@ -12782,7 +12608,6 @@ snapshots: postcss-value-parser: 4.2.0 resolve-from: 5.0.0 string-width: 4.2.3 - strip-ansi: 7.1.0 supports-hyperlinks: 3.1.0 svg-tags: 1.0.0 table: 6.8.2 @@ -12851,7 +12676,7 @@ snapshots: tinycolor2@1.6.0: {} - tinyexec@0.3.0: {} + tinyexec@0.3.1: {} tinypool@1.0.1: {} @@ -12889,13 +12714,17 @@ snapshots: dependencies: typescript: 5.6.3 + ts-api-utils@1.4.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + tsconfck@3.1.4(typescript@5.6.3): optionalDependencies: typescript: 5.6.3 tslib@2.7.0: {} - tsx@4.19.1: + tsx@4.19.2: dependencies: esbuild: 0.23.1 get-tsconfig: 4.8.1 @@ -12978,11 +12807,11 @@ snapshots: dependencies: semver: 7.6.3 - typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.6.3): + typescript-eslint@8.13.0(eslint@9.14.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3))(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -13073,16 +12902,11 @@ snapshots: universalify@0.1.2: {} - unload@2.2.0: + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: - '@babel/runtime': 7.25.7 - detect-node: 2.1.0 - - update-browserslist-db@1.1.1(browserslist@4.24.0): - dependencies: - browserslist: 4.24.0 + browserslist: 4.24.2 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: @@ -13096,6 +12920,8 @@ snapshots: uuid@10.0.0: {} + uuid@11.0.3: {} + uuid@9.0.1: {} vfile-location@5.0.3: @@ -13113,12 +12939,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@2.1.2(@types/node@22.7.5): + vite-node@2.1.4(@types/node@22.9.0): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 - vite: 5.4.8(@types/node@22.7.5) + vite: 5.4.10(@types/node@22.9.0) transitivePeerDependencies: - '@types/node' - less @@ -13130,10 +12956,10 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.2.4(@types/node@22.7.5)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)): + vite-plugin-dts@4.3.0(@types/node@22.9.0)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@22.7.5) - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) + '@microsoft/api-extractor': 7.47.11(@types/node@22.9.0) + '@rollup/pluginutils': 5.1.3(rollup@4.24.0) '@volar/typescript': 2.4.6 '@vue/language-core': 2.1.6(typescript@5.6.3) compare-versions: 6.1.1 @@ -13143,59 +12969,60 @@ snapshots: magic-string: 0.30.12 typescript: 5.6.3 optionalDependencies: - vite: 5.4.8(@types/node@22.7.5) + vite: 5.4.10(@types/node@22.9.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-tsconfig-paths@5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)): + vite-tsconfig-paths@5.1.2(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.6.3) optionalDependencies: - vite: 5.4.8(@types/node@22.7.5) + vite: 5.4.10(@types/node@22.9.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.8(@types/node@22.7.5): + vite@5.4.10(@types/node@22.9.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.24.0 optionalDependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 fsevents: 2.3.3 - vitefu@1.0.2(vite@5.4.8(@types/node@22.7.5)): + vitefu@1.0.3(vite@5.4.10(@types/node@22.9.0)): optionalDependencies: - vite: 5.4.8(@types/node@22.7.5) - - vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1): - dependencies: - '@vitest/expect': 2.1.2 - '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@22.7.5)) - '@vitest/pretty-format': 2.1.2 - '@vitest/runner': 2.1.2 - '@vitest/snapshot': 2.1.2 - '@vitest/spy': 2.1.2 - '@vitest/utils': 2.1.2 - chai: 5.1.1 + vite: 5.4.10(@types/node@22.9.0) + + vitest@2.1.4(@types/node@22.9.0)(jsdom@25.0.1): + dependencies: + '@vitest/expect': 2.1.4 + '@vitest/mocker': 2.1.4(vite@5.4.10(@types/node@22.9.0)) + '@vitest/pretty-format': 2.1.4 + '@vitest/runner': 2.1.4 + '@vitest/snapshot': 2.1.4 + '@vitest/spy': 2.1.4 + '@vitest/utils': 2.1.4 + chai: 5.1.2 debug: 4.3.7 + expect-type: 1.1.0 magic-string: 0.30.12 pathe: 1.1.2 std-env: 3.7.0 tinybench: 2.9.0 - tinyexec: 0.3.0 + tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.8(@types/node@22.7.5) - vite-node: 2.1.2(@types/node@22.7.5) + vite: 5.4.10(@types/node@22.9.0) + vite-node: 2.1.4(@types/node@22.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.7.5 + '@types/node': 22.9.0 jsdom: 25.0.1 transitivePeerDependencies: - less @@ -13498,7 +13325,7 @@ snapshots: yocto-queue@1.1.1: {} - zod-to-json-schema@3.23.3(zod@3.23.8): + zod-to-json-schema@3.23.5(zod@3.23.8): dependencies: zod: 3.23.8 @@ -13511,11 +13338,11 @@ snapshots: zone.js@0.14.10: {} - zustand@4.5.5(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1): + zustand@4.5.5(@types/react@18.3.12)(immer@10.1.1)(react@18.3.1): dependencies: use-sync-external-store: 1.2.2(react@18.3.1) optionalDependencies: - '@types/react': 18.3.11 + '@types/react': 18.3.12 immer: 10.1.1 react: 18.3.1 diff --git a/synnax/go.mod b/synnax/go.mod index 14a1d3da62..74da5367dc 100644 --- a/synnax/go.mod +++ b/synnax/go.mod @@ -1,16 +1,18 @@ module github.com/synnaxlabs/synnax -go 1.22 +go 1.22.7 + +toolchain go1.23.0 require ( github.com/blevesearch/bleve/v2 v2.4.2 github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292 - github.com/cockroachdb/pebble v1.1.1 + github.com/cockroachdb/pebble v1.1.2 github.com/gofiber/fiber/v2 v2.52.5 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.6.0 - github.com/onsi/ginkgo/v2 v2.20.2 - github.com/onsi/gomega v1.34.1 + github.com/onsi/ginkgo/v2 v2.21.0 + github.com/onsi/gomega v1.35.1 github.com/samber/lo v1.47.0 github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.19.0 @@ -19,12 +21,12 @@ require ( github.com/synnaxlabs/cesium v0.0.0-20220722114246-333fea6b09d0 github.com/synnaxlabs/freighter v0.0.0-20220810182625-b66219353383 github.com/synnaxlabs/x v0.0.0-20220801122519-e4a5e96a532d - github.com/uptrace/uptrace-go v1.27.1 + github.com/uptrace/uptrace-go v1.31.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.26.0 - golang.org/x/sys v0.24.0 - google.golang.org/grpc v1.65.0 - google.golang.org/protobuf v1.34.2 + golang.org/x/crypto v0.29.0 + golang.org/x/sys v0.27.0 + google.golang.org/grpc v1.68.0 + google.golang.org/protobuf v1.35.1 ) replace github.com/synnaxlabs/aspen => ../aspen @@ -38,18 +40,18 @@ replace github.com/synnaxlabs/x => ../x/go replace github.com/synnaxlabs/alamos => ../alamos/go require ( - github.com/DataDog/zstd v1.5.5 // indirect + github.com/DataDog/zstd v1.5.6 // indirect github.com/RoaringBitmap/roaring v1.9.4 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.13.0 // indirect - github.com/blevesearch/bleve_index_api v1.1.10 // indirect + github.com/bits-and-blooms/bitset v1.15.0 // indirect + github.com/blevesearch/bleve_index_api v1.1.12 // indirect github.com/blevesearch/geo v0.1.20 // indirect - github.com/blevesearch/go-faiss v1.0.20 // indirect + github.com/blevesearch/go-faiss v1.0.23 // indirect github.com/blevesearch/go-porterstemmer v1.0.3 // indirect github.com/blevesearch/gtreap v0.1.1 // indirect github.com/blevesearch/mmap-go v1.0.4 // indirect - github.com/blevesearch/scorch_segment_api/v2 v2.2.15 // indirect + github.com/blevesearch/scorch_segment_api/v2 v2.2.16 // indirect github.com/blevesearch/segment v0.9.1 // indirect github.com/blevesearch/snowballstem v0.9.0 // indirect github.com/blevesearch/upsidedown_store_api v1.0.2 // indirect @@ -58,18 +60,18 @@ require ( github.com/blevesearch/zapx/v12 v12.3.10 // indirect github.com/blevesearch/zapx/v13 v13.3.10 // indirect github.com/blevesearch/zapx/v14 v14.3.10 // indirect - github.com/blevesearch/zapx/v15 v15.3.13 // indirect - github.com/blevesearch/zapx/v16 v16.1.5 // indirect + github.com/blevesearch/zapx/v15 v15.3.16 // indirect + github.com/blevesearch/zapx/v16 v16.1.7 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cockroachdb/errors v1.11.3 // indirect - github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a // indirect + github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/fasthttp/websocket v1.5.10 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/getsentry/sentry-go v0.28.1 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/getsentry/sentry-go v0.29.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect @@ -79,66 +81,67 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mschoch/smat v0.2.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.50.0 // indirect + github.com/prometheus/common v0.60.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/sagikazarmark/locafero v0.6.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/cast v1.7.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.55.0 // indirect + github.com/valyala/fasthttp v1.57.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - go.etcd.io/bbolt v1.3.10 // indirect - go.opentelemetry.io/contrib/instrumentation/runtime v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.4.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.4.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.etcd.io/bbolt v1.3.11 // indirect + go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.8.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/text v0.17.0 // indirect - golang.org/x/tools v0.24.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sync v0.9.0 // indirect + golang.org/x/text v0.20.0 // indirect + golang.org/x/tools v0.27.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/synnax/go.sum b/synnax/go.sum index ebf62fc67f..16360a26ec 100644 --- a/synnax/go.sum +++ b/synnax/go.sum @@ -1,22 +1,32 @@ github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= +github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/RoaringBitmap/roaring v1.9.4 h1:yhEIoH4YezLYT04s1nHehNO64EKFTop/wBhxv2QzDdQ= github.com/RoaringBitmap/roaring v1.9.4/go.mod h1:6AXUsoIEzDTFFQCe1RbGA6uFONMhvejWj5rqITANK90= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.15.0 h1:DiCRMscZsGyYePE9AR3sVhKqUXCt5IZvkX5AfAc5xLQ= +github.com/bits-and-blooms/bitset v1.15.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/blevesearch/bleve/v2 v2.4.2 h1:NooYP1mb3c0StkiY9/xviiq2LGSaE8BQBCc/pirMx0U= github.com/blevesearch/bleve/v2 v2.4.2/go.mod h1:ATNKj7Yl2oJv/lGuF4kx39bST2dveX6w0th2FFYLkc8= github.com/blevesearch/bleve_index_api v1.1.10 h1:PDLFhVjrjQWr6jCuU7TwlmByQVCSEURADHdCqVS9+g0= github.com/blevesearch/bleve_index_api v1.1.10/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8= +github.com/blevesearch/bleve_index_api v1.1.12 h1:P4bw9/G/5rulOF7SJ9l4FsDoo7UFJ+5kexNy1RXfegY= +github.com/blevesearch/bleve_index_api v1.1.12/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8= github.com/blevesearch/geo v0.1.20 h1:paaSpu2Ewh/tn5DKn/FB5SzvH0EWupxHEIwbCk/QPqM= github.com/blevesearch/geo v0.1.20/go.mod h1:DVG2QjwHNMFmjo+ZgzrIq2sfCh6rIHzy9d9d0B59I6w= github.com/blevesearch/go-faiss v1.0.20 h1:AIkdTQFWuZ5LQmKQSebgMR4RynGNw8ZseJXaan5kvtI= github.com/blevesearch/go-faiss v1.0.20/go.mod h1:jrxHrbl42X/RnDPI+wBoZU8joxxuRwedrxqswQ3xfU8= +github.com/blevesearch/go-faiss v1.0.23 h1:Wmc5AFwDLKGl2L6mjLX1Da3vCL0EKa2uHHSorcIS1Uc= +github.com/blevesearch/go-faiss v1.0.23/go.mod h1:OMGQwOaRRYxrmeNdMrXJPvVx8gBnvE5RYrr0BahNnkk= github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo= github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y= @@ -25,6 +35,8 @@ github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCD github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs= github.com/blevesearch/scorch_segment_api/v2 v2.2.15 h1:prV17iU/o+A8FiZi9MXmqbagd8I0bCqM7OKUYPbnb5Y= github.com/blevesearch/scorch_segment_api/v2 v2.2.15/go.mod h1:db0cmP03bPNadXrCDuVkKLV6ywFSiRgPFT1YVrestBc= +github.com/blevesearch/scorch_segment_api/v2 v2.2.16 h1:uGvKVvG7zvSxCwcm4/ehBa9cCEuZVE+/zvrSl57QUVY= +github.com/blevesearch/scorch_segment_api/v2 v2.2.16/go.mod h1:VF5oHVbIFTu+znY1v30GjSpT5+9YFs9dV2hjvuh34F0= github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU= github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw= github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s= @@ -43,8 +55,12 @@ github.com/blevesearch/zapx/v14 v14.3.10 h1:SG6xlsL+W6YjhX5N3aEiL/2tcWh3DO75Bnz7 github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns= github.com/blevesearch/zapx/v15 v15.3.13 h1:6EkfaZiPlAxqXz0neniq35my6S48QI94W/wyhnpDHHQ= github.com/blevesearch/zapx/v15 v15.3.13/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg= +github.com/blevesearch/zapx/v15 v15.3.16 h1:Ct3rv7FUJPfPk99TI/OofdC+Kpb4IdyfdMH48sb+FmE= +github.com/blevesearch/zapx/v15 v15.3.16/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg= github.com/blevesearch/zapx/v16 v16.1.5 h1:b0sMcarqNFxuXvjoXsF8WtwVahnxyhEvBSRJi/AUHjU= github.com/blevesearch/zapx/v16 v16.1.5/go.mod h1:J4mSF39w1QELc11EWRSBFkPeZuO7r/NPKkHzDCoiaI8= +github.com/blevesearch/zapx/v16 v16.1.7 h1:I07qV6l1rPda19zyof9Q2J9E8cjZ57pQhNY0+ePI5vM= +github.com/blevesearch/zapx/v16 v16.1.7/go.mod h1:JqQlOqlRVaYDkpLIl3JnKql8u4zKTNlVEa3nLsi0Gn8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -57,10 +73,14 @@ github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDr github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a h1:f52TdbU4D5nozMAhO9TvTJ2ZMCXtN4VIAmfrrZ0JXQ4= github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 h1:pU88SPhIFid6/k0egdR5V6eALQYq2qbSmukrkgIh/0A= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -77,8 +97,12 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRtY6P5k= github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -109,10 +133,14 @@ github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQu github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA= github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -123,6 +151,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -136,6 +166,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -145,14 +177,22 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw= github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4= github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -163,10 +203,14 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57CPQ= github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -175,6 +219,8 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk= github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0= @@ -190,6 +236,8 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -211,46 +259,79 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/uptrace/uptrace-go v1.27.1 h1:CIcBWKucTkw1ussNToZA1HNO7+HXOju9zDcFC+MOpOA= github.com/uptrace/uptrace-go v1.27.1/go.mod h1:/9tKtcIaxb3GAwPOCqkZ8bhXRR/ZYCsXb9Zs5kh14Eo= +github.com/uptrace/uptrace-go v1.31.0 h1:i+AsiXVZ5NHHYWvlmJyTqg5l9sLqYN/KSZeLWr3kAM8= +github.com/uptrace/uptrace-go v1.31.0/go.mod h1:zX5JqvEoLpFbbtGN+G1/vf276rfoHiTFrh7yt1XdVCY= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.55.0 h1:Zkefzgt6a7+bVKHnu/YaYSOPfNYNisSVBo/unVCf8k8= github.com/valyala/fasthttp v1.55.0/go.mod h1:NkY9JtkrpPKmgwV3HTaS2HWaJss9RSIsRVfcxxoHiOM= +github.com/valyala/fasthttp v1.57.0 h1:Xw8SjWGEP/+wAAgyy5XTvgrWlOD1+TxbbvNADYCm1Tg= +github.com/valyala/fasthttp v1.57.0/go.mod h1:h6ZBaPRlzpZ6O3H5t2gEk1Qi33+TmLvfwgLLp0t9CpE= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= +go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= +go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.opentelemetry.io/contrib/instrumentation/runtime v0.53.0 h1:nOlJEAJyrcy8hexK65M+dsCHIx7CVVbybcFDNkcTcAc= go.opentelemetry.io/contrib/instrumentation/runtime v0.53.0/go.mod h1:u79lGGIlkg3Ryw425RbMjEkGYNxSnXRyR286O840+u4= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 h1:kJB5wMVorwre8QzEodzTAbzm9FOOah0zvG+V4abNlEE= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0/go.mod h1:Nup4TgnOyEJWmVq9sf/ASH3ZJiAXwWHd5xZCHG7Sg9M= go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0 h1:zBPZAISA9NOc5cE8zydqDiS0itvg/P/0Hn9m72a5gvM= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.4.0/go.mod h1:gcj2fFjEsqpV3fXuzAA+0Ze1p2/4MJ4T7d77AmkvueQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0 h1:aLmmtjRke7LPDQ3lvpFz+kNEH43faFhzW7v8BFIEydg= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0/go.mod h1:TC1pyCt6G9Sjb4bQpShH+P5R53pO6ZuGnHuuln9xMeE= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= go.opentelemetry.io/otel/log v0.4.0 h1:/vZ+3Utqh18e8TPjuc3ecg284078KWrR8BRz+PQAj3o= go.opentelemetry.io/otel/log v0.4.0/go.mod h1:DhGnQvky7pHy82MIRV43iXh3FlKN8UUKftn0KbLOq6I= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/log v0.4.0 h1:1mMI22L82zLqf6KtkjrRy5BbagOTWdJsqMY/HSqILAA= go.opentelemetry.io/otel/sdk/log v0.4.0/go.mod h1:AYJ9FVF0hNOgAVzUG/ybg/QttnXhUePWAupmCqtdESo= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08= go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -264,8 +345,12 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -274,11 +359,15 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -289,30 +378,44 @@ golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 h1:0+ozOGcrp+Y8Aq8TLNN2Aliibms5LEzsq99ZZmAGYm0= google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/grpc/examples v0.0.0-20230113182548-78ddc05d9b33 h1:8WxuLGirDjuGV4NdWz+zhN6wTZar4Rntk/ZY8iXG5Mk= google.golang.org/grpc/examples v0.0.0-20230113182548-78ddc05d9b33/go.mod h1:Nr5H8+MlGWr5+xX/STzdoEqJrO+YteqFbMyCsrb6mH0= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/synnax/pkg/distribution/channel/lease_proxy.go b/synnax/pkg/distribution/channel/lease_proxy.go index 082163f9b3..e1847cb5cd 100644 --- a/synnax/pkg/distribution/channel/lease_proxy.go +++ b/synnax/pkg/distribution/channel/lease_proxy.go @@ -11,6 +11,7 @@ package channel import ( "context" + "github.com/samber/lo" "github.com/synnaxlabs/synnax/pkg/distribution/core" "github.com/synnaxlabs/synnax/pkg/distribution/ontology" @@ -26,6 +27,7 @@ import ( type leaseProxy struct { ServiceConfig createRouter proxy.BatchFactory[Channel] + renameRouter proxy.BatchFactory[renameBatchEntry] keyRouter proxy.BatchFactory[Key] leasedCounter *counter freeCounter *counter @@ -56,6 +58,7 @@ func newLeaseProxy( ServiceConfig: cfg, createRouter: proxy.BatchFactory[Channel]{Host: cfg.HostResolver.HostKey()}, keyRouter: proxy.BatchFactory[Key]{Host: cfg.HostResolver.HostKey()}, + renameRouter: proxy.BatchFactory[renameBatchEntry]{Host: cfg.HostResolver.HostKey()}, leasedCounter: c, group: group, externalCounter: extCtr, @@ -283,11 +286,6 @@ func (lp *leaseProxy) deleteByName(ctx context.Context, tx gorp.Tx, names []stri } func (lp *leaseProxy) delete(ctx context.Context, tx gorp.Tx, keys Keys, allowInternal bool) error { - // Block channel deletion on Windows due to a bug in Cesium - // if strings.HasPrefix(runtime.GOOS, "windows") { - // return errors.New("Channel deletion is not supported on Windows due to a known bug.") - // } - if !allowInternal { var internalChannels []Channel err := gorp. @@ -372,6 +370,27 @@ func (lp *leaseProxy) deleteRemote(ctx context.Context, target core.NodeKey, key return err } +type renameBatchEntry struct { + key Key + name string +} + +var _ proxy.Entry = renameBatchEntry{} + +func (r renameBatchEntry) Lease() core.NodeKey { return r.key.Lease() } + +func unzipRenameBatch(entries []renameBatchEntry) ([]Key, []string) { + return lo.UnzipBy2(entries, func(e renameBatchEntry) (Key, string) { + return e.key, e.name + }) +} + +func newRenameBatch(keys Keys, names []string) []renameBatchEntry { + return lo.ZipBy2(keys, names, func(k Key, n string) renameBatchEntry { + return renameBatchEntry{key: k, name: n} + }) +} + func (lp *leaseProxy) rename( ctx context.Context, tx gorp.Tx, @@ -382,20 +401,26 @@ func (lp *leaseProxy) rename( if len(keys) != len(names) { return errors.Wrap(validate.Error, "keys and names must be the same length") } - batch := lp.keyRouter.Batch(keys) + batch := lp.renameRouter.Batch(newRenameBatch(keys, names)) for nodeKey, entries := range batch.Peers { - err := lp.renameRemote(ctx, nodeKey, entries, names) + keys, names := unzipRenameBatch(entries) + err := lp.renameRemote(ctx, nodeKey, keys, names) if err != nil { return err } } if len(batch.Free) > 0 { - err := lp.renameFreeVirtual(ctx, tx, batch.Free, names, allowInternal) + keys, names := unzipRenameBatch(batch.Free) + err := lp.renameFreeVirtual(ctx, tx, keys, names, allowInternal) if err != nil { return err } } - return lp.renameGateway(ctx, tx, batch.Gateway, names, allowInternal) + if len(batch.Gateway) > 0 { + keys, names := unzipRenameBatch(batch.Gateway) + return lp.renameGateway(ctx, tx, keys, names, allowInternal) + } + return nil } func (lp *leaseProxy) renameRemote(ctx context.Context, target core.NodeKey, keys Keys, names []string) error { diff --git a/synnax/pkg/distribution/channel/rename_test.go b/synnax/pkg/distribution/channel/rename_test.go index 6c3fe877ee..1c6ccb4b7a 100644 --- a/synnax/pkg/distribution/channel/rename_test.go +++ b/synnax/pkg/distribution/channel/rename_test.go @@ -43,9 +43,13 @@ var _ = Describe("Rename", Ordered, func() { It("Should rename the channel without error", func() { Expect(services[1].Rename(ctx, ch.Key(), "SG03", false)).To(Succeed()) Eventually(func(g Gomega) { - g.Expect(services[1].NewRetrieve().WhereKeys(ch.Key()).Exec(ctx, nil)).To(Succeed()) - g.Expect(ch.Name).To(Equal("SG03")) - }) + var resCh channel.Channel + g.Expect(services[1].NewRetrieve(). + WhereKeys(ch.Key()). + Entry(&resCh).Exec(ctx, nil), + ).To(Succeed()) + g.Expect(resCh.Name).To(Equal("SG03")) + }).Should(Succeed()) }) }) Context("Node is remote", func() { @@ -53,10 +57,52 @@ var _ = Describe("Rename", Ordered, func() { It("Should rename the channel without error", func() { Expect(services[2].Rename(ctx, ch.Key(), "SG03", false)).To(Succeed()) Eventually(func(g Gomega) { - g.Expect(services[2].NewRetrieve().WhereKeys(ch.Key()).Exec(ctx, nil)).To(Succeed()) - g.Expect(ch.Name).To(Equal("SG03")) - }) + var resCh channel.Channel + g.Expect(services[2].NewRetrieve(). + WhereKeys(ch.Key()). + Entry(&resCh). + Exec(ctx, nil)).To(Succeed()) + g.Expect(resCh.Name).To(Equal("SG03")) + }).Should(Succeed()) }) }) }) + Context("Multiple channels", func() { + It("Should rename the channels without error", func() { + ch1 := channel.Channel{ + Name: "fermat", + Rate: 2 * telem.Hz, + DataType: telem.Int64T, + } + ch2 := channel.Channel{ + Name: "laplace", + Rate: 2 * telem.Hz, + DataType: telem.Float32T, + } + ch3 := channel.Channel{ + Name: "newton", + DataType: telem.StringT, + Leaseholder: core.Free, + Virtual: true, + } + channels := []channel.Channel{ch1, ch2, ch3} + Expect(services[1].CreateMany(ctx, &channels)).To(Succeed()) + keys := channel.KeysFromChannels(channels) + Expect(services[1].RenameMany( + ctx, + keys, + []string{"fermat1", "laplace1", "newton1"}, + false, + )).To(Succeed()) + + Eventually(func(g Gomega) { + var resChannels []channel.Channel + g.Expect(services[1].NewRetrieve().WhereKeys(keys...).Entries(&resChannels).Exec(ctx, nil)).To(Succeed()) + Expect(channel.KeysFromChannels(resChannels)).To(Equal(keys)) + g.Expect(resChannels[0].Name).To(Equal("fermat1")) + g.Expect(resChannels[1].Name).To(Equal("laplace1")) + g.Expect(resChannels[2].Name).To(Equal("newton1")) + }).Should(Succeed()) + }) + }) }) diff --git a/synnax/pkg/storage/storage_test.go b/synnax/pkg/storage/storage_test.go index 4c850e8b2c..d100257041 100644 --- a/synnax/pkg/storage/storage_test.go +++ b/synnax/pkg/storage/storage_test.go @@ -17,6 +17,8 @@ import ( xfs "github.com/synnaxlabs/x/io/fs" "os" "path/filepath" + "runtime" + "strings" ) var _ = Describe("storage", func() { @@ -42,32 +44,37 @@ var _ = Describe("storage", func() { }) }) Describe("Permissions", func() { - Describe("Name Directory", func() { - It("Should set the correct permissions on the storage directory", func() { - cfg.Perm = storage.DefaultConfig.Perm - store, err := storage.Open(cfg) - Expect(err).NotTo(HaveOccurred()) - stat, err := os.Stat(cfg.Dirname) - Expect(err).ToNot(HaveOccurred()) - Expect(stat.Mode().Perm()).To(Equal(cfg.Perm)) - Expect(store.Close()).To(Succeed()) + // These two tests are failing on Windows because VFS cannot create a + // directory on Windows with custom permissions – all directories are created + // with 777. + if !strings.HasPrefix(runtime.GOOS, "windows") { + Describe("Name Directory", func() { + It("Should set the correct permissions on the storage directory", func() { + cfg.Perm = storage.DefaultConfig.Perm + store, err := storage.Open(cfg) + Expect(err).NotTo(HaveOccurred()) + stat, err := os.Stat(cfg.Dirname) + Expect(err).ToNot(HaveOccurred()) + Expect(stat.Mode().Perm()).To(Equal(cfg.Perm)) + Expect(store.Close()).To(Succeed()) + }) }) - }) - Describe("Existing Directory", func() { - var p string - BeforeEach(func() { - p = filepath.Join(tempDir, "x-storage") - Expect(os.Mkdir(p, xfs.OS_USER_R)).To(Succeed()) - cfg.Dirname = p - }) - AfterEach(func() { Expect(os.RemoveAll(p)).To(Succeed()) }) - It("Should return an error if the directory exists but has insufficient permissions", func() { - // use os.Stat to check the dir permissions - cfg.Perm = xfs.OS_USER_RWX - _, err := storage.Open(cfg) - Expect(err).To(HaveOccurred()) + Describe("Existing Directory", func() { + var p string + BeforeEach(func() { + p = filepath.Join(tempDir, "x-storage") + Expect(os.Mkdir(p, xfs.OS_USER_R)).To(Succeed()) + cfg.Dirname = p + }) + AfterEach(func() { Expect(os.RemoveAll(p)).To(Succeed()) }) + It("Should return an error if the directory exists but has insufficient permissions", func() { + // use os.Stat to check the dir permissions + cfg.Perm = xfs.OS_USER_RWX + _, err := storage.Open(cfg) + Expect(err).To(HaveOccurred()) + }) }) - }) + } }) Describe("Membacked", func() { It("Should open a memory backed version of storage", func() { diff --git a/synnax/pkg/version/VERSION b/synnax/pkg/version/VERSION index dddc2e9ca7..85e60ed180 100644 --- a/synnax/pkg/version/VERSION +++ b/synnax/pkg/version/VERSION @@ -1 +1 @@ -0.33.4 +0.34.0 diff --git a/x/go/breaker/breaker_test.go b/x/go/breaker/breaker_test.go index ac07a183f0..de71b38657 100644 --- a/x/go/breaker/breaker_test.go +++ b/x/go/breaker/breaker_test.go @@ -48,6 +48,6 @@ var _ = Describe("Breaker", func() { Expect(b.Wait()).To(BeTrue()) // 80ms Expect(b.Wait()).To(BeTrue()) // 160ms duration := time.Now().Sub(start) - Expect(duration).To(BeNumerically("~", 310*time.Millisecond, 20*time.Millisecond)) + Expect(duration).To(BeNumerically("~", 310*time.Millisecond, 100*time.Millisecond)) }) }) diff --git a/x/go/go.mod b/x/go/go.mod index 0589f0a0c4..3a7339dbe2 100644 --- a/x/go/go.mod +++ b/x/go/go.mod @@ -1,76 +1,77 @@ module github.com/synnaxlabs/x -go 1.22 +go 1.22.7 -toolchain go1.22.0 +toolchain go1.23.0 require ( github.com/cockroachdb/errors v1.11.3 - github.com/cockroachdb/pebble v1.1.1 + github.com/cockroachdb/pebble v1.1.2 github.com/google/uuid v1.6.0 - github.com/onsi/ginkgo/v2 v2.20.0 - github.com/onsi/gomega v1.34.1 + github.com/onsi/ginkgo/v2 v2.21.0 + github.com/onsi/gomega v1.35.1 github.com/samber/lo v1.47.0 github.com/synnaxlabs/alamos v0.0.0-00010101000000-000000000000 - github.com/uptrace/uptrace-go v1.27.1 + github.com/uptrace/uptrace-go v1.31.0 github.com/vmihailenco/msgpack/v5 v5.4.1 - go.opentelemetry.io/otel v1.28.0 + go.opentelemetry.io/otel v1.32.0 go.uber.org/zap v1.27.0 - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 - golang.org/x/net v0.28.0 - golang.org/x/sync v0.8.0 - google.golang.org/protobuf v1.34.2 + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f + golang.org/x/net v0.31.0 + golang.org/x/sync v0.9.0 + google.golang.org/protobuf v1.35.1 ) replace github.com/synnaxlabs/alamos => ../../alamos/go require ( - github.com/DataDog/zstd v1.5.5 // indirect + github.com/DataDog/zstd v1.5.6 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/getsentry/sentry-go v0.29.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/klauspost/compress v1.17.7 // indirect + github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.19.0 // indirect - github.com/prometheus/client_model v0.6.0 // indirect - github.com/prometheus/common v0.50.0 // indirect - github.com/prometheus/procfs v0.13.0 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 // indirect - go.opentelemetry.io/otel/log v0.3.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.27.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.3.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.8.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.23.0 // indirect - golang.org/x/text v0.17.0 // indirect - golang.org/x/tools v0.24.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/grpc v1.65.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + golang.org/x/tools v0.27.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.68.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/x/go/go.sum b/x/go/go.sum index 64a64e9d3e..087939cb1a 100644 --- a/x/go/go.sum +++ b/x/go/go.sum @@ -1,5 +1,7 @@ github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= +github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -12,10 +14,14 @@ github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDr github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 h1:pU88SPhIFid6/k0egdR5V6eALQYq2qbSmukrkgIh/0A= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -25,6 +31,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -42,22 +50,36 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw= github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -67,21 +89,33 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57CPQ= github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/uptrace/uptrace-go v1.27.1 h1:CIcBWKucTkw1ussNToZA1HNO7+HXOju9zDcFC+MOpOA= github.com/uptrace/uptrace-go v1.27.1/go.mod h1:/9tKtcIaxb3GAwPOCqkZ8bhXRR/ZYCsXb9Zs5kh14Eo= +github.com/uptrace/uptrace-go v1.31.0 h1:i+AsiXVZ5NHHYWvlmJyTqg5l9sLqYN/KSZeLWr3kAM8= +github.com/uptrace/uptrace-go v1.31.0/go.mod h1:zX5JqvEoLpFbbtGN+G1/vf276rfoHiTFrh7yt1XdVCY= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -90,32 +124,80 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0 h1:UaQVCH34fQsyDjlgS0L070Kjs9uCrLKoQfzn2Nl7XTY= go.opentelemetry.io/contrib/instrumentation/runtime v0.52.0/go.mod h1:Ks4aHdMgu1vAfEY0cIBHcGx2l1S0+PwFm2BE/HRzqSk= +go.opentelemetry.io/contrib/instrumentation/runtime v0.56.0 h1:s7wHG+t8bEoH7ibWk1nk682h7EoWLJ5/8j+TSO3bX/o= +go.opentelemetry.io/contrib/instrumentation/runtime v0.56.0/go.mod h1:Q8Hsv3d9DwryfIl+ebj4mY81IYVRSPy4QfxroVZwqLo= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0 h1:kJB5wMVorwre8QzEodzTAbzm9FOOah0zvG+V4abNlEE= +go.opentelemetry.io/contrib/instrumentation/runtime v0.57.0/go.mod h1:Nup4TgnOyEJWmVq9sf/ASH3ZJiAXwWHd5xZCHG7Sg9M= go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 h1:ccBrA8nCY5mM0y5uO7FT0ze4S0TuFcWdDB2FxGMTjkI= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0/go.mod h1:/9pb6634zi2Lk8LYg9Q0X8Ar6jka4dkFOylBLbVQPCE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.31.0 h1:ZsXq73BERAiNuuFXYqP4MR5hBrjXfMGSO+Cx7qoOZiM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.31.0/go.mod h1:hg1zaDMpyZJuUzjFxFsRYBoccE86tM9Uf4IqNMUxvrY= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= go.opentelemetry.io/otel/log v0.3.0 h1:kJRFkpUFYtny37NQzL386WbznUByZx186DpEMKhEGZs= go.opentelemetry.io/otel/log v0.3.0/go.mod h1:ziCwqZr9soYDwGNbIL+6kAvQC+ANvjgG367HVcyR/ys= +go.opentelemetry.io/otel/log v0.7.0 h1:d1abJc0b1QQZADKvfe9JqqrfmPYQCz2tUSO+0XZmuV4= +go.opentelemetry.io/otel/log v0.7.0/go.mod h1:2jf2z7uVfnzDNknKTO9G+ahcOAyWcp1fJmk/wJjULRo= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/log v0.3.0 h1:GEjJ8iftz2l+XO1GF2856r7yYVh74URiF9JMcAacr5U= go.opentelemetry.io/otel/sdk/log v0.3.0/go.mod h1:BwCxtmux6ACLuys1wlbc0+vGBd+xytjmjajwqqIul2g= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -127,6 +209,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -135,38 +219,62 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 h1:fVoAXEKA4+yufmbdVYv+SE73+cPZbbbe8paLsHfkK+U= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/x/go/io/counter_test.go b/x/go/io/counter_test.go index a2cf15e063..273ac24019 100644 --- a/x/go/io/counter_test.go +++ b/x/go/io/counter_test.go @@ -94,6 +94,7 @@ var _ = Describe("Counter", func() { Expect(keys).To(HaveLen(1000)) Expect(lo.Uniq(keys)).To(HaveLen(1000)) + Expect(f.Close()).To(Succeed()) }) }) } diff --git a/x/go/io/fs/default.go b/x/go/io/fs/default.go index a77d290ec8..5271318115 100644 --- a/x/go/io/fs/default.go +++ b/x/go/io/fs/default.go @@ -9,7 +9,10 @@ package fs -import "os" +import ( + "os" + goPath "path" +) type defaultFS struct { perm os.FileMode @@ -40,14 +43,14 @@ func (d *defaultFS) Exists(name string) (bool, error) { } // List implements FS. -func (d *defaultFS) List(name string) ([]os.FileInfo, error) { - entries, err := os.ReadDir(name) +func (d *defaultFS) List(dirName string) ([]os.FileInfo, error) { + entries, err := os.ReadDir(dirName) if err != nil { return nil, err } infos := make([]os.FileInfo, len(entries)) for i, e := range entries { - infos[i], err = e.Info() + infos[i], err = os.Stat(goPath.Join(dirName, e.Name())) if err != nil { return nil, err } diff --git a/x/go/io/fs/file_test.go b/x/go/io/fs/file_test.go new file mode 100644 index 0000000000..663f73960d --- /dev/null +++ b/x/go/io/fs/file_test.go @@ -0,0 +1,61 @@ +// Copyright 2023 Synnax Labs, Inc. +// +// Use of this software is governed by the Business Source License included in the file +// licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with the Business Source +// License, use of this software will be governed by the Apache License, Version 2.0, +// included in the file licenses/APL.txt. + +package fs_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + xfs "github.com/synnaxlabs/x/io/fs" + . "github.com/synnaxlabs/x/testutil" + "os" +) + +// Most of the functionalities of a File are well-tested in the tests for a file system in fs_test.go. +var _ = Describe("File", func() { + fileSystems := map[string]func() xfs.FS{ + "memFS": func() xfs.FS { + return xfs.NewMem() + }, + "osFS": func() xfs.FS { + return MustSucceed(xfs.Default.Sub("./testData")) + }, + } + + for fsName, makeFS := range fileSystems { + fsName, makeFS := fsName, makeFS + + var ( + fsRoot, fs xfs.FS + f xfs.File + ) + + Context("FS:"+fsName, Ordered, func() { + BeforeEach(func() { + fsRoot = makeFS() + fs = MustSucceed(fsRoot.Sub("test-spec")) + f = MustSucceed(fs.Open("file.fi", os.O_CREATE|os.O_RDWR)) + MustSucceed(f.Write([]byte("tacocat"))) + }) + AfterEach(func() { + Expect(f.Close()).ToNot(HaveOccurred()) + Expect(fsRoot.Remove("test-spec")).To(Succeed()) + }) + AfterAll(func() { Expect(xfs.Default.Remove("testData")).To(Succeed()) }) + + Describe("Stat", func() { + It("Should give the size of the file correctly", func() { + s, err := f.Stat() + Expect(err).ToNot(HaveOccurred()) + Expect(s.Size()).To(Equal(int64(7))) + }) + }) + }) + } +}) diff --git a/x/go/io/fs/fs_test.go b/x/go/io/fs/fs_test.go index 39c176b567..faa4cd5319 100644 --- a/x/go/io/fs/fs_test.go +++ b/x/go/io/fs/fs_test.go @@ -457,6 +457,28 @@ var _ = Describe("FS", func() { Expect(l[0].Name()).To(Equal("file1.json")) Expect(f.Close()).To(Succeed()) }) + + Context("Windows Regression", func() { + It("Should list file sizes in the directory correctly", func() { + // Windows has a different implementation of DirEntry.Info() + // than other OS's - one of its problems is that it has trouble + // returning the size of a file that still has handles open to + // it. + // We avoided it by calling os.Stat() instead in our implementation + // of List(). + subFS, err := fs.Sub("sub1") + Expect(err).ToNot(HaveOccurred()) + f := MustSucceed(subFS.Open("file1.txt", os.O_CREATE|os.O_RDWR)) + _, err = f.Write([]byte("tacocat")) + Expect(err).ToNot(HaveOccurred()) + l := MustSucceed(subFS.List("")) + s, err := f.Stat() + Expect(err).ToNot(HaveOccurred()) + Expect(s.Size()).To(Equal(int64(7))) + Expect(l[0].Size()).To(Equal(int64(7))) + Expect(f.Close()).To(Succeed()) + }) + }) }) Describe("Rename", func() { diff --git a/x/go/signal/signal_test.go b/x/go/signal/signal_test.go index 79fbee1ecc..d7d86f643f 100644 --- a/x/go/signal/signal_test.go +++ b/x/go/signal/signal_test.go @@ -337,7 +337,7 @@ var _ = Describe("Signal", func() { }() Eventually(done).Should(BeClosed()) - Expect(time.Now().Sub(start)).To(BeNumerically("~", 511*time.Millisecond, 20*time.Millisecond)) + Expect(time.Now().Sub(start)).To(BeNumerically("~", 511*time.Millisecond, 150*time.Millisecond)) }) }) diff --git a/x/media/package.json b/x/media/package.json index caca7bf5d7..17c0592a22 100644 --- a/x/media/package.json +++ b/x/media/package.json @@ -1,6 +1,6 @@ { "name": "@synnaxlabs/media", - "version": "0.33.0", + "version": "0.34.0", "type": "module", "description": "Media Assets for Synnax Labs", "repository": "https://github.com/synnaxlabs/synnax/tree/main/x/media", @@ -17,8 +17,8 @@ "watch": "vite build --watch", "test": "vitest", "cov": "vitest --coverage", - "lint": "eslint \"src/**/*.ts*\"", - "fix": "eslint \"src/**/*.ts*\" --fix" + "lint": "eslint --cache", + "fix": "eslint --cache --fix" }, "dependencies": { "@synnaxlabs/x": "workspace:*", @@ -32,10 +32,11 @@ "@synnaxlabs/tsconfig": "workspace:*", "@synnaxlabs/vite-plugin": "workspace:*", "@types/node": "^22.7.5", - "@vitejs/plugin-react": "^4.3.2", + "@vitejs/plugin-react": "^4.3.3", + "eslint": "^9.12.0", "eslint-config-synnaxlabs": "workspace:*", - "vite": "^5.4.8", - "vitest": "^2.1.2" + "vite": "^5.4.10", + "vitest": "^2.1.4" }, "files": [ "dist" diff --git a/x/media/src/Logo/LogoWatermark.tsx b/x/media/src/Logo/LogoWatermark.tsx index 2383b65863..62f7860e4b 100644 --- a/x/media/src/Logo/LogoWatermark.tsx +++ b/x/media/src/Logo/LogoWatermark.tsx @@ -9,9 +9,9 @@ import "@/Logo/LogoWatermark.css"; -import { ReactElement } from "react"; +import { type ReactElement } from "react"; -import { Logo, LogoProps } from "@/Logo/Logo"; +import { Logo, type LogoProps } from "@/Logo/Logo"; /** * LogoWatermark displays the Synnax logo as a watermark in the center of the screen. diff --git a/x/ts/package.json b/x/ts/package.json index ae0d3c9d69..3cd154c8b3 100644 --- a/x/ts/package.json +++ b/x/ts/package.json @@ -1,6 +1,6 @@ { "name": "@synnaxlabs/x", - "version": "0.33.0", + "version": "0.34.0", "type": "module", "description": "Common Utilities for Synnax Labs", "repository": "https://github.com/synnaxlabs/synnax/tree/main/x/go", @@ -16,8 +16,8 @@ "build": "tsc --noEmit && vite build", "test": "vitest", "cov": "vitest --coverage", - "lint": "eslint \"src/**/*.ts*\"", - "fix": "eslint \"src/**/*.ts*\" --fix" + "lint": "eslint --cache", + "fix": "eslint --cache --fix" }, "dependencies": { "js-convert-case": "^4.2.0", @@ -28,11 +28,12 @@ "@synnaxlabs/tsconfig": "workspace:*", "@synnaxlabs/vite-plugin": "workspace:*", "@types/node": "^22.7.5", - "@vitest/coverage-v8": "^2.1.2", + "@vitest/coverage-v8": "^2.1.4", + "eslint": "^9.12.0", "eslint-config-synnaxlabs": "workspace:*", "typescript": "^5.6.3", - "vite": "^5.4.8", - "vitest": "^2.1.2" + "vite": "^5.4.10", + "vitest": "^2.1.4" }, "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/x/ts/src/binary/encoder.ts b/x/ts/src/binary/encoder.ts index 51df2e59b9..29355af27e 100644 --- a/x/ts/src/binary/encoder.ts +++ b/x/ts/src/binary/encoder.ts @@ -101,9 +101,8 @@ export class CSVCodec implements Codec { } encodeString(payload: unknown): string { - if (!Array.isArray(payload) || payload.length === 0 || !isObject(payload[0])) { + if (!Array.isArray(payload) || payload.length === 0 || !isObject(payload[0])) throw new Error("Payload must be an array of objects"); - } const keys = Object.keys(payload[0]); const csvRows = [keys.join(",")]; diff --git a/x/ts/src/caseconv/caseconv.ts b/x/ts/src/caseconv/caseconv.ts index 07753af76f..568c0ae06f 100644 --- a/x/ts/src/caseconv/caseconv.ts +++ b/x/ts/src/caseconv/caseconv.ts @@ -34,12 +34,11 @@ const createConverter = ( Object.keys(anyObj).forEach((key) => { let value = anyObj[key]; const nkey = f(key); - if (opt.recursive) { + if (opt.recursive) if (isValidObject(value)) { - if (!belongToTypes(value, opt.keepTypesOnRecursion)) { + if (!belongToTypes(value, opt.keepTypesOnRecursion)) value = converter(value, opt); - } - } else if (opt.recursiveInArray && isArrayObject(value)) { + } else if (opt.recursiveInArray && isArrayObject(value)) value = [...value].map((v) => { let ret = v; if (isValidObject(v)) { @@ -54,8 +53,6 @@ const createConverter = ( } return ret; }); - } - } res[nkey] = value; }); @@ -76,12 +73,10 @@ const createConverter = ( */ export const snakeToCamel = createConverter(snakeToCamelStr); -const camelToSnakeStr = (str: string): string => { +const camelToSnakeStr = (str: string): string => // Don't convert the first character and don't convert a character that is after a // non-alphanumeric character - return str.replace(/([a-z0-9])([A-Z])/g, (_, p1, p2) => `${p1}_${p2.toLowerCase()}`); -}; - + str.replace(/([a-z0-9])([A-Z])/g, (_, p1, p2) => `${p1}_${p2.toLowerCase()}`); export const camelToSnake = createConverter(camelToSnakeStr); /** @@ -121,11 +116,8 @@ export const defaultOptions: Options = { }; export const validateOptions = (opt: Options = defaultOptions): Options => { - if (opt.recursive == null) { - opt = defaultOptions; - } else if (opt.recursiveInArray == null) { - opt.recursiveInArray = false; - } + if (opt.recursive == null) opt = defaultOptions; + else opt.recursiveInArray ??= false; return opt; }; diff --git a/x/ts/src/clamp/clamp.ts b/x/ts/src/clamp/clamp.ts index 4c0687f804..801568c4ba 100644 --- a/x/ts/src/clamp/clamp.ts +++ b/x/ts/src/clamp/clamp.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { numeric } from "@/numeric"; +import { type numeric } from "@/numeric"; export const clamp = (value: T, min?: T, max?: T): T => { if (min !== undefined && value < min) return min; diff --git a/x/ts/src/compare/compare.ts b/x/ts/src/compare/compare.ts index 945d36ff94..a901b892e5 100644 --- a/x/ts/src/compare/compare.ts +++ b/x/ts/src/compare/compare.ts @@ -156,9 +156,7 @@ export const stringsWithNumbers = (a: string, b: string): number => { } else if (!isNaN(Number(aPart)) && !isNaN(Number(bPart))) { const numComparison = Number(aPart) - Number(bPart); if (numComparison !== 0) return numComparison; - } else { - return isNaN(Number(aPart)) ? -1 : 1; - } + } else return isNaN(Number(aPart)) ? -1 : 1; } return aParts.length - bParts.length; diff --git a/x/ts/src/debounce/debounce.ts b/x/ts/src/debounce/debounce.ts index 05f8efa521..e0e1c46a77 100644 --- a/x/ts/src/debounce/debounce.ts +++ b/x/ts/src/debounce/debounce.ts @@ -33,12 +33,11 @@ export const throttle = void>( if (waitFor === 0) return func; const throttled = (...args: Parameters): void => { - if (timeout === null) { + if (timeout === null) timeout = setTimeout(() => { func(...args); timeout = null; }, waitFor); - } }; return throttled as F; diff --git a/x/ts/src/deep/difference.ts b/x/ts/src/deep/difference.ts index ce55002bfa..fbfe6bc994 100644 --- a/x/ts/src/deep/difference.ts +++ b/x/ts/src/deep/difference.ts @@ -22,26 +22,20 @@ export const difference = ( return; } - if (typeof a === "object" && typeof b === "object") { + if (typeof a === "object" && typeof b === "object") if (Array.isArray(a) && Array.isArray(b)) { if (a.length !== b.length) { diffMap[currentPath] = [a, b]; return; } - for (let i = 0; i < a.length; i++) { - compare(a[i], b[i], `${currentPath}[${i}]`); - } + for (let i = 0; i < a.length; i++) compare(a[i], b[i], `${currentPath}[${i}]`); } else { const keys = new Set([...Object.keys(a as {}), ...Object.keys(b as {})]); keys.forEach((key) => { compare(a[key], b[key], currentPath !== "" ? `${currentPath}.${key}` : key); }); } - } else { - if (a !== b) { - diffMap[currentPath] = [a, b]; - } - } + else if (a !== b) diffMap[currentPath] = [a, b]; }; compare(obj1, obj2, path); diff --git a/x/ts/src/deep/merge.ts b/x/ts/src/deep/merge.ts index 9cf217b394..082d326432 100644 --- a/x/ts/src/deep/merge.ts +++ b/x/ts/src/deep/merge.ts @@ -7,7 +7,7 @@ // License, use of this software will be governed by the Apache License, Version 2.0, // included in the file licenses/APL.txt. -import { z } from "zod"; +import { type z } from "zod"; import { type Partial } from "@/deep/partial"; import { isObject } from "@/identity"; @@ -22,23 +22,17 @@ export const override = (base: T, ...overrides: Array>): T => { if (overrides.length === 0) return base; const source = overrides.shift(); - if (isObject(base) && isObject(source)) { - for (const key in source) { + if (isObject(base) && isObject(source)) + for (const key in source) try { if (isObject(source[key])) { if (!(key in base)) Object.assign(base, { [key]: {} }); override(base[key], source[key]); - } else { - Object.assign(base, { [key]: source[key] }); - } + } else Object.assign(base, { [key]: source[key] }); } catch (e) { - if (e instanceof TypeError) { - throw new TypeError(`.${key}: ${e.message}`); - } + if (e instanceof TypeError) throw new TypeError(`.${key}: ${e.message}`); throw e; } - } - } return override(base, ...overrides); }; @@ -65,13 +59,12 @@ export const overrideValidItems = ( typeof overrideValue === "object" && !Array.isArray(overrideValue) && overrideValue !== null - ) { - // If it's a nested object, recurse into it only if a valid schema exists + ) if (currentSchema && currentSchema.shape && currentSchema.shape[key]) { - if (!baseObj[key]) baseObj[key] = {}; + // If it's a nested object, recurse into it only if a valid schema exists + baseObj[key] ||= {}; mergeValidFields(baseObj[key], overrideValue, currentSchema.shape[key]); } - } } return baseObj; }; diff --git a/x/ts/src/deep/path.spec.ts b/x/ts/src/deep/path.spec.ts index 9e479333ae..8c2b28ef52 100644 --- a/x/ts/src/deep/path.spec.ts +++ b/x/ts/src/deep/path.spec.ts @@ -10,7 +10,7 @@ import { describe, expect, it } from "vitest"; import { deep } from "@/deep"; -import { UnknownRecord } from "@/record"; +import { type UnknownRecord } from "@/record"; interface TestRecord { a: number; diff --git a/x/ts/src/deep/path.ts b/x/ts/src/deep/path.ts index 3e571b5b1f..967f3d7de2 100644 --- a/x/ts/src/deep/path.ts +++ b/x/ts/src/deep/path.ts @@ -33,7 +33,7 @@ type Prev = [ 18, 19, 20, - ...Array<0>, + ...0[], ]; /** @@ -160,7 +160,7 @@ export const set = (obj: V, path: string, value: unknown): void => { let result: UnknownRecord = obj as UnknownRecord; for (let i = 0; i < parts.length - 1; i++) { const part = parts[i]; - if (result[part] == null) result[part] = {}; + result[part] ??= {}; result = result[part] as UnknownRecord; } result[parts[parts.length - 1]] = value; @@ -182,7 +182,7 @@ export const remove = (obj: V, path: string): void => { } // if its an array, we need to splice it if (Array.isArray(result)) { - const index = parseInt(parts[parts.length - 1], 10); + const index = parseInt(parts[parts.length - 1]); if (isNaN(index)) return; result.splice(index, 1); return; diff --git a/x/ts/src/math/math.ts b/x/ts/src/math/math.ts index abdceb2941..a7e4243c09 100644 --- a/x/ts/src/math/math.ts +++ b/x/ts/src/math/math.ts @@ -47,7 +47,7 @@ export const equal = (a: V, b: Numeric): boolean => { * @example roundToNearestMagnitude(123456) => 100000 */ export const roundToNearestMagnitude = (num: number): number => { - const magnitude = Math.pow(10, Math.floor(Math.log10(num))); + const magnitude = 10 ** Math.floor(Math.log10(num)); return Math.round(num / magnitude) * magnitude; }; diff --git a/x/ts/src/migrate/migrate.ts b/x/ts/src/migrate/migrate.ts index d63418b69a..31eee1b208 100644 --- a/x/ts/src/migrate/migrate.ts +++ b/x/ts/src/migrate/migrate.ts @@ -10,7 +10,7 @@ import { z } from "zod"; import { compare } from "@/compare"; -import { Optional } from "@/optional"; +import { type Optional } from "@/optional"; export const semVerZ = z.string().regex(/^\d+\.\d+\.\d+$/); @@ -179,10 +179,10 @@ export const migrator = < const latestMigrationVersion = Object.keys(migrations).sort(compareSemVer).pop(); if (latestMigrationVersion == null) return (v: I) => { - if (v.version == null) v.version = defaultVersion; + v.version ??= defaultVersion; if (v.version !== def.version) { console.log( - `${name} version ${v.version} is newer than latest version of ${def.version}. + `${name} version ${v.version} is newer than latest version of ${def.version}. Returning default instead. `, ); @@ -224,7 +224,7 @@ export const migrator = < }; return (v: I): O => { try { - if (v.version == null) { + if (v.version == null) if (defaultVersion != null) { console.log( `${name} version is null. Setting version to default of ${defaultVersion}`, @@ -236,7 +236,6 @@ export const migrator = < ); return def; } - } return f(v as Migratable) as O; } catch (e) { console.log(`${name} failed to parse final result. Exiting with default`); diff --git a/x/ts/src/runtime/os.ts b/x/ts/src/runtime/os.ts index cdbe57caee..d5c53c6d49 100644 --- a/x/ts/src/runtime/os.ts +++ b/x/ts/src/runtime/os.ts @@ -31,8 +31,8 @@ const evalOS = (): OS | undefined => { if (typeof window === "undefined") return undefined; const userAgent = window.navigator.userAgent.toLowerCase(); if (userAgent.includes("mac")) return "MacOS"; - else if (userAgent.includes("win")) return "Windows"; - else if (userAgent.includes("linux")) return "Linux"; + if (userAgent.includes("win")) return "Windows"; + if (userAgent.includes("linux")) return "Linux"; return undefined; }; diff --git a/x/ts/src/spatial/bounds/bounds.spec.ts b/x/ts/src/spatial/bounds/bounds.spec.ts index 455f69536b..9252dcbbb7 100644 --- a/x/ts/src/spatial/bounds/bounds.spec.ts +++ b/x/ts/src/spatial/bounds/bounds.spec.ts @@ -9,7 +9,7 @@ import { describe, expect, it, test } from "vitest"; -import { numeric } from "@/numeric"; +import { type numeric } from "@/numeric"; import * as bounds from "@/spatial/bounds/bounds"; describe("Bounds", () => { diff --git a/x/ts/src/spatial/bounds/bounds.ts b/x/ts/src/spatial/bounds/bounds.ts index cd6ab9c3cd..273f6fc743 100644 --- a/x/ts/src/spatial/bounds/bounds.ts +++ b/x/ts/src/spatial/bounds/bounds.ts @@ -46,7 +46,7 @@ export const construct = ( upper?: T, ): Bounds => { const b: Bounds = {} as const as Bounds; - if (typeof lower === "number" || typeof lower === "bigint") { + if (typeof lower === "number" || typeof lower === "bigint") if (upper != null) { b.lower = lower; b.upper = upper; @@ -54,7 +54,7 @@ export const construct = ( b.lower = (typeof lower === "bigint" ? 0n : 0) as T; b.upper = lower; } - } else if (Array.isArray(lower)) { + else if (Array.isArray(lower)) { if (lower.length !== 2) throw new Error("bounds: expected array of length 2"); [b.lower, b.upper] = lower; } else return makeValid(lower); diff --git a/x/ts/src/spatial/box/box.ts b/x/ts/src/spatial/box/box.ts index d7bde1230d..633a68892f 100644 --- a/x/ts/src/spatial/box/box.ts +++ b/x/ts/src/spatial/box/box.ts @@ -249,9 +249,8 @@ export const loc = (b: Crude, loc: location.Location): number => { }; /** @returns true if the area of the box is 0 and false otherwise. */ -export const areaIsZero = (b: Box): boolean => { - return b.one.x === b.two.x && b.one.y === b.two.y; -}; +export const areaIsZero = (b: Box): boolean => + b.one.x === b.two.x && b.one.y === b.two.y; /** @returns the width of the box. */ export const width = (b: Crude): number => dim(b, "x"); @@ -459,7 +458,7 @@ export const constructWithAlternateRoot = ( ): Box => { const first = { x, y }; const second = { x: x + width, y: y + height }; - if (currRoot.x !== newRoot.x) { + if (currRoot.x !== newRoot.x) if (currRoot.x === "center") { first.x -= width / 2; second.x -= width / 2; @@ -467,8 +466,7 @@ export const constructWithAlternateRoot = ( first.x -= width; second.x -= width; } - } - if (currRoot.y !== newRoot.y) { + if (currRoot.y !== newRoot.y) if (currRoot.y === "center") { first.y -= height / 2; second.y -= height / 2; @@ -476,6 +474,5 @@ export const constructWithAlternateRoot = ( first.y -= height; second.y -= height; } - } return construct(first, second, undefined, undefined, newRoot); }; diff --git a/x/ts/src/spatial/direction/direction.ts b/x/ts/src/spatial/direction/direction.ts index ecb007c12b..bc387a0627 100644 --- a/x/ts/src/spatial/direction/direction.ts +++ b/x/ts/src/spatial/direction/direction.ts @@ -29,7 +29,7 @@ export type Crude = CrudeDirection; export const construct = (c: Crude): Direction => { if (DIRECTIONS.includes(c as Direction)) return c as Direction; if (Y_LOCATIONS.includes(c as YLocation)) return "y"; - else return "x"; + return "x"; }; export const swap = (direction: CrudeDirection): Direction => diff --git a/x/ts/src/spatial/location/location.ts b/x/ts/src/spatial/location/location.ts index a124f077a4..2495a7ae1a 100644 --- a/x/ts/src/spatial/location/location.ts +++ b/x/ts/src/spatial/location/location.ts @@ -70,8 +70,8 @@ export type Crude = CrudeLocation; export const construct = (cl: Crude): Location => { if (cl instanceof String) return cl as Location; if (!DIRECTIONS.includes(cl as Direction)) return cl as Location; - else if (cl === "x") return "left"; - else return "top"; + if (cl === "x") return "left"; + return "top"; }; export const swap = (cl: Crude): Location => SWAPPED[construct(cl)]; @@ -161,13 +161,13 @@ export const constructXY = (x: Crude | XY, y?: Crude): XY => { `[XYLocation] - encountered two locations with the same direction: ${parsedX.toString()} - ${parsedY.toString()}`, ); const xy = { ...CENTER }; - if (parsedX === "center") { + if (parsedX === "center") if (isX(parsedY)) [xy.x, xy.y] = [parsedY, parsedX]; else [xy.x, xy.y] = [parsedX, parsedY]; - } else if (parsedY === "center") { + else if (parsedY === "center") if (isX(parsedX)) [xy.x, xy.y] = [parsedX, parsedY]; else [xy.x, xy.y] = [parsedY, parsedX]; - } else if (isX(parsedX)) [xy.x, xy.y] = [parsedX, parsedY as YLocation]; + else if (isX(parsedX)) [xy.x, xy.y] = [parsedX, parsedY as YLocation]; else [xy.x, xy.y] = [parsedY as XLocation, parsedX as YLocation]; return xy; }; diff --git a/x/ts/src/spatial/scale/scale.ts b/x/ts/src/spatial/scale/scale.ts index d2abc7f254..8d351cf7fb 100644 --- a/x/ts/src/spatial/scale/scale.ts +++ b/x/ts/src/spatial/scale/scale.ts @@ -10,7 +10,7 @@ import { z } from "zod"; import { clamp } from "@/clamp/clamp"; -import { numeric } from "@/numeric"; +import { type numeric } from "@/numeric"; import * as bounds from "@/spatial/bounds/bounds"; import { type Box, isBox } from "@/spatial/box/box"; import * as box from "@/spatial/box/box"; diff --git a/x/ts/src/telem/generate.ts b/x/ts/src/telem/generate.ts index fae5694d94..791952315e 100644 --- a/x/ts/src/telem/generate.ts +++ b/x/ts/src/telem/generate.ts @@ -12,8 +12,6 @@ import { DataType, type DataTypeT, type TypedArray } from "@/telem/telem"; export const randomSeries = (length: number, dataType: DataTypeT): TypedArray => { // generate random bytes of the correct length const bytes = new Uint8Array(length * new DataType(dataType).density.valueOf()); - for (let i = 0; i < bytes.byteLength; i++) { - bytes[i] = Math.floor(Math.random() * 256); - } + for (let i = 0; i < bytes.byteLength; i++) bytes[i] = Math.floor(Math.random() * 256); return new new DataType(dataType).Array(bytes.buffer); }; diff --git a/x/ts/src/telem/series.ts b/x/ts/src/telem/series.ts index 56dab21bd0..c821b3a724 100644 --- a/x/ts/src/telem/series.ts +++ b/x/ts/src/telem/series.ts @@ -13,7 +13,7 @@ import { binary } from "@/binary"; import { caseconv } from "@/caseconv"; import { compare } from "@/compare"; import { id } from "@/id"; -import { math } from "@/math"; +import { type math } from "@/math"; import { bounds } from "@/spatial"; import { type GLBufferController, @@ -205,37 +205,35 @@ export class Series { const isArray = Array.isArray(data); if (dataType != null) this.dataType = new DataType(dataType); - else { - if (data instanceof ArrayBuffer) - throw new Error( - "cannot infer data type from an ArrayBuffer instance when constructing a Series. Please provide a data type.", - ); - else if (isArray || isSingle) { - let first: TelemValue | unknown = data as TelemValue; - if (!isSingle) { - if (data.length === 0) - throw new Error( - "cannot infer data type from a zero length JS array when constructing a Series. Please provide a data type.", - ); - first = data[0]; - } - if (typeof first === "string") this.dataType = DataType.STRING; - else if (typeof first === "number") this.dataType = DataType.FLOAT64; - else if (typeof first === "bigint") this.dataType = DataType.INT64; - else if (typeof first === "boolean") this.dataType = DataType.BOOLEAN; - else if ( - first instanceof TimeStamp || - first instanceof Date || - first instanceof TimeStamp - ) - this.dataType = DataType.TIMESTAMP; - else if (typeof first === "object") this.dataType = DataType.JSON; - else + else if (data instanceof ArrayBuffer) + throw new Error( + "cannot infer data type from an ArrayBuffer instance when constructing a Series. Please provide a data type.", + ); + else if (isArray || isSingle) { + let first: TelemValue | unknown = data as TelemValue; + if (!isSingle) { + if (data.length === 0) throw new Error( - `cannot infer data type of ${typeof first} when constructing a Series from a JS array`, + "cannot infer data type from a zero length JS array when constructing a Series. Please provide a data type.", ); - } else this.dataType = new DataType(data); - } + first = data[0]; + } + if (typeof first === "string") this.dataType = DataType.STRING; + else if (typeof first === "number") this.dataType = DataType.FLOAT64; + else if (typeof first === "bigint") this.dataType = DataType.INT64; + else if (typeof first === "boolean") this.dataType = DataType.BOOLEAN; + else if ( + first instanceof TimeStamp || + first instanceof Date || + first instanceof TimeStamp + ) + this.dataType = DataType.TIMESTAMP; + else if (typeof first === "object") this.dataType = DataType.JSON; + else + throw new Error( + `cannot infer data type of ${typeof first} when constructing a Series from a JS array`, + ); + } else this.dataType = new DataType(data); if (!isArray && !isSingle) this._data = data; else { @@ -249,11 +247,11 @@ export class Series { data_ = data_.map((v) => new TimeStamp(v as CrudeTimeStamp).valueOf()); if (this.dataType.equals(DataType.STRING)) { this._cachedLength = data_.length; - this._data = new TextEncoder().encode(data_.join("\n") + "\n"); + this._data = new TextEncoder().encode(`${data_.join("\n")}\n`); } else if (this.dataType.equals(DataType.JSON)) { this._cachedLength = data_.length; this._data = new TextEncoder().encode( - data_.map((d) => binary.JSON_CODEC.encodeString(d)).join("\n") + "\n", + `${data_.map((d) => binary.JSON_CODEC.encodeString(d)).join("\n")}\n`, ); } else this._data = new this.dataType.Array(data_ as number[] & bigint[]).buffer; } @@ -286,9 +284,8 @@ export class Series { static generateTimestamps(length: number, rate: Rate, start: TimeStamp): Series { const timeRange = start.spanRange(rate.span(length)); const data = new BigInt64Array(length); - for (let i = 0; i < length; i++) { + for (let i = 0; i < length; i++) data[i] = BigInt(start.add(rate.span(i)).valueOf()); - } return new Series({ data, dataType: DataType.TIMESTAMP, timeRange }); } @@ -297,13 +294,13 @@ export class Series { } static fromStrings(data: string[], timeRange?: TimeRange): Series { - const buffer = new TextEncoder().encode(data.join("\n") + "\n"); + const buffer = new TextEncoder().encode(`${data.join("\n")}\n`); return new Series({ data: buffer, dataType: DataType.STRING, timeRange }); } static fromJSON(data: T[], timeRange?: TimeRange): Series { const buffer = new TextEncoder().encode( - data.map((d) => binary.JSON_CODEC.encodeString(d)).join("\n") + "\n", + `${data.map((d) => binary.JSON_CODEC.encodeString(d)).join("\n")}\n`, ); return new Series({ data: buffer, dataType: DataType.JSON, timeRange }); } @@ -475,9 +472,8 @@ export class Series { convert(target: DataType, sampleOffset: math.Numeric = 0): Series { if (this.dataType.equals(target)) return this; const data = new target.Array(this.length); - for (let i = 0; i < this.length; i++) { + for (let i = 0; i < this.length; i++) data[i] = convertDataType(this.dataType, target, this.data[i], sampleOffset); - } return new Series({ data: data.buffer, dataType: target, @@ -490,9 +486,9 @@ export class Series { private calcRawMax(): math.Numeric { if (this.length === 0) return -Infinity; - if (this.dataType.equals(DataType.TIMESTAMP)) { + if (this.dataType.equals(DataType.TIMESTAMP)) this._cachedMax = this.data[this.data.length - 1]; - } else if (this.dataType.usesBigInt) { + else if (this.dataType.usesBigInt) { const d = this.data as BigInt64Array; this._cachedMax = d.reduce((a, b) => (a > b ? a : b)); } else { @@ -507,15 +503,14 @@ export class Series { if (this.dataType.isVariable) throw new Error("cannot calculate maximum on a variable length data type"); if (this.writePos === 0) return -Infinity; - else if (this._cachedMax == null) this._cachedMax = this.calcRawMax(); + this._cachedMax ??= this.calcRawMax(); return addSamples(this._cachedMax, this.sampleOffset); } private calcRawMin(): math.Numeric { if (this.length === 0) return Infinity; - if (this.dataType.equals(DataType.TIMESTAMP)) { - this._cachedMin = this.data[0]; - } else if (this.dataType.usesBigInt) { + if (this.dataType.equals(DataType.TIMESTAMP)) this._cachedMin = this.data[0]; + else if (this.dataType.usesBigInt) { const d = this.data as BigInt64Array; this._cachedMin = d.reduce((a, b) => (a < b ? a : b)); } else { @@ -530,7 +525,7 @@ export class Series { if (this.dataType.isVariable) throw new Error("cannot calculate minimum on a variable length data type"); if (this.writePos === 0) return Infinity; - else if (this._cachedMin == null) this._cachedMin = this.calcRawMin(); + this._cachedMin ??= this.calcRawMin(); return addSamples(this._cachedMin, this.sampleOffset); } @@ -596,7 +591,7 @@ export class Series { end = this._cachedIndexes[index + 1] - 1; } else { if (index < 0) index = this.length + index; - for (let i = 0; i < this.data.length; i++) { + for (let i = 0; i < this.data.length; i++) if (this.data[i] === NEW_LINE) { if (index === 0) { end = i; @@ -605,7 +600,6 @@ export class Series { start = i + 1; index--; } - } if (end === 0) end = this.data.length; if (start >= end || index > 0) { if (required) throw new Error(`[series] - no value at index ${index}`); @@ -656,9 +650,8 @@ export class Series { // This means we only need to buffer part of the array. if (this.writePos !== FULL_BUFFER) { - if (prevBuffer === 0) { + if (prevBuffer === 0) gl.bufferData(gl.ARRAY_BUFFER, this.byteCapacity.valueOf(), gl.STATIC_DRAW); - } const byteOffset = this.dataType.density.size(prevBuffer).valueOf(); const slice = this.underlyingData.slice(this.gl.prevBuffer, this.writePos); gl.bufferSubData(gl.ARRAY_BUFFER, byteOffset, slice.buffer); @@ -747,9 +740,8 @@ export class Series { [Symbol.iterator](): Iterator { if (this.dataType.isVariable) { const s = new StringSeriesIterator(this); - if (this.dataType.equals(DataType.JSON)) { + if (this.dataType.equals(DataType.JSON)) return new JSONSeriesIterator(s) as Iterator; - } return s as Iterator; } return new FixedSeriesIterator(this) as Iterator; @@ -992,10 +984,9 @@ export class MultiSeries implements Iterable< if (required) throw new Error(`[series] - no value at alignment ${alignment}`); return undefined; } - for (const ser of this.series) { + for (const ser of this.series) if (bounds.contains(ser.alignmentBounds, alignment)) return ser.atAlignment(alignment, required as true); - } if (required) throw new Error(`[series] - no value at alignment ${alignment}`); return undefined; } diff --git a/x/ts/src/telem/telem.spec.ts b/x/ts/src/telem/telem.spec.ts index 36c4b271f6..a70253af7d 100644 --- a/x/ts/src/telem/telem.spec.ts +++ b/x/ts/src/telem/telem.spec.ts @@ -11,7 +11,7 @@ import { describe, expect, it, test } from "vitest"; import { binary } from "@/binary"; import { - CrudeDataType, + type CrudeDataType, DataType, Density, Rate, @@ -547,19 +547,13 @@ describe("DataType", () => { DataType.FLOAT32, DataType.FLOAT64, ]; - for (const from of numericTypes) { - for (const to of numericTypes) { - expect(from.canCastTo(to)).toBe(true); - } - } + for (const from of numericTypes) + for (const to of numericTypes) expect(from.canCastTo(to)).toBe(true); }); it("should return true for non-numeric data types ONLY if they are equal", () => { const nonNumericTypes = [DataType.STRING, DataType.BOOLEAN]; - for (const from of nonNumericTypes) { - for (const to of nonNumericTypes) { - expect(from.canCastTo(to)).toBe(from === to); - } - } + for (const from of nonNumericTypes) + for (const to of nonNumericTypes) expect(from.canCastTo(to)).toBe(from === to); }); }); diff --git a/x/ts/src/telem/telem.ts b/x/ts/src/telem/telem.ts index 258be9ea8e..1ce1d5c1c0 100644 --- a/x/ts/src/telem/telem.ts +++ b/x/ts/src/telem/telem.ts @@ -43,11 +43,10 @@ const remainder = ( TimeSpan.MICROSECOND, TimeSpan.NANOSECOND, ].some((s) => s.equals(ts)) - ) { + ) throw new Error( "Invalid argument for remainder. Must be an even TimeSpan or Timestamp", ); - } const v = value.valueOf() % ts.valueOf(); return (value instanceof TimeStamp ? new TimeStamp(v) : new TimeSpan(v)) as T; }; @@ -93,14 +92,13 @@ export class TimeStamp implements Stringer { let offset: bigint = BigInt(0); if (value instanceof Number) value = value.valueOf(); if (tzInfo === "local") offset = TimeStamp.utcOffset.valueOf(); - if (typeof value === "number") { + if (typeof value === "number") if (isFinite(value)) value = Math.trunc(value); else { if (isNaN(value)) value = 0; if (value === Infinity) value = TimeStamp.MAX; else value = TimeStamp.MIN; } - } this.value = BigInt(value.valueOf()) + offset; } } @@ -126,10 +124,10 @@ export class TimeStamp implements Stringer { let seconds = "00"; let milliseconds: string | undefined = "00"; if (mbeSeconds != null) [seconds, milliseconds] = mbeSeconds.split("."); - let base = TimeStamp.hours(parseInt(hours ?? "00", 10)) - .add(TimeStamp.minutes(parseInt(minutes ?? "00", 10))) - .add(TimeStamp.seconds(parseInt(seconds ?? "00", 10))) - .add(TimeStamp.milliseconds(parseInt(milliseconds ?? "00", 10))); + let base = TimeStamp.hours(parseInt(hours ?? "00")) + .add(TimeStamp.minutes(parseInt(minutes ?? "00"))) + .add(TimeStamp.seconds(parseInt(seconds ?? "00"))) + .add(TimeStamp.milliseconds(parseInt(milliseconds ?? "00"))); if (tzInfo === "local") base = base.add(TimeStamp.utcOffset); return base.valueOf(); } @@ -1066,12 +1064,11 @@ export class DataType extends String implements Stringer { ) { super(value.valueOf()); return; - } else { - const t = DataType.ARRAY_CONSTRUCTOR_DATA_TYPES.get(value.constructor.name); - if (t != null) { - super(t.valueOf()); - return; - } + } + const t = DataType.ARRAY_CONSTRUCTOR_DATA_TYPES.get(value.constructor.name); + if (t != null) { + super(t.valueOf()); + return; } super(DataType.UNKNOWN.valueOf()); throw new Error(`unable to find data type for ${value.toString()}`); @@ -1136,9 +1133,8 @@ export class DataType extends String implements Stringer { (!this.isVariable && other.isVariable) ) return false; - if ((this.isFloat && other.isInteger) || (this.isInteger && other.isFloat)) { + if ((this.isFloat && other.isInteger) || (this.isInteger && other.isFloat)) return this.density.valueOf() < other.density.valueOf(); - } if ((this.isFloat && other.isFloat) || (this.isInteger && other.isInteger)) return this.density.valueOf() <= other.density.valueOf(); return false; diff --git a/x/ts/src/url/url.ts b/x/ts/src/url/url.ts index 402209bb85..016ae89208 100644 --- a/x/ts/src/url/url.ts +++ b/x/ts/src/url/url.ts @@ -40,18 +40,15 @@ export const buildQueryString = ( prefix: string = "", ): string => { if (request === null) return ""; - return ( - "?" + - Object.entries(request) - .filter(([, value]) => { - if (value === undefined || value === null) return false; - if (Array.isArray(value)) return value.length > 0; - return true; - }) - - .map(([key, value]) => `${prefix}${key}=${value}`) - .join("&") - ); + return `?${Object.entries(request) + .filter(([, value]) => { + if (value === undefined || value === null) return false; + if (Array.isArray(value)) return value.length > 0; + return true; + }) + + .map(([key, value]) => `${prefix}${key}=${value}`) + .join("&")}`; }; /**