diff --git a/.github/workflows/docker_build_base.yml b/.github/workflows/docker_build_base.yml
index af459215099..00848e2518e 100644
--- a/.github/workflows/docker_build_base.yml
+++ b/.github/workflows/docker_build_base.yml
@@ -177,7 +177,7 @@ jobs:
fail-fast: true
matrix:
debian: [ bullseye, bookworm ]
- component: [ vtadmin, vtorc, vtgate, vttablet, mysqlctld, mysqlctl, vtctl, vtctlclient, vtctld, logrotate, logtail ]
+ component: [ vtadmin, vtorc, vtgate, vttablet, mysqlctld, mysqlctl, vtctl, vtctlclient, vtctld, logrotate, logtail, vtbackup, vtexplain ]
steps:
- name: Check out code
diff --git a/.github/workflows/docker_build_vttestserver.yml b/.github/workflows/docker_build_vttestserver.yml
new file mode 100644
index 00000000000..1223700527b
--- /dev/null
+++ b/.github/workflows/docker_build_vttestserver.yml
@@ -0,0 +1,65 @@
+name: Docker Build vttestserver
+on:
+ push:
+ branches:
+ - main
+ tags:
+ - '*'
+
+concurrency:
+ group: format('{0}-{1}', ${{ github.ref }}, 'Docker Build vttestserver')
+ cancel-in-progress: true
+
+permissions: read-all
+
+jobs:
+ build_and_push:
+ name: Build and push vitess/vttestserver Docker images
+ runs-on: gh-hosted-runners-16cores-1
+ if: github.repository == 'vitessio/vitess'
+
+ strategy:
+ fail-fast: true
+ matrix:
+ branch: [ mysql57, mysql80 ]
+
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v3
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Set Dockerfile path
+ run: |
+ echo "DOCKERFILE=./docker/vttestserver/Dockerfile.${{ matrix.branch }}" >> $GITHUB_ENV
+
+ - name: Build and push on main
+ if: github.ref == 'refs/heads/main'
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ file: ${{ env.DOCKERFILE }}
+ push: true
+ tags: vitess/vttestserver:${{ matrix.branch }}
+
+ - name: Get the Git tag
+ if: startsWith(github.ref, 'refs/tags/')
+ run: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
+
+ - name: Set Docker tag name
+ if: startsWith(github.ref, 'refs/tags/')
+ run: |
+ echo "DOCKER_TAG=vitess/vttestserver:${TAG_NAME}-${{ matrix.branch }}" >> $GITHUB_ENV
+
+ - name: Build and push on tags
+ if: startsWith(github.ref, 'refs/tags/')
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ file: ${{ env.DOCKERFILE }}
+ push: true
+ tags: ${{ env.DOCKER_TAG }}
\ No newline at end of file
diff --git a/changelog/18.0/18.0.0/summary.md b/changelog/18.0/18.0.0/summary.md
index e9d7ad4e405..5224c0ae801 100644
--- a/changelog/18.0/18.0.0/summary.md
+++ b/changelog/18.0/18.0.0/summary.md
@@ -44,7 +44,7 @@
In previous releases the [local examples](https://github.com/vitessio/vitess/tree/main/examples/local) were
explicitly using etcd v2 storage (`etcd --enable-v2=true`) and API (`ETCDCTL_API=2`) mode. We have now
removed this legacy etcd usage and instead use the new (default) etcd v3 storage and API. Please see
-[PR #13791](https://github.com/vitessio/vitess/pull/13791) for additional info. If you are using the local
+[PR #13791](https://github.com/vitessio/vitess/pull/13791) for details. If you are using the local
examples in any sort of long-term non-testing capacity, then you will need to explicitly use the v2 storage
and API mode or [migrate your existing data from v2 to v3](https://etcd.io/docs/v3.5/tutorials/how-to-migrate/).
@@ -52,60 +52,61 @@ and API mode or [migrate your existing data from v2 to v3](https://etcd.io/docs/
#### VTOrc flag `--allow-emergency-reparent`
-VTOrc has a new flag `--allow-emergency-reparent` that allows the users to toggle the ability of VTOrc to run emergency
-reparent operations. Users that want VTOrc to fix the replication issues, but don't want it to run any reparents
-should start using this flag. By default, VTOrc will be able to run `EmergencyReparentShard`. Users must specify the
-flag to `false` to change the behaviour.
+VTOrc has a new flag `--allow-emergency-reparent` that specifies whether VTOrc is allowed to run emergency
+failover operations. Users that want VTOrc to fix replication issues, but don't want it to run any failovers
+should use this flag. This flag defaults to `true` which corresponds to the default behavior from prior releases.
#### VTOrc flag `--change-tablets-with-errant-gtid-to-drained`
VTOrc has a new flag `--change-tablets-with-errant-gtid-to-drained` that allows users to choose whether VTOrc should change the
-tablet type of tablets with errant GTIDs to `DRAINED`. By default, it is disabled.
+tablet type of tablets with errant GTIDs to `DRAINED`. By default, this flag is disabled.
This feature allows users to configure VTOrc such that any tablet that encounters errant GTIDs is automatically taken out of the
serving graph. These tablets can then be inspected for what the errant GTIDs are, and once fixed, they can rejoin the cluster.
#### ERS sub flag `--wait-for-all-tablets`
-Running `EmergencyReparentShard` from the vtctldclient has a new sub-flag `--wait-for-all-tablets` that makes `EmergencyReparentShard` wait
+vtctldclient command `EmergencyReparentShard` has a new sub-flag `--wait-for-all-tablets` that makes `EmergencyReparentShard` wait
for a response from all the tablets. Originally `EmergencyReparentShard` was meant only to be run when a primary tablet is unreachable.
-We have realized now that there are cases when the replication is broken but all the tablets are reachable. In these cases, it is advisable to
-call `EmergencyReparentShard` with `--wait-for-all-tablets` so that it does not ignore one of the tablets.
+We have realized now that there are cases when replication is broken but all tablets are reachable. In these cases, it is advisable to
+call `EmergencyReparentShard` with `--wait-for-all-tablets` so that it does not ignore any of the tablets.
#### VTGate GRPC stream execute session flag `--grpc-send-session-in-streaming`
-This flag enables transaction support on `StreamExecute` api.
-Once enabled, VTGate `StreamExecute` gRPC api will send session as the last packet in the response.
-The client should enable it only when they have made the required changes to expect such a packet.
+This flag enables transaction support on VTGate's `StreamExecute` gRPC API.
+When this is enabled, `StreamExecute` will return the session in the last packet of the response.
+Users should enable this flag only after client code has been changed to expect such a packet.
It is disabled by default.
### Experimental Foreign Key Support
-A new field `foreignKeyMode` has been added to the VSchema. This field can be provided for each keyspace. The VTGate flag `--foreign_key_mode` has been deprecated in favour of this field.
+A new optional field `foreignKeyMode` has been added to the VSchema. This field can be provided for each keyspace. The VTGate flag `--foreign_key_mode` has been deprecated in favor of this field.
There are 3 foreign key modes now supported in Vitess -
1. `unmanaged` -
- This mode represents the default behaviour in Vitess, where it does not manage foreign keys column references. Users are responsible for configuring foreign keys in MySQL in such a way that related rows, as determined by foreign keys, reside within the same shard.
+ This mode represents the default behavior in Vitess, where it does not manage foreign key column references. Users are responsible for configuring foreign keys in MySQL in such a way that related rows, as determined by foreign keys, reside within the same shard.
2. `managed` [EXPERIMENTAL] -
- In this experimental mode, Vitess is fully aware of foreign key relationships and actively tracks foreign key constraints using the schema tracker. Vitess takes charge of handling DML operations with foreign keys cascading updates, deletes and verifying restrict. It will also validate parent row existence.
- This ensures that all the operations are logged in binary logs, unlike MySQL implementation of foreign keys.
- This enables seamless integration of VReplication with foreign keys.
- For more details on what operations Vitess takes please refer to the [design document for foreign keys](https://github.com/vitessio/vitess/issues/12967).
+ In this experimental mode, Vitess is fully aware of foreign key relationships and actively tracks foreign key constraints using the schema tracker. VTGate will handle DML operations with foreign keys and correctly cascade updates and deletes.
+ It will also verify `restrict` constraints and validate the existence of parent rows before inserting child rows.
+ This ensures that all child operations are logged in binary logs, unlike the InnoDB implementation of foreign keys.
+ This allows the usage of VReplication workflows with foreign keys.
+ Implementation details are documented in the [RFC for foreign keys](https://github.com/vitessio/vitess/issues/12967).
3. `disallow` -
In this mode Vitess explicitly disallows any DDL statements that try to create a foreign key constraint. This mode is equivalent to running VTGate with the flag `--foreign_key_mode=disallow`.
#### Upgrade process
-After upgrading from v17 to v18, the users should specify the correct foreign key mode for all their keyspaces in the VSchema using the new property.
-Once this change has taken effect, the deprecated flag `--foreign_key_mode` can be dropped from all the VTGates.
+After upgrading from v17 to v18, users should specify the correct foreign key mode for all their keyspaces in the VSchema using the new property.
+Once this change has taken effect, the deprecated flag `--foreign_key_mode` can be dropped from all VTGates. Note that this is only required if running in `disallow` mode.
+No action is needed to use `unmanaged` mode.
### VTAdmin
#### vtadmin-web updated to node v18.16.0 (LTS)
Building `vtadmin-web` now requires node >= v18.16.0 (LTS). Breaking changes from v16 to v18 are listed
-in https://nodejs.org/en/blog/release/v18.0.0, but none apply to VTAdmin. Full details on v18.16.0 are listed
+in https://nodejs.org/en/blog/release/v18, but none apply to VTAdmin. Full details on node v18.16.0 are listed
on https://nodejs.org/en/blog/release/v18.16.0.
### Deprecations and Deletions
@@ -124,58 +125,58 @@ develop new features without impacting other commands. This also presents an [AP
This makes development easier while also offering a better UX. For example, this offers a way to use
[configuration files](https://vitess.io/docs/18.0/reference/viper/config-files/) with support for
[dynamic configuration](https://vitess.io/docs/18.0/reference/viper/dynamic-values/) ([see also](https://github.com/vitessio/vitess/blob/release-18.0/doc/viper/viper.md)).
-- The [reference documentation](https://vitess.io/docs/reference/programs/vtctldclient/) is now built through code. This
+- The [reference documentation](https://vitess.io/docs/18.0/reference/programs/vtctldclient/) is now built through code. This
removes a burden from developers while helping users by ensuring the docs are always correct and up-to-date.
-In Vitess 18.0 we have completed migrating all client commands to `vtctldclient` – the last ones being the [OnlineDDL](https://github.com/vitessio/vitess/issues/13712)
+In Vitess 18 we have completed migrating all client commands to `vtctldclient` – the last ones being the [OnlineDDL](https://github.com/vitessio/vitess/issues/13712)
and [VReplication](https://github.com/vitessio/vitess/issues/12152) commands. With this work now completed, the
-legacy `vtctl`/`vtctlclient` binaries are now fully deprecated and we plan to remove them in Vitess 19.0. You should
-[begin your transition](https://vitess.io/docs/18.0/reference/vtctldclient-transition/) before upgrading to 18.0.
+legacy `vtctl`/`vtctlclient` binaries are now fully deprecated and we plan to remove them in Vitess 19. You should
+[begin your transition](https://vitess.io/docs/18.0/reference/vtctldclient-transition/) before upgrading to Vitess 18.
#### Deprecated Command Line Flags
Throttler related `vttablet` flags:
-- `--throttle_threshold` is deprecated and will be removed in `v19.0`
-- `--throttle_metrics_query` is deprecated and will be removed in `v19.0`
-- `--throttle_metrics_threshold` is deprecated and will be removed in `v19.0`
-- `--throttle_check_as_check_self` is deprecated and will be removed in `v19.0`
-- `--throttler-config-via-topo` is deprecated after assumed `true` in `v17.0`. It will be removed in a future version.
+- `--throttle_threshold` is deprecated and will be removed in `v19`
+- `--throttle_metrics_query` is deprecated and will be removed in `v19`
+- `--throttle_metrics_threshold` is deprecated and will be removed in `v19`
+- `--throttle_check_as_check_self` is deprecated and will be removed in `v19`
+- `--throttler-config-via-topo` is deprecated after assumed `true` in `v17`. It will be removed in a future version.
Cache related `vttablet` flags:
-- `--queryserver-config-query-cache-lfu` is deprecated and will be removed in `v19.0`. The query cache always uses a LFU implementation now.
-- `--queryserver-config-query-cache-size` is deprecated and will be removed in `v19.0`. This option only applied to LRU caches, which are now unsupported.
+- `--queryserver-config-query-cache-lfu` is deprecated and will be removed in `v19`. The query cache always uses a LFU implementation now.
+- `--queryserver-config-query-cache-size` is deprecated and will be removed in `v19`. This option only applied to LRU caches, which are now unsupported.
Buffering related `vtgate` flags:
-- `--buffer_implementation` is deprecated and will be removed in `v19.0`
+- `--buffer_implementation` is deprecated and will be removed in `v19`
Cache related `vtgate` flags:
-- `--gate_query_cache_lfu` is deprecated and will be removed in `v19.0`. The query cache always uses a LFU implementation now.
-- `--gate_query_cache_size` is deprecated and will be removed in `v19.0`. This option only applied to LRU caches, which are now unsupported.
+- `--gate_query_cache_lfu` is deprecated and will be removed in `v19`. The query cache always uses a LFU implementation now.
+- `--gate_query_cache_size` is deprecated and will be removed in `v19`. This option only applied to LRU caches, which are now unsupported.
VTGate flags:
-- `--schema_change_signal_user` is deprecated and will be removed in `v19.0`
-- `--foreign_key_mode` is deprecated and will be removed in `v19.0`. For more detail read the [foreign keys](#foreign-keys) section.
+- `--schema_change_signal_user` is deprecated and will be removed in `v19`
+- `--foreign_key_mode` is deprecated and will be removed in `v19`. For more detail read the [foreign keys](#foreign-keys) section.
VDiff v1:
-[VDiff v2 was added in Vitess 15.0](https://vitess.io/blog/2022-11-22-vdiff-v2/) and marked as GA in 16.0.
-The [legacy v1 client command](https://vitess.io/docs/18.0/reference/vreplication/vdiffv1/) is now deprecated in Vitess 18.0 and will be **removed** in 19.0.
+[VDiff v2 was added in Vitess 15](https://vitess.io/blog/2022-11-22-vdiff-v2/) and marked as GA in 16.
+The [legacy v1 client command](https://vitess.io/docs/18.0/reference/vreplication/vdiffv1/) is now deprecated in Vitess 18 and will be **removed** in Vitess 19.
Please switch all of your usage to the [new VDiff client](https://vitess.io/docs/18.0/reference/vreplication/vdiff/) command ASAP.
#### Deprecated Stats
-The following `EmergencyReparentShard` stats are deprecated in `v18.0` and will be removed in `v19.0`:
+The following `EmergencyReparentShard` stats are deprecated in `v18` and will be removed in `v19`:
- `ers_counter`
- `ers_success_counter`
- `ers_failure_counter`
-These metrics are replaced by [new reparenting stats introduced in `v18.0`](#vtctld-and-vtorc-reparenting-stats).
+These metrics are replaced by [new reparenting stats introduced in `v18`](#vtctld-and-vtorc-reparenting-stats).
VTBackup stat `DurationByPhase` is deprecated. Use the binary-valued `Phase` stat instead.
@@ -214,16 +215,15 @@ Flags in `vtorc`:
#### Deleted `v3` planner
-The `Gen4` planner has been the default planner since Vitess 14. The `v3` planner was deprecated in Vitess 15 and has now been removed in this release.
+The `Gen4` planner has been the default planner since Vitess 14. The `v3` planner was deprecated in Vitess 15 and has been removed in Vitess 18.
#### Deleted `k8stopo`
-The `k8stopo` has been deprecated in Vitess 17, also see https://github.com/vitessio/vitess/issues/13298. With Vitess 18
-the `k8stopo` has been removed.
+`k8stopo` was deprecated in Vitess 17, see https://github.com/vitessio/vitess/issues/13298. It has now been removed.
#### Deleted `vtgr`
-The `vtgr` has been deprecated in Vitess 17, also see https://github.com/vitessio/vitess/issues/13300. With Vitess 18 `vtgr` has been removed.
+`vtgr` was deprecated in Vitess 17, see https://github.com/vitessio/vitess/issues/13300. It has now been removed.
#### Deleted `query_analyzer`
@@ -237,7 +237,7 @@ The VTGate stat `VindexUnknownParameters` gauges unknown Vindex parameters found
#### VTBackup `Phase` stat
-In v17, the `vtbackup` stat `DurationByPhase` stat was added measuring the time spent by `vtbackup` in each phase. This stat turned out to be awkward to use in production, and has been replaced in v18 by a binary-valued `Phase` stat.
+In v17, the `vtbackup` stat `DurationByPhase` stat was added to measure the time spent by `vtbackup` in each phase. This stat turned out to be awkward to use in production, and has been replaced in v18 by a binary-valued `Phase` stat.
`Phase` reports a 1 (active) or a 0 (inactive) for each of the following phases:
@@ -272,7 +272,7 @@ vtbackup_restore_count{component="BackupStorage",implementation="S3",operation="
#### VTCtld and VTOrc reparenting stats
-New VTCtld and VTorc stats were added to measure frequency of reparents by keyspace/shard:
+New VTCtld and VTOrc stats were added to measure frequency of reparents by keyspace/shard:
- `emergency_reparent_counts` - Number of times `EmergencyReparentShard` has been run. It is further subdivided by the keyspace, shard and the result of the operation.
- `planned_reparent_counts` - Number of times `PlannedReparentShard` has been run. It is further subdivided by the keyspace, shard and the result of the operation.
@@ -297,7 +297,7 @@ tablet will not actually throttle any transactions; however, it will increase th
(`vttablet_transaction_throttler_throttled`). This allows users to deploy the transaction throttler in production and
gain observability on how much throttling would take place, without actually throttling any requests.
-### Docker
+### Docker Builds
#### Bookworm added and made default
@@ -306,12 +306,13 @@ Bullseye images will still be built and available as long as the OS build is cur
#### Buster removed
-Buster LTS supports will stop in June 2024, and Vitess v18.0 will be supported through October 2024.
+Buster LTS supports will stop in June 2024, and Vitess 18 will be supported through October 2024.
To prevent supporting a deprecated buster build for several months after June 2024, we are preemptively
-removing Vitess support.
+removing Vitess support for Buster.
### Durability Policies
#### New Durability Policies
-2 new inbuilt durability policies have been added to Vitess in this release namely `semi_sync_with_rdonly_ack` and `cross_cell_with_rdonly_ack`. These policies are exactly like `semi_sync` and `cross_cell` respectively, and differ just in the part where the rdonly tablets can also send semi-sync ACKs.
\ No newline at end of file
+Two new built-in durability policies have been added in Vitess 18: `semi_sync_with_rdonly_ack` and `cross_cell_with_rdonly_ack`.
+These policies are similar to `semi_sync` and `cross_cell` respectively, the only difference is that `rdonly` tablets can also send semi-sync ACKs.
\ No newline at end of file
diff --git a/go/cmd/vtctldclient/command/vreplication/common/utils.go b/go/cmd/vtctldclient/command/vreplication/common/utils.go
index be3e52f9ab9..da6e3329579 100644
--- a/go/cmd/vtctldclient/command/vreplication/common/utils.go
+++ b/go/cmd/vtctldclient/command/vreplication/common/utils.go
@@ -26,6 +26,7 @@ import (
"github.com/spf13/cobra"
"vitess.io/vitess/go/cmd/vtctldclient/cli"
+ "vitess.io/vitess/go/vt/topo"
"vitess.io/vitess/go/vt/topo/topoproto"
"vitess.io/vitess/go/vt/vtctl/vtctldclient"
"vitess.io/vitess/go/vt/vtctl/workflow"
@@ -56,6 +57,7 @@ var (
CreateOptions = struct {
Cells []string
+ AllCells bool
TabletTypes []topodatapb.TabletType
TabletTypesInPreferenceOrder bool
OnDDL string
@@ -98,12 +100,28 @@ func GetCommandCtx() context.Context {
return commandCtx
}
-func ParseCells(cmd *cobra.Command) {
- if cmd.Flags().Lookup("cells").Changed { // Validate the provided value(s)
+func ParseCells(cmd *cobra.Command) error {
+ cf := cmd.Flags().Lookup("cells")
+ af := cmd.Flags().Lookup("all-cells")
+ if cf != nil && cf.Changed && af != nil && af.Changed {
+ return fmt.Errorf("cannot specify both --cells and --all-cells")
+ }
+ if cf.Changed { // Validate the provided value(s)
for i, cell := range CreateOptions.Cells { // Which only means trimming whitespace
CreateOptions.Cells[i] = strings.TrimSpace(cell)
}
}
+ if CreateOptions.AllCells { // Use all current cells
+ ctx, cancel := context.WithTimeout(commandCtx, topo.RemoteOperationTimeout)
+ defer cancel()
+ resp, err := client.GetCellInfoNames(ctx, &vtctldatapb.GetCellInfoNamesRequest{})
+ if err != nil {
+ return fmt.Errorf("failed to get current cells: %v", err)
+ }
+ CreateOptions.Cells = make([]string, len(resp.Names))
+ copy(CreateOptions.Cells, resp.Names)
+ }
+ return nil
}
func ParseTabletTypes(cmd *cobra.Command) error {
@@ -130,7 +148,9 @@ func ParseAndValidateCreateOptions(cmd *cobra.Command) error {
if err := validateOnDDL(cmd); err != nil {
return err
}
- ParseCells(cmd)
+ if err := ParseCells(cmd); err != nil {
+ return err
+ }
if err := ParseTabletTypes(cmd); err != nil {
return err
}
@@ -192,6 +212,7 @@ func AddCommonFlags(cmd *cobra.Command) {
func AddCommonCreateFlags(cmd *cobra.Command) {
cmd.Flags().StringSliceVarP(&CreateOptions.Cells, "cells", "c", nil, "Cells and/or CellAliases to copy table data from.")
+ cmd.Flags().BoolVarP(&CreateOptions.AllCells, "all-cells", "a", false, "Copy table data from any existing cell.")
cmd.Flags().Var((*topoproto.TabletTypeListFlag)(&CreateOptions.TabletTypes), "tablet-types", "Source tablet types to replicate table data from (e.g. PRIMARY,REPLICA,RDONLY).")
cmd.Flags().BoolVar(&CreateOptions.TabletTypesInPreferenceOrder, "tablet-types-in-preference-order", true, "When performing source tablet selection, look for candidates in the type order as they are listed in the tablet-types flag.")
cmd.Flags().StringVar(&CreateOptions.OnDDL, "on-ddl", onDDLDefault, "What to do when DDL is encountered in the VReplication stream. Possible values are IGNORE, STOP, EXEC, and EXEC_IGNORE.")
diff --git a/go/cmd/vtctldclient/command/vreplication/common/utils_test.go b/go/cmd/vtctldclient/command/vreplication/common/utils_test.go
index 77672d82350..0dc179060d6 100644
--- a/go/cmd/vtctldclient/command/vreplication/common/utils_test.go
+++ b/go/cmd/vtctldclient/command/vreplication/common/utils_test.go
@@ -14,19 +14,38 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-package common
+package common_test
import (
+ "context"
"testing"
+ "time"
"github.com/spf13/cobra"
+ "github.com/stretchr/testify/require"
+
+ "vitess.io/vitess/go/cmd/vtctldclient/command"
+ "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/common"
+ "vitess.io/vitess/go/vt/topo"
+ "vitess.io/vitess/go/vt/topo/memorytopo"
+ "vitess.io/vitess/go/vt/vtctl/grpcvtctldserver"
+ "vitess.io/vitess/go/vt/vtctl/localvtctldclient"
+ "vitess.io/vitess/go/vt/vtctl/vtctldclient"
+ "vitess.io/vitess/go/vt/vttablet/tmclient"
)
func TestParseAndValidateCreateOptions(t *testing.T) {
+ common.SetCommandCtx(context.Background())
+ ctx, cancel := context.WithTimeout(common.GetCommandCtx(), 60*time.Second)
+ defer cancel()
+ cells := []string{"zone1", "zone2", "zone3"}
+ SetupLocalVtctldClient(t, ctx, cells...)
+
tests := []struct {
- name string
- setFunc func(*cobra.Command) error
- wantErr bool
+ name string
+ setFunc func(*cobra.Command) error
+ wantErr bool
+ checkFunc func()
}{
{
name: "invalid tablet type",
@@ -58,18 +77,50 @@ func TestParseAndValidateCreateOptions(t *testing.T) {
},
wantErr: false,
},
+ {
+ name: "cells and all-cells",
+ setFunc: func(cmd *cobra.Command) error {
+ cellsFlag := cmd.Flags().Lookup("cells")
+ allCellsFlag := cmd.Flags().Lookup("all-cells")
+ if err := cellsFlag.Value.Set("cella"); err != nil {
+ return err
+ }
+ cellsFlag.Changed = true
+ if err := allCellsFlag.Value.Set("true"); err != nil {
+ return err
+ }
+ allCellsFlag.Changed = true
+ return nil
+ },
+ wantErr: true,
+ },
+ {
+ name: "all cells",
+ setFunc: func(cmd *cobra.Command) error {
+ allCellsFlag := cmd.Flags().Lookup("all-cells")
+ if err := allCellsFlag.Value.Set("true"); err != nil {
+ return err
+ }
+ allCellsFlag.Changed = true
+ return nil
+ },
+ wantErr: false,
+ checkFunc: func() {
+ require.Equal(t, cells, common.CreateOptions.Cells)
+ },
+ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cmd := &cobra.Command{}
- AddCommonCreateFlags(cmd)
+ common.AddCommonCreateFlags(cmd)
test := func() error {
if tt.setFunc != nil {
if err := tt.setFunc(cmd); err != nil {
return err
}
}
- if err := ParseAndValidateCreateOptions(cmd); err != nil {
+ if err := common.ParseAndValidateCreateOptions(cmd); err != nil {
return err
}
return nil
@@ -77,6 +128,26 @@ func TestParseAndValidateCreateOptions(t *testing.T) {
if err := test(); (err != nil) != tt.wantErr {
t.Errorf("ParseAndValidateCreateOptions() error = %v, wantErr %t", err, tt.wantErr)
}
+ if tt.checkFunc != nil {
+ tt.checkFunc()
+ }
})
}
}
+
+// SetupLocalVtctldClient sets up a local or internal VtctldServer and
+// VtctldClient for tests. It uses a memorytopo instance which contains
+// the cells provided.
+func SetupLocalVtctldClient(t *testing.T, ctx context.Context, cells ...string) {
+ ts, factory := memorytopo.NewServerAndFactory(ctx, cells...)
+ topo.RegisterFactory("test", factory)
+ tmclient.RegisterTabletManagerClientFactory("grpc", func() tmclient.TabletManagerClient {
+ return nil
+ })
+ vtctld := grpcvtctldserver.NewVtctldServer(ts)
+ localvtctldclient.SetServer(vtctld)
+ command.VtctldClientProtocol = "local"
+ client, err := vtctldclient.New(command.VtctldClientProtocol, "")
+ require.NoError(t, err, "failed to create local vtctld client which uses an internal vtctld server")
+ common.SetClient(client)
+}
diff --git a/go/mysql/conn.go b/go/mysql/conn.go
index b1159f11c31..aa9cd94c7d5 100644
--- a/go/mysql/conn.go
+++ b/go/mysql/conn.go
@@ -1708,6 +1708,10 @@ func (c *Conn) IsMarkedForClose() bool {
return c.closing
}
+func (c *Conn) IsShuttingDown() bool {
+ return c.listener.shutdown.Load()
+}
+
// ConnCheck ensures that this connection to the MySQL server hasn't been broken.
// This is a fast, non-blocking check. For details on its implementation, please read
// "Three Bugs in the Go MySQL Driver" (Vicent Marti, GitHub, 2020)
@@ -1745,8 +1749,3 @@ func (c *Conn) ConnCheck() error {
}
return nil
}
-
-// GetTestConn returns a conn for testing purpose only.
-func GetTestConn() *Conn {
- return newConn(testConn{})
-}
diff --git a/go/mysql/conn_fake.go b/go/mysql/conn_fake.go
index 72d944c2f3b..e61f90d33f1 100644
--- a/go/mysql/conn_fake.go
+++ b/go/mysql/conn_fake.go
@@ -81,3 +81,14 @@ func (m mockAddress) String() string {
}
var _ net.Addr = (*mockAddress)(nil)
+
+// GetTestConn returns a conn for testing purpose only.
+func GetTestConn() *Conn {
+ return newConn(testConn{})
+}
+
+// GetTestServerConn is only meant to be used for testing.
+// It creates a server connection using a testConn and the provided listener.
+func GetTestServerConn(listener *Listener) *Conn {
+ return newServerConn(testConn{}, listener)
+}
diff --git a/go/vt/discovery/tablet_picker.go b/go/vt/discovery/tablet_picker.go
index 99d95848d19..e5177d81f3f 100644
--- a/go/vt/discovery/tablet_picker.go
+++ b/go/vt/discovery/tablet_picker.go
@@ -135,6 +135,8 @@ type TabletPicker struct {
inOrder bool
cellPref TabletPickerCellPreference
localCellInfo localCellInfo
+ // This map is keyed on the results of TabletAlias.String().
+ ignoreTablets map[string]struct{}
}
// NewTabletPicker returns a TabletPicker.
@@ -144,6 +146,7 @@ func NewTabletPicker(
cells []string,
localCell, keyspace, shard, tabletTypesStr string,
options TabletPickerOptions,
+ ignoreTablets ...*topodatapb.TabletAlias,
) (*TabletPicker, error) {
// Keep inOrder parsing here for backward compatability until TabletPickerTabletOrder is fully adopted.
if tabletTypesStr == "" {
@@ -219,7 +222,7 @@ func NewTabletPicker(
}
}
- return &TabletPicker{
+ tp := &TabletPicker{
ts: ts,
cells: dedupeCells(cells),
localCellInfo: localCellInfo{localCell: localCell, cellsInAlias: aliasCellMap},
@@ -228,7 +231,15 @@ func NewTabletPicker(
tabletTypes: tabletTypes,
inOrder: inOrder,
cellPref: cellPref,
- }, nil
+ ignoreTablets: make(map[string]struct{}, len(ignoreTablets)),
+ }
+
+ for _, ignoreTablet := range ignoreTablets {
+ tp.ignoreTablets[ignoreTablet.String()] = struct{}{}
+ }
+
+ return tp, nil
+
}
// dedupeCells is used to remove duplicates in the cell list in case it is passed in
@@ -358,7 +369,9 @@ func (tp *TabletPicker) GetMatchingTablets(ctx context.Context) []*topo.TabletIn
log.Errorf("Error getting shard %s/%s: %v", tp.keyspace, tp.shard, err)
return nil
}
- aliases = append(aliases, si.PrimaryAlias)
+ if _, ignore := tp.ignoreTablets[si.PrimaryAlias.String()]; !ignore {
+ aliases = append(aliases, si.PrimaryAlias)
+ }
} else {
actualCells := make([]string, 0)
for _, cell := range tp.cells {
@@ -394,7 +407,9 @@ func (tp *TabletPicker) GetMatchingTablets(ctx context.Context) []*topo.TabletIn
continue
}
for _, node := range sri.Nodes {
- aliases = append(aliases, node.TabletAlias)
+ if _, ignore := tp.ignoreTablets[node.TabletAlias.String()]; !ignore {
+ aliases = append(aliases, node.TabletAlias)
+ }
}
}
}
diff --git a/go/vt/discovery/tablet_picker_test.go b/go/vt/discovery/tablet_picker_test.go
index 2999c251e93..ac822124d58 100644
--- a/go/vt/discovery/tablet_picker_test.go
+++ b/go/vt/discovery/tablet_picker_test.go
@@ -391,6 +391,29 @@ func TestPickUsingCellAsAlias(t *testing.T) {
}
}
+func TestPickWithIgnoreList(t *testing.T) {
+ ctx := utils.LeakCheckContext(t)
+
+ te := newPickerTestEnv(t, ctx, []string{"cell1", "cell2"})
+
+ want := addTablet(ctx, te, 101, topodatapb.TabletType_REPLICA, "cell1", true, true)
+ defer deleteTablet(t, te, want)
+
+ dontWant := addTablet(ctx, te, 102, topodatapb.TabletType_REPLICA, "cell1", true, true)
+ defer deleteTablet(t, te, dontWant)
+
+ // Specify the alias as the cell.
+ tp, err := NewTabletPicker(ctx, te.topoServ, []string{"cella"}, "cell1", te.keyspace, te.shard, "replica", TabletPickerOptions{}, dontWant.GetAlias())
+ require.NoError(t, err)
+
+ // Try it many times to be sure we don't ever pick from the ignore list.
+ for i := 0; i < 100; i++ {
+ tablet, err := tp.PickForStreaming(ctx)
+ require.NoError(t, err)
+ require.False(t, proto.Equal(dontWant, tablet), "Picked the tablet we shouldn't have: %v", dontWant)
+ }
+}
+
func TestPickUsingCellAliasOnlySpecified(t *testing.T) {
ctx := utils.LeakCheckContextTimeout(t, 200*time.Millisecond)
diff --git a/go/vt/mysqlctl/builtinbackupengine.go b/go/vt/mysqlctl/builtinbackupengine.go
index 33d4ce688fd..e46932bcd51 100644
--- a/go/vt/mysqlctl/builtinbackupengine.go
+++ b/go/vt/mysqlctl/builtinbackupengine.go
@@ -348,6 +348,7 @@ func (be *BuiltinBackupEngine) executeIncrementalBackup(ctx context.Context, par
if resp.FirstTimestampBinlog == "" || resp.LastTimestampBinlog == "" {
return false, vterrors.Errorf(vtrpc.Code_ABORTED, "empty binlog name in response. Request=%v, Response=%v", req, resp)
}
+ log.Infof("ReadBinlogFilesTimestampsResponse: %+v", resp)
incrDetails := &IncrementalBackupDetails{
FirstTimestamp: FormatRFC3339(protoutil.TimeFromProto(resp.FirstTimestamp).UTC()),
FirstTimestampBinlog: filepath.Base(resp.FirstTimestampBinlog),
diff --git a/go/vt/mysqlctl/mysqld.go b/go/vt/mysqlctl/mysqld.go
index ba4ccf755b3..ee872c214f4 100644
--- a/go/vt/mysqlctl/mysqld.go
+++ b/go/vt/mysqlctl/mysqld.go
@@ -1294,36 +1294,46 @@ func (mysqld *Mysqld) ApplyBinlogFile(ctx context.Context, req *mysqlctlpb.Apply
}
// parseBinlogEntryTimestamp attempts to extract a timestamp from a binlog entry.
-func parseBinlogEntryTimestamp(logEntry string) (found bool, t time.Time, err error) {
+func parseBinlogEntryTimestamp(logEntry string) (t time.Time, err error) {
if len(logEntry) == 0 {
- return false, t, nil
+ return t, nil
}
if logEntry[0] != '#' {
- return false, t, nil
+ return t, nil
}
if submatch := binlogEntryCommittedTimestampRegex.FindStringSubmatch(logEntry); submatch != nil {
// MySQL 8.0
binlogEntryCommittedTimestamp := submatch[1]
unixMicros, err := strconv.ParseInt(binlogEntryCommittedTimestamp, 10, 64)
if err != nil {
- return false, t, err
+ return t, err
}
- return true, time.UnixMicro(unixMicros), nil
+ return time.UnixMicro(unixMicros), nil
}
if submatch := binlogEntryTimestampGTIDRegexp.FindStringSubmatch(logEntry); submatch != nil {
// MySQL 5.7
t, err = ParseBinlogTimestamp(submatch[1])
if err != nil {
- return false, t, err
+ return t, err
}
- return true, t, nil
+ return t, nil
}
- return false, t, nil
+ return t, nil
}
// scanBinlogTimestamp invokes a `mysqlbinlog` binary to look for a timestamp in the given binary. The function
-// either looks for the first such timestamp or the last.
-func (mysqld *Mysqld) scanBinlogTimestamp(mysqlbinlogDir string, mysqlbinlogEnv []string, mysqlbinlogName string, binlogFile string, stopAtFirst bool) (matchedTime time.Time, matchFound bool, err error) {
+// looks for the first and last timestamps.
+func (mysqld *Mysqld) scanBinlogTimestamp(
+ mysqlbinlogDir string,
+ mysqlbinlogEnv []string,
+ mysqlbinlogName string,
+ binlogFile string,
+ stopAtFirst bool, // unused at this moment, to be used as an optimization hint
+) (
+ firstMatchedTime time.Time,
+ lastMatchedTime time.Time,
+ err error,
+) {
args := []string{binlogFile}
mysqlbinlogCmd := exec.Command(mysqlbinlogName, args...)
mysqlbinlogCmd.Dir = mysqlbinlogDir
@@ -1331,48 +1341,39 @@ func (mysqld *Mysqld) scanBinlogTimestamp(mysqlbinlogDir string, mysqlbinlogEnv
log.Infof("ApplyBinlogFile: running mysqlbinlog command: %#v", mysqlbinlogCmd)
pipe, err := mysqlbinlogCmd.StdoutPipe() // to be piped into mysql
if err != nil {
- return matchedTime, false, err
- }
- scanComplete := make(chan error)
- intentionalKill := false
- scan := func() {
- defer close(scanComplete)
- defer func() {
- intentionalKill = true
- mysqlbinlogCmd.Process.Kill() // ensures the binlog file is released
- }()
+ return firstMatchedTime, lastMatchedTime, err
+ }
+ scan := func() error {
// Read line by line and process it
scanner := bufio.NewScanner(pipe)
for scanner.Scan() {
logEntry := scanner.Text()
- found, t, err := parseBinlogEntryTimestamp(logEntry)
+ t, err := parseBinlogEntryTimestamp(logEntry)
if err != nil {
- scanComplete <- err
- return
+ return err
}
- if found {
- matchedTime = t
- matchFound = true
+ if t.IsZero() {
+ continue
}
- if found && stopAtFirst {
- // Found the first timestamp and it's all we need. We won't scan any further and so we should also
- // kill mysqlbinlog (otherwise it keeps waiting until we've read the entire pipe).
- return
+ if firstMatchedTime.IsZero() {
+ firstMatchedTime = t
}
+ lastMatchedTime = t
}
+ return nil
}
- if err := mysqlbinlogCmd.Start(); err != nil {
- return matchedTime, false, err
+ if err := mysqlbinlogCmd.Start(); err != nil { // Start() is nonblockig
+ return firstMatchedTime, lastMatchedTime, err
}
- go scan()
- if err := mysqlbinlogCmd.Wait(); err != nil && !intentionalKill {
- return matchedTime, false, vterrors.Wrapf(err, "waiting on mysqlbinlog command in ReadBinlogFilesTimestamps")
+ defer mysqlbinlogCmd.Process.Kill()
+ if err := scan(); err != nil { // We must first exhaust reading the command's output, before calling cmd.Wait()
+ return firstMatchedTime, lastMatchedTime, vterrors.Wrapf(err, "scanning mysqlbinlog output in ReadBinlogFilesTimestamps")
}
- if err := <-scanComplete; err != nil {
- return matchedTime, false, vterrors.Wrapf(err, "scanning mysqlbinlog output in ReadBinlogFilesTimestamps ")
+ if err := mysqlbinlogCmd.Wait(); err != nil {
+ return firstMatchedTime, lastMatchedTime, vterrors.Wrapf(err, "waiting on mysqlbinlog command in ReadBinlogFilesTimestamps")
}
- return matchedTime, matchFound, nil
+ return firstMatchedTime, lastMatchedTime, nil
}
// ReadBinlogFilesTimestamps reads all given binlog files via `mysqlbinlog` command and returns the first and last found transaction timestamps
@@ -1402,31 +1403,60 @@ func (mysqld *Mysqld) ReadBinlogFilesTimestamps(ctx context.Context, req *mysqlc
return nil, err
}
+ lastMatchedTimeMap := map[string]time.Time{} // a simple cache to avoid rescanning same files. Key=binlog file name
+
resp := &mysqlctlpb.ReadBinlogFilesTimestampsResponse{}
// Find first timestamp
- for _, binlogFile := range req.BinlogFileNames {
- t, found, err := mysqld.scanBinlogTimestamp(dir, env, mysqlbinlogName, binlogFile, true)
- if err != nil {
- return nil, err
- }
- if found {
- resp.FirstTimestamp = protoutil.TimeToProto(t)
+ err = func() error {
+ for _, binlogFile := range req.BinlogFileNames {
+ firstMatchedTime, lastMatchedTime, err := mysqld.scanBinlogTimestamp(dir, env, mysqlbinlogName, binlogFile, true)
+ if err != nil {
+ return vterrors.Wrapf(err, "while scanning for first binlog timestamp in %v", binlogFile)
+ }
+ if !lastMatchedTime.IsZero() {
+ // cache result
+ lastMatchedTimeMap[binlogFile] = lastMatchedTime
+ }
+ if firstMatchedTime.IsZero() {
+ // Timestamp not found in this file.
+ continue
+ }
+ resp.FirstTimestamp = protoutil.TimeToProto(firstMatchedTime)
resp.FirstTimestampBinlog = binlogFile
- break
+ return nil // early break
}
+ return nil
+ }()
+ if err != nil {
+ return resp, err
}
// Find last timestamp
- for i := len(req.BinlogFileNames) - 1; i >= 0; i-- {
- binlogFile := req.BinlogFileNames[i]
- t, found, err := mysqld.scanBinlogTimestamp(dir, env, mysqlbinlogName, binlogFile, false)
- if err != nil {
- return nil, err
- }
- if found {
- resp.LastTimestamp = protoutil.TimeToProto(t)
+ err = func() error {
+ for i := len(req.BinlogFileNames) - 1; i >= 0; i-- {
+ binlogFile := req.BinlogFileNames[i]
+
+ // See if we have a cached value for this file. This is certainly be the situation if there's a single binary log file in req.BinlogFileNames,
+ // which means the first file and last file are the same, and so we have already parsed the file while searching for the first timestamp.
+ lastMatchedTime, ok := lastMatchedTimeMap[binlogFile]
+ if !ok {
+ var err error
+ _, lastMatchedTime, err = mysqld.scanBinlogTimestamp(dir, env, mysqlbinlogName, binlogFile, false)
+ if err != nil {
+ return vterrors.Wrapf(err, "while scanning for last binlog timestamp in %v", binlogFile)
+ }
+ }
+ if lastMatchedTime.IsZero() {
+ // Timestamp not found in this file.
+ continue
+ }
+ resp.LastTimestamp = protoutil.TimeToProto(lastMatchedTime)
resp.LastTimestampBinlog = binlogFile
- break
+ return nil // early break
}
+ return nil
+ }()
+ if err != nil {
+ return resp, err
}
return resp, nil
}
diff --git a/go/vt/mysqlctl/mysqld_test.go b/go/vt/mysqlctl/mysqld_test.go
index 2053c0f0cc9..435090008f2 100644
--- a/go/vt/mysqlctl/mysqld_test.go
+++ b/go/vt/mysqlctl/mysqld_test.go
@@ -139,7 +139,6 @@ func TestParseBinlogEntryTimestamp(t *testing.T) {
tcases := []struct {
name string
entry string
- found bool
tm time.Time
}{
{
@@ -157,24 +156,19 @@ func TestParseBinlogEntryTimestamp(t *testing.T) {
{
name: "mysql80",
entry: "#230605 16:06:34 server id 22233 end_log_pos 1037 CRC32 0xa4707c5b GTID last_committed=4 sequence_number=5 rbr_only=no original_committed_timestamp=1685970394031366 immediate_commit_timestamp=1685970394032458 transaction_length=186",
- found: true,
tm: time.UnixMicro(1685970394031366),
},
{
name: "mysql57",
entry: "#230608 13:14:31 server id 484362839 end_log_pos 259 CRC32 0xc07510d0 GTID last_committed=0 sequence_number=1 rbr_only=yes",
- found: true,
tm: time.Date(2023, time.June, 8, 13, 14, 31, 0, time.UTC),
},
}
for _, tcase := range tcases {
t.Run(tcase.name, func(t *testing.T) {
- found, tm, err := parseBinlogEntryTimestamp(tcase.entry)
+ tm, err := parseBinlogEntryTimestamp(tcase.entry)
assert.NoError(t, err)
- assert.Equal(t, tcase.found, found)
- if tcase.found {
- assert.Equal(t, tcase.tm, tm)
- }
+ assert.Equal(t, tcase.tm, tm)
})
}
}
diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go
index 4df774f9f5d..1e8cb655547 100644
--- a/go/vt/vtgate/engine/concatenate.go
+++ b/go/vt/vtgate/engine/concatenate.go
@@ -18,8 +18,10 @@ package engine
import (
"context"
+ "slices"
"sync"
- "sync/atomic"
+
+ "golang.org/x/sync/errgroup"
"vitess.io/vitess/go/sqltypes"
querypb "vitess.io/vitess/go/vt/proto/query"
@@ -236,34 +238,40 @@ func (c *Concatenate) TryStreamExecute(ctx context.Context, vcursor VCursor, bin
}
func (c *Concatenate) parallelStreamExec(inCtx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, in func(*sqltypes.Result) error) error {
+ // Scoped context; any early exit triggers cancel() to clean up ongoing work.
ctx, cancel := context.WithCancel(inCtx)
defer cancel()
- var outerErr error
-
- var cbMu sync.Mutex
- var wg, fieldMu sync.WaitGroup
- var fieldRec atomic.Int64
- fieldRec.Store(int64(len(c.Sources)))
- fieldMu.Add(1)
- rest := make([]*sqltypes.Result, len(c.Sources))
- var fields []*querypb.Field
+ // Mutexes for dealing with concurrent access to shared state.
+ var (
+ muCallback sync.Mutex // Protects callback
+ muFields sync.Mutex // Protects field state
+ condFields = sync.NewCond(&muFields) // Condition var for field arrival
+ wg errgroup.Group // Wait group for all streaming goroutines
+ rest = make([]*sqltypes.Result, len(c.Sources)) // Collects first result from each source to derive fields
+ fields []*querypb.Field // Cached final field types
+ )
+
+ // Process each result chunk, considering type coercion.
callback := func(res *sqltypes.Result, srcIdx int) error {
- cbMu.Lock()
- defer cbMu.Unlock()
+ muCallback.Lock()
+ defer muCallback.Unlock()
+ // Check if type coercion needed for this source.
+ // We only need to check if fields are not in NoNeedToTypeCheck set.
needsCoercion := false
for idx, field := range rest[srcIdx].Fields {
- _, ok := c.NoNeedToTypeCheck[idx]
- if !ok && fields[idx].Type != field.Type {
+ _, skip := c.NoNeedToTypeCheck[idx]
+ if !skip && fields[idx].Type != field.Type {
needsCoercion = true
break
}
}
+
+ // Apply type coercion if needed.
if needsCoercion {
for _, row := range res.Rows {
- err := c.coerceValuesTo(row, fields)
- if err != nil {
+ if err := c.coerceValuesTo(row, fields); err != nil {
return err
}
}
@@ -271,57 +279,65 @@ func (c *Concatenate) parallelStreamExec(inCtx context.Context, vcursor VCursor,
return in(res)
}
- once := sync.Once{}
-
+ // Start streaming query execution in parallel for all sources.
for i, source := range c.Sources {
- wg.Add(1)
currIndex, currSource := i, source
-
- go func() {
- defer wg.Done()
+ wg.Go(func() error {
err := vcursor.StreamExecutePrimitive(ctx, currSource, bindVars, true, func(resultChunk *sqltypes.Result) error {
- // if we have fields to compare, make sure all the fields are all the same
- if fieldRec.Load() > 0 && resultChunk.Fields != nil {
- rest[currIndex] = resultChunk
- res := fieldRec.Add(-1)
- if res == 0 {
- // We have received fields from all sources. We can now calculate the output types
- var err error
- fields, err = c.getFields(rest)
- if err != nil {
- return err
+ // Process fields when they arrive; coordinate field agreement across sources.
+ if resultChunk.Fields != nil {
+ muFields.Lock()
+
+ // Capture the initial result chunk to determine field types later.
+ if rest[currIndex] == nil {
+ rest[currIndex] = resultChunk
+
+ // If this was the last source to report its fields, derive the final output fields.
+ if !slices.Contains(rest, nil) {
+ muFields.Unlock()
+
+ // We have received fields from all sources. We can now calculate the output types
+ var err error
+ fields, err = c.getFields(rest)
+ if err != nil {
+ return err
+ }
+ resultChunk.Fields = fields
+
+ defer condFields.Broadcast()
+ return callback(resultChunk, currIndex)
}
- resultChunk.Fields = fields
- defer once.Do(func() {
- fieldMu.Done()
- })
-
- return callback(resultChunk, currIndex)
- } else {
- fieldMu.Wait()
}
+ // Wait for fields from all sources.
+ for slices.Contains(rest, nil) {
+ condFields.Wait()
+ }
+ muFields.Unlock()
}
- // If we get here, all the fields have been received
- select {
- case <-ctx.Done():
+ // Context check to avoid extra work.
+ if ctx.Err() != nil {
return nil
- default:
- return callback(resultChunk, currIndex)
}
+ return callback(resultChunk, currIndex)
})
+
+ // Error handling and context cleanup for this source.
if err != nil {
- outerErr = err
+ muFields.Lock()
+ if rest[currIndex] == nil {
+ // Signal that this source is done, even if by failure, to unblock field waiting.
+ rest[currIndex] = &sqltypes.Result{}
+ }
cancel()
- once.Do(func() {
- fieldMu.Done()
- })
+ condFields.Broadcast()
+ muFields.Unlock()
}
- }()
-
+ return err
+ })
}
- wg.Wait()
- return outerErr
+ // Wait for all sources to complete.
+ return wg.Wait()
}
func (c *Concatenate) sequentialStreamExec(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, callback func(*sqltypes.Result) error) error {
diff --git a/go/vt/vtgate/evalengine/translate.go b/go/vt/vtgate/evalengine/translate.go
index 82d22083039..84d8a2c4f10 100644
--- a/go/vt/vtgate/evalengine/translate.go
+++ b/go/vt/vtgate/evalengine/translate.go
@@ -193,7 +193,7 @@ func (ast *astCompiler) translateBindVar(arg *sqlparser.Argument) (Expr, error)
}
func (ast *astCompiler) translateColOffset(col *sqlparser.Offset) (Expr, error) {
- var typ Type
+ typ := UnknownType()
if ast.cfg.ResolveType != nil {
typ, _ = ast.cfg.ResolveType(col.Original)
}
@@ -216,7 +216,7 @@ func (ast *astCompiler) translateColName(colname *sqlparser.ColName) (Expr, erro
if err != nil {
return nil, err
}
- var typ Type
+ typ := UnknownType()
if ast.cfg.ResolveType != nil {
typ, _ = ast.cfg.ResolveType(colname)
}
diff --git a/go/vt/vtgate/plugin_mysql_server.go b/go/vt/vtgate/plugin_mysql_server.go
index bfbb7b105f8..273592b5bf7 100644
--- a/go/vt/vtgate/plugin_mysql_server.go
+++ b/go/vt/vtgate/plugin_mysql_server.go
@@ -201,6 +201,12 @@ func startSpan(ctx context.Context, query, label string) (trace.Span, context.Co
}
func (vh *vtgateHandler) ComQuery(c *mysql.Conn, query string, callback func(*sqltypes.Result) error) error {
+ session := vh.session(c)
+ if c.IsShuttingDown() && !session.InTransaction {
+ c.MarkForClose()
+ return sqlerror.NewSQLError(sqlerror.ERServerShutdown, sqlerror.SSNetError, "Server shutdown in progress")
+ }
+
ctx, cancel := context.WithCancel(context.Background())
c.UpdateCancelCtx(cancel)
@@ -229,7 +235,6 @@ func (vh *vtgateHandler) ComQuery(c *mysql.Conn, query string, callback func(*sq
"VTGate MySQL Connector" /* subcomponent: part of the client */)
ctx = callerid.NewContext(ctx, ef, im)
- session := vh.session(c)
if !session.InTransaction {
vh.busyConnections.Add(1)
}
@@ -614,11 +619,11 @@ func newMysqlUnixSocket(address string, authServer mysql.AuthServer, handler mys
func (srv *mysqlServer) shutdownMysqlProtocolAndDrain() {
if srv.tcpListener != nil {
- srv.tcpListener.Close()
+ srv.tcpListener.Shutdown()
srv.tcpListener = nil
}
if srv.unixListener != nil {
- srv.unixListener.Close()
+ srv.unixListener.Shutdown()
srv.unixListener = nil
}
if srv.sigChan != nil {
diff --git a/go/vt/vtgate/plugin_mysql_server_test.go b/go/vt/vtgate/plugin_mysql_server_test.go
index 1b161dfb171..1aa201b5d4c 100644
--- a/go/vt/vtgate/plugin_mysql_server_test.go
+++ b/go/vt/vtgate/plugin_mysql_server_test.go
@@ -342,3 +342,80 @@ func TestKillMethods(t *testing.T) {
require.EqualError(t, cancelCtx.Err(), "context canceled")
require.True(t, mysqlConn.IsMarkedForClose())
}
+
+func TestGracefulShutdown(t *testing.T) {
+ executor, _, _, _, _ := createExecutorEnv(t)
+
+ vh := newVtgateHandler(&VTGate{executor: executor, timings: timings, rowsReturned: rowsReturned, rowsAffected: rowsAffected})
+ th := &testHandler{}
+ listener, err := mysql.NewListener("tcp", "127.0.0.1:", mysql.NewAuthServerNone(), th, 0, 0, false, false, 0)
+ require.NoError(t, err)
+ defer listener.Close()
+
+ // add a connection
+ mysqlConn := mysql.GetTestServerConn(listener)
+ mysqlConn.ConnectionID = 1
+ mysqlConn.UserData = &mysql.StaticUserData{}
+ vh.connections[1] = mysqlConn
+
+ err = vh.ComQuery(mysqlConn, "select 1", func(result *sqltypes.Result) error {
+ return nil
+ })
+ assert.NoError(t, err)
+
+ listener.Shutdown()
+
+ err = vh.ComQuery(mysqlConn, "select 1", func(result *sqltypes.Result) error {
+ return nil
+ })
+ require.EqualError(t, err, "Server shutdown in progress (errno 1053) (sqlstate 08S01)")
+
+ require.True(t, mysqlConn.IsMarkedForClose())
+}
+
+func TestGracefulShutdownWithTransaction(t *testing.T) {
+ executor, _, _, _, _ := createExecutorEnv(t)
+
+ vh := newVtgateHandler(&VTGate{executor: executor, timings: timings, rowsReturned: rowsReturned, rowsAffected: rowsAffected})
+ th := &testHandler{}
+ listener, err := mysql.NewListener("tcp", "127.0.0.1:", mysql.NewAuthServerNone(), th, 0, 0, false, false, 0)
+ require.NoError(t, err)
+ defer listener.Close()
+
+ // add a connection
+ mysqlConn := mysql.GetTestServerConn(listener)
+ mysqlConn.ConnectionID = 1
+ mysqlConn.UserData = &mysql.StaticUserData{}
+ vh.connections[1] = mysqlConn
+
+ err = vh.ComQuery(mysqlConn, "BEGIN", func(result *sqltypes.Result) error {
+ return nil
+ })
+ assert.NoError(t, err)
+
+ err = vh.ComQuery(mysqlConn, "select 1", func(result *sqltypes.Result) error {
+ return nil
+ })
+ assert.NoError(t, err)
+
+ listener.Shutdown()
+
+ err = vh.ComQuery(mysqlConn, "select 1", func(result *sqltypes.Result) error {
+ return nil
+ })
+ assert.NoError(t, err)
+
+ err = vh.ComQuery(mysqlConn, "COMMIT", func(result *sqltypes.Result) error {
+ return nil
+ })
+ assert.NoError(t, err)
+
+ require.False(t, mysqlConn.IsMarkedForClose())
+
+ err = vh.ComQuery(mysqlConn, "select 1", func(result *sqltypes.Result) error {
+ return nil
+ })
+ require.EqualError(t, err, "Server shutdown in progress (errno 1053) (sqlstate 08S01)")
+
+ require.True(t, mysqlConn.IsMarkedForClose())
+}
diff --git a/go/vt/vtgate/vstream_manager.go b/go/vt/vtgate/vstream_manager.go
index 38706a8fbee..ffb8989ca5d 100644
--- a/go/vt/vtgate/vstream_manager.go
+++ b/go/vt/vtgate/vstream_manager.go
@@ -27,17 +27,17 @@ import (
"vitess.io/vitess/go/stats"
"vitess.io/vitess/go/vt/discovery"
- querypb "vitess.io/vitess/go/vt/proto/query"
+ "vitess.io/vitess/go/vt/log"
"vitess.io/vitess/go/vt/servenv"
+ "vitess.io/vitess/go/vt/srvtopo"
"vitess.io/vitess/go/vt/topo"
+ "vitess.io/vitess/go/vt/vterrors"
- "vitess.io/vitess/go/vt/log"
binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata"
+ querypb "vitess.io/vitess/go/vt/proto/query"
topodatapb "vitess.io/vitess/go/vt/proto/topodata"
vtgatepb "vitess.io/vitess/go/vt/proto/vtgate"
vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc"
- "vitess.io/vitess/go/vt/srvtopo"
- "vitess.io/vitess/go/vt/vterrors"
)
// vstreamManager manages vstream requests.
@@ -53,6 +53,10 @@ type vstreamManager struct {
// maxSkewTimeoutSeconds is the maximum allowed skew between two streams when the MinimizeSkew flag is set
const maxSkewTimeoutSeconds = 10 * 60
+// tabletPickerContextTimeout is the timeout for the child context used to select candidate tablets
+// for a vstream
+const tabletPickerContextTimeout = 90 * time.Second
+
// vstream contains the metadata for one VStream request.
type vstream struct {
// mu protects parts of vgtid, the semantics of a send, and journaler.
@@ -124,6 +128,7 @@ type journalEvent struct {
func newVStreamManager(resolver *srvtopo.Resolver, serv srvtopo.Server, cell string) *vstreamManager {
exporter := servenv.NewExporter(cell, "VStreamManager")
+
return &vstreamManager{
resolver: resolver,
toposerv: serv,
@@ -473,6 +478,7 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha
// journalDone is assigned a channel when a journal event is encountered.
// It will be closed when all journal events converge.
var journalDone chan struct{}
+ ignoreTablets := make([]*topodatapb.TabletAlias, 0)
errCount := 0
for {
@@ -490,12 +496,19 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha
var eventss [][]*binlogdatapb.VEvent
var err error
cells := vs.getCells()
- tp, err := discovery.NewTabletPicker(ctx, vs.ts, cells, vs.vsm.cell, sgtid.Keyspace, sgtid.Shard, vs.tabletType.String(), vs.tabletPickerOptions)
+
+ tp, err := discovery.NewTabletPicker(ctx, vs.ts, cells, vs.vsm.cell, sgtid.Keyspace, sgtid.Shard, vs.tabletType.String(), vs.tabletPickerOptions, ignoreTablets...)
if err != nil {
log.Errorf(err.Error())
return err
}
- tablet, err := tp.PickForStreaming(ctx)
+
+ // Create a child context with a stricter timeout when picking a tablet.
+ // This will prevent hanging in the case no tablets are found.
+ tpCtx, tpCancel := context.WithTimeout(ctx, tabletPickerContextTimeout)
+ defer tpCancel()
+
+ tablet, err := tp.PickForStreaming(tpCtx)
if err != nil {
log.Errorf(err.Error())
return err
@@ -670,11 +683,18 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha
// Unreachable.
err = vterrors.Errorf(vtrpcpb.Code_UNKNOWN, "vstream ended unexpectedly")
}
- if vterrors.Code(err) != vtrpcpb.Code_FAILED_PRECONDITION && vterrors.Code(err) != vtrpcpb.Code_UNAVAILABLE {
+
+ retry, ignoreTablet := vs.shouldRetry(err)
+ if !retry {
log.Errorf("vstream for %s/%s error: %v", sgtid.Keyspace, sgtid.Shard, err)
return err
}
+ if ignoreTablet {
+ ignoreTablets = append(ignoreTablets, tablet.GetAlias())
+ }
+
errCount++
+ // Retry, at most, 3 times if the error can be retried.
if errCount >= 3 {
log.Errorf("vstream for %s/%s had three consecutive failures: %v", sgtid.Keyspace, sgtid.Shard, err)
return err
@@ -683,6 +703,30 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha
}
}
+// shouldRetry determines whether we should exit immediately or retry the vstream.
+// The first return value determines if the error can be retried, while the second
+// indicates whether the tablet with which the error occurred should be ommitted
+// from the candidate list of tablets to choose from on the retry.
+//
+// An error should be retried if it is expected to be transient.
+// A tablet should be ignored upon retry if it's likely another tablet will not
+// produce the same error.
+func (vs *vstream) shouldRetry(err error) (bool, bool) {
+ errCode := vterrors.Code(err)
+
+ if errCode == vtrpcpb.Code_FAILED_PRECONDITION || errCode == vtrpcpb.Code_UNAVAILABLE {
+ return true, false
+ }
+
+ // If there is a GTIDSet Mismatch on the tablet, omit it from the candidate
+ // list in the TabletPicker on retry.
+ if errCode == vtrpcpb.Code_INVALID_ARGUMENT && strings.Contains(err.Error(), "GTIDSet Mismatch") {
+ return true, true
+ }
+
+ return false, false
+}
+
// sendAll sends a group of events together while holding the lock.
func (vs *vstream) sendAll(ctx context.Context, sgtid *binlogdatapb.ShardGtid, eventss [][]*binlogdatapb.VEvent) error {
vs.mu.Lock()
diff --git a/go/vt/vtgate/vstream_manager_test.go b/go/vt/vtgate/vstream_manager_test.go
index 3018791964f..4c1e9ec6764 100644
--- a/go/vt/vtgate/vstream_manager_test.go
+++ b/go/vt/vtgate/vstream_manager_test.go
@@ -386,46 +386,133 @@ func TestVStreamsCreatedAndLagMetrics(t *testing.T) {
assert.Equal(t, wantVStreamsLag, vsm.vstreamsLag.Counts(), "vstreamsLag matches")
}
-func TestVStreamRetry(t *testing.T) {
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
+func TestVStreamRetriableErrors(t *testing.T) {
+ type testCase struct {
+ name string
+ code vtrpcpb.Code
+ msg string
+ shouldRetry bool
+ ignoreTablet bool
+ }
- cell := "aa"
- ks := "TestVStream"
- _ = createSandbox(ks)
- hc := discovery.NewFakeHealthCheck(nil)
+ tcases := []testCase{
+ {
+ name: "failed precondition",
+ code: vtrpcpb.Code_FAILED_PRECONDITION,
+ msg: "",
+ shouldRetry: true,
+ ignoreTablet: false,
+ },
+ {
+ name: "gtid mismatch",
+ code: vtrpcpb.Code_INVALID_ARGUMENT,
+ msg: "GTIDSet Mismatch aa",
+ shouldRetry: true,
+ ignoreTablet: true,
+ },
+ {
+ name: "unavailable",
+ code: vtrpcpb.Code_UNAVAILABLE,
+ msg: "",
+ shouldRetry: true,
+ ignoreTablet: false,
+ },
+ {
+ name: "should not retry",
+ code: vtrpcpb.Code_INVALID_ARGUMENT,
+ msg: "final error",
+ shouldRetry: false,
+ ignoreTablet: false,
+ },
+ }
- st := getSandboxTopo(ctx, cell, ks, []string{"-20"})
- vsm := newTestVStreamManager(ctx, hc, st, "aa")
- sbc0 := hc.AddTestTablet(cell, "1.1.1.1", 1001, ks, "-20", topodatapb.TabletType_PRIMARY, true, 1, nil)
- addTabletToSandboxTopo(t, ctx, st, ks, "-20", sbc0.Tablet())
commit := []*binlogdatapb.VEvent{
{Type: binlogdatapb.VEventType_COMMIT},
}
- sbc0.AddVStreamEvents(commit, nil)
- sbc0.AddVStreamEvents(nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "aa"))
- sbc0.AddVStreamEvents(commit, nil)
- sbc0.AddVStreamEvents(nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "bb"))
- sbc0.AddVStreamEvents(nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "cc"))
- sbc0.AddVStreamEvents(nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "final error"))
- var count atomic.Int32
- vgtid := &binlogdatapb.VGtid{
- ShardGtids: []*binlogdatapb.ShardGtid{{
- Keyspace: ks,
- Shard: "-20",
- Gtid: "pos",
- }},
- }
- err := vsm.VStream(ctx, topodatapb.TabletType_PRIMARY, vgtid, nil, &vtgatepb.VStreamFlags{}, func(events []*binlogdatapb.VEvent) error {
- count.Add(1)
- return nil
- })
- wantErr := "final error"
- if err == nil || !strings.Contains(err.Error(), wantErr) {
- t.Errorf("vstream end: %v, must contain %v", err.Error(), wantErr)
+
+ want := &binlogdatapb.VStreamResponse{Events: commit}
+
+ for _, tcase := range tcases {
+ t.Run(tcase.name, func(t *testing.T) {
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ // aa will be the local cell for this test, but that tablet will have a vstream error.
+ cells := []string{"aa", "ab"}
+
+ ks := "TestVStream"
+ _ = createSandbox(ks)
+ hc := discovery.NewFakeHealthCheck(nil)
+
+ st := getSandboxTopoMultiCell(ctx, cells, ks, []string{"-20"})
+
+ sbc0 := hc.AddTestTablet(cells[0], "1.1.1.1", 1001, ks, "-20", topodatapb.TabletType_REPLICA, true, 1, nil)
+ sbc1 := hc.AddTestTablet(cells[1], "1.1.1.1", 1002, ks, "-20", topodatapb.TabletType_REPLICA, true, 1, nil)
+
+ addTabletToSandboxTopo(t, ctx, st, ks, "-20", sbc0.Tablet())
+ addTabletToSandboxTopo(t, ctx, st, ks, "-20", sbc1.Tablet())
+
+ vsm := newTestVStreamManager(ctx, hc, st, cells[0])
+
+ // Always have the local cell tablet error so it's ignored on retry and we pick the other one
+ // if the error requires ignoring the tablet on retry.
+ sbc0.AddVStreamEvents(nil, vterrors.Errorf(tcase.code, tcase.msg))
+
+ if tcase.ignoreTablet {
+ sbc1.AddVStreamEvents(commit, nil)
+ } else {
+ sbc0.AddVStreamEvents(commit, nil)
+ }
+
+ vgtid := &binlogdatapb.VGtid{
+ ShardGtids: []*binlogdatapb.ShardGtid{{
+ Keyspace: ks,
+ Shard: "-20",
+ Gtid: "pos",
+ }},
+ }
+
+ ch := make(chan *binlogdatapb.VStreamResponse)
+ done := make(chan struct{})
+ go func() {
+ err := vsm.VStream(ctx, topodatapb.TabletType_REPLICA, vgtid, nil, &vtgatepb.VStreamFlags{Cells: strings.Join(cells, ",")}, func(events []*binlogdatapb.VEvent) error {
+ ch <- &binlogdatapb.VStreamResponse{Events: events}
+ return nil
+ })
+ wantErr := "context canceled"
+
+ if !tcase.shouldRetry {
+ wantErr = tcase.msg
+ }
+
+ if err == nil || !strings.Contains(err.Error(), wantErr) {
+ t.Errorf("vstream end: %v, must contain %v", err.Error(), wantErr)
+ }
+ close(done)
+ }()
+
+ Loop:
+ for {
+ if tcase.shouldRetry {
+ select {
+ case event := <-ch:
+ got := event.CloneVT()
+ if !proto.Equal(got, want) {
+ t.Errorf("got different vstream event than expected")
+ }
+ cancel()
+ case <-done:
+ // The goroutine has completed, so break out of the loop
+ break Loop
+ }
+ } else {
+ <-done
+ break Loop
+ }
+ }
+ })
}
- time.Sleep(100 * time.Millisecond) // wait for goroutine within VStream to finish
- assert.Equal(t, int32(2), count.Load())
+
}
func TestVStreamShouldNotSendSourceHeartbeats(t *testing.T) {
@@ -1266,6 +1353,22 @@ func getSandboxTopo(ctx context.Context, cell string, keyspace string, shards []
return st
}
+func getSandboxTopoMultiCell(ctx context.Context, cells []string, keyspace string, shards []string) *sandboxTopo {
+ st := newSandboxForCells(ctx, cells)
+ ts := st.topoServer
+
+ for _, cell := range cells {
+ ts.CreateCellInfo(ctx, cell, &topodatapb.CellInfo{})
+ }
+
+ ts.CreateKeyspace(ctx, keyspace, &topodatapb.Keyspace{})
+
+ for _, shard := range shards {
+ ts.CreateShard(ctx, keyspace, shard)
+ }
+ return st
+}
+
func addTabletToSandboxTopo(t *testing.T, ctx context.Context, st *sandboxTopo, ks, shard string, tablet *topodatapb.Tablet) {
_, err := st.topoServer.UpdateShardFields(ctx, ks, shard, func(si *topo.ShardInfo) error {
si.PrimaryAlias = tablet.Alias
diff --git a/web/vtadmin/package-lock.json b/web/vtadmin/package-lock.json
index 55e5cf75ce2..4f3a8f957d4 100644
--- a/web/vtadmin/package-lock.json
+++ b/web/vtadmin/package-lock.json
@@ -72,9 +72,9 @@
}
},
"node_modules/@adobe/css-tools": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz",
- "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz",
+ "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==",
"dev": true
},
"node_modules/@ampproject/remapping": {
@@ -4604,9 +4604,9 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -4767,9 +4767,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -4848,9 +4848,9 @@
}
},
"node_modules/@typescript-eslint/utils/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -8258,9 +8258,9 @@
}
},
"node_modules/get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
"dev": true,
"engines": {
"node": "*"
@@ -10316,9 +10316,9 @@
}
},
"node_modules/normalize-package-data/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -10353,15 +10353,17 @@
}
},
"node_modules/npm": {
- "version": "9.6.3",
- "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.3.tgz",
- "integrity": "sha512-KMAw6cJF5JGPJz/NtsU8H1sMqb34qPGnSMaSWrVO8bzxOdAXJNAtDXATvLl0lflrImIze1FZCqocM8wdIu3Sfg==",
+ "version": "9.9.0",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.0.tgz",
+ "integrity": "sha512-wkd7sjz4KmdmddYQcd0aTP73P1cEuPlekeulz4jTDeMVx/Zo5XZ5KQ1z3eUzV3Q/WZpEO0NJXTrD5FNFe6fhCA==",
"bundleDependencies": [
"@isaacs/string-locale-compare",
"@npmcli/arborist",
"@npmcli/config",
+ "@npmcli/fs",
"@npmcli/map-workspaces",
"@npmcli/package-json",
+ "@npmcli/promise-spawn",
"@npmcli/run-script",
"abbrev",
"archy",
@@ -10398,6 +10400,7 @@
"ms",
"node-gyp",
"nopt",
+ "normalize-package-data",
"npm-audit-report",
"npm-install-checks",
"npm-package-arg",
@@ -10412,10 +10415,11 @@
"proc-log",
"qrcode-terminal",
"read",
- "read-package-json",
- "read-package-json-fast",
"semver",
+ "sigstore",
+ "spdx-expression-parse",
"ssri",
+ "supports-color",
"tar",
"text-table",
"tiny-relative-date",
@@ -10427,71 +10431,75 @@
"dev": true,
"dependencies": {
"@isaacs/string-locale-compare": "^1.1.0",
- "@npmcli/arborist": "^6.2.6",
- "@npmcli/config": "^6.1.5",
- "@npmcli/map-workspaces": "^3.0.3",
- "@npmcli/package-json": "^3.0.0",
- "@npmcli/run-script": "^6.0.0",
+ "@npmcli/arborist": "^6.5.0",
+ "@npmcli/config": "^6.4.0",
+ "@npmcli/fs": "^3.1.0",
+ "@npmcli/map-workspaces": "^3.0.4",
+ "@npmcli/package-json": "^4.0.1",
+ "@npmcli/promise-spawn": "^6.0.2",
+ "@npmcli/run-script": "^6.0.2",
"abbrev": "^2.0.0",
"archy": "~1.0.0",
- "cacache": "^17.0.5",
- "chalk": "^4.1.2",
+ "cacache": "^17.1.3",
+ "chalk": "^5.3.0",
"ci-info": "^3.8.0",
"cli-columns": "^4.0.0",
"cli-table3": "^0.6.3",
"columnify": "^1.6.0",
"fastest-levenshtein": "^1.0.16",
- "fs-minipass": "^3.0.1",
- "glob": "^9.3.1",
+ "fs-minipass": "^3.0.2",
+ "glob": "^10.2.7",
"graceful-fs": "^4.2.11",
"hosted-git-info": "^6.1.1",
- "ini": "^3.0.1",
+ "ini": "^4.1.1",
"init-package-json": "^5.0.0",
"is-cidr": "^4.0.2",
"json-parse-even-better-errors": "^3.0.0",
"libnpmaccess": "^7.0.2",
- "libnpmdiff": "^5.0.14",
- "libnpmexec": "^5.0.14",
- "libnpmfund": "^4.0.14",
+ "libnpmdiff": "^5.0.20",
+ "libnpmexec": "^6.0.4",
+ "libnpmfund": "^4.2.1",
"libnpmhook": "^9.0.3",
- "libnpmorg": "^5.0.3",
- "libnpmpack": "^5.0.14",
- "libnpmpublish": "^7.1.3",
+ "libnpmorg": "^5.0.4",
+ "libnpmpack": "^5.0.20",
+ "libnpmpublish": "^7.5.0",
"libnpmsearch": "^6.0.2",
"libnpmteam": "^5.0.3",
"libnpmversion": "^4.0.2",
- "make-fetch-happen": "^11.0.3",
- "minimatch": "^7.4.3",
- "minipass": "^4.2.5",
+ "make-fetch-happen": "^11.1.1",
+ "minimatch": "^9.0.3",
+ "minipass": "^5.0.0",
"minipass-pipeline": "^1.2.4",
"ms": "^2.1.2",
- "node-gyp": "^9.3.1",
- "nopt": "^7.1.0",
- "npm-audit-report": "^4.0.0",
- "npm-install-checks": "^6.1.0",
+ "node-gyp": "^9.4.0",
+ "nopt": "^7.2.0",
+ "normalize-package-data": "^5.0.0",
+ "npm-audit-report": "^5.0.0",
+ "npm-install-checks": "^6.2.0",
"npm-package-arg": "^10.1.0",
- "npm-pick-manifest": "^8.0.1",
+ "npm-pick-manifest": "^8.0.2",
"npm-profile": "^7.0.1",
- "npm-registry-fetch": "^14.0.3",
+ "npm-registry-fetch": "^14.0.5",
"npm-user-validate": "^2.0.0",
"npmlog": "^7.0.1",
"p-map": "^4.0.0",
- "pacote": "^15.1.1",
+ "pacote": "^15.2.0",
"parse-conflict-json": "^3.0.1",
"proc-log": "^3.0.0",
"qrcode-terminal": "^0.12.0",
- "read": "^2.0.0",
- "read-package-json": "^6.0.1",
- "read-package-json-fast": "^3.0.2",
- "semver": "^7.3.8",
- "ssri": "^10.0.1",
- "tar": "^6.1.13",
+ "read": "^2.1.0",
+ "semver": "^7.5.4",
+ "sigstore": "^1.9.0",
+ "spdx-expression-parse": "^3.0.1",
+ "ssri": "^10.0.4",
+ "supports-color": "^9.4.0",
+ "tar": "^6.1.15",
"text-table": "~0.2.0",
"tiny-relative-date": "^1.3.0",
"treeverse": "^3.0.0",
"validate-npm-package-name": "^5.0.0",
- "which": "^3.0.0",
- "write-file-atomic": "^5.0.0"
+ "which": "^3.0.1",
+ "write-file-atomic": "^5.0.1"
},
"bin": {
"npm": "bin/npm-cli.js",
@@ -10526,9 +10534,75 @@
"node_modules/npm/node_modules/@gar/promisify": {
"version": "1.1.3",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "dev": true,
"inBundle": true,
"license": "MIT"
},
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
"node_modules/npm/node_modules/@isaacs/string-locale-compare": {
"version": "1.1.0",
"dev": true,
@@ -10536,7 +10610,7 @@
"license": "ISC"
},
"node_modules/npm/node_modules/@npmcli/arborist": {
- "version": "6.2.6",
+ "version": "6.5.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -10548,7 +10622,7 @@
"@npmcli/metavuln-calculator": "^5.0.0",
"@npmcli/name-from-folder": "^2.0.0",
"@npmcli/node-gyp": "^3.0.0",
- "@npmcli/package-json": "^3.0.0",
+ "@npmcli/package-json": "^4.0.0",
"@npmcli/query": "^3.0.0",
"@npmcli/run-script": "^6.0.0",
"bin-links": "^4.0.1",
@@ -10557,9 +10631,9 @@
"hosted-git-info": "^6.1.1",
"json-parse-even-better-errors": "^3.0.0",
"json-stringify-nice": "^1.1.4",
- "minimatch": "^7.4.2",
+ "minimatch": "^9.0.0",
"nopt": "^7.0.0",
- "npm-install-checks": "^6.0.0",
+ "npm-install-checks": "^6.2.0",
"npm-package-arg": "^10.1.0",
"npm-pick-manifest": "^8.0.1",
"npm-registry-fetch": "^14.0.3",
@@ -10568,12 +10642,12 @@
"parse-conflict-json": "^3.0.0",
"proc-log": "^3.0.0",
"promise-all-reject-late": "^1.0.0",
- "promise-call-limit": "^1.0.1",
+ "promise-call-limit": "^1.0.2",
"read-package-json-fast": "^3.0.2",
"semver": "^7.3.7",
"ssri": "^10.0.1",
"treeverse": "^3.0.0",
- "walk-up-path": "^1.0.0"
+ "walk-up-path": "^3.0.1"
},
"bin": {
"arborist": "bin/index.js"
@@ -10583,18 +10657,19 @@
}
},
"node_modules/npm/node_modules/@npmcli/config": {
- "version": "6.1.5",
+ "version": "6.4.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/map-workspaces": "^3.0.2",
- "ini": "^3.0.0",
+ "ci-info": "^3.8.0",
+ "ini": "^4.1.0",
"nopt": "^7.0.0",
"proc-log": "^3.0.0",
"read-package-json-fast": "^3.0.2",
"semver": "^7.3.5",
- "walk-up-path": "^1.0.0"
+ "walk-up-path": "^3.0.1"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -10625,7 +10700,7 @@
}
},
"node_modules/npm/node_modules/@npmcli/git": {
- "version": "4.0.4",
+ "version": "4.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -10660,14 +10735,14 @@
}
},
"node_modules/npm/node_modules/@npmcli/map-workspaces": {
- "version": "3.0.3",
+ "version": "3.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/name-from-folder": "^2.0.0",
- "glob": "^9.3.1",
- "minimatch": "^7.4.2",
+ "glob": "^10.2.2",
+ "minimatch": "^9.0.0",
"read-package-json-fast": "^3.0.0"
},
"engines": {
@@ -10675,7 +10750,7 @@
}
},
"node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
- "version": "5.0.0",
+ "version": "5.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -10692,7 +10767,6 @@
"node_modules/npm/node_modules/@npmcli/move-file": {
"version": "2.0.1",
"dev": true,
- "inBundle": true,
"license": "MIT",
"dependencies": {
"mkdirp": "^1.0.4",
@@ -10721,12 +10795,18 @@
}
},
"node_modules/npm/node_modules/@npmcli/package-json": {
- "version": "3.0.0",
+ "version": "4.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "json-parse-even-better-errors": "^3.0.0"
+ "@npmcli/git": "^4.1.0",
+ "glob": "^10.2.2",
+ "hosted-git-info": "^6.1.1",
+ "json-parse-even-better-errors": "^3.0.0",
+ "normalize-package-data": "^5.0.0",
+ "proc-log": "^3.0.0",
+ "semver": "^7.5.3"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -10757,7 +10837,7 @@
}
},
"node_modules/npm/node_modules/@npmcli/run-script": {
- "version": "6.0.0",
+ "version": "6.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -10772,11 +10852,60 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/npm/node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/bundle": {
+ "version": "1.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.2.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/npm/node_modules/@sigstore/protobuf-specs": {
- "version": "0.1.0",
+ "version": "0.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign": {
+ "version": "1.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^1.1.0",
+ "@sigstore/protobuf-specs": "^0.2.0",
+ "make-fetch-happen": "^11.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/tuf": {
+ "version": "1.0.3",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.2.0",
+ "tuf-js": "^1.1.7"
+ },
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
@@ -10790,13 +10919,23 @@
"node": ">= 10"
}
},
+ "node_modules/npm/node_modules/@tufjs/canonical-json": {
+ "version": "1.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/npm/node_modules/@tufjs/models": {
- "version": "1.0.1",
+ "version": "1.0.4",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "minimatch": "^7.4.2"
+ "@tufjs/canonical-json": "1.0.0",
+ "minimatch": "^9.0.0"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -10938,7 +11077,7 @@
"license": "MIT"
},
"node_modules/npm/node_modules/bin-links": {
- "version": "4.0.1",
+ "version": "4.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -11004,21 +11143,20 @@
}
},
"node_modules/npm/node_modules/cacache": {
- "version": "17.0.5",
+ "version": "17.1.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/fs": "^3.1.0",
"fs-minipass": "^3.0.0",
- "glob": "^9.3.1",
+ "glob": "^10.2.2",
"lru-cache": "^7.7.1",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minipass-collect": "^1.0.2",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
"p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
"ssri": "^10.0.0",
"tar": "^6.1.11",
"unique-filename": "^3.0.0"
@@ -11028,16 +11166,12 @@
}
},
"node_modules/npm/node_modules/chalk": {
- "version": "4.1.2",
+ "version": "5.3.0",
"dev": true,
"inBundle": true,
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
"engines": {
- "node": ">=10"
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
@@ -11192,6 +11326,35 @@
"inBundle": true,
"license": "ISC"
},
+ "node_modules/npm/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/npm/node_modules/cssesc": {
"version": "3.0.0",
"dev": true,
@@ -11263,6 +11426,12 @@
"node": ">=0.3.1"
}
},
+ "node_modules/npm/node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
"node_modules/npm/node_modules/emoji-regex": {
"version": "8.0.0",
"dev": true,
@@ -11312,6 +11481,12 @@
"node": ">=0.8.x"
}
},
+ "node_modules/npm/node_modules/exponential-backoff": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0"
+ },
"node_modules/npm/node_modules/fastest-levenshtein": {
"version": "1.0.16",
"dev": true,
@@ -11321,13 +11496,29 @@
"node": ">= 4.9.1"
}
},
+ "node_modules/npm/node_modules/foreground-child": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/npm/node_modules/fs-minipass": {
- "version": "3.0.1",
+ "version": "3.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "minipass": "^4.0.0"
+ "minipass": "^5.0.0"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -11346,7 +11537,7 @@
"license": "MIT"
},
"node_modules/npm/node_modules/gauge": {
- "version": "5.0.0",
+ "version": "5.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -11355,7 +11546,7 @@
"color-support": "^1.1.3",
"console-control-strings": "^1.1.0",
"has-unicode": "^2.0.1",
- "signal-exit": "^3.0.7",
+ "signal-exit": "^4.0.1",
"string-width": "^4.2.3",
"strip-ansi": "^6.0.1",
"wide-align": "^1.1.5"
@@ -11365,15 +11556,19 @@
}
},
"node_modules/npm/node_modules/glob": {
- "version": "9.3.1",
+ "version": "10.2.7",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "minimatch": "^7.4.1",
- "minipass": "^4.2.4",
- "path-scurry": "^1.6.1"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.0.3",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2",
+ "path-scurry": "^1.7.0"
+ },
+ "bin": {
+ "glob": "dist/cjs/src/bin.js"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -11400,15 +11595,6 @@
"node": ">= 0.4.0"
}
},
- "node_modules/npm/node_modules/has-flag": {
- "version": "4.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/npm/node_modules/has-unicode": {
"version": "2.0.1",
"dev": true,
@@ -11503,12 +11689,12 @@
"license": "BSD-3-Clause"
},
"node_modules/npm/node_modules/ignore-walk": {
- "version": "6.0.2",
+ "version": "6.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "minimatch": "^7.4.2"
+ "minimatch": "^9.0.0"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -11535,7 +11721,6 @@
"node_modules/npm/node_modules/infer-owner": {
"version": "1.0.4",
"dev": true,
- "inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/inflight": {
@@ -11555,12 +11740,12 @@
"license": "ISC"
},
"node_modules/npm/node_modules/ini": {
- "version": "3.0.1",
+ "version": "4.1.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/npm/node_modules/init-package-json": {
@@ -11609,7 +11794,7 @@
}
},
"node_modules/npm/node_modules/is-core-module": {
- "version": "2.11.0",
+ "version": "2.12.1",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -11641,6 +11826,24 @@
"inBundle": true,
"license": "ISC"
},
+ "node_modules/npm/node_modules/jackspeak": {
+ "version": "2.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/npm/node_modules/json-parse-even-better-errors": {
"version": "3.0.0",
"dev": true,
@@ -11669,7 +11872,7 @@
"license": "MIT"
},
"node_modules/npm/node_modules/just-diff": {
- "version": "6.0.0",
+ "version": "6.0.2",
"dev": true,
"inBundle": true,
"license": "MIT"
@@ -11694,17 +11897,17 @@
}
},
"node_modules/npm/node_modules/libnpmdiff": {
- "version": "5.0.14",
+ "version": "5.0.20",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^6.2.6",
+ "@npmcli/arborist": "^6.5.0",
"@npmcli/disparity-colors": "^3.0.0",
"@npmcli/installed-package-contents": "^2.0.2",
"binary-extensions": "^2.2.0",
"diff": "^5.1.0",
- "minimatch": "^7.4.2",
+ "minimatch": "^9.0.0",
"npm-package-arg": "^10.1.0",
"pacote": "^15.0.8",
"tar": "^6.1.13"
@@ -11714,14 +11917,13 @@
}
},
"node_modules/npm/node_modules/libnpmexec": {
- "version": "5.0.14",
+ "version": "6.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^6.2.6",
+ "@npmcli/arborist": "^6.5.0",
"@npmcli/run-script": "^6.0.0",
- "chalk": "^4.1.0",
"ci-info": "^3.7.1",
"npm-package-arg": "^10.1.0",
"npmlog": "^7.0.1",
@@ -11730,19 +11932,19 @@
"read": "^2.0.0",
"read-package-json-fast": "^3.0.2",
"semver": "^7.3.7",
- "walk-up-path": "^1.0.0"
+ "walk-up-path": "^3.0.1"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/npm/node_modules/libnpmfund": {
- "version": "4.0.14",
+ "version": "4.2.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^6.2.6"
+ "@npmcli/arborist": "^6.5.0"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -11762,7 +11964,7 @@
}
},
"node_modules/npm/node_modules/libnpmorg": {
- "version": "5.0.3",
+ "version": "5.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -11775,12 +11977,12 @@
}
},
"node_modules/npm/node_modules/libnpmpack": {
- "version": "5.0.14",
+ "version": "5.0.20",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^6.2.6",
+ "@npmcli/arborist": "^6.5.0",
"@npmcli/run-script": "^6.0.0",
"npm-package-arg": "^10.1.0",
"pacote": "^15.0.8"
@@ -11790,7 +11992,7 @@
}
},
"node_modules/npm/node_modules/libnpmpublish": {
- "version": "7.1.3",
+ "version": "7.5.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -11801,7 +12003,7 @@
"npm-registry-fetch": "^14.0.3",
"proc-log": "^3.0.0",
"semver": "^7.3.7",
- "sigstore": "^1.0.0",
+ "sigstore": "^1.4.0",
"ssri": "^10.0.1"
},
"engines": {
@@ -11859,7 +12061,7 @@
}
},
"node_modules/npm/node_modules/make-fetch-happen": {
- "version": "11.0.3",
+ "version": "11.1.1",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -11871,7 +12073,7 @@
"https-proxy-agent": "^5.0.0",
"is-lambda": "^1.0.1",
"lru-cache": "^7.7.1",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minipass-fetch": "^3.0.0",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
@@ -11885,7 +12087,7 @@
}
},
"node_modules/npm/node_modules/minimatch": {
- "version": "7.4.3",
+ "version": "9.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -11893,14 +12095,14 @@
"brace-expansion": "^2.0.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/npm/node_modules/minipass": {
- "version": "4.2.5",
+ "version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -11933,12 +12135,12 @@
}
},
"node_modules/npm/node_modules/minipass-fetch": {
- "version": "3.0.1",
+ "version": "3.0.3",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minipass-sized": "^1.0.3",
"minizlib": "^2.1.2"
},
@@ -12105,15 +12307,16 @@
}
},
"node_modules/npm/node_modules/node-gyp": {
- "version": "9.3.1",
+ "version": "9.4.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
"glob": "^7.1.4",
"graceful-fs": "^4.2.6",
- "make-fetch-happen": "^10.0.3",
+ "make-fetch-happen": "^11.0.3",
"nopt": "^6.0.0",
"npmlog": "^6.0.0",
"rimraf": "^3.0.2",
@@ -12128,21 +12331,8 @@
"node": "^12.13 || ^14.13 || >=16"
}
},
- "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": {
- "version": "2.1.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "@gar/promisify": "^1.1.3",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": {
- "version": "1.1.1",
+ "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": {
+ "version": "1.1.1",
"dev": true,
"inBundle": true,
"license": "ISC"
@@ -12170,87 +12360,6 @@
"concat-map": "0.0.1"
}
},
- "node_modules/npm/node_modules/node-gyp/node_modules/cacache": {
- "version": "16.1.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "@npmcli/fs": "^2.1.0",
- "@npmcli/move-file": "^2.0.0",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.1.0",
- "glob": "^8.0.1",
- "infer-owner": "^1.0.4",
- "lru-cache": "^7.7.1",
- "minipass": "^3.1.6",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "mkdirp": "^1.0.4",
- "p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^9.0.0",
- "tar": "^6.1.11",
- "unique-filename": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": {
- "version": "8.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": {
- "version": "5.1.6",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": {
- "version": "2.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/npm/node_modules/node-gyp/node_modules/gauge": {
"version": "4.0.4",
"dev": true,
@@ -12290,33 +12399,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": {
- "version": "10.2.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "agentkeepalive": "^4.2.1",
- "cacache": "^16.1.0",
- "http-cache-semantics": "^4.1.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^7.7.1",
- "minipass": "^3.1.6",
- "minipass-collect": "^1.0.2",
- "minipass-fetch": "^2.0.3",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.3",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^7.0.0",
- "ssri": "^9.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
"node_modules/npm/node_modules/node-gyp/node_modules/minimatch": {
"version": "3.1.2",
"dev": true,
@@ -12329,35 +12411,6 @@
"node": "*"
}
},
- "node_modules/npm/node_modules/node-gyp/node_modules/minipass": {
- "version": "3.3.6",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": {
- "version": "2.1.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^3.1.6",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.1.2"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- },
- "optionalDependencies": {
- "encoding": "^0.1.13"
- }
- },
"node_modules/npm/node_modules/node-gyp/node_modules/nopt": {
"version": "6.0.0",
"dev": true,
@@ -12402,41 +12455,11 @@
"node": ">= 6"
}
},
- "node_modules/npm/node_modules/node-gyp/node_modules/ssri": {
- "version": "9.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.1.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "unique-slug": "^3.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": {
- "version": "3.0.0",
+ "node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": {
+ "version": "3.0.7",
"dev": true,
"inBundle": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
+ "license": "ISC"
},
"node_modules/npm/node_modules/node-gyp/node_modules/which": {
"version": "2.0.2",
@@ -12454,7 +12477,7 @@
}
},
"node_modules/npm/node_modules/nopt": {
- "version": "7.1.0",
+ "version": "7.2.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -12484,13 +12507,10 @@
}
},
"node_modules/npm/node_modules/npm-audit-report": {
- "version": "4.0.0",
+ "version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
- "dependencies": {
- "chalk": "^4.0.0"
- },
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
@@ -12508,7 +12528,7 @@
}
},
"node_modules/npm/node_modules/npm-install-checks": {
- "version": "6.1.0",
+ "version": "6.2.0",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
@@ -12520,7 +12540,7 @@
}
},
"node_modules/npm/node_modules/npm-normalize-package-bin": {
- "version": "3.0.0",
+ "version": "3.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -12556,7 +12576,7 @@
}
},
"node_modules/npm/node_modules/npm-pick-manifest": {
- "version": "8.0.1",
+ "version": "8.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -12584,13 +12604,13 @@
}
},
"node_modules/npm/node_modules/npm-registry-fetch": {
- "version": "14.0.3",
+ "version": "14.0.5",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"make-fetch-happen": "^11.0.0",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minipass-fetch": "^3.0.0",
"minipass-json-stream": "^1.0.1",
"minizlib": "^2.1.2",
@@ -12650,7 +12670,7 @@
}
},
"node_modules/npm/node_modules/pacote": {
- "version": "15.1.1",
+ "version": "15.2.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -12661,7 +12681,7 @@
"@npmcli/run-script": "^6.0.0",
"cacache": "^17.0.0",
"fs-minipass": "^3.0.0",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"npm-package-arg": "^10.0.0",
"npm-packlist": "^7.0.0",
"npm-pick-manifest": "^8.0.0",
@@ -12670,7 +12690,7 @@
"promise-retry": "^2.0.1",
"read-package-json": "^6.0.0",
"read-package-json-fast": "^3.0.0",
- "sigstore": "^1.0.0",
+ "sigstore": "^1.3.0",
"ssri": "^10.0.0",
"tar": "^6.1.11"
},
@@ -12704,24 +12724,42 @@
"node": ">=0.10.0"
}
},
+ "node_modules/npm/node_modules/path-key": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/npm/node_modules/path-scurry": {
- "version": "1.6.1",
+ "version": "1.9.2",
"dev": true,
"inBundle": true,
"license": "BlueOak-1.0.0",
"dependencies": {
- "lru-cache": "^7.14.1",
- "minipass": "^4.0.2"
+ "lru-cache": "^9.1.1",
+ "minipass": "^5.0.0 || ^6.0.2"
},
"engines": {
- "node": ">=14"
+ "node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/npm/node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "9.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
"node_modules/npm/node_modules/postcss-selector-parser": {
- "version": "6.0.11",
+ "version": "6.0.13",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -12761,7 +12799,7 @@
}
},
"node_modules/npm/node_modules/promise-call-limit": {
- "version": "1.0.1",
+ "version": "1.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -12809,7 +12847,7 @@
}
},
"node_modules/npm/node_modules/read": {
- "version": "2.0.0",
+ "version": "2.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -12830,12 +12868,12 @@
}
},
"node_modules/npm/node_modules/read-package-json": {
- "version": "6.0.1",
+ "version": "6.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "glob": "^9.3.0",
+ "glob": "^10.2.2",
"json-parse-even-better-errors": "^3.0.0",
"normalize-package-data": "^5.0.0",
"npm-normalize-package-bin": "^3.0.0"
@@ -12858,7 +12896,7 @@
}
},
"node_modules/npm/node_modules/readable-stream": {
- "version": "4.3.0",
+ "version": "4.4.0",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -12939,8 +12977,22 @@
}
},
"node_modules/npm/node_modules/safe-buffer": {
- "version": "5.1.2",
+ "version": "5.2.1",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
"inBundle": true,
"license": "MIT"
},
@@ -12952,7 +13004,7 @@
"optional": true
},
"node_modules/npm/node_modules/semver": {
- "version": "7.3.8",
+ "version": "7.5.4",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -12984,21 +13036,50 @@
"inBundle": true,
"license": "ISC"
},
+ "node_modules/npm/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/npm/node_modules/signal-exit": {
- "version": "3.0.7",
+ "version": "4.0.2",
"dev": true,
"inBundle": true,
- "license": "ISC"
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
},
"node_modules/npm/node_modules/sigstore": {
- "version": "1.2.0",
+ "version": "1.9.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
- "@sigstore/protobuf-specs": "^0.1.0",
- "make-fetch-happen": "^11.0.1",
- "tuf-js": "^1.0.0"
+ "@sigstore/bundle": "^1.1.0",
+ "@sigstore/protobuf-specs": "^0.2.0",
+ "@sigstore/sign": "^1.0.0",
+ "@sigstore/tuf": "^1.0.3",
+ "make-fetch-happen": "^11.0.1"
},
"bin": {
"sigstore": "bin/sigstore.js"
@@ -13078,24 +13159,24 @@
"license": "CC0-1.0"
},
"node_modules/npm/node_modules/ssri": {
- "version": "10.0.1",
+ "version": "10.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "minipass": "^4.0.0"
+ "minipass": "^5.0.0"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/npm/node_modules/string_decoder": {
- "version": "1.1.1",
+ "version": "1.3.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "safe-buffer": "~5.1.0"
+ "safe-buffer": "~5.2.0"
}
},
"node_modules/npm/node_modules/string-width": {
@@ -13112,6 +13193,21 @@
"node": ">=8"
}
},
+ "node_modules/npm/node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/npm/node_modules/strip-ansi": {
"version": "6.0.1",
"dev": true,
@@ -13124,27 +13220,40 @@
"node": ">=8"
}
},
- "node_modules/npm/node_modules/supports-color": {
- "version": "7.2.0",
+ "node_modules/npm/node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
+ "node_modules/npm/node_modules/supports-color": {
+ "version": "9.4.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
"node_modules/npm/node_modules/tar": {
- "version": "6.1.13",
+ "version": "6.1.15",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
@@ -13199,13 +13308,14 @@
}
},
"node_modules/npm/node_modules/tuf-js": {
- "version": "1.1.2",
+ "version": "1.1.7",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "@tufjs/models": "1.0.1",
- "make-fetch-happen": "^11.0.1"
+ "@tufjs/models": "1.0.4",
+ "debug": "^4.3.4",
+ "make-fetch-happen": "^11.1.1"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -13264,7 +13374,7 @@
}
},
"node_modules/npm/node_modules/walk-up-path": {
- "version": "1.0.0",
+ "version": "3.0.1",
"dev": true,
"inBundle": true,
"license": "ISC"
@@ -13279,7 +13389,7 @@
}
},
"node_modules/npm/node_modules/which": {
- "version": "3.0.0",
+ "version": "3.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -13302,6 +13412,103 @@
"string-width": "^1.0.2 || 2 || 3 || 4"
}
},
+ "node_modules/npm/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "5.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
"node_modules/npm/node_modules/wrappy": {
"version": "1.0.2",
"dev": true,
@@ -13309,13 +13516,13 @@
"license": "ISC"
},
"node_modules/npm/node_modules/write-file-atomic": {
- "version": "5.0.0",
+ "version": "5.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
+ "signal-exit": "^4.0.1"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -14615,9 +14822,9 @@
}
},
"node_modules/protobufjs-cli/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -15017,9 +15224,9 @@
}
},
"node_modules/read-pkg/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"bin": {
"semver": "bin/semver"
@@ -15453,9 +15660,9 @@
}
},
"node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
@@ -17415,9 +17622,9 @@
},
"dependencies": {
"@adobe/css-tools": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz",
- "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz",
+ "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==",
"dev": true
},
"@ampproject/remapping": {
@@ -20536,9 +20743,9 @@
}
},
"semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
@@ -20626,9 +20833,9 @@
}
},
"semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
@@ -20684,9 +20891,9 @@
}
},
"semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
@@ -23155,9 +23362,9 @@
"dev": true
},
"get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
"dev": true
},
"get-intrinsic": {
@@ -24684,9 +24891,9 @@
}
},
"semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
@@ -24711,77 +24918,81 @@
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="
},
"npm": {
- "version": "9.6.3",
- "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.3.tgz",
- "integrity": "sha512-KMAw6cJF5JGPJz/NtsU8H1sMqb34qPGnSMaSWrVO8bzxOdAXJNAtDXATvLl0lflrImIze1FZCqocM8wdIu3Sfg==",
+ "version": "9.9.0",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.0.tgz",
+ "integrity": "sha512-wkd7sjz4KmdmddYQcd0aTP73P1cEuPlekeulz4jTDeMVx/Zo5XZ5KQ1z3eUzV3Q/WZpEO0NJXTrD5FNFe6fhCA==",
"dev": true,
"requires": {
"@isaacs/string-locale-compare": "^1.1.0",
- "@npmcli/arborist": "^6.2.6",
- "@npmcli/config": "^6.1.5",
- "@npmcli/map-workspaces": "^3.0.3",
- "@npmcli/package-json": "^3.0.0",
- "@npmcli/run-script": "^6.0.0",
+ "@npmcli/arborist": "^6.5.0",
+ "@npmcli/config": "^6.4.0",
+ "@npmcli/fs": "^3.1.0",
+ "@npmcli/map-workspaces": "^3.0.4",
+ "@npmcli/package-json": "^4.0.1",
+ "@npmcli/promise-spawn": "^6.0.2",
+ "@npmcli/run-script": "^6.0.2",
"abbrev": "^2.0.0",
"archy": "~1.0.0",
- "cacache": "^17.0.5",
- "chalk": "^4.1.2",
+ "cacache": "^17.1.3",
+ "chalk": "^5.3.0",
"ci-info": "^3.8.0",
"cli-columns": "^4.0.0",
"cli-table3": "^0.6.3",
"columnify": "^1.6.0",
"fastest-levenshtein": "^1.0.16",
- "fs-minipass": "^3.0.1",
- "glob": "^9.3.1",
+ "fs-minipass": "^3.0.2",
+ "glob": "^10.2.7",
"graceful-fs": "^4.2.11",
"hosted-git-info": "^6.1.1",
- "ini": "^3.0.1",
+ "ini": "^4.1.1",
"init-package-json": "^5.0.0",
"is-cidr": "^4.0.2",
"json-parse-even-better-errors": "^3.0.0",
"libnpmaccess": "^7.0.2",
- "libnpmdiff": "^5.0.14",
- "libnpmexec": "^5.0.14",
- "libnpmfund": "^4.0.14",
+ "libnpmdiff": "^5.0.20",
+ "libnpmexec": "^6.0.4",
+ "libnpmfund": "^4.2.1",
"libnpmhook": "^9.0.3",
- "libnpmorg": "^5.0.3",
- "libnpmpack": "^5.0.14",
- "libnpmpublish": "^7.1.3",
+ "libnpmorg": "^5.0.4",
+ "libnpmpack": "^5.0.20",
+ "libnpmpublish": "^7.5.0",
"libnpmsearch": "^6.0.2",
"libnpmteam": "^5.0.3",
"libnpmversion": "^4.0.2",
- "make-fetch-happen": "^11.0.3",
- "minimatch": "^7.4.3",
- "minipass": "^4.2.5",
+ "make-fetch-happen": "^11.1.1",
+ "minimatch": "^9.0.3",
+ "minipass": "^5.0.0",
"minipass-pipeline": "^1.2.4",
"ms": "^2.1.2",
- "node-gyp": "^9.3.1",
- "nopt": "^7.1.0",
- "npm-audit-report": "^4.0.0",
- "npm-install-checks": "^6.1.0",
+ "node-gyp": "^9.4.0",
+ "nopt": "^7.2.0",
+ "normalize-package-data": "^5.0.0",
+ "npm-audit-report": "^5.0.0",
+ "npm-install-checks": "^6.2.0",
"npm-package-arg": "^10.1.0",
- "npm-pick-manifest": "^8.0.1",
+ "npm-pick-manifest": "^8.0.2",
"npm-profile": "^7.0.1",
- "npm-registry-fetch": "^14.0.3",
+ "npm-registry-fetch": "^14.0.5",
"npm-user-validate": "^2.0.0",
"npmlog": "^7.0.1",
"p-map": "^4.0.0",
- "pacote": "^15.1.1",
+ "pacote": "^15.2.0",
"parse-conflict-json": "^3.0.1",
"proc-log": "^3.0.0",
"qrcode-terminal": "^0.12.0",
- "read": "^2.0.0",
- "read-package-json": "^6.0.1",
- "read-package-json-fast": "^3.0.2",
- "semver": "^7.3.8",
- "ssri": "^10.0.1",
- "tar": "^6.1.13",
+ "read": "^2.1.0",
+ "semver": "^7.5.4",
+ "sigstore": "^1.9.0",
+ "spdx-expression-parse": "^3.0.1",
+ "ssri": "^10.0.4",
+ "supports-color": "^9.4.0",
+ "tar": "^6.1.15",
"text-table": "~0.2.0",
"tiny-relative-date": "^1.3.0",
"treeverse": "^3.0.0",
"validate-npm-package-name": "^5.0.0",
- "which": "^3.0.0",
- "write-file-atomic": "^5.0.0"
+ "which": "^3.0.1",
+ "write-file-atomic": "^5.0.1"
},
"dependencies": {
"@colors/colors": {
@@ -24792,16 +25003,58 @@
},
"@gar/promisify": {
"version": "1.1.3",
- "bundled": true,
"dev": true
},
+ "@isaacs/cliui": {
+ "version": "8.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "6.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "bundled": true,
+ "dev": true
+ },
+ "string-width": {
+ "version": "5.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ }
+ }
+ }
+ },
"@isaacs/string-locale-compare": {
"version": "1.1.0",
"bundled": true,
"dev": true
},
"@npmcli/arborist": {
- "version": "6.2.6",
+ "version": "6.5.0",
"bundled": true,
"dev": true,
"requires": {
@@ -24812,7 +25065,7 @@
"@npmcli/metavuln-calculator": "^5.0.0",
"@npmcli/name-from-folder": "^2.0.0",
"@npmcli/node-gyp": "^3.0.0",
- "@npmcli/package-json": "^3.0.0",
+ "@npmcli/package-json": "^4.0.0",
"@npmcli/query": "^3.0.0",
"@npmcli/run-script": "^6.0.0",
"bin-links": "^4.0.1",
@@ -24821,9 +25074,9 @@
"hosted-git-info": "^6.1.1",
"json-parse-even-better-errors": "^3.0.0",
"json-stringify-nice": "^1.1.4",
- "minimatch": "^7.4.2",
+ "minimatch": "^9.0.0",
"nopt": "^7.0.0",
- "npm-install-checks": "^6.0.0",
+ "npm-install-checks": "^6.2.0",
"npm-package-arg": "^10.1.0",
"npm-pick-manifest": "^8.0.1",
"npm-registry-fetch": "^14.0.3",
@@ -24832,26 +25085,27 @@
"parse-conflict-json": "^3.0.0",
"proc-log": "^3.0.0",
"promise-all-reject-late": "^1.0.0",
- "promise-call-limit": "^1.0.1",
+ "promise-call-limit": "^1.0.2",
"read-package-json-fast": "^3.0.2",
"semver": "^7.3.7",
"ssri": "^10.0.1",
"treeverse": "^3.0.0",
- "walk-up-path": "^1.0.0"
+ "walk-up-path": "^3.0.1"
}
},
"@npmcli/config": {
- "version": "6.1.5",
+ "version": "6.4.0",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/map-workspaces": "^3.0.2",
- "ini": "^3.0.0",
+ "ci-info": "^3.8.0",
+ "ini": "^4.1.0",
"nopt": "^7.0.0",
"proc-log": "^3.0.0",
"read-package-json-fast": "^3.0.2",
"semver": "^7.3.5",
- "walk-up-path": "^1.0.0"
+ "walk-up-path": "^3.0.1"
}
},
"@npmcli/disparity-colors": {
@@ -24871,7 +25125,7 @@
}
},
"@npmcli/git": {
- "version": "4.0.4",
+ "version": "4.1.0",
"bundled": true,
"dev": true,
"requires": {
@@ -24895,18 +25149,18 @@
}
},
"@npmcli/map-workspaces": {
- "version": "3.0.3",
+ "version": "3.0.4",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/name-from-folder": "^2.0.0",
- "glob": "^9.3.1",
- "minimatch": "^7.4.2",
+ "glob": "^10.2.2",
+ "minimatch": "^9.0.0",
"read-package-json-fast": "^3.0.0"
}
},
"@npmcli/metavuln-calculator": {
- "version": "5.0.0",
+ "version": "5.0.1",
"bundled": true,
"dev": true,
"requires": {
@@ -24918,7 +25172,6 @@
},
"@npmcli/move-file": {
"version": "2.0.1",
- "bundled": true,
"dev": true,
"requires": {
"mkdirp": "^1.0.4",
@@ -24936,11 +25189,17 @@
"dev": true
},
"@npmcli/package-json": {
- "version": "3.0.0",
+ "version": "4.0.1",
"bundled": true,
"dev": true,
"requires": {
- "json-parse-even-better-errors": "^3.0.0"
+ "@npmcli/git": "^4.1.0",
+ "glob": "^10.2.2",
+ "hosted-git-info": "^6.1.1",
+ "json-parse-even-better-errors": "^3.0.0",
+ "normalize-package-data": "^5.0.0",
+ "proc-log": "^3.0.0",
+ "semver": "^7.5.3"
}
},
"@npmcli/promise-spawn": {
@@ -24959,34 +25218,73 @@
"postcss-selector-parser": "^6.0.10"
}
},
- "@npmcli/run-script": {
- "version": "6.0.0",
+ "@npmcli/run-script": {
+ "version": "6.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@npmcli/node-gyp": "^3.0.0",
+ "@npmcli/promise-spawn": "^6.0.0",
+ "node-gyp": "^9.0.0",
+ "read-package-json-fast": "^3.0.0",
+ "which": "^3.0.0"
+ }
+ },
+ "@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "@sigstore/bundle": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@sigstore/protobuf-specs": "^0.2.0"
+ }
+ },
+ "@sigstore/protobuf-specs": {
+ "version": "0.2.1",
+ "bundled": true,
+ "dev": true
+ },
+ "@sigstore/sign": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@sigstore/bundle": "^1.1.0",
+ "@sigstore/protobuf-specs": "^0.2.0",
+ "make-fetch-happen": "^11.0.1"
+ }
+ },
+ "@sigstore/tuf": {
+ "version": "1.0.3",
"bundled": true,
"dev": true,
"requires": {
- "@npmcli/node-gyp": "^3.0.0",
- "@npmcli/promise-spawn": "^6.0.0",
- "node-gyp": "^9.0.0",
- "read-package-json-fast": "^3.0.0",
- "which": "^3.0.0"
+ "@sigstore/protobuf-specs": "^0.2.0",
+ "tuf-js": "^1.1.7"
}
},
- "@sigstore/protobuf-specs": {
- "version": "0.1.0",
+ "@tootallnate/once": {
+ "version": "2.0.0",
"bundled": true,
"dev": true
},
- "@tootallnate/once": {
- "version": "2.0.0",
+ "@tufjs/canonical-json": {
+ "version": "1.0.0",
"bundled": true,
"dev": true
},
"@tufjs/models": {
- "version": "1.0.1",
+ "version": "1.0.4",
"bundled": true,
"dev": true,
"requires": {
- "minimatch": "^7.4.2"
+ "@tufjs/canonical-json": "1.0.0",
+ "minimatch": "^9.0.0"
}
},
"abbrev": {
@@ -25072,7 +25370,7 @@
"dev": true
},
"bin-links": {
- "version": "4.0.1",
+ "version": "4.0.2",
"bundled": true,
"dev": true,
"requires": {
@@ -25113,33 +25411,28 @@
}
},
"cacache": {
- "version": "17.0.5",
+ "version": "17.1.3",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/fs": "^3.1.0",
"fs-minipass": "^3.0.0",
- "glob": "^9.3.1",
+ "glob": "^10.2.2",
"lru-cache": "^7.7.1",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minipass-collect": "^1.0.2",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
"p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
"ssri": "^10.0.0",
"tar": "^6.1.11",
"unique-filename": "^3.0.0"
}
},
"chalk": {
- "version": "4.1.2",
+ "version": "5.3.0",
"bundled": true,
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
+ "dev": true
},
"chownr": {
"version": "2.0.0",
@@ -25234,6 +25527,26 @@
"bundled": true,
"dev": true
},
+ "cross-spawn": {
+ "version": "7.0.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "dependencies": {
+ "which": {
+ "version": "2.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
"cssesc": {
"version": "3.0.0",
"bundled": true,
@@ -25277,6 +25590,11 @@
"bundled": true,
"dev": true
},
+ "eastasianwidth": {
+ "version": "0.2.0",
+ "bundled": true,
+ "dev": true
+ },
"emoji-regex": {
"version": "8.0.0",
"bundled": true,
@@ -25311,17 +25629,31 @@
"bundled": true,
"dev": true
},
+ "exponential-backoff": {
+ "version": "3.1.1",
+ "bundled": true,
+ "dev": true
+ },
"fastest-levenshtein": {
"version": "1.0.16",
"bundled": true,
"dev": true
},
+ "foreground-child": {
+ "version": "3.1.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ }
+ },
"fs-minipass": {
- "version": "3.0.1",
+ "version": "3.0.2",
"bundled": true,
"dev": true,
"requires": {
- "minipass": "^4.0.0"
+ "minipass": "^5.0.0"
}
},
"fs.realpath": {
@@ -25335,7 +25667,7 @@
"dev": true
},
"gauge": {
- "version": "5.0.0",
+ "version": "5.0.1",
"bundled": true,
"dev": true,
"requires": {
@@ -25343,21 +25675,22 @@
"color-support": "^1.1.3",
"console-control-strings": "^1.1.0",
"has-unicode": "^2.0.1",
- "signal-exit": "^3.0.7",
+ "signal-exit": "^4.0.1",
"string-width": "^4.2.3",
"strip-ansi": "^6.0.1",
"wide-align": "^1.1.5"
}
},
"glob": {
- "version": "9.3.1",
+ "version": "10.2.7",
"bundled": true,
"dev": true,
"requires": {
- "fs.realpath": "^1.0.0",
- "minimatch": "^7.4.1",
- "minipass": "^4.2.4",
- "path-scurry": "^1.6.1"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.0.3",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2",
+ "path-scurry": "^1.7.0"
}
},
"graceful-fs": {
@@ -25373,11 +25706,6 @@
"function-bind": "^1.1.1"
}
},
- "has-flag": {
- "version": "4.0.0",
- "bundled": true,
- "dev": true
- },
"has-unicode": {
"version": "2.0.1",
"bundled": true,
@@ -25438,11 +25766,11 @@
"dev": true
},
"ignore-walk": {
- "version": "6.0.2",
+ "version": "6.0.3",
"bundled": true,
"dev": true,
"requires": {
- "minimatch": "^7.4.2"
+ "minimatch": "^9.0.0"
}
},
"imurmurhash": {
@@ -25457,7 +25785,6 @@
},
"infer-owner": {
"version": "1.0.4",
- "bundled": true,
"dev": true
},
"inflight": {
@@ -25475,7 +25802,7 @@
"dev": true
},
"ini": {
- "version": "3.0.1",
+ "version": "4.1.1",
"bundled": true,
"dev": true
},
@@ -25512,7 +25839,7 @@
}
},
"is-core-module": {
- "version": "2.11.0",
+ "version": "2.12.1",
"bundled": true,
"dev": true,
"requires": {
@@ -25534,6 +25861,15 @@
"bundled": true,
"dev": true
},
+ "jackspeak": {
+ "version": "2.2.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "@isaacs/cliui": "^8.0.2",
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"json-parse-even-better-errors": {
"version": "3.0.0",
"bundled": true,
@@ -25550,7 +25886,7 @@
"dev": true
},
"just-diff": {
- "version": "6.0.0",
+ "version": "6.0.2",
"bundled": true,
"dev": true
},
@@ -25569,29 +25905,28 @@
}
},
"libnpmdiff": {
- "version": "5.0.14",
+ "version": "5.0.20",
"bundled": true,
"dev": true,
"requires": {
- "@npmcli/arborist": "^6.2.6",
+ "@npmcli/arborist": "^6.5.0",
"@npmcli/disparity-colors": "^3.0.0",
"@npmcli/installed-package-contents": "^2.0.2",
"binary-extensions": "^2.2.0",
"diff": "^5.1.0",
- "minimatch": "^7.4.2",
+ "minimatch": "^9.0.0",
"npm-package-arg": "^10.1.0",
"pacote": "^15.0.8",
"tar": "^6.1.13"
}
},
"libnpmexec": {
- "version": "5.0.14",
+ "version": "6.0.4",
"bundled": true,
"dev": true,
"requires": {
- "@npmcli/arborist": "^6.2.6",
+ "@npmcli/arborist": "^6.5.0",
"@npmcli/run-script": "^6.0.0",
- "chalk": "^4.1.0",
"ci-info": "^3.7.1",
"npm-package-arg": "^10.1.0",
"npmlog": "^7.0.1",
@@ -25600,15 +25935,15 @@
"read": "^2.0.0",
"read-package-json-fast": "^3.0.2",
"semver": "^7.3.7",
- "walk-up-path": "^1.0.0"
+ "walk-up-path": "^3.0.1"
}
},
"libnpmfund": {
- "version": "4.0.14",
+ "version": "4.2.1",
"bundled": true,
"dev": true,
"requires": {
- "@npmcli/arborist": "^6.2.6"
+ "@npmcli/arborist": "^6.5.0"
}
},
"libnpmhook": {
@@ -25621,7 +25956,7 @@
}
},
"libnpmorg": {
- "version": "5.0.3",
+ "version": "5.0.4",
"bundled": true,
"dev": true,
"requires": {
@@ -25630,18 +25965,18 @@
}
},
"libnpmpack": {
- "version": "5.0.14",
+ "version": "5.0.20",
"bundled": true,
"dev": true,
"requires": {
- "@npmcli/arborist": "^6.2.6",
+ "@npmcli/arborist": "^6.5.0",
"@npmcli/run-script": "^6.0.0",
"npm-package-arg": "^10.1.0",
"pacote": "^15.0.8"
}
},
"libnpmpublish": {
- "version": "7.1.3",
+ "version": "7.5.0",
"bundled": true,
"dev": true,
"requires": {
@@ -25651,7 +25986,7 @@
"npm-registry-fetch": "^14.0.3",
"proc-log": "^3.0.0",
"semver": "^7.3.7",
- "sigstore": "^1.0.0",
+ "sigstore": "^1.4.0",
"ssri": "^10.0.1"
}
},
@@ -25690,7 +26025,7 @@
"dev": true
},
"make-fetch-happen": {
- "version": "11.0.3",
+ "version": "11.1.1",
"bundled": true,
"dev": true,
"requires": {
@@ -25701,7 +26036,7 @@
"https-proxy-agent": "^5.0.0",
"is-lambda": "^1.0.1",
"lru-cache": "^7.7.1",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minipass-fetch": "^3.0.0",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
@@ -25712,7 +26047,7 @@
}
},
"minimatch": {
- "version": "7.4.3",
+ "version": "9.0.3",
"bundled": true,
"dev": true,
"requires": {
@@ -25720,7 +26055,7 @@
}
},
"minipass": {
- "version": "4.2.5",
+ "version": "5.0.0",
"bundled": true,
"dev": true
},
@@ -25743,12 +26078,12 @@
}
},
"minipass-fetch": {
- "version": "3.0.1",
+ "version": "3.0.3",
"bundled": true,
"dev": true,
"requires": {
"encoding": "^0.1.13",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minipass-sized": "^1.0.3",
"minizlib": "^2.1.2"
}
@@ -25866,14 +26201,15 @@
"dev": true
},
"node-gyp": {
- "version": "9.3.1",
+ "version": "9.4.0",
"bundled": true,
"dev": true,
"requires": {
"env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
"glob": "^7.1.4",
"graceful-fs": "^4.2.6",
- "make-fetch-happen": "^10.0.3",
+ "make-fetch-happen": "^11.0.3",
"nopt": "^6.0.0",
"npmlog": "^6.0.0",
"rimraf": "^3.0.2",
@@ -25882,15 +26218,6 @@
"which": "^2.0.2"
},
"dependencies": {
- "@npmcli/fs": {
- "version": "2.1.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "@gar/promisify": "^1.1.3",
- "semver": "^7.3.5"
- }
- },
"abbrev": {
"version": "1.1.1",
"bundled": true,
@@ -25914,69 +26241,6 @@
"concat-map": "0.0.1"
}
},
- "cacache": {
- "version": "16.1.3",
- "bundled": true,
- "dev": true,
- "requires": {
- "@npmcli/fs": "^2.1.0",
- "@npmcli/move-file": "^2.0.0",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.1.0",
- "glob": "^8.0.1",
- "infer-owner": "^1.0.4",
- "lru-cache": "^7.7.1",
- "minipass": "^3.1.6",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "mkdirp": "^1.0.4",
- "p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^9.0.0",
- "tar": "^6.1.11",
- "unique-filename": "^2.0.0"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "glob": {
- "version": "8.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- }
- },
- "minimatch": {
- "version": "5.1.6",
- "bundled": true,
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- }
- }
- },
- "fs-minipass": {
- "version": "2.1.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
"gauge": {
"version": "4.0.4",
"bundled": true,
@@ -26005,29 +26269,6 @@
"path-is-absolute": "^1.0.0"
}
},
- "make-fetch-happen": {
- "version": "10.2.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "agentkeepalive": "^4.2.1",
- "cacache": "^16.1.0",
- "http-cache-semantics": "^4.1.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^7.7.1",
- "minipass": "^3.1.6",
- "minipass-collect": "^1.0.2",
- "minipass-fetch": "^2.0.3",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.3",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^7.0.0",
- "ssri": "^9.0.0"
- }
- },
"minimatch": {
"version": "3.1.2",
"bundled": true,
@@ -26036,25 +26277,6 @@
"brace-expansion": "^1.1.7"
}
},
- "minipass": {
- "version": "3.3.6",
- "bundled": true,
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "minipass-fetch": {
- "version": "2.1.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "encoding": "^0.1.13",
- "minipass": "^3.1.6",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.1.2"
- }
- },
"nopt": {
"version": "6.0.0",
"bundled": true,
@@ -26084,29 +26306,10 @@
"util-deprecate": "^1.0.1"
}
},
- "ssri": {
- "version": "9.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "minipass": "^3.1.1"
- }
- },
- "unique-filename": {
- "version": "2.0.1",
+ "signal-exit": {
+ "version": "3.0.7",
"bundled": true,
- "dev": true,
- "requires": {
- "unique-slug": "^3.0.0"
- }
- },
- "unique-slug": {
- "version": "3.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4"
- }
+ "dev": true
},
"which": {
"version": "2.0.2",
@@ -26119,7 +26322,7 @@
}
},
"nopt": {
- "version": "7.1.0",
+ "version": "7.2.0",
"bundled": true,
"dev": true,
"requires": {
@@ -26138,12 +26341,9 @@
}
},
"npm-audit-report": {
- "version": "4.0.0",
+ "version": "5.0.0",
"bundled": true,
- "dev": true,
- "requires": {
- "chalk": "^4.0.0"
- }
+ "dev": true
},
"npm-bundled": {
"version": "3.0.0",
@@ -26154,7 +26354,7 @@
}
},
"npm-install-checks": {
- "version": "6.1.0",
+ "version": "6.2.0",
"bundled": true,
"dev": true,
"requires": {
@@ -26162,7 +26362,7 @@
}
},
"npm-normalize-package-bin": {
- "version": "3.0.0",
+ "version": "3.0.1",
"bundled": true,
"dev": true
},
@@ -26186,7 +26386,7 @@
}
},
"npm-pick-manifest": {
- "version": "8.0.1",
+ "version": "8.0.2",
"bundled": true,
"dev": true,
"requires": {
@@ -26206,12 +26406,12 @@
}
},
"npm-registry-fetch": {
- "version": "14.0.3",
+ "version": "14.0.5",
"bundled": true,
"dev": true,
"requires": {
"make-fetch-happen": "^11.0.0",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minipass-fetch": "^3.0.0",
"minipass-json-stream": "^1.0.1",
"minizlib": "^2.1.2",
@@ -26252,7 +26452,7 @@
}
},
"pacote": {
- "version": "15.1.1",
+ "version": "15.2.0",
"bundled": true,
"dev": true,
"requires": {
@@ -26262,7 +26462,7 @@
"@npmcli/run-script": "^6.0.0",
"cacache": "^17.0.0",
"fs-minipass": "^3.0.0",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"npm-package-arg": "^10.0.0",
"npm-packlist": "^7.0.0",
"npm-pick-manifest": "^8.0.0",
@@ -26271,7 +26471,7 @@
"promise-retry": "^2.0.1",
"read-package-json": "^6.0.0",
"read-package-json-fast": "^3.0.0",
- "sigstore": "^1.0.0",
+ "sigstore": "^1.3.0",
"ssri": "^10.0.0",
"tar": "^6.1.11"
}
@@ -26291,17 +26491,29 @@
"bundled": true,
"dev": true
},
+ "path-key": {
+ "version": "3.1.1",
+ "bundled": true,
+ "dev": true
+ },
"path-scurry": {
- "version": "1.6.1",
+ "version": "1.9.2",
"bundled": true,
"dev": true,
"requires": {
- "lru-cache": "^7.14.1",
- "minipass": "^4.0.2"
+ "lru-cache": "^9.1.1",
+ "minipass": "^5.0.0 || ^6.0.2"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "9.1.1",
+ "bundled": true,
+ "dev": true
+ }
}
},
"postcss-selector-parser": {
- "version": "6.0.11",
+ "version": "6.0.13",
"bundled": true,
"dev": true,
"requires": {
@@ -26325,7 +26537,7 @@
"dev": true
},
"promise-call-limit": {
- "version": "1.0.1",
+ "version": "1.0.2",
"bundled": true,
"dev": true
},
@@ -26357,7 +26569,7 @@
"dev": true
},
"read": {
- "version": "2.0.0",
+ "version": "2.1.0",
"bundled": true,
"dev": true,
"requires": {
@@ -26370,11 +26582,11 @@
"dev": true
},
"read-package-json": {
- "version": "6.0.1",
+ "version": "6.0.4",
"bundled": true,
"dev": true,
"requires": {
- "glob": "^9.3.0",
+ "glob": "^10.2.2",
"json-parse-even-better-errors": "^3.0.0",
"normalize-package-data": "^5.0.0",
"npm-normalize-package-bin": "^3.0.0"
@@ -26390,7 +26602,7 @@
}
},
"readable-stream": {
- "version": "4.3.0",
+ "version": "4.4.0",
"bundled": true,
"dev": true,
"requires": {
@@ -26446,7 +26658,7 @@
}
},
"safe-buffer": {
- "version": "5.1.2",
+ "version": "5.2.1",
"bundled": true,
"dev": true
},
@@ -26457,7 +26669,7 @@
"optional": true
},
"semver": {
- "version": "7.3.8",
+ "version": "7.5.4",
"bundled": true,
"dev": true,
"requires": {
@@ -26479,19 +26691,34 @@
"bundled": true,
"dev": true
},
+ "shebang-command": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "bundled": true,
+ "dev": true
+ },
"signal-exit": {
- "version": "3.0.7",
+ "version": "4.0.2",
"bundled": true,
"dev": true
},
"sigstore": {
- "version": "1.2.0",
+ "version": "1.9.0",
"bundled": true,
"dev": true,
"requires": {
- "@sigstore/protobuf-specs": "^0.1.0",
- "make-fetch-happen": "^11.0.1",
- "tuf-js": "^1.0.0"
+ "@sigstore/bundle": "^1.1.0",
+ "@sigstore/protobuf-specs": "^0.2.0",
+ "@sigstore/sign": "^1.0.0",
+ "@sigstore/tuf": "^1.0.3",
+ "make-fetch-happen": "^11.0.1"
}
},
"smart-buffer": {
@@ -26547,19 +26774,19 @@
"dev": true
},
"ssri": {
- "version": "10.0.1",
+ "version": "10.0.4",
"bundled": true,
"dev": true,
"requires": {
- "minipass": "^4.0.0"
+ "minipass": "^5.0.0"
}
},
"string_decoder": {
- "version": "1.1.1",
+ "version": "1.3.0",
"bundled": true,
"dev": true,
"requires": {
- "safe-buffer": "~5.1.0"
+ "safe-buffer": "~5.2.0"
}
},
"string-width": {
@@ -26572,6 +26799,16 @@
"strip-ansi": "^6.0.1"
}
},
+ "string-width-cjs": {
+ "version": "npm:string-width@4.2.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
"strip-ansi": {
"version": "6.0.1",
"bundled": true,
@@ -26580,22 +26817,27 @@
"ansi-regex": "^5.0.1"
}
},
- "supports-color": {
- "version": "7.2.0",
+ "strip-ansi-cjs": {
+ "version": "npm:strip-ansi@6.0.1",
"bundled": true,
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "ansi-regex": "^5.0.1"
}
},
+ "supports-color": {
+ "version": "9.4.0",
+ "bundled": true,
+ "dev": true
+ },
"tar": {
- "version": "6.1.13",
+ "version": "6.1.15",
"bundled": true,
"dev": true,
"requires": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
- "minipass": "^4.0.0",
+ "minipass": "^5.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
@@ -26637,12 +26879,13 @@
"dev": true
},
"tuf-js": {
- "version": "1.1.2",
+ "version": "1.1.7",
"bundled": true,
"dev": true,
"requires": {
- "@tufjs/models": "1.0.1",
- "make-fetch-happen": "^11.0.1"
+ "@tufjs/models": "1.0.4",
+ "debug": "^4.3.4",
+ "make-fetch-happen": "^11.1.1"
}
},
"unique-filename": {
@@ -26684,7 +26927,7 @@
}
},
"walk-up-path": {
- "version": "1.0.0",
+ "version": "3.0.1",
"bundled": true,
"dev": true
},
@@ -26697,7 +26940,7 @@
}
},
"which": {
- "version": "3.0.0",
+ "version": "3.0.1",
"bundled": true,
"dev": true,
"requires": {
@@ -26712,18 +26955,73 @@
"string-width": "^1.0.2 || 2 || 3 || 4"
}
},
+ "wrap-ansi": {
+ "version": "8.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "6.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "6.2.1",
+ "bundled": true,
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "bundled": true,
+ "dev": true
+ },
+ "string-width": {
+ "version": "5.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ }
+ }
+ }
+ },
+ "wrap-ansi-cjs": {
+ "version": "npm:wrap-ansi@7.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true
},
"write-file-atomic": {
- "version": "5.0.0",
+ "version": "5.0.1",
"bundled": true,
"dev": true,
"requires": {
"imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
+ "signal-exit": "^4.0.1"
}
},
"yallist": {
@@ -27540,9 +27838,9 @@
}
},
"semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
@@ -27829,9 +28127,9 @@
}
},
"semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
},
"type-fest": {
@@ -28181,9 +28479,9 @@
}
},
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
},
"serve": {