From a8dd0b7f294a2664d53f39ce75c5154fd6cb435e Mon Sep 17 00:00:00 2001 From: Evan Simkowitz Date: Thu, 30 Jan 2025 17:33:18 -0800 Subject: [PATCH 01/17] Cleanup retrySendTimeout func creation (#1872) --- pkg/wshutil/wshrpc.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pkg/wshutil/wshrpc.go b/pkg/wshutil/wshrpc.go index 37bb48888..400d0070c 100644 --- a/pkg/wshutil/wshrpc.go +++ b/pkg/wshutil/wshrpc.go @@ -736,21 +736,21 @@ func (w *WshRpc) setServerDone() { } func (w *WshRpc) retrySendTimeout(resId string) { + done := func() bool { + w.Lock.Lock() + defer w.Lock.Unlock() + if w.ServerDone { + return true + } + select { + case w.CtxDoneCh <- resId: + return true + default: + return false + } + } for { - done := func() bool { - w.Lock.Lock() - defer w.Lock.Unlock() - if w.ServerDone { - return true - } - select { - case w.CtxDoneCh <- resId: - return true - default: - return false - } - }() - if done { + if done() { return } time.Sleep(100 * time.Millisecond) From d224bd471de5b7688ce0816e77b01f1243babf99 Mon Sep 17 00:00:00 2001 From: Evan Simkowitz Date: Thu, 30 Jan 2025 17:36:45 -0800 Subject: [PATCH 02/17] Add mips builds for wsh (#1878) --- Taskfile.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Taskfile.yml b/Taskfile.yml index 160142e47..6509bbef8 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -199,6 +199,14 @@ tasks: vars: GOOS: linux GOARCH: amd64 + - task: build:wsh:internal + vars: + GOOS: linux + GOARCH: mips + - task: build:wsh:internal + vars: + GOOS: linux + GOARCH: mips64 - task: build:wsh:internal vars: GOOS: windows From 902ff9baf193377f51625007aa5ff43bbee926a5 Mon Sep 17 00:00:00 2001 From: Evan Simkowitz Date: Fri, 31 Jan 2025 10:42:39 -0800 Subject: [PATCH 03/17] enable `wsh file` cross-remote copy/move (#1725) This adds the ability to stream `tar` archives over channels between `wsh` instances. The main use cases for this are remote copy and move operations. It also completes the `wavefs` implementation of the FileShare interface to allow copy/move interoperability between wavefiles and other storage types. The tar streaming functionality has been broken out into the new `tarcopy` package for easy reuse. New `fileshare` functions are added for `CopyInternal`, which allows copying files internal to a filesystem to bypass the expensive interop layer, and `MoveInternal`, which does the same for moving a file within a filesystem. Copying between remotes is now handled by `CopyRemote`, which accepts the source `FileShareClient` as a parameter. `wsh` connections use the same implementation for `CopyInternal` and `CopyRemote` as they need to request the channel on the remote destination, since we don't offer a way to pass channels as a parameter to a remote call. This also adds a recursive `-r` flag to `wsh file rm` to allow for deleting a directory and all its contents. S3 support will be addressed in a future PR. --------- Co-authored-by: sawka Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- cmd/generatego/main-generatego.go | 1 + cmd/wsh/cmd/wshcmd-file.go | 7 +- frontend/app/store/wshclientapi.ts | 8 +- frontend/types/gotypes.d.ts | 12 + pkg/remote/awsconn/awsconn.go | 29 +-- pkg/remote/connparse/connparse.go | 6 +- pkg/remote/connparse/connparse_test.go | 48 ++++ pkg/remote/fileshare/fileshare.go | 59 +++-- pkg/remote/fileshare/fstype/fstype.go | 15 +- pkg/remote/fileshare/s3fs/s3fs.go | 36 +-- pkg/remote/fileshare/wavefs/wavefs.go | 261 +++++++++++++++++---- pkg/remote/fileshare/wshfs/wshfs.go | 18 +- pkg/util/fileutil/fileutil.go | 57 ++++- pkg/util/iochan/iochan.go | 62 +++-- pkg/util/iochan/iochantypes/iochantypes.go | 6 + pkg/util/tarcopy/tarcopy.go | 137 +++++++++++ pkg/web/web.go | 80 ++++--- pkg/wshrpc/wshclient/wshclient.go | 13 +- pkg/wshrpc/wshremote/wshremote.go | 214 ++++++++--------- pkg/wshrpc/wshrpctypes.go | 17 +- pkg/wshrpc/wshserver/wshserver.go | 7 +- pkg/wshutil/wshrpcio.go | 11 + pkg/wshutil/wshutil.go | 2 + 23 files changed, 790 insertions(+), 316 deletions(-) create mode 100644 pkg/util/iochan/iochantypes/iochantypes.go create mode 100644 pkg/util/tarcopy/tarcopy.go diff --git a/cmd/generatego/main-generatego.go b/cmd/generatego/main-generatego.go index c93faa352..62e65d4f7 100644 --- a/cmd/generatego/main-generatego.go +++ b/cmd/generatego/main-generatego.go @@ -30,6 +30,7 @@ func GenerateWshClient() error { "github.com/wavetermdev/waveterm/pkg/waveobj", "github.com/wavetermdev/waveterm/pkg/wps", "github.com/wavetermdev/waveterm/pkg/vdom", + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes", }) wshDeclMap := wshrpc.GenerateWshCommandDeclMap() for _, key := range utilfn.GetOrderedMapKeys(wshDeclMap) { diff --git a/cmd/wsh/cmd/wshcmd-file.go b/cmd/wsh/cmd/wshcmd-file.go index 091dd74ac..62e60474e 100644 --- a/cmd/wsh/cmd/wshcmd-file.go +++ b/cmd/wsh/cmd/wshcmd-file.go @@ -98,6 +98,7 @@ func init() { fileCmd.AddCommand(fileListCmd) fileCmd.AddCommand(fileCatCmd) fileCmd.AddCommand(fileWriteCmd) + fileRmCmd.Flags().BoolP("recursive", "r", false, "remove directories recursively") fileCmd.AddCommand(fileRmCmd) fileCmd.AddCommand(fileInfoCmd) fileCmd.AddCommand(fileAppendCmd) @@ -259,6 +260,10 @@ func fileRmRun(cmd *cobra.Command, args []string) error { if err != nil { return err } + recursive, err := cmd.Flags().GetBool("recursive") + if err != nil { + return err + } fileData := wshrpc.FileData{ Info: &wshrpc.FileInfo{ Path: path}} @@ -272,7 +277,7 @@ func fileRmRun(cmd *cobra.Command, args []string) error { return fmt.Errorf("getting file info: %w", err) } - err = wshclient.FileDeleteCommand(RpcClient, fileData, &wshrpc.RpcOpts{Timeout: DefaultFileTimeout}) + err = wshclient.FileDeleteCommand(RpcClient, wshrpc.CommandDeleteFileData{Path: path, Recursive: recursive}, &wshrpc.RpcOpts{Timeout: DefaultFileTimeout}) if err != nil { return fmt.Errorf("removing file: %w", err) } diff --git a/frontend/app/store/wshclientapi.ts b/frontend/app/store/wshclientapi.ts index 2822ac298..9c614af4e 100644 --- a/frontend/app/store/wshclientapi.ts +++ b/frontend/app/store/wshclientapi.ts @@ -168,7 +168,7 @@ class RpcApiType { } // command "filedelete" [call] - FileDeleteCommand(client: WshClient, data: FileData, opts?: RpcOpts): Promise { + FileDeleteCommand(client: WshClient, data: CommandDeleteFileData, opts?: RpcOpts): Promise { return client.wshRpcCall("filedelete", data, opts); } @@ -203,7 +203,7 @@ class RpcApiType { } // command "filestreamtar" [responsestream] - FileStreamTarCommand(client: WshClient, data: CommandRemoteStreamTarData, opts?: RpcOpts): AsyncGenerator { + FileStreamTarCommand(client: WshClient, data: CommandRemoteStreamTarData, opts?: RpcOpts): AsyncGenerator { return client.wshRpcStream("filestreamtar", data, opts); } @@ -258,7 +258,7 @@ class RpcApiType { } // command "remotefiledelete" [call] - RemoteFileDeleteCommand(client: WshClient, data: string, opts?: RpcOpts): Promise { + RemoteFileDeleteCommand(client: WshClient, data: CommandDeleteFileData, opts?: RpcOpts): Promise { return client.wshRpcCall("remotefiledelete", data, opts); } @@ -313,7 +313,7 @@ class RpcApiType { } // command "remotetarstream" [responsestream] - RemoteTarStreamCommand(client: WshClient, data: CommandRemoteStreamTarData, opts?: RpcOpts): AsyncGenerator { + RemoteTarStreamCommand(client: WshClient, data: CommandRemoteStreamTarData, opts?: RpcOpts): AsyncGenerator { return client.wshRpcStream("remotetarstream", data, opts); } diff --git a/frontend/types/gotypes.d.ts b/frontend/types/gotypes.d.ts index 41423efb2..400e86935 100644 --- a/frontend/types/gotypes.d.ts +++ b/frontend/types/gotypes.d.ts @@ -166,6 +166,12 @@ declare global { blockid: string; }; + // wshrpc.CommandDeleteFileData + type CommandDeleteFileData = { + path: string; + recursive: boolean; + }; + // wshrpc.CommandDisposeData type CommandDisposeData = { routeid: string; @@ -583,6 +589,12 @@ declare global { // waveobj.ORef type ORef = string; + // iochantypes.Packet + type Packet = { + Data: string; + Checksum: string; + }; + // wshrpc.PathCommandData type PathCommandData = { pathtype: string; diff --git a/pkg/remote/awsconn/awsconn.go b/pkg/remote/awsconn/awsconn.go index 6b7471dbe..ff0deaeda 100644 --- a/pkg/remote/awsconn/awsconn.go +++ b/pkg/remote/awsconn/awsconn.go @@ -124,28 +124,13 @@ func ParseProfiles() map[string]struct{} { } func ListBuckets(ctx context.Context, client *s3.Client) ([]types.Bucket, error) { - var err error - var output *s3.ListBucketsOutput - var buckets []types.Bucket - region := client.Options().Region - bucketPaginator := s3.NewListBucketsPaginator(client, &s3.ListBucketsInput{BucketRegion: ®ion}) - for bucketPaginator.HasMorePages() { - output, err = bucketPaginator.NextPage(ctx) - log.Printf("output: %v", output) - if err != nil { - var apiErr smithy.APIError - if errors.As(err, &apiErr) && apiErr.ErrorCode() == "AccessDenied" { - fmt.Println("You don't have permission to list buckets for this account.") - err = apiErr - } else { - return nil, fmt.Errorf("Couldn't list buckets for your account. Here's why: %v\n", err) - } - break - } - if output == nil { - break + output, err := client.ListBuckets(ctx, &s3.ListBucketsInput{}) + if err != nil { + var apiErr smithy.APIError + if errors.As(err, &apiErr) { + return nil, fmt.Errorf("error listing buckets: %v", apiErr) } - buckets = append(buckets, output.Buckets...) + return nil, fmt.Errorf("error listing buckets: %v", err) } - return buckets, nil + return output.Buckets, nil } diff --git a/pkg/remote/connparse/connparse.go b/pkg/remote/connparse/connparse.go index e4cadba91..995106561 100644 --- a/pkg/remote/connparse/connparse.go +++ b/pkg/remote/connparse/connparse.go @@ -57,6 +57,10 @@ func (c *Connection) GetFullURI() string { return c.Scheme + "://" + c.GetPathWithHost() } +func (c *Connection) GetSchemeAndHost() string { + return c.Scheme + "://" + c.Host +} + func ParseURIAndReplaceCurrentHost(ctx context.Context, uri string) (*Connection, error) { conn, err := ParseURI(uri) if err != nil { @@ -148,7 +152,7 @@ func ParseURI(uri string) (*Connection, error) { } if strings.HasPrefix(remotePath, "/~") { remotePath = strings.TrimPrefix(remotePath, "/") - } else if len(remotePath) > 1 && !windowsDriveRegex.MatchString(remotePath) && !strings.HasPrefix(remotePath, "/") && !strings.HasPrefix(remotePath, "~") { + } else if len(remotePath) > 1 && !windowsDriveRegex.MatchString(remotePath) && !strings.HasPrefix(remotePath, "/") && !strings.HasPrefix(remotePath, "~") && !strings.HasPrefix(remotePath, "./") && !strings.HasPrefix(remotePath, "../") && !strings.HasPrefix(remotePath, ".\\") && !strings.HasPrefix(remotePath, "..\\") && remotePath != ".." { remotePath = "/" + remotePath } } diff --git a/pkg/remote/connparse/connparse_test.go b/pkg/remote/connparse/connparse_test.go index 5eae1ce88..c530c8e76 100644 --- a/pkg/remote/connparse/connparse_test.go +++ b/pkg/remote/connparse/connparse_test.go @@ -190,6 +190,54 @@ func TestParseURI_WSHCurrentPathShorthand(t *testing.T) { } } +func TestParseURI_WSHCurrentPath(t *testing.T) { + cstr := "./Documents/path/to/file" + c, err := connparse.ParseURI(cstr) + if err != nil { + t.Fatalf("failed to parse URI: %v", err) + } + expected := "./Documents/path/to/file" + if c.Path != expected { + t.Fatalf("expected path to be %q, got %q", expected, c.Path) + } + expected = "current" + if c.Host != expected { + t.Fatalf("expected host to be %q, got %q", expected, c.Host) + } + expected = "wsh" + if c.Scheme != expected { + t.Fatalf("expected scheme to be %q, got %q", expected, c.Scheme) + } + expected = "wsh://current/./Documents/path/to/file" + if c.GetFullURI() != expected { + t.Fatalf("expected full URI to be %q, got %q", expected, c.GetFullURI()) + } +} + +func TestParseURI_WSHCurrentPathWindows(t *testing.T) { + cstr := ".\\Documents\\path\\to\\file" + c, err := connparse.ParseURI(cstr) + if err != nil { + t.Fatalf("failed to parse URI: %v", err) + } + expected := ".\\Documents\\path\\to\\file" + if c.Path != expected { + t.Fatalf("expected path to be %q, got %q", expected, c.Path) + } + expected = "current" + if c.Host != expected { + t.Fatalf("expected host to be %q, got %q", expected, c.Host) + } + expected = "wsh" + if c.Scheme != expected { + t.Fatalf("expected scheme to be %q, got %q", expected, c.Scheme) + } + expected = "wsh://current/.\\Documents\\path\\to\\file" + if c.GetFullURI() != expected { + t.Fatalf("expected full URI to be %q, got %q", expected, c.GetFullURI()) + } +} + func TestParseURI_WSHLocalShorthand(t *testing.T) { t.Parallel() cstr := "/~/path/to/file" diff --git a/pkg/remote/fileshare/fileshare.go b/pkg/remote/fileshare/fileshare.go index 3b2458cad..9473db55a 100644 --- a/pkg/remote/fileshare/fileshare.go +++ b/pkg/remote/fileshare/fileshare.go @@ -5,12 +5,11 @@ import ( "fmt" "log" - "github.com/wavetermdev/waveterm/pkg/remote/awsconn" "github.com/wavetermdev/waveterm/pkg/remote/connparse" "github.com/wavetermdev/waveterm/pkg/remote/fileshare/fstype" - "github.com/wavetermdev/waveterm/pkg/remote/fileshare/s3fs" "github.com/wavetermdev/waveterm/pkg/remote/fileshare/wavefs" "github.com/wavetermdev/waveterm/pkg/remote/fileshare/wshfs" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" "github.com/wavetermdev/waveterm/pkg/wshrpc" "github.com/wavetermdev/waveterm/pkg/wshutil" ) @@ -29,12 +28,12 @@ func CreateFileShareClient(ctx context.Context, connection string) (fstype.FileS } conntype := conn.GetType() if conntype == connparse.ConnectionTypeS3 { - config, err := awsconn.GetConfig(ctx, connection) - if err != nil { - log.Printf("error getting aws config: %v", err) - return nil, nil - } - return s3fs.NewS3Client(config), conn + // config, err := awsconn.GetConfig(ctx, connection) + // if err != nil { + // log.Printf("error getting aws config: %v", err) + // return nil, nil + // } + return nil, nil } else if conntype == connparse.ConnectionTypeWave { return wavefs.NewWaveClient(), conn } else if conntype == connparse.ConnectionTypeWsh { @@ -61,10 +60,10 @@ func ReadStream(ctx context.Context, data wshrpc.FileData) <-chan wshrpc.RespOrE return client.ReadStream(ctx, conn, data) } -func ReadTarStream(ctx context.Context, data wshrpc.CommandRemoteStreamTarData) <-chan wshrpc.RespOrErrorUnion[[]byte] { +func ReadTarStream(ctx context.Context, data wshrpc.CommandRemoteStreamTarData) <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet] { client, conn := CreateFileShareClient(ctx, data.Path) if conn == nil || client == nil { - return wshutil.SendErrCh[[]byte](fmt.Errorf(ErrorParsingConnection, data.Path)) + return wshutil.SendErrCh[iochantypes.Packet](fmt.Errorf(ErrorParsingConnection, data.Path)) } return client.ReadTarStream(ctx, conn, data.Opts) } @@ -110,35 +109,47 @@ func Mkdir(ctx context.Context, path string) error { } func Move(ctx context.Context, data wshrpc.CommandFileCopyData) error { - srcConn, err := connparse.ParseURIAndReplaceCurrentHost(ctx, data.SrcUri) - if err != nil { - return fmt.Errorf("error parsing source connection %s: %v", data.SrcUri, err) + srcClient, srcConn := CreateFileShareClient(ctx, data.SrcUri) + if srcConn == nil || srcClient == nil { + return fmt.Errorf("error creating fileshare client, could not parse source connection %s", data.SrcUri) } destClient, destConn := CreateFileShareClient(ctx, data.DestUri) if destConn == nil || destClient == nil { - return fmt.Errorf("error creating fileshare client, could not parse connection %s or %s", data.SrcUri, data.DestUri) + return fmt.Errorf("error creating fileshare client, could not parse destination connection %s", data.DestUri) + } + if srcConn.Host != destConn.Host { + err := destClient.CopyRemote(ctx, srcConn, destConn, srcClient, data.Opts) + if err != nil { + return fmt.Errorf("cannot copy %q to %q: %w", data.SrcUri, data.DestUri, err) + } + return srcClient.Delete(ctx, srcConn, data.Opts.Recursive) + } else { + return srcClient.MoveInternal(ctx, srcConn, destConn, data.Opts) } - return destClient.Move(ctx, srcConn, destConn, data.Opts) } func Copy(ctx context.Context, data wshrpc.CommandFileCopyData) error { - srcConn, err := connparse.ParseURIAndReplaceCurrentHost(ctx, data.SrcUri) - if err != nil { - return fmt.Errorf("error parsing source connection %s: %v", data.SrcUri, err) + srcClient, srcConn := CreateFileShareClient(ctx, data.SrcUri) + if srcConn == nil || srcClient == nil { + return fmt.Errorf("error creating fileshare client, could not parse source connection %s", data.SrcUri) } destClient, destConn := CreateFileShareClient(ctx, data.DestUri) if destConn == nil || destClient == nil { - return fmt.Errorf("error creating fileshare client, could not parse connection %s or %s", data.SrcUri, data.DestUri) + return fmt.Errorf("error creating fileshare client, could not parse destination connection %s", data.DestUri) + } + if srcConn.Host != destConn.Host { + return destClient.CopyRemote(ctx, srcConn, destConn, srcClient, data.Opts) + } else { + return srcClient.CopyInternal(ctx, srcConn, destConn, data.Opts) } - return destClient.Copy(ctx, srcConn, destConn, data.Opts) } -func Delete(ctx context.Context, path string) error { - client, conn := CreateFileShareClient(ctx, path) +func Delete(ctx context.Context, data wshrpc.CommandDeleteFileData) error { + client, conn := CreateFileShareClient(ctx, data.Path) if conn == nil || client == nil { - return fmt.Errorf(ErrorParsingConnection, path) + return fmt.Errorf(ErrorParsingConnection, data.Path) } - return client.Delete(ctx, conn) + return client.Delete(ctx, conn, data.Recursive) } func Join(ctx context.Context, path string, parts ...string) (string, error) { diff --git a/pkg/remote/fileshare/fstype/fstype.go b/pkg/remote/fileshare/fstype/fstype.go index 3d42c0b03..3c3d6fceb 100644 --- a/pkg/remote/fileshare/fstype/fstype.go +++ b/pkg/remote/fileshare/fstype/fstype.go @@ -7,6 +7,7 @@ import ( "context" "github.com/wavetermdev/waveterm/pkg/remote/connparse" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" "github.com/wavetermdev/waveterm/pkg/wshrpc" ) @@ -18,7 +19,7 @@ type FileShareClient interface { // ReadStream returns a stream of file data at the given path. If it's a directory, then the list of entries ReadStream(ctx context.Context, conn *connparse.Connection, data wshrpc.FileData) <-chan wshrpc.RespOrErrorUnion[wshrpc.FileData] // ReadTarStream returns a stream of tar data at the given path - ReadTarStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileCopyOpts) <-chan wshrpc.RespOrErrorUnion[[]byte] + ReadTarStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileCopyOpts) <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet] // ListEntries returns the list of entries at the given path, or nothing if the path is a file ListEntries(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileListOpts) ([]*wshrpc.FileInfo, error) // ListEntriesStream returns a stream of entries at the given path @@ -29,12 +30,14 @@ type FileShareClient interface { AppendFile(ctx context.Context, conn *connparse.Connection, data wshrpc.FileData) error // Mkdir creates a directory at the given path Mkdir(ctx context.Context, conn *connparse.Connection) error - // Move moves the file from srcConn to destConn - Move(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error - // Copy copies the file from srcConn to destConn - Copy(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error + // Move moves the file within the same connection + MoveInternal(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error + // Copy copies the file within the same connection + CopyInternal(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error + // CopyRemote copies the file between different connections + CopyRemote(ctx context.Context, srcConn, destConn *connparse.Connection, srcClient FileShareClient, opts *wshrpc.FileCopyOpts) error // Delete deletes the entry at the given path - Delete(ctx context.Context, conn *connparse.Connection) error + Delete(ctx context.Context, conn *connparse.Connection, recursive bool) error // Join joins the given parts to the connection path Join(ctx context.Context, conn *connparse.Connection, parts ...string) (string, error) // GetConnectionType returns the type of connection for the fileshare diff --git a/pkg/remote/fileshare/s3fs/s3fs.go b/pkg/remote/fileshare/s3fs/s3fs.go index 32d0636d5..b406615d4 100644 --- a/pkg/remote/fileshare/s3fs/s3fs.go +++ b/pkg/remote/fileshare/s3fs/s3fs.go @@ -5,6 +5,7 @@ package s3fs import ( "context" + "errors" "log" "github.com/aws/aws-sdk-go-v2/aws" @@ -12,6 +13,7 @@ import ( "github.com/wavetermdev/waveterm/pkg/remote/awsconn" "github.com/wavetermdev/waveterm/pkg/remote/connparse" "github.com/wavetermdev/waveterm/pkg/remote/fileshare/fstype" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" "github.com/wavetermdev/waveterm/pkg/wshrpc" "github.com/wavetermdev/waveterm/pkg/wshutil" ) @@ -29,15 +31,15 @@ func NewS3Client(config *aws.Config) *S3Client { } func (c S3Client) Read(ctx context.Context, conn *connparse.Connection, data wshrpc.FileData) (*wshrpc.FileData, error) { - return nil, nil + return nil, errors.ErrUnsupported } func (c S3Client) ReadStream(ctx context.Context, conn *connparse.Connection, data wshrpc.FileData) <-chan wshrpc.RespOrErrorUnion[wshrpc.FileData] { - return nil + return wshutil.SendErrCh[wshrpc.FileData](errors.ErrUnsupported) } -func (c S3Client) ReadTarStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileCopyOpts) <-chan wshrpc.RespOrErrorUnion[[]byte] { - return nil +func (c S3Client) ReadTarStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileCopyOpts) <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet] { + return wshutil.SendErrCh[iochantypes.Packet](errors.ErrUnsupported) } func (c S3Client) ListEntriesStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileListOpts) <-chan wshrpc.RespOrErrorUnion[wshrpc.CommandRemoteListEntriesRtnData] { @@ -82,35 +84,39 @@ func (c S3Client) ListEntries(ctx context.Context, conn *connparse.Connection, o } func (c S3Client) Stat(ctx context.Context, conn *connparse.Connection) (*wshrpc.FileInfo, error) { - return nil, nil + return nil, errors.ErrUnsupported } func (c S3Client) PutFile(ctx context.Context, conn *connparse.Connection, data wshrpc.FileData) error { - return nil + return errors.ErrUnsupported } func (c S3Client) AppendFile(ctx context.Context, conn *connparse.Connection, data wshrpc.FileData) error { - return nil + return errors.ErrUnsupported } func (c S3Client) Mkdir(ctx context.Context, conn *connparse.Connection) error { - return nil + return errors.ErrUnsupported +} + +func (c S3Client) MoveInternal(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { + return errors.ErrUnsupported } -func (c S3Client) Move(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { - return nil +func (c S3Client) CopyRemote(ctx context.Context, srcConn, destConn *connparse.Connection, srcClient fstype.FileShareClient, opts *wshrpc.FileCopyOpts) error { + return errors.ErrUnsupported } -func (c S3Client) Copy(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { - return nil +func (c S3Client) CopyInternal(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { + return errors.ErrUnsupported } -func (c S3Client) Delete(ctx context.Context, conn *connparse.Connection) error { - return nil +func (c S3Client) Delete(ctx context.Context, conn *connparse.Connection, recursive bool) error { + return errors.ErrUnsupported } func (c S3Client) Join(ctx context.Context, conn *connparse.Connection, parts ...string) (string, error) { - return "", nil + return "", errors.ErrUnsupported } func (c S3Client) GetConnectionType() string { diff --git a/pkg/remote/fileshare/wavefs/wavefs.go b/pkg/remote/fileshare/wavefs/wavefs.go index 7be121547..63cbe36a1 100644 --- a/pkg/remote/fileshare/wavefs/wavefs.go +++ b/pkg/remote/fileshare/wavefs/wavefs.go @@ -4,17 +4,24 @@ package wavefs import ( + "archive/tar" "context" "encoding/base64" "errors" "fmt" + "io" "io/fs" + "log" "path" "strings" + "time" "github.com/wavetermdev/waveterm/pkg/filestore" "github.com/wavetermdev/waveterm/pkg/remote/connparse" "github.com/wavetermdev/waveterm/pkg/remote/fileshare/fstype" + "github.com/wavetermdev/waveterm/pkg/util/fileutil" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" + "github.com/wavetermdev/waveterm/pkg/util/tarcopy" "github.com/wavetermdev/waveterm/pkg/util/wavefileutil" "github.com/wavetermdev/waveterm/pkg/waveobj" "github.com/wavetermdev/waveterm/pkg/wps" @@ -22,6 +29,10 @@ import ( "github.com/wavetermdev/waveterm/pkg/wshutil" ) +const ( + DefaultTimeout = 30 * time.Second +) + type WaveClient struct{} var _ fstype.FileShareClient = WaveClient{} @@ -95,8 +106,60 @@ func (c WaveClient) Read(ctx context.Context, conn *connparse.Connection, data w return &wshrpc.FileData{Info: data.Info, Entries: list}, nil } -func (c WaveClient) ReadTarStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileCopyOpts) <-chan wshrpc.RespOrErrorUnion[[]byte] { - return nil +func (c WaveClient) ReadTarStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileCopyOpts) <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet] { + log.Printf("ReadTarStream: conn: %v, opts: %v\n", conn, opts) + list, err := c.ListEntries(ctx, conn, nil) + if err != nil { + return wshutil.SendErrCh[iochantypes.Packet](fmt.Errorf("error listing blockfiles: %w", err)) + } + + pathPrefix := getPathPrefix(conn) + schemeAndHost := conn.GetSchemeAndHost() + "/" + + timeout := DefaultTimeout + if opts.Timeout > 0 { + timeout = time.Duration(opts.Timeout) * time.Millisecond + } + readerCtx, cancel := context.WithTimeout(context.Background(), timeout) + rtn, writeHeader, fileWriter, tarClose := tarcopy.TarCopySrc(readerCtx, pathPrefix) + + go func() { + defer func() { + tarClose() + cancel() + }() + for _, file := range list { + if readerCtx.Err() != nil { + rtn <- wshutil.RespErr[iochantypes.Packet](readerCtx.Err()) + return + } + file.Mode = 0644 + + if err = writeHeader(fileutil.ToFsFileInfo(file), file.Path); err != nil { + rtn <- wshutil.RespErr[iochantypes.Packet](fmt.Errorf("error writing tar header: %w", err)) + return + } + if file.IsDir { + continue + } + + log.Printf("ReadTarStream: reading file: %s\n", file.Path) + + internalPath := strings.TrimPrefix(file.Path, schemeAndHost) + + _, dataBuf, err := filestore.WFS.ReadFile(ctx, conn.Host, internalPath) + if err != nil { + rtn <- wshutil.RespErr[iochantypes.Packet](fmt.Errorf("error reading blockfile: %w", err)) + return + } + if _, err = fileWriter.Write(dataBuf); err != nil { + rtn <- wshutil.RespErr[iochantypes.Packet](fmt.Errorf("error writing tar data: %w", err)) + return + } + } + }() + + return rtn } func (c WaveClient) ListEntriesStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileListOpts) <-chan wshrpc.RespOrErrorUnion[wshrpc.CommandRemoteListEntriesRtnData] { @@ -116,10 +179,14 @@ func (c WaveClient) ListEntriesStream(ctx context.Context, conn *connparse.Conne } func (c WaveClient) ListEntries(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileListOpts) ([]*wshrpc.FileInfo, error) { + log.Printf("ListEntries: conn: %v, opts: %v\n", conn, opts) zoneId := conn.Host if zoneId == "" { return nil, fmt.Errorf("zoneid not found in connection") } + if opts == nil { + opts = &wshrpc.FileListOpts{} + } prefix, err := cleanPath(conn.Path) if err != nil { return nil, fmt.Errorf("error cleaning path: %w", err) @@ -265,33 +332,6 @@ func (c WaveClient) PutFile(ctx context.Context, conn *connparse.Connection, dat return nil } -/* - - path := data.Info.Path - log.Printf("Append: path=%s", path) - client, conn := CreateFileShareClient(ctx, path) - if conn == nil || client == nil { - return fmt.Errorf(ErrorParsingConnection, path) - } - finfo, err := client.Stat(ctx, conn) - if err != nil { - return err - } - if data.Info == nil { - data.Info = &wshrpc.FileInfo{} - } - oldInfo := data.Info - data.Info = finfo - if oldInfo.Opts != nil { - data.Info.Opts = oldInfo.Opts - } - data.At = &wshrpc.FileDataAt{ - Offset: finfo.Size, - } - log.Printf("Append: offset=%d", data.At.Offset) - return client.PutFile(ctx, conn, data) -*/ - func (c WaveClient) AppendFile(ctx context.Context, conn *connparse.Connection, data wshrpc.FileData) error { dataBuf, err := base64.StdEncoding.DecodeString(data.Data64) if err != nil { @@ -346,39 +386,156 @@ func (c WaveClient) AppendFile(ctx context.Context, conn *connparse.Connection, // WaveFile does not support directories, only prefix-based listing func (c WaveClient) Mkdir(ctx context.Context, conn *connparse.Connection) error { - return nil + return errors.ErrUnsupported } -func (c WaveClient) Move(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { +func (c WaveClient) MoveInternal(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { + if srcConn.Host != destConn.Host { + return fmt.Errorf("move internal, src and dest hosts do not match") + } + err := c.CopyInternal(ctx, srcConn, destConn, opts) + if err != nil { + return fmt.Errorf("error copying blockfile: %w", err) + } + err = c.Delete(ctx, srcConn, opts.Recursive) + if err != nil { + return fmt.Errorf("error deleting blockfile: %w", err) + } return nil } -func (c WaveClient) Copy(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { +func (c WaveClient) CopyInternal(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { + if srcConn.Host == destConn.Host { + host := srcConn.Host + srcFileName, err := cleanPath(srcConn.Path) + if err != nil { + return fmt.Errorf("error cleaning source path: %w", err) + } + destFileName, err := cleanPath(destConn.Path) + if err != nil { + return fmt.Errorf("error cleaning destination path: %w", err) + } + err = filestore.WFS.MakeFile(ctx, host, destFileName, wshrpc.FileMeta{}, wshrpc.FileOpts{}) + if err != nil { + return fmt.Errorf("error making source blockfile: %w", err) + } + _, dataBuf, err := filestore.WFS.ReadFile(ctx, host, srcFileName) + if err != nil { + return fmt.Errorf("error reading source blockfile: %w", err) + } + err = filestore.WFS.WriteFile(ctx, host, destFileName, dataBuf) + if err != nil { + return fmt.Errorf("error writing to destination blockfile: %w", err) + } + wps.Broker.Publish(wps.WaveEvent{ + Event: wps.Event_BlockFile, + Scopes: []string{waveobj.MakeORef(waveobj.OType_Block, host).String()}, + Data: &wps.WSFileEventData{ + ZoneId: host, + FileName: destFileName, + FileOp: wps.FileOp_Invalidate, + }, + }) + return nil + } else { + return fmt.Errorf("copy between different hosts not supported") + } +} + +func (c WaveClient) CopyRemote(ctx context.Context, srcConn, destConn *connparse.Connection, srcClient fstype.FileShareClient, opts *wshrpc.FileCopyOpts) error { + zoneId := destConn.Host + if zoneId == "" { + return fmt.Errorf("zoneid not found in connection") + } + destPrefix := getPathPrefix(destConn) + destPrefix = strings.TrimPrefix(destPrefix, destConn.GetSchemeAndHost()+"/") + log.Printf("CopyRemote: srcConn: %v, destConn: %v, destPrefix: %s\n", srcConn, destConn, destPrefix) + readCtx, cancel := context.WithCancelCause(ctx) + ioch := srcClient.ReadTarStream(readCtx, srcConn, opts) + err := tarcopy.TarCopyDest(readCtx, cancel, ioch, func(next *tar.Header, reader *tar.Reader) error { + if next.Typeflag == tar.TypeDir { + return nil + } + fileName, err := cleanPath(path.Join(destPrefix, next.Name)) + if err != nil { + return fmt.Errorf("error cleaning path: %w", err) + } + _, err = filestore.WFS.Stat(ctx, zoneId, fileName) + if err != nil { + if !errors.Is(err, fs.ErrNotExist) { + return fmt.Errorf("error getting blockfile info: %w", err) + } + err := filestore.WFS.MakeFile(ctx, zoneId, fileName, nil, wshrpc.FileOpts{}) + if err != nil { + return fmt.Errorf("error making blockfile: %w", err) + } + } + log.Printf("CopyRemote: writing file: %s; size: %d\n", fileName, next.Size) + dataBuf := make([]byte, next.Size) + _, err = reader.Read(dataBuf) + if err != nil { + if !errors.Is(err, io.EOF) { + return fmt.Errorf("error reading tar data: %w", err) + } + } + err = filestore.WFS.WriteFile(ctx, zoneId, fileName, dataBuf) + if err != nil { + return fmt.Errorf("error writing to blockfile: %w", err) + } + wps.Broker.Publish(wps.WaveEvent{ + Event: wps.Event_BlockFile, + Scopes: []string{waveobj.MakeORef(waveobj.OType_Block, zoneId).String()}, + Data: &wps.WSFileEventData{ + ZoneId: zoneId, + FileName: fileName, + FileOp: wps.FileOp_Invalidate, + }, + }) + return nil + }) + if err != nil { + return fmt.Errorf("error copying tar stream: %w", err) + } return nil } -func (c WaveClient) Delete(ctx context.Context, conn *connparse.Connection) error { +func (c WaveClient) Delete(ctx context.Context, conn *connparse.Connection, recursive bool) error { zoneId := conn.Host if zoneId == "" { return fmt.Errorf("zoneid not found in connection") } - fileName, err := cleanPath(conn.Path) + schemeAndHost := conn.GetSchemeAndHost() + "/" + + entries, err := c.ListEntries(ctx, conn, nil) if err != nil { - return fmt.Errorf("error cleaning path: %w", err) + return fmt.Errorf("error listing blockfiles: %w", err) } - err = filestore.WFS.DeleteFile(ctx, zoneId, fileName) - if err != nil { - return fmt.Errorf("error deleting blockfile: %w", err) + if len(entries) > 0 { + if !recursive { + return fmt.Errorf("more than one entry, use recursive flag to delete") + } + errs := make([]error, 0) + for _, entry := range entries { + fileName := strings.TrimPrefix(entry.Path, schemeAndHost) + err = filestore.WFS.DeleteFile(ctx, zoneId, fileName) + if err != nil { + errs = append(errs, fmt.Errorf("error deleting blockfile %s/%s: %w", zoneId, fileName, err)) + continue + } + wps.Broker.Publish(wps.WaveEvent{ + Event: wps.Event_BlockFile, + Scopes: []string{waveobj.MakeORef(waveobj.OType_Block, zoneId).String()}, + Data: &wps.WSFileEventData{ + ZoneId: zoneId, + FileName: fileName, + FileOp: wps.FileOp_Delete, + }, + }) + } + if len(errs) > 0 { + return fmt.Errorf("error deleting blockfiles: %v", errs) + } } - wps.Broker.Publish(wps.WaveEvent{ - Event: wps.Event_BlockFile, - Scopes: []string{waveobj.MakeORef(waveobj.OType_Block, zoneId).String()}, - Data: &wps.WSFileEventData{ - ZoneId: zoneId, - FileName: fileName, - FileOp: wps.FileOp_Delete, - }, - }) return nil } @@ -417,3 +574,13 @@ func cleanPath(path string) (string, error) { func (c WaveClient) GetConnectionType() string { return connparse.ConnectionTypeWave } + +func getPathPrefix(conn *connparse.Connection) string { + fullUri := conn.GetFullURI() + pathPrefix := fullUri + lastSlash := strings.LastIndex(fullUri, "/") + if lastSlash > 10 && lastSlash < len(fullUri)-1 { + pathPrefix = fullUri[:lastSlash+1] + } + return pathPrefix +} diff --git a/pkg/remote/fileshare/wshfs/wshfs.go b/pkg/remote/fileshare/wshfs/wshfs.go index 000c58b66..61816ea57 100644 --- a/pkg/remote/fileshare/wshfs/wshfs.go +++ b/pkg/remote/fileshare/wshfs/wshfs.go @@ -12,6 +12,7 @@ import ( "github.com/wavetermdev/waveterm/pkg/remote/connparse" "github.com/wavetermdev/waveterm/pkg/remote/fileshare/fstype" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" "github.com/wavetermdev/waveterm/pkg/wshrpc" "github.com/wavetermdev/waveterm/pkg/wshrpc/wshclient" "github.com/wavetermdev/waveterm/pkg/wshutil" @@ -86,7 +87,7 @@ func (c WshClient) ReadStream(ctx context.Context, conn *connparse.Connection, d return wshclient.RemoteStreamFileCommand(RpcClient, streamFileData, &wshrpc.RpcOpts{Route: wshutil.MakeConnectionRouteId(conn.Host)}) } -func (c WshClient) ReadTarStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileCopyOpts) <-chan wshrpc.RespOrErrorUnion[[]byte] { +func (c WshClient) ReadTarStream(ctx context.Context, conn *connparse.Connection, opts *wshrpc.FileCopyOpts) <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet] { timeout := opts.Timeout if timeout == 0 { timeout = ThirtySeconds @@ -145,7 +146,10 @@ func (c WshClient) Mkdir(ctx context.Context, conn *connparse.Connection) error return wshclient.RemoteMkdirCommand(RpcClient, conn.Path, &wshrpc.RpcOpts{Route: wshutil.MakeConnectionRouteId(conn.Host)}) } -func (c WshClient) Move(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { +func (c WshClient) MoveInternal(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { + if srcConn.Host != destConn.Host { + return fmt.Errorf("move internal, src and dest hosts do not match") + } if opts == nil { opts = &wshrpc.FileCopyOpts{} } @@ -156,7 +160,11 @@ func (c WshClient) Move(ctx context.Context, srcConn, destConn *connparse.Connec return wshclient.RemoteFileMoveCommand(RpcClient, wshrpc.CommandRemoteFileCopyData{SrcUri: srcConn.GetFullURI(), DestUri: destConn.GetFullURI(), Opts: opts}, &wshrpc.RpcOpts{Route: wshutil.MakeConnectionRouteId(destConn.Host), Timeout: timeout}) } -func (c WshClient) Copy(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { +func (c WshClient) CopyRemote(ctx context.Context, srcConn, destConn *connparse.Connection, _ fstype.FileShareClient, opts *wshrpc.FileCopyOpts) error { + return c.CopyInternal(ctx, srcConn, destConn, opts) +} + +func (c WshClient) CopyInternal(ctx context.Context, srcConn, destConn *connparse.Connection, opts *wshrpc.FileCopyOpts) error { if opts == nil { opts = &wshrpc.FileCopyOpts{} } @@ -167,8 +175,8 @@ func (c WshClient) Copy(ctx context.Context, srcConn, destConn *connparse.Connec return wshclient.RemoteFileCopyCommand(RpcClient, wshrpc.CommandRemoteFileCopyData{SrcUri: srcConn.GetFullURI(), DestUri: destConn.GetFullURI(), Opts: opts}, &wshrpc.RpcOpts{Route: wshutil.MakeConnectionRouteId(destConn.Host), Timeout: timeout}) } -func (c WshClient) Delete(ctx context.Context, conn *connparse.Connection) error { - return wshclient.RemoteFileDeleteCommand(RpcClient, conn.Path, &wshrpc.RpcOpts{Route: wshutil.MakeConnectionRouteId(conn.Host)}) +func (c WshClient) Delete(ctx context.Context, conn *connparse.Connection, recursive bool) error { + return wshclient.RemoteFileDeleteCommand(RpcClient, wshrpc.CommandDeleteFileData{Path: conn.Path, Recursive: recursive}, &wshrpc.RpcOpts{Route: wshutil.MakeConnectionRouteId(conn.Host)}) } func (c WshClient) Join(ctx context.Context, conn *connparse.Connection, parts ...string) (string, error) { diff --git a/pkg/util/fileutil/fileutil.go b/pkg/util/fileutil/fileutil.go index b5bbfbb1b..18bb538d6 100644 --- a/pkg/util/fileutil/fileutil.go +++ b/pkg/util/fileutil/fileutil.go @@ -6,27 +6,27 @@ package fileutil import ( "io" "io/fs" - "log" "mime" "net/http" "os" "path/filepath" "regexp" "strings" + "time" "github.com/wavetermdev/waveterm/pkg/wavebase" + "github.com/wavetermdev/waveterm/pkg/wshrpc" ) func FixPath(path string) (string, error) { + var err error if strings.HasPrefix(path, "~") { path = filepath.Join(wavebase.GetHomeDir(), path[1:]) } else if !filepath.IsAbs(path) { - log.Printf("FixPath: path is not absolute: %s", path) - path, err := filepath.Abs(path) + path, err = filepath.Abs(path) if err != nil { return "", err } - log.Printf("FixPath: fixed path: %s", path) } return path, nil } @@ -164,3 +164,52 @@ func IsInitScriptPath(input string) bool { return true } + +type FsFileInfo struct { + NameInternal string + ModeInternal os.FileMode + SizeInternal int64 + ModTimeInternal int64 + IsDirInternal bool +} + +func (f FsFileInfo) Name() string { + return f.NameInternal +} + +func (f FsFileInfo) Size() int64 { + return f.SizeInternal +} + +func (f FsFileInfo) Mode() os.FileMode { + return f.ModeInternal +} + +func (f FsFileInfo) ModTime() time.Time { + return time.Unix(0, f.ModTimeInternal) +} + +func (f FsFileInfo) IsDir() bool { + return f.IsDirInternal +} + +func (f FsFileInfo) Sys() interface{} { + return nil +} + +var _ fs.FileInfo = FsFileInfo{} + +// ToFsFileInfo converts wshrpc.FileInfo to FsFileInfo. +// It panics if fi is nil. +func ToFsFileInfo(fi *wshrpc.FileInfo) FsFileInfo { + if fi == nil { + panic("ToFsFileInfo: nil FileInfo") + } + return FsFileInfo{ + NameInternal: fi.Name, + ModeInternal: fi.Mode, + SizeInternal: fi.Size, + ModTimeInternal: fi.ModTime, + IsDirInternal: fi.IsDir, + } +} diff --git a/pkg/util/iochan/iochan.go b/pkg/util/iochan/iochan.go index 4145837fe..98fb94a19 100644 --- a/pkg/util/iochan/iochan.go +++ b/pkg/util/iochan/iochan.go @@ -5,46 +5,49 @@ package iochan import ( + "bytes" "context" + "crypto/sha256" "errors" "fmt" "io" - "log" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" "github.com/wavetermdev/waveterm/pkg/wshrpc" "github.com/wavetermdev/waveterm/pkg/wshutil" ) // ReaderChan reads from an io.Reader and sends the data to a channel -func ReaderChan(ctx context.Context, r io.Reader, chunkSize int64, callback func()) chan wshrpc.RespOrErrorUnion[[]byte] { - ch := make(chan wshrpc.RespOrErrorUnion[[]byte], 32) +func ReaderChan(ctx context.Context, r io.Reader, chunkSize int64, callback func()) chan wshrpc.RespOrErrorUnion[iochantypes.Packet] { + ch := make(chan wshrpc.RespOrErrorUnion[iochantypes.Packet], 32) go func() { defer func() { - log.Printf("ReaderChan: closing channel") close(ch) callback() }() - buf := make([]byte, chunkSize) + sha256Hash := sha256.New() for { select { case <-ctx.Done(): if ctx.Err() == context.Canceled { return } - log.Printf("ReaderChan: context error: %v", ctx.Err()) return default: + buf := make([]byte, chunkSize) if n, err := r.Read(buf); err != nil { if errors.Is(err, io.EOF) { - log.Printf("ReaderChan: EOF") + ch <- wshrpc.RespOrErrorUnion[iochantypes.Packet]{Response: iochantypes.Packet{Checksum: sha256Hash.Sum(nil)}} // send the checksum return } - ch <- wshutil.RespErr[[]byte](fmt.Errorf("ReaderChan: read error: %v", err)) - log.Printf("ReaderChan: read error: %v", err) + ch <- wshutil.RespErr[iochantypes.Packet](fmt.Errorf("ReaderChan: read error: %v", err)) return } else if n > 0 { - // log.Printf("ReaderChan: read %d bytes", n) - ch <- wshrpc.RespOrErrorUnion[[]byte]{Response: buf[:n]} + if _, err := sha256Hash.Write(buf[:n]); err != nil { + ch <- wshutil.RespErr[iochantypes.Packet](fmt.Errorf("ReaderChan: error writing to sha256 hash: %v", err)) + return + } + ch <- wshrpc.RespOrErrorUnion[iochantypes.Packet]{Response: iochantypes.Packet{Data: buf[:n]}} } } } @@ -53,13 +56,15 @@ func ReaderChan(ctx context.Context, r io.Reader, chunkSize int64, callback func } // WriterChan reads from a channel and writes the data to an io.Writer -func WriterChan(ctx context.Context, w io.Writer, ch <-chan wshrpc.RespOrErrorUnion[[]byte], callback func(), errCallback func(error)) { +func WriterChan(ctx context.Context, w io.Writer, ch <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet], callback func(), cancel context.CancelCauseFunc) { go func() { defer func() { - log.Printf("WriterChan: closing channel") + if ctx.Err() != nil { + drainChannel(ch) + } callback() - drainChannel(ch) }() + sha256Hash := sha256.New() for { select { case <-ctx.Done(): @@ -69,22 +74,33 @@ func WriterChan(ctx context.Context, w io.Writer, ch <-chan wshrpc.RespOrErrorUn return } if resp.Error != nil { - log.Printf("WriterChan: error: %v", resp.Error) - errCallback(resp.Error) + cancel(resp.Error) return } - if _, err := w.Write(resp.Response); err != nil { - log.Printf("WriterChan: write error: %v", err) - errCallback(err) + if _, err := sha256Hash.Write(resp.Response.Data); err != nil { + cancel(fmt.Errorf("WriterChan: error writing to sha256 hash: %v", err)) + return + } + // The checksum is sent as the last packet + if resp.Response.Checksum != nil { + localChecksum := sha256Hash.Sum(nil) + if !bytes.Equal(localChecksum, resp.Response.Checksum) { + cancel(fmt.Errorf("WriterChan: checksum mismatch")) + } + return + } + if _, err := w.Write(resp.Response.Data); err != nil { + cancel(fmt.Errorf("WriterChan: write error: %v", err)) return - } else { - // log.Printf("WriterChan: wrote %d bytes", n) } } } }() } -func drainChannel(ch <-chan wshrpc.RespOrErrorUnion[[]byte]) { - for range ch {} +func drainChannel(ch <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet]) { + go func() { + for range ch { + } + }() } diff --git a/pkg/util/iochan/iochantypes/iochantypes.go b/pkg/util/iochan/iochantypes/iochantypes.go new file mode 100644 index 000000000..00ea42b0b --- /dev/null +++ b/pkg/util/iochan/iochantypes/iochantypes.go @@ -0,0 +1,6 @@ +package iochantypes + +type Packet struct { + Data []byte + Checksum []byte +} diff --git a/pkg/util/tarcopy/tarcopy.go b/pkg/util/tarcopy/tarcopy.go new file mode 100644 index 000000000..825ac2b31 --- /dev/null +++ b/pkg/util/tarcopy/tarcopy.go @@ -0,0 +1,137 @@ +// Copyright 2025, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Package tarcopy provides functions for copying files over a channel via a tar stream. +package tarcopy + +import ( + "archive/tar" + "context" + "errors" + "fmt" + "io" + "io/fs" + "log" + "path/filepath" + "strings" + "time" + + "github.com/wavetermdev/waveterm/pkg/util/iochan" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" + "github.com/wavetermdev/waveterm/pkg/wshrpc" +) + +const ( + maxRetries = 5 + retryDelay = 10 * time.Millisecond + tarCopySrcName = "TarCopySrc" + tarCopyDestName = "TarCopyDest" + pipeReaderName = "pipe reader" + pipeWriterName = "pipe writer" + tarWriterName = "tar writer" +) + +// TarCopySrc creates a tar stream writer and returns a channel to send the tar stream to. +// writeHeader is a function that writes the tar header for the file. +// writer is the tar writer to write the file data to. +// close is a function that closes the tar writer and internal pipe writer. +func TarCopySrc(ctx context.Context, pathPrefix string) (outputChan chan wshrpc.RespOrErrorUnion[iochantypes.Packet], writeHeader func(fi fs.FileInfo, file string) error, writer io.Writer, close func()) { + pipeReader, pipeWriter := io.Pipe() + tarWriter := tar.NewWriter(pipeWriter) + rtnChan := iochan.ReaderChan(ctx, pipeReader, wshrpc.FileChunkSize, func() { + gracefulClose(pipeReader, tarCopySrcName, pipeReaderName) + }) + + return rtnChan, func(fi fs.FileInfo, file string) error { + // generate tar header + header, err := tar.FileInfoHeader(fi, file) + if err != nil { + return err + } + + header.Name = filepath.Clean(strings.TrimPrefix(file, pathPrefix)) + if err := validatePath(header.Name); err != nil { + return err + } + + // write header + if err := tarWriter.WriteHeader(header); err != nil { + return err + } + return nil + }, tarWriter, func() { + gracefulClose(tarWriter, tarCopySrcName, tarWriterName) + gracefulClose(pipeWriter, tarCopySrcName, pipeWriterName) + } +} + +func validatePath(path string) error { + if strings.Contains(path, "..") { + return fmt.Errorf("invalid tar path containing directory traversal: %s", path) + } + if strings.HasPrefix(path, "/") { + return fmt.Errorf("invalid tar path starting with /: %s", path) + } + return nil +} + +// TarCopyDest reads a tar stream from a channel and writes the files to the destination. +// readNext is a function that is called for each file in the tar stream to read the file data. It should return an error if the file cannot be read. +// The function returns an error if the tar stream cannot be read. +func TarCopyDest(ctx context.Context, cancel context.CancelCauseFunc, ch <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet], readNext func(next *tar.Header, reader *tar.Reader) error) error { + pipeReader, pipeWriter := io.Pipe() + iochan.WriterChan(ctx, pipeWriter, ch, func() { + gracefulClose(pipeWriter, tarCopyDestName, pipeWriterName) + cancel(nil) + }, cancel) + tarReader := tar.NewReader(pipeReader) + defer func() { + if !gracefulClose(pipeReader, tarCopyDestName, pipeReaderName) { + // If the pipe reader cannot be closed, cancel the context. This should kill the writer goroutine. + cancel(nil) + } + }() + for { + select { + case <-ctx.Done(): + if ctx.Err() != nil { + return context.Cause(ctx) + } + return nil + default: + next, err := tarReader.Next() + if err != nil { + // Do one more check for context error before returning + if ctx.Err() != nil { + return context.Cause(ctx) + } + if errors.Is(err, io.EOF) { + return nil + } else { + return err + } + } + err = readNext(next, tarReader) + if err != nil { + return err + } + } + } +} + +func gracefulClose(closer io.Closer, debugName string, closerName string) bool { + closed := false + for retries := 0; retries < maxRetries; retries++ { + if err := closer.Close(); err != nil { + log.Printf("%s: error closing %s: %v, trying again in %dms\n", debugName, closerName, err, retryDelay.Milliseconds()) + time.Sleep(retryDelay) + continue + } + closed = true + break + } + if !closed { + log.Printf("%s: unable to close %s after %d retries\n", debugName, closerName, maxRetries) + } + return closed +} diff --git a/pkg/web/web.go b/pkg/web/web.go index 35d9445c6..6cc1f999b 100644 --- a/pkg/web/web.go +++ b/pkg/web/web.go @@ -243,11 +243,12 @@ func handleLocalStreamFile(w http.ResponseWriter, r *http.Request, path string, } } -func handleRemoteStreamFile(w http.ResponseWriter, _ *http.Request, conn string, path string, no404 bool) error { +func handleRemoteStreamFile(w http.ResponseWriter, req *http.Request, conn string, path string, no404 bool) error { client := wshserver.GetMainRpcClient() streamFileData := wshrpc.CommandRemoteStreamFileData{Path: path} route := wshutil.MakeConnectionRouteId(conn) - rtnCh := wshclient.RemoteStreamFileCommand(client, streamFileData, &wshrpc.RpcOpts{Route: route}) + rpcOpts := &wshrpc.RpcOpts{Route: route, Timeout: 60 * 1000} + rtnCh := wshclient.RemoteStreamFileCommand(client, streamFileData, rpcOpts) firstPk := true var fileInfo *wshrpc.FileInfo loopDone := false @@ -261,45 +262,54 @@ func handleRemoteStreamFile(w http.ResponseWriter, _ *http.Request, conn string, } }() }() - for respUnion := range rtnCh { - if respUnion.Error != nil { - return respUnion.Error - } - if firstPk { - firstPk = false - if respUnion.Response.Info == nil { - return fmt.Errorf("stream file protocol error, fileinfo is empty") + ctx := req.Context() + for { + select { + case <-ctx.Done(): + rpcOpts.StreamCancelFn() + return ctx.Err() + case respUnion, ok := <-rtnCh: + if !ok { + loopDone = true + return nil + } + if respUnion.Error != nil { + return respUnion.Error } - fileInfo = respUnion.Response.Info - if fileInfo.NotFound { - if no404 { - serveTransparentGIF(w) - return nil - } else { - return fmt.Errorf("file not found: %q", path) + if firstPk { + firstPk = false + if respUnion.Response.Info == nil { + return fmt.Errorf("stream file protocol error, fileinfo is empty") + } + fileInfo = respUnion.Response.Info + if fileInfo.NotFound { + if no404 { + serveTransparentGIF(w) + return nil + } else { + return fmt.Errorf("file not found: %q", path) + } + } + if fileInfo.IsDir { + return fmt.Errorf("cannot stream directory: %q", path) } + w.Header().Set(ContentTypeHeaderKey, fileInfo.MimeType) + w.Header().Set(ContentLengthHeaderKey, fmt.Sprintf("%d", fileInfo.Size)) + continue } - if fileInfo.IsDir { - return fmt.Errorf("cannot stream directory: %q", path) + if respUnion.Response.Data64 == "" { + continue + } + decoder := base64.NewDecoder(base64.StdEncoding, bytes.NewReader([]byte(respUnion.Response.Data64))) + _, err := io.Copy(w, decoder) + if err != nil { + log.Printf("error streaming file %q: %v\n", path, err) + // not sure what to do here, the headers have already been sent. + // just return + return nil } - w.Header().Set(ContentTypeHeaderKey, fileInfo.MimeType) - w.Header().Set(ContentLengthHeaderKey, fmt.Sprintf("%d", fileInfo.Size)) - continue - } - if respUnion.Response.Data64 == "" { - continue - } - decoder := base64.NewDecoder(base64.StdEncoding, bytes.NewReader([]byte(respUnion.Response.Data64))) - _, err := io.Copy(w, decoder) - if err != nil { - log.Printf("error streaming file %q: %v\n", path, err) - // not sure what to do here, the headers have already been sent. - // just return - return nil } } - loopDone = true - return nil } func handleStreamFile(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/wshrpc/wshclient/wshclient.go b/pkg/wshrpc/wshclient/wshclient.go index 2480484ec..599cd79c5 100644 --- a/pkg/wshrpc/wshclient/wshclient.go +++ b/pkg/wshrpc/wshclient/wshclient.go @@ -12,6 +12,7 @@ import ( "github.com/wavetermdev/waveterm/pkg/waveobj" "github.com/wavetermdev/waveterm/pkg/wps" "github.com/wavetermdev/waveterm/pkg/vdom" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" ) // command "activity", wshserver.ActivityCommand @@ -207,7 +208,7 @@ func FileCreateCommand(w *wshutil.WshRpc, data wshrpc.FileData, opts *wshrpc.Rpc } // command "filedelete", wshserver.FileDeleteCommand -func FileDeleteCommand(w *wshutil.WshRpc, data wshrpc.FileData, opts *wshrpc.RpcOpts) error { +func FileDeleteCommand(w *wshutil.WshRpc, data wshrpc.CommandDeleteFileData, opts *wshrpc.RpcOpts) error { _, err := sendRpcRequestCallHelper[any](w, "filedelete", data, opts) return err } @@ -248,8 +249,8 @@ func FileReadCommand(w *wshutil.WshRpc, data wshrpc.FileData, opts *wshrpc.RpcOp } // command "filestreamtar", wshserver.FileStreamTarCommand -func FileStreamTarCommand(w *wshutil.WshRpc, data wshrpc.CommandRemoteStreamTarData, opts *wshrpc.RpcOpts) chan wshrpc.RespOrErrorUnion[[]uint8] { - return sendRpcRequestResponseStreamHelper[[]uint8](w, "filestreamtar", data, opts) +func FileStreamTarCommand(w *wshutil.WshRpc, data wshrpc.CommandRemoteStreamTarData, opts *wshrpc.RpcOpts) chan wshrpc.RespOrErrorUnion[iochantypes.Packet] { + return sendRpcRequestResponseStreamHelper[iochantypes.Packet](w, "filestreamtar", data, opts) } // command "filewrite", wshserver.FileWriteCommand @@ -313,7 +314,7 @@ func RemoteFileCopyCommand(w *wshutil.WshRpc, data wshrpc.CommandRemoteFileCopyD } // command "remotefiledelete", wshserver.RemoteFileDeleteCommand -func RemoteFileDeleteCommand(w *wshutil.WshRpc, data string, opts *wshrpc.RpcOpts) error { +func RemoteFileDeleteCommand(w *wshutil.WshRpc, data wshrpc.CommandDeleteFileData, opts *wshrpc.RpcOpts) error { _, err := sendRpcRequestCallHelper[any](w, "remotefiledelete", data, opts) return err } @@ -376,8 +377,8 @@ func RemoteStreamFileCommand(w *wshutil.WshRpc, data wshrpc.CommandRemoteStreamF } // command "remotetarstream", wshserver.RemoteTarStreamCommand -func RemoteTarStreamCommand(w *wshutil.WshRpc, data wshrpc.CommandRemoteStreamTarData, opts *wshrpc.RpcOpts) chan wshrpc.RespOrErrorUnion[[]uint8] { - return sendRpcRequestResponseStreamHelper[[]uint8](w, "remotetarstream", data, opts) +func RemoteTarStreamCommand(w *wshutil.WshRpc, data wshrpc.CommandRemoteStreamTarData, opts *wshrpc.RpcOpts) chan wshrpc.RespOrErrorUnion[iochantypes.Packet] { + return sendRpcRequestResponseStreamHelper[iochantypes.Packet](w, "remotetarstream", data, opts) } // command "remotewritefile", wshserver.RemoteWriteFileCommand diff --git a/pkg/wshrpc/wshremote/wshremote.go b/pkg/wshrpc/wshremote/wshremote.go index df241dd26..f324f52fe 100644 --- a/pkg/wshrpc/wshremote/wshremote.go +++ b/pkg/wshrpc/wshremote/wshremote.go @@ -18,14 +18,21 @@ import ( "time" "github.com/wavetermdev/waveterm/pkg/remote/connparse" + "github.com/wavetermdev/waveterm/pkg/remote/fileshare/wshfs" "github.com/wavetermdev/waveterm/pkg/util/fileutil" - "github.com/wavetermdev/waveterm/pkg/util/iochan" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" + "github.com/wavetermdev/waveterm/pkg/util/tarcopy" "github.com/wavetermdev/waveterm/pkg/util/utilfn" "github.com/wavetermdev/waveterm/pkg/wavebase" "github.com/wavetermdev/waveterm/pkg/wshrpc" + "github.com/wavetermdev/waveterm/pkg/wshrpc/wshclient" "github.com/wavetermdev/waveterm/pkg/wshutil" ) +const ( + DefaultTimeout = 30 * time.Second +) + type ServerImpl struct { LogWriter io.Writer } @@ -190,9 +197,6 @@ func (impl *ServerImpl) remoteStreamFileInternal(ctx context.Context, data wshrp if finfo.NotFound { return nil } - if finfo.Size > wshrpc.MaxFileSize { - return fmt.Errorf("file %q is too large to read, use /wave/stream-file", path) - } if finfo.IsDir { return impl.remoteStreamFileDir(ctx, path, byteRange, dataCallback) } else { @@ -220,7 +224,6 @@ func (impl *ServerImpl) RemoteStreamFileCommand(ctx context.Context, data wshrpc resp.Data64 = base64.StdEncoding.EncodeToString(data) resp.At = &wshrpc.FileDataAt{Offset: byteRange.Start, Size: len(data)} } - logPrintfDev("callback -- sending response %d\n", len(resp.Data64)) ch <- wshrpc.RespOrErrorUnion[wshrpc.FileData]{Response: resp} }) if err != nil { @@ -230,92 +233,83 @@ func (impl *ServerImpl) RemoteStreamFileCommand(ctx context.Context, data wshrpc return ch } -func (impl *ServerImpl) RemoteTarStreamCommand(ctx context.Context, data wshrpc.CommandRemoteStreamTarData) <-chan wshrpc.RespOrErrorUnion[[]byte] { +func (impl *ServerImpl) RemoteTarStreamCommand(ctx context.Context, data wshrpc.CommandRemoteStreamTarData) <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet] { path := data.Path opts := data.Opts if opts == nil { opts = &wshrpc.FileCopyOpts{} } recursive := opts.Recursive - log.Printf("RemoteTarStreamCommand: path=%s\n", path) + logPrintfDev("RemoteTarStreamCommand: path=%s\n", path) path, err := wavebase.ExpandHomeDir(path) if err != nil { - return wshutil.SendErrCh[[]byte](fmt.Errorf("cannot expand path %q: %w", path, err)) + return wshutil.SendErrCh[iochantypes.Packet](fmt.Errorf("cannot expand path %q: %w", path, err)) } cleanedPath := filepath.Clean(wavebase.ExpandHomeDirSafe(path)) finfo, err := os.Stat(cleanedPath) if err != nil { - return wshutil.SendErrCh[[]byte](fmt.Errorf("cannot stat file %q: %w", path, err)) - } - pipeReader, pipeWriter := io.Pipe() - tarWriter := tar.NewWriter(pipeWriter) - timeout := time.Millisecond * 100 - if opts.Timeout > 0 { - timeout = time.Duration(opts.Timeout) * time.Millisecond + return wshutil.SendErrCh[iochantypes.Packet](fmt.Errorf("cannot stat file %q: %w", path, err)) } - readerCtx, _ := context.WithTimeout(context.Background(), timeout) - rtn := iochan.ReaderChan(readerCtx, pipeReader, wshrpc.FileChunkSize, func() { - pipeReader.Close() - pipeWriter.Close() - }) var pathPrefix string if finfo.IsDir() && strings.HasSuffix(cleanedPath, "/") { pathPrefix = cleanedPath } else { - pathPrefix = filepath.Dir(cleanedPath) + pathPrefix = filepath.Dir(cleanedPath) + "/" } - go func() { - if readerCtx.Err() != nil { - return + if finfo.IsDir() { + if !recursive { + return wshutil.SendErrCh[iochantypes.Packet](fmt.Errorf("cannot create tar stream for %q: %w", path, errors.New("directory copy requires recursive option"))) } - defer tarWriter.Close() - logPrintfDev("creating tar stream for %q\n", path) - if finfo.IsDir() { - logPrintfDev("%q is a directory, recursive: %v\n", path, recursive) - if !recursive { - rtn <- wshutil.RespErr[[]byte](fmt.Errorf("cannot create tar stream for %q: %w", path, errors.New("directory copy requires recursive option"))) - return + } + + timeout := DefaultTimeout + if opts.Timeout > 0 { + timeout = time.Duration(opts.Timeout) * time.Millisecond + } + readerCtx, cancel := context.WithTimeout(ctx, timeout) + rtn, writeHeader, fileWriter, tarClose := tarcopy.TarCopySrc(readerCtx, pathPrefix) + + go func() { + defer func() { + tarClose() + cancel() + }() + walkFunc := func(path string, info fs.FileInfo, err error) error { + if readerCtx.Err() != nil { + return readerCtx.Err() } - } - err := filepath.Walk(path, func(file string, fi os.FileInfo, err error) error { - // generate tar header - header, err := tar.FileInfoHeader(fi, file) if err != nil { return err } - - header.Name = strings.TrimPrefix(file, pathPrefix) - if header.Name == "" { - return nil - } - - // write header - if err := tarWriter.WriteHeader(header); err != nil { + if err = writeHeader(info, path); err != nil { return err } // if not a dir, write file content - if !fi.IsDir() { - data, err := os.Open(file) + if !info.IsDir() { + data, err := os.Open(path) if err != nil { return err } - if n, err := io.Copy(tarWriter, data); err != nil { - log.Printf("error copying file %q: %v\n", file, err) + if _, err := io.Copy(fileWriter, data); err != nil { return err - } else { - logPrintfDev("wrote %d bytes to tar stream\n", n) } } - time.Sleep(time.Millisecond * 10) return nil - }) + } + log.Printf("RemoteTarStreamCommand: starting\n") + err = nil + if finfo.IsDir() { + err = filepath.Walk(path, walkFunc) + } else { + err = walkFunc(path, finfo, nil) + } if err != nil { - rtn <- wshutil.RespErr[[]byte](fmt.Errorf("cannot create tar stream for %q: %w", path, err)) + rtn <- wshutil.RespErr[iochantypes.Packet](err) } - logPrintfDev("returning tar stream\n") + log.Printf("RemoteTarStreamCommand: done\n") }() - logPrintfDev("returning channel\n") + log.Printf("RemoteTarStreamCommand: returning channel\n") return rtn } @@ -327,7 +321,7 @@ func (impl *ServerImpl) RemoteFileCopyCommand(ctx context.Context, data wshrpc.C } destUri := data.DestUri srcUri := data.SrcUri - // merge := opts.Merge + merge := opts.Merge overwrite := opts.Overwrite destConn, err := connparse.ParseURIAndReplaceCurrentHost(ctx, destUri) @@ -350,68 +344,46 @@ func (impl *ServerImpl) RemoteFileCopyCommand(ctx context.Context, data wshrpc.C } else if !errors.Is(err, fs.ErrNotExist) { return fmt.Errorf("cannot stat destination %q: %w", destPathCleaned, err) } - logPrintfDev("copying %q to %q\n", srcUri, destUri) srcConn, err := connparse.ParseURIAndReplaceCurrentHost(ctx, srcUri) if err != nil { return fmt.Errorf("cannot parse source URI %q: %w", srcUri, err) } if srcConn.Host == destConn.Host { - logPrintfDev("same host, copying file\n") srcPathCleaned := filepath.Clean(wavebase.ExpandHomeDirSafe(srcConn.Path)) err := os.Rename(srcPathCleaned, destPathCleaned) if err != nil { return fmt.Errorf("cannot copy file %q to %q: %w", srcPathCleaned, destPathCleaned, err) } } else { - return fmt.Errorf("cannot copy file %q to %q: source and destination must be on the same host", srcUri, destPathCleaned) - } - /* TODO: uncomment once ready for cross-connection copy - timeout := time.Millisecond * 100 - if opts.Timeout > 0 { - timeout = time.Duration(opts.Timeout) * time.Millisecond - } - readCtx, _ := context.WithTimeout(ctx, timeout) - readCtx, cancel := context.WithCancelCause(readCtx) - ioch := fileshare.ReadTarStream(readCtx, wshrpc.CommandRemoteStreamTarData{Path: srcUri, Opts: opts}) - pipeReader, pipeWriter := io.Pipe() - iochan.WriterChan(readCtx, pipeWriter, ioch, func() { - log.Printf("closing pipe writer\n") - pipeWriter.Close() - pipeReader.Close() - }, cancel) - defer cancel(nil) - tarReader := tar.NewReader(pipeReader) - for { - select { - case <-readCtx.Done(): - if readCtx.Err() != nil { - return context.Cause(readCtx) - } - return nil - default: - next, err := tarReader.Next() - if err != nil { - if errors.Is(err, io.EOF) { - // Do one more check for context error before returning - if readCtx.Err() != nil { - return context.Cause(readCtx) - } - return nil - } - return fmt.Errorf("cannot read tar stream: %w", err) - } + timeout := DefaultTimeout + if opts.Timeout > 0 { + timeout = time.Duration(opts.Timeout) * time.Millisecond + } + readCtx, cancel := context.WithCancelCause(ctx) + readCtx, timeoutCancel := context.WithTimeoutCause(readCtx, timeout, fmt.Errorf("timeout copying file %q to %q", srcUri, destUri)) + defer timeoutCancel() + copyStart := time.Now() + ioch := wshclient.FileStreamTarCommand(wshfs.RpcClient, wshrpc.CommandRemoteStreamTarData{Path: srcUri, Opts: opts}, &wshrpc.RpcOpts{Timeout: opts.Timeout}) + numFiles := 0 + numSkipped := 0 + totalBytes := int64(0) + err := tarcopy.TarCopyDest(readCtx, cancel, ioch, func(next *tar.Header, reader *tar.Reader) error { // Check for directory traversal if strings.Contains(next.Name, "..") { log.Printf("skipping file with unsafe path: %q\n", next.Name) - continue + numSkipped++ + return nil } + numFiles++ finfo := next.FileInfo() nextPath := filepath.Join(destPathCleaned, next.Name) destinfo, err = os.Stat(nextPath) if err != nil && !errors.Is(err, fs.ErrNotExist) { return fmt.Errorf("cannot stat file %q: %w", nextPath, err) } - log.Printf("new file: name %q; dest %q\n", next.Name, nextPath) + if !finfo.IsDir() { + totalBytes += finfo.Size() + } if destinfo != nil { if destinfo.IsDir() { @@ -444,16 +416,10 @@ func (impl *ServerImpl) RemoteFileCopyCommand(ctx context.Context, data wshrpc.C } } else if !overwrite { return fmt.Errorf("cannot create file %q, file exists at path, overwrite not specified", nextPath) - } else { - err := os.Remove(nextPath) - if err != nil { - return fmt.Errorf("cannot remove file %q: %w", nextPath, err) - } } } } else { if finfo.IsDir() { - log.Printf("creating directory %q\n", nextPath) err := os.MkdirAll(nextPath, finfo.Mode()) if err != nil { return fmt.Errorf("cannot create directory %q: %w", nextPath, err) @@ -463,20 +429,30 @@ func (impl *ServerImpl) RemoteFileCopyCommand(ctx context.Context, data wshrpc.C if err != nil { return fmt.Errorf("cannot create parent directory %q: %w", filepath.Dir(nextPath), err) } - file, err := os.Create(nextPath) + file, err := os.OpenFile(nextPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, finfo.Mode()) if err != nil { return fmt.Errorf("cannot create new file %q: %w", nextPath, err) } - _, err = io.Copy(file, tarReader) + _, err = io.Copy(file, reader) if err != nil { return fmt.Errorf("cannot write file %q: %w", nextPath, err) } - file.Chmod(finfo.Mode()) file.Close() } } + return nil + }) + if err != nil { + return fmt.Errorf("cannot copy %q to %q: %w", srcUri, destUri, err) + } + totalTime := time.Since(copyStart).Seconds() + totalMegaBytes := float64(totalBytes) / 1024 / 1024 + rate := float64(0) + if totalTime > 0 { + rate = totalMegaBytes / totalTime } - }*/ + log.Printf("RemoteFileCopyCommand: done; %d files copied in %.3fs, total of %.4f MB, %.2f MB/s, %d files skipped\n", numFiles, totalTime, totalMegaBytes, rate, numSkipped) + } return nil } @@ -696,22 +672,18 @@ func (impl *ServerImpl) RemoteFileMoveCommand(ctx context.Context, data wshrpc.C } else if !errors.Is(err, fs.ErrNotExist) { return fmt.Errorf("cannot stat destination %q: %w", destUri, err) } - logPrintfDev("moving %q to %q\n", srcUri, destUri) srcConn, err := connparse.ParseURIAndReplaceCurrentHost(ctx, srcUri) if err != nil { return fmt.Errorf("cannot parse source URI %q: %w", srcUri, err) } - logPrintfDev("source host: %q, destination host: %q\n", srcConn.Host, destConn.Host) if srcConn.Host == destConn.Host { - logPrintfDev("moving file on same host\n") srcPathCleaned := filepath.Clean(wavebase.ExpandHomeDirSafe(srcConn.Path)) - logPrintfDev("moving %q to %q\n", srcPathCleaned, destPathCleaned) err := os.Rename(srcPathCleaned, destPathCleaned) if err != nil { return fmt.Errorf("cannot move file %q to %q: %w", srcPathCleaned, destPathCleaned, err) } } else { - return fmt.Errorf("cannot move file %q to %q: source and destination must be on the same host", srcUri, destUri) + return fmt.Errorf("cannot move file %q to %q: different hosts", srcUri, destUri) } return nil } @@ -796,15 +768,27 @@ func (*ServerImpl) RemoteWriteFileCommand(ctx context.Context, data wshrpc.FileD return nil } -func (*ServerImpl) RemoteFileDeleteCommand(ctx context.Context, path string) error { - expandedPath, err := wavebase.ExpandHomeDir(path) +func (*ServerImpl) RemoteFileDeleteCommand(ctx context.Context, data wshrpc.CommandDeleteFileData) error { + expandedPath, err := wavebase.ExpandHomeDir(data.Path) if err != nil { - return fmt.Errorf("cannot delete file %q: %w", path, err) + return fmt.Errorf("cannot delete file %q: %w", data.Path, err) } cleanedPath := filepath.Clean(expandedPath) + err = os.Remove(cleanedPath) if err != nil { - return fmt.Errorf("cannot delete file %q: %w", path, err) + finfo, _ := os.Stat(cleanedPath) + if finfo != nil && finfo.IsDir() { + if !data.Recursive { + return fmt.Errorf("cannot delete directory %q, recursive option not specified", data.Path) + } + err = os.RemoveAll(cleanedPath) + if err != nil { + return fmt.Errorf("cannot delete directory %q: %w", data.Path, err) + } + } else { + return fmt.Errorf("cannot delete file %q: %w", data.Path, err) + } } return nil } diff --git a/pkg/wshrpc/wshrpctypes.go b/pkg/wshrpc/wshrpctypes.go index 7fc5121dc..06de27f5c 100644 --- a/pkg/wshrpc/wshrpctypes.go +++ b/pkg/wshrpc/wshrpctypes.go @@ -13,6 +13,7 @@ import ( "reflect" "github.com/wavetermdev/waveterm/pkg/ijson" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" "github.com/wavetermdev/waveterm/pkg/vdom" "github.com/wavetermdev/waveterm/pkg/waveobj" "github.com/wavetermdev/waveterm/pkg/wconfig" @@ -25,7 +26,7 @@ const ( // MaxDirSize is the maximum number of entries that can be read in a directory MaxDirSize = 1024 // FileChunkSize is the size of the file chunk to read - FileChunkSize = 16 * 1024 + FileChunkSize = 64 * 1024 // DirChunkSize is the size of the directory chunk to read DirChunkSize = 128 ) @@ -65,6 +66,7 @@ const ( Command_FileRead = "fileread" Command_FileMove = "filemove" Command_FileCopy = "filecopy" + Command_FileStreamTar = "filestreamtar" Command_EventPublish = "eventpublish" Command_EventRecv = "eventrecv" Command_EventSub = "eventsub" @@ -150,12 +152,12 @@ type WshRpcInterface interface { WaitForRouteCommand(ctx context.Context, data CommandWaitForRouteData) (bool, error) FileMkdirCommand(ctx context.Context, data FileData) error FileCreateCommand(ctx context.Context, data FileData) error - FileDeleteCommand(ctx context.Context, data FileData) error + FileDeleteCommand(ctx context.Context, data CommandDeleteFileData) error FileAppendCommand(ctx context.Context, data FileData) error FileAppendIJsonCommand(ctx context.Context, data CommandAppendIJsonData) error FileWriteCommand(ctx context.Context, data FileData) error FileReadCommand(ctx context.Context, data FileData) (*FileData, error) - FileStreamTarCommand(ctx context.Context, data CommandRemoteStreamTarData) <-chan RespOrErrorUnion[[]byte] + FileStreamTarCommand(ctx context.Context, data CommandRemoteStreamTarData) <-chan RespOrErrorUnion[iochantypes.Packet] FileMoveCommand(ctx context.Context, data CommandFileCopyData) error FileCopyCommand(ctx context.Context, data CommandFileCopyData) error FileInfoCommand(ctx context.Context, data FileData) (*FileInfo, error) @@ -199,13 +201,13 @@ type WshRpcInterface interface { // remotes RemoteStreamFileCommand(ctx context.Context, data CommandRemoteStreamFileData) chan RespOrErrorUnion[FileData] - RemoteTarStreamCommand(ctx context.Context, data CommandRemoteStreamTarData) <-chan RespOrErrorUnion[[]byte] + RemoteTarStreamCommand(ctx context.Context, data CommandRemoteStreamTarData) <-chan RespOrErrorUnion[iochantypes.Packet] RemoteFileCopyCommand(ctx context.Context, data CommandRemoteFileCopyData) error RemoteListEntriesCommand(ctx context.Context, data CommandRemoteListEntriesData) chan RespOrErrorUnion[CommandRemoteListEntriesRtnData] RemoteFileInfoCommand(ctx context.Context, path string) (*FileInfo, error) RemoteFileTouchCommand(ctx context.Context, path string) error RemoteFileMoveCommand(ctx context.Context, data CommandRemoteFileCopyData) error - RemoteFileDeleteCommand(ctx context.Context, path string) error + RemoteFileDeleteCommand(ctx context.Context, data CommandDeleteFileData) error RemoteWriteFileCommand(ctx context.Context, data FileData) error RemoteFileJoinCommand(ctx context.Context, paths []string) (*FileInfo, error) RemoteMkdirCommand(ctx context.Context, path string) error @@ -498,6 +500,11 @@ type CpuDataType struct { Value float64 `json:"value"` } +type CommandDeleteFileData struct { + Path string `json:"path"` + Recursive bool `json:"recursive"` +} + type CommandFileCopyData struct { SrcUri string `json:"srcuri"` DestUri string `json:"desturi"` diff --git a/pkg/wshrpc/wshserver/wshserver.go b/pkg/wshrpc/wshserver/wshserver.go index fd575872b..ff403cd73 100644 --- a/pkg/wshrpc/wshserver/wshserver.go +++ b/pkg/wshrpc/wshserver/wshserver.go @@ -28,6 +28,7 @@ import ( "github.com/wavetermdev/waveterm/pkg/remote/fileshare" "github.com/wavetermdev/waveterm/pkg/telemetry" "github.com/wavetermdev/waveterm/pkg/util/envutil" + "github.com/wavetermdev/waveterm/pkg/util/iochan/iochantypes" "github.com/wavetermdev/waveterm/pkg/util/shellutil" "github.com/wavetermdev/waveterm/pkg/util/utilfn" "github.com/wavetermdev/waveterm/pkg/util/wavefileutil" @@ -307,8 +308,8 @@ func (ws *WshServer) FileMkdirCommand(ctx context.Context, data wshrpc.FileData) return fileshare.Mkdir(ctx, data.Info.Path) } -func (ws *WshServer) FileDeleteCommand(ctx context.Context, data wshrpc.FileData) error { - return fileshare.Delete(ctx, data.Info.Path) +func (ws *WshServer) FileDeleteCommand(ctx context.Context, data wshrpc.CommandDeleteFileData) error { + return fileshare.Delete(ctx, data) } func (ws *WshServer) FileInfoCommand(ctx context.Context, data wshrpc.FileData) (*wshrpc.FileInfo, error) { @@ -339,7 +340,7 @@ func (ws *WshServer) FileMoveCommand(ctx context.Context, data wshrpc.CommandFil return fileshare.Move(ctx, data) } -func (ws *WshServer) FileStreamTarCommand(ctx context.Context, data wshrpc.CommandRemoteStreamTarData) <-chan wshrpc.RespOrErrorUnion[[]byte] { +func (ws *WshServer) FileStreamTarCommand(ctx context.Context, data wshrpc.CommandRemoteStreamTarData) <-chan wshrpc.RespOrErrorUnion[iochantypes.Packet] { return fileshare.ReadTarStream(ctx, data) } diff --git a/pkg/wshutil/wshrpcio.go b/pkg/wshutil/wshrpcio.go index 67dbe48d6..9aa5f1609 100644 --- a/pkg/wshutil/wshrpcio.go +++ b/pkg/wshutil/wshrpcio.go @@ -22,12 +22,23 @@ func AdaptStreamToMsgCh(input io.Reader, output chan []byte) error { } func AdaptOutputChToStream(outputCh chan []byte, output io.Writer) error { + drain := false + defer func() { + if drain { + go func() { + for range outputCh { + } + }() + } + }() for msg := range outputCh { if _, err := output.Write(msg); err != nil { + drain = true return fmt.Errorf("error writing to output (AdaptOutputChToStream): %w", err) } // write trailing newline if _, err := output.Write([]byte{'\n'}); err != nil { + drain = true return fmt.Errorf("error writing trailing newline to output (AdaptOutputChToStream): %w", err) } } diff --git a/pkg/wshutil/wshutil.go b/pkg/wshutil/wshutil.go index 871fd72d1..17a422eeb 100644 --- a/pkg/wshutil/wshutil.go +++ b/pkg/wshutil/wshutil.go @@ -484,6 +484,8 @@ func handleDomainSocketClient(conn net.Conn) { }() defer func() { conn.Close() + close(proxy.FromRemoteCh) + close(proxy.ToRemoteCh) routeIdPtr := routeIdContainer.Load() if routeIdPtr != nil && *routeIdPtr != "" { DefaultRouter.UnregisterRoute(*routeIdPtr) From 3b0251f858ce784a6b9409e2089e9b95408ccbb0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:42:59 -0800 Subject: [PATCH 04/17] Bump electron from 34.0.1 to 34.0.2 in the electron-patch group (#1890) Bumps the electron-patch group with 1 update: [electron](https://github.com/electron/electron). Updates `electron` from 34.0.1 to 34.0.2
Release notes

Sourced from electron's releases.

electron v34.0.2

Release Notes for v34.0.2

Fixes

  • Fixed a crash when calling shell.readShortcutLink caused by PKEY_AppUserModel_ToastActivatorCLSID sometimes being represented by a string uuid. #45350 (Also in 33)
  • Fixed a potential crash in chrome.tabs.update(). #45304 (Also in 33, 35)
  • Fixed an issue where print scaling could be too small during silent print. #45283 (Also in 35)
  • Fixed crash in gin::wrappable::secondweakcallback. #45376

Other Changes

  • Updated Chromium to 132.0.6834.159. #45313
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=electron&package-manager=npm_and_yarn&previous-version=34.0.1&new-version=34.0.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 1383fc024..83cf04825 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@types/ws": "^8", "@vitejs/plugin-react-swc": "^3.7.2", "@vitest/coverage-istanbul": "^3.0.4", - "electron": "^34.0.1", + "electron": "^34.0.2", "electron-builder": "^25.1.8", "electron-vite": "^2.3.0", "eslint": "^9.18.0", diff --git a/yarn.lock b/yarn.lock index bf3a869af..91bf257a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10169,16 +10169,16 @@ __metadata: languageName: node linkType: hard -"electron@npm:^34.0.1": - version: 34.0.1 - resolution: "electron@npm:34.0.1" +"electron@npm:^34.0.2": + version: 34.0.2 + resolution: "electron@npm:34.0.2" dependencies: "@electron/get": "npm:^2.0.0" "@types/node": "npm:^20.9.0" extract-zip: "npm:^2.0.1" bin: electron: cli.js - checksum: 10c0/0a63edd57633edac8e4f4d1310dbb82ac01287f1f9113a18cef310dfef7f266ef8be98eda7d01890e23b37d03f36811bbac0fe5c4e0a27c9f3719ba3b7841f83 + checksum: 10c0/c1708b7a01a1490fb9162823a95b4ebdcae237c624c4f9836fc9cb6bde063a650422f2219eb56a38ca1e8e50f0d178961c2224879cf0dc334f9e9891e85e817d languageName: node linkType: hard @@ -21684,7 +21684,7 @@ __metadata: css-tree: "npm:^3.0.1" dayjs: "npm:^1.11.13" debug: "npm:^4.3.7" - electron: "npm:^34.0.1" + electron: "npm:^34.0.2" electron-builder: "npm:^25.1.8" electron-updater: "npm:6.3.9" electron-vite: "npm:^2.3.0" From 5b9d6f7ccc74292a062a133544eeb2d9c8aa4c75 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:43:15 -0800 Subject: [PATCH 05/17] Bump the storybook-patch group with 10 updates (#1889) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the storybook-patch group with 10 updates: | Package | From | To | | --- | --- | --- | | [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials) | `8.5.1` | `8.5.2` | | [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions) | `8.5.1` | `8.5.2` | | [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links) | `8.5.1` | `8.5.2` | | [@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks) | `8.5.1` | `8.5.2` | | [@storybook/builder-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/builders/builder-vite) | `8.5.1` | `8.5.2` | | [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react) | `8.5.1` | `8.5.2` | | [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite) | `8.5.1` | `8.5.2` | | [@storybook/test](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/test) | `8.5.1` | `8.5.2` | | [@storybook/theming](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/theming) | `8.5.1` | `8.5.2` | | [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli) | `8.5.1` | `8.5.2` | Updates `@storybook/addon-essentials` from 8.5.1 to 8.5.2
Release notes

Sourced from @​storybook/addon-essentials's releases.

v8.5.2

8.5.2

Changelog

Sourced from @​storybook/addon-essentials's changelog.

8.5.2

Commits

Updates `@storybook/addon-interactions` from 8.5.1 to 8.5.2
Release notes

Sourced from @​storybook/addon-interactions's releases.

v8.5.2

8.5.2

Changelog

Sourced from @​storybook/addon-interactions's changelog.

8.5.2

Commits

Updates `@storybook/addon-links` from 8.5.1 to 8.5.2
Release notes

Sourced from @​storybook/addon-links's releases.

v8.5.2

8.5.2

Changelog

Sourced from @​storybook/addon-links's changelog.

8.5.2

Commits

Updates `@storybook/blocks` from 8.5.1 to 8.5.2
Release notes

Sourced from @​storybook/blocks's releases.

v8.5.2

8.5.2

Changelog

Sourced from @​storybook/blocks's changelog.

8.5.2

Commits

Updates `@storybook/builder-vite` from 8.5.1 to 8.5.2
Release notes

Sourced from @​storybook/builder-vite's releases.

v8.5.2

8.5.2

Changelog

Sourced from @​storybook/builder-vite's changelog.

8.5.2

Commits

Updates `@storybook/react` from 8.5.1 to 8.5.2
Release notes

Sourced from @​storybook/react's releases.

v8.5.2

8.5.2

Changelog

Sourced from @​storybook/react's changelog.

8.5.2

Commits

Updates `@storybook/react-vite` from 8.5.1 to 8.5.2
Release notes

Sourced from @​storybook/react-vite's releases.

v8.5.2

8.5.2

Changelog

Sourced from @​storybook/react-vite's changelog.

8.5.2

Commits

Updates `@storybook/test` from 8.5.1 to 8.5.2
Release notes

Sourced from @​storybook/test's releases.

v8.5.2

8.5.2

Changelog

Sourced from @​storybook/test's changelog.

8.5.2

Commits

Updates `@storybook/theming` from 8.5.1 to 8.5.2
Release notes

Sourced from @​storybook/theming's releases.

v8.5.2

8.5.2

Commits

Updates `storybook` from 8.5.1 to 8.5.2
Release notes

Sourced from storybook's releases.

v8.5.2

8.5.2

Changelog

Sourced from storybook's changelog.

8.5.2

Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 20 ++-- yarn.lock | 320 +++++++++++++++++++++++++-------------------------- 2 files changed, 170 insertions(+), 170 deletions(-) diff --git a/package.json b/package.json index 83cf04825..5354a60d0 100644 --- a/package.json +++ b/package.json @@ -30,15 +30,15 @@ "@chromatic-com/storybook": "^3.2.4", "@eslint/js": "^9.18.0", "@rollup/plugin-node-resolve": "^16.0.0", - "@storybook/addon-essentials": "^8.5.1", - "@storybook/addon-interactions": "^8.5.1", - "@storybook/addon-links": "^8.5.1", - "@storybook/blocks": "^8.5.1", - "@storybook/builder-vite": "^8.5.1", - "@storybook/react": "^8.5.1", - "@storybook/react-vite": "^8.5.1", - "@storybook/test": "^8.5.1", - "@storybook/theming": "^8.5.1", + "@storybook/addon-essentials": "^8.5.2", + "@storybook/addon-interactions": "^8.5.2", + "@storybook/addon-links": "^8.5.2", + "@storybook/blocks": "^8.5.2", + "@storybook/builder-vite": "^8.5.2", + "@storybook/react": "^8.5.2", + "@storybook/react-vite": "^8.5.2", + "@storybook/test": "^8.5.2", + "@storybook/theming": "^8.5.2", "@types/color": "^4.2.0", "@types/css-tree": "^2", "@types/debug": "^4", @@ -69,7 +69,7 @@ "rollup-plugin-flow": "^1.1.1", "sass": "^1.83.4", "semver": "^7.6.3", - "storybook": "^8.5.1", + "storybook": "^8.5.2", "storybook-dark-mode": "^4.0.2", "ts-node": "^10.9.2", "tslib": "^2.8.1", diff --git a/yarn.lock b/yarn.lock index 91bf257a1..a31e74017 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4824,9 +4824,9 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-actions@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-actions@npm:8.5.1" +"@storybook/addon-actions@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-actions@npm:8.5.2" dependencies: "@storybook/global": "npm:^5.0.0" "@types/uuid": "npm:^9.0.1" @@ -4834,164 +4834,164 @@ __metadata: polished: "npm:^4.2.2" uuid: "npm:^9.0.0" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/f3b704e962e5b409f48876001889d896a9a611ecb2f9249bb8fa40cb78b30f63b478210fd191f6f2cbebdf7bfc6b54cb23551723861a2a3efc0430f357e1f051 + storybook: ^8.5.2 + checksum: 10c0/d509b0d2b46ef9f6b96363b54198d7ac5176b45886e0c3c0109560dc6fd6e249782f3e056f42eb474870090b88ebfac61b1d70763b073d9406a4b8762852e756 languageName: node linkType: hard -"@storybook/addon-backgrounds@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-backgrounds@npm:8.5.1" +"@storybook/addon-backgrounds@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-backgrounds@npm:8.5.2" dependencies: "@storybook/global": "npm:^5.0.0" memoizerific: "npm:^1.11.3" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/085e442750a8bd0036cf050211128616ae6258434f88cec3352bf2c85dc7cd00e5bb008d3e7472d3121d25565ffd2e94140e93dda4b155fb26f1a53b54564242 + storybook: ^8.5.2 + checksum: 10c0/7161b498542f911071ffbb66aab8c9281fae72daba23836a3ed174363b3933d20d08f7dac483d801f9368efaa8e5d253b53b26999a47422a9bac984764e1bedb languageName: node linkType: hard -"@storybook/addon-controls@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-controls@npm:8.5.1" +"@storybook/addon-controls@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-controls@npm:8.5.2" dependencies: "@storybook/global": "npm:^5.0.0" dequal: "npm:^2.0.2" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/572cecff58ac3fe99ab896eab1e874e6c0154b87d73426fa2ebdff4060d230507d81abf09c59ed9b818976da1e6641d9a0715b12828edc6a7467cdea0c709525 + storybook: ^8.5.2 + checksum: 10c0/8e5ae4ddd8601191010d0ffc19e5309bbd5d28445c91a1087ad40f40358a2c47a3ec91c3049ba7f1b86092a53691eaad0804cd854cafec06d8737fad54cd5cd1 languageName: node linkType: hard -"@storybook/addon-docs@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-docs@npm:8.5.1" +"@storybook/addon-docs@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-docs@npm:8.5.2" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/blocks": "npm:8.5.1" - "@storybook/csf-plugin": "npm:8.5.1" - "@storybook/react-dom-shim": "npm:8.5.1" + "@storybook/blocks": "npm:8.5.2" + "@storybook/csf-plugin": "npm:8.5.2" + "@storybook/react-dom-shim": "npm:8.5.2" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/c2a717b206b34c75dcf4f44dab7ff56a83be5ba7e0f0680ff19e590a051d5d7b1c236fae24104fca067eaee1541fccc8757c78cc07cb3cddb880deece2477099 + storybook: ^8.5.2 + checksum: 10c0/9de7187aca2e4fafdcebab283ff8910fbb9eb7bd0bb488106d544b3683e5508b826e87d7d08505128a0ec5780087cac1a6689e18dd58a88c5c0d728a51a398bf languageName: node linkType: hard -"@storybook/addon-essentials@npm:^8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-essentials@npm:8.5.1" +"@storybook/addon-essentials@npm:^8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-essentials@npm:8.5.2" dependencies: - "@storybook/addon-actions": "npm:8.5.1" - "@storybook/addon-backgrounds": "npm:8.5.1" - "@storybook/addon-controls": "npm:8.5.1" - "@storybook/addon-docs": "npm:8.5.1" - "@storybook/addon-highlight": "npm:8.5.1" - "@storybook/addon-measure": "npm:8.5.1" - "@storybook/addon-outline": "npm:8.5.1" - "@storybook/addon-toolbars": "npm:8.5.1" - "@storybook/addon-viewport": "npm:8.5.1" + "@storybook/addon-actions": "npm:8.5.2" + "@storybook/addon-backgrounds": "npm:8.5.2" + "@storybook/addon-controls": "npm:8.5.2" + "@storybook/addon-docs": "npm:8.5.2" + "@storybook/addon-highlight": "npm:8.5.2" + "@storybook/addon-measure": "npm:8.5.2" + "@storybook/addon-outline": "npm:8.5.2" + "@storybook/addon-toolbars": "npm:8.5.2" + "@storybook/addon-viewport": "npm:8.5.2" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/c66c098776f4ee6da86236d209968520f444faf61830d600879e72e121161db79d093bc6bfef7fce4fce1e0487a0b99afa2d34c538bf438725fe624be6a96112 + storybook: ^8.5.2 + checksum: 10c0/b12df402412316919c93cd9173486ffe79c5ee08ab89738c81a00929b2d74206e2fc331cb82d70caf14f8eaa2b6bced3b492c0522d0687f28b6355774aa6160c languageName: node linkType: hard -"@storybook/addon-highlight@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-highlight@npm:8.5.1" +"@storybook/addon-highlight@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-highlight@npm:8.5.2" dependencies: "@storybook/global": "npm:^5.0.0" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/28bd9c097ec2a2f78b189426939839315a5fce458eb3d13ab8b18ec5a32f3371761addb03cdf1f17c6c03f9c2c3fe419078fb5af6b8f002a4aef677d1d9f23f0 + storybook: ^8.5.2 + checksum: 10c0/c14d8ba34e980e9b334f83ac75a90957bda6069cea368d1dfa3f17b74b763048700a3dffd930a20e162ee5c01378c910da51dcafa508644e8b01351e5b442188 languageName: node linkType: hard -"@storybook/addon-interactions@npm:^8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-interactions@npm:8.5.1" +"@storybook/addon-interactions@npm:^8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-interactions@npm:8.5.2" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/instrumenter": "npm:8.5.1" - "@storybook/test": "npm:8.5.1" + "@storybook/instrumenter": "npm:8.5.2" + "@storybook/test": "npm:8.5.2" polished: "npm:^4.2.2" ts-dedent: "npm:^2.2.0" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/3f78146ee98f99885c1698580364f6f3ae6dba1964cc60b7e755bde3abf97019534f1bfb62f3a1c534eb9a05ace75a4ba52a81e58e4b2d1d3599ea84543fd232 + storybook: ^8.5.2 + checksum: 10c0/6a491d06cee81b4e8e7af100582784e21d739d84d3ae76f4fe88a85c6974f886f6ee6b9032fc22ddcd08c110b01d36b318c455c38396c0d51feb49060953e5ed languageName: node linkType: hard -"@storybook/addon-links@npm:^8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-links@npm:8.5.1" +"@storybook/addon-links@npm:^8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-links@npm:8.5.2" dependencies: "@storybook/csf": "npm:0.1.12" "@storybook/global": "npm:^5.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.1 + storybook: ^8.5.2 peerDependenciesMeta: react: optional: true - checksum: 10c0/dc1c9f6131b97997f11937c2c95ff51f875f0e4dbaa201de8e76e6163c8f70b0cbebf4d39f0e57edcb5fd9c51feb2318c00644b5dee2b4da9d8dca322be9d1c6 + checksum: 10c0/60f29c2ff9bb1887cb84a81fb29af9dc8f24cb424210a2619dbda3ba361d40f7b799f6084780b4244714c5785d0dcd936303acda548e1d72f955411a0c668647 languageName: node linkType: hard -"@storybook/addon-measure@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-measure@npm:8.5.1" +"@storybook/addon-measure@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-measure@npm:8.5.2" dependencies: "@storybook/global": "npm:^5.0.0" tiny-invariant: "npm:^1.3.1" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/4707a71ece4207f7cf3b26cdf3f748b51764acc41d3b935c95077262d1e977b79a3dbbccb3d5c4e5cbd3df4f2cbc163182e41d5268b67376dbd76bf84b7463c3 + storybook: ^8.5.2 + checksum: 10c0/b59e5f92699a13150306ba84d9a5155488e5a62e156135e5c8444f47ce4aa3bb95a13250a28ce5a42a388225ad006b8e42b77938c7914faa7b3db3b721bd7b2b languageName: node linkType: hard -"@storybook/addon-outline@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-outline@npm:8.5.1" +"@storybook/addon-outline@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-outline@npm:8.5.2" dependencies: "@storybook/global": "npm:^5.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/546d387e8175bfc55bf9ac47fc8bf0ce0a190ce43b2cf2a9b90ebd21be22875e92c3f5e1211caae4874a8c88494f7206aae895761c4abf7482e9668ba55d2142 + storybook: ^8.5.2 + checksum: 10c0/300fbc0e254069bf6c3e14eb8c3ffbab069db29c82e3f0135173d8d9e96e7d89187a3577de131b36b44c5201fa2d7dc3fd5083e814e0cec6dee7f5b6d34233e7 languageName: node linkType: hard -"@storybook/addon-toolbars@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-toolbars@npm:8.5.1" +"@storybook/addon-toolbars@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-toolbars@npm:8.5.2" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/a49471696d6801343b2d369d536a7f03e968e22aedf2ac72ab50a3591e453729fbf5a16b57b7340e825f270acff34627e4b32797a7d651900ba60e80a3c04874 + storybook: ^8.5.2 + checksum: 10c0/7745e45026146f667a8f4c2540f3c5817a71b4e0f5ab6602d5f86c99da70c7ccd20e905445946041e0f46295b2eb27284a9b326a9ca916768cc06f01faf86899 languageName: node linkType: hard -"@storybook/addon-viewport@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/addon-viewport@npm:8.5.1" +"@storybook/addon-viewport@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/addon-viewport@npm:8.5.2" dependencies: memoizerific: "npm:^1.11.3" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/ebe4f91d816dec3349a552bf3513e1d9049735d7ad6f34bb9a26265cafe5ae085f9d89db6820920a42e47e4be96d2b763339c7f0a49e6e62a8d83f85911f9b74 + storybook: ^8.5.2 + checksum: 10c0/8755d489e11fa376c6befe3383d9169f7727a0fa83da8c56ff9ceceb4a26dfb64f521e0656c4412fa26ec7aad3ede42347afa4940c3041a7c749f05eca888aec languageName: node linkType: hard -"@storybook/blocks@npm:8.5.1, @storybook/blocks@npm:^8.5.1": - version: 8.5.1 - resolution: "@storybook/blocks@npm:8.5.1" +"@storybook/blocks@npm:8.5.2, @storybook/blocks@npm:^8.5.2": + version: 8.5.2 + resolution: "@storybook/blocks@npm:8.5.2" dependencies: "@storybook/csf": "npm:0.1.12" "@storybook/icons": "npm:^1.2.12" @@ -4999,36 +4999,36 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.1 + storybook: ^8.5.2 peerDependenciesMeta: react: optional: true react-dom: optional: true - checksum: 10c0/670e97a7e0a27ae7fb890fc684797691a0443d191312d8231b28bad24009b8f418ea6a2b02c56add4c0090d0e388fd2b2081dd2fbf6b9fc66f1bda54497ea130 + checksum: 10c0/a8345cdd2805aeaf1c6798ed91f34aa4b9edfcd25f55cbb0dd2bf027a30b23b9ee10f9e199d3022760df7b9d78357b7a2d3ed2f587e8bfa9aa456e5a77960926 languageName: node linkType: hard -"@storybook/builder-vite@npm:8.5.1, @storybook/builder-vite@npm:^8.5.1": - version: 8.5.1 - resolution: "@storybook/builder-vite@npm:8.5.1" +"@storybook/builder-vite@npm:8.5.2, @storybook/builder-vite@npm:^8.5.2": + version: 8.5.2 + resolution: "@storybook/builder-vite@npm:8.5.2" dependencies: - "@storybook/csf-plugin": "npm:8.5.1" + "@storybook/csf-plugin": "npm:8.5.2" browser-assert: "npm:^1.2.1" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^8.5.1 + storybook: ^8.5.2 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - checksum: 10c0/c8d1626f4a13141d1c4422a9ac4c0b2d3c8a8af82fe7c9212ea803a3ce157e4b6d6565194397088d352a42d5f05af047755f7224fd83424606f7005c8efe2ee9 + checksum: 10c0/fe53f3b4463e6a3d35f08e63a16e1f65b9f178bf3d2ff776b4be5c82e31ac0e874cb599ed8659a829952deca5fbf5cc0b804b0b29a1a80234741dee8ba515684 languageName: node linkType: hard -"@storybook/components@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/components@npm:8.5.1" +"@storybook/components@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/components@npm:8.5.2" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 10c0/1fd89b03dafb9e845478ea4a8eda750ca41cf6b2d95cfe4a62617d9f6e06ce2f01bd4728f75c8433dbbacc0692d56027bb278e678cf1c8205c48a128799aa92e + checksum: 10c0/a5eef011332c6a2f22a2efc91d82b577e9d6cdfe657cb9056c59050c8cfd1ad7999e237d408e403c33220b9849ec1f25c32dd2af0099d3a712e8b582409cad23 languageName: node linkType: hard @@ -5050,9 +5050,9 @@ __metadata: languageName: node linkType: hard -"@storybook/core@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/core@npm:8.5.1" +"@storybook/core@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/core@npm:8.5.2" dependencies: "@storybook/csf": "npm:0.1.12" better-opn: "npm:^3.0.2" @@ -5070,18 +5070,18 @@ __metadata: peerDependenciesMeta: prettier: optional: true - checksum: 10c0/3838b1ce36331927f10c9c11210956752b00c05aa42de77b5551b82273c25d3ae1b7465f50b0c6757e9eb87dfe47bc7aa293225a038328e313e7b2f5a28f768a + checksum: 10c0/30716091ea9dd6e05ab079c67907f442c112cb6cb118d8a44e2be26f62398005f68dbdfbcb75a44bb2e59f468889e06dd92778de393550bf6fbb026c1c17e4ec languageName: node linkType: hard -"@storybook/csf-plugin@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/csf-plugin@npm:8.5.1" +"@storybook/csf-plugin@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/csf-plugin@npm:8.5.2" dependencies: unplugin: "npm:^1.3.1" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/c3fd9ea2bd1f0762f62926c79ce8677e1105ee86b53f472813f430bc682146d6e8e1ad692a53b88481315ba0ad9f46f3f14deea585721ad4933f87cb32dee0d8 + storybook: ^8.5.2 + checksum: 10c0/fb1fa5ddf821fbfc98387b58e5fa7847b6b2fff9014f49b352c4b60a4601229b1f087a87fa94bb0663189e5e57ec462264b22b8f147cfe80533d132994c550c6 languageName: node linkType: hard @@ -5111,24 +5111,24 @@ __metadata: languageName: node linkType: hard -"@storybook/instrumenter@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/instrumenter@npm:8.5.1" +"@storybook/instrumenter@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/instrumenter@npm:8.5.2" dependencies: "@storybook/global": "npm:^5.0.0" "@vitest/utils": "npm:^2.1.1" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/513956e116c60fc20da6cd56823ef8ba46e5ab79bf134d3ec9de34a89547e5e0fd723fe6cc8e44984601786d5b1b75c190d68b51aa95f18e5cad5dd5bcb18e35 + storybook: ^8.5.2 + checksum: 10c0/76c54c17808a1f9e621af6d54a4b60c5c4216eb892908c0015f84291ae38743dfc054a263cd2a2ca6cb2eb066c26e4da28e0e739d737d7f573811848f4b367e9 languageName: node linkType: hard -"@storybook/manager-api@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/manager-api@npm:8.5.1" +"@storybook/manager-api@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/manager-api@npm:8.5.2" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 10c0/5c5d3afc65081ddaa065b299f897d79df3e1d2779b110fd6d104fadfcdf0208d6ad0b7e7537b4a3db0e6f4f3fdea60a8ef52f6f61a05cc5b19ecc0ed0bb0c974 + checksum: 10c0/4a41d4340db231b1598068002c1059993cc88c69bea62bef4f4be5b814d513109638b1692225e99689d94b98eb3ae31acfa8572fca3d5f4608151f86fc98d4a3 languageName: node linkType: hard @@ -5141,101 +5141,101 @@ __metadata: languageName: node linkType: hard -"@storybook/preview-api@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/preview-api@npm:8.5.1" +"@storybook/preview-api@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/preview-api@npm:8.5.2" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 10c0/48f60644ac4fb748e2268470fd159768b5d3782ea6a11e4ad8631caf8207c614a8c05bb16f5404e9404786475b8e4b4eae2d168cbef103d9cb7dc023cc9ec196 + checksum: 10c0/19010580a927a842c89eff7e1e31c4caea42fd1bb994fe10cc163c900e2dc1288152ffb6658432deb120a85bf8a97bb092c408dbd5fbf287960390defb968e2e languageName: node linkType: hard -"@storybook/react-dom-shim@npm:8.5.1": - version: 8.5.1 - resolution: "@storybook/react-dom-shim@npm:8.5.1" +"@storybook/react-dom-shim@npm:8.5.2": + version: 8.5.2 + resolution: "@storybook/react-dom-shim@npm:8.5.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.1 - checksum: 10c0/13e6acf25d10f03396dbe0e1dc70e67e6c6c9a33217b8b9f8612bef9d77f34a5b2895a21fa9ef27d6022530056186b04f53123610c45e0fce88cdddc0b243b11 + storybook: ^8.5.2 + checksum: 10c0/6091c1dd4c5664963674aa5b96030256adf88c9a37b78a192363be975f09ac3f59b0562fcb89683266a28552a35dd3c87b329a333f45eb74a1014aa3f0115c53 languageName: node linkType: hard -"@storybook/react-vite@npm:^8.5.1": - version: 8.5.1 - resolution: "@storybook/react-vite@npm:8.5.1" +"@storybook/react-vite@npm:^8.5.2": + version: 8.5.2 + resolution: "@storybook/react-vite@npm:8.5.2" dependencies: "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.4.2" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:8.5.1" - "@storybook/react": "npm:8.5.1" + "@storybook/builder-vite": "npm:8.5.2" + "@storybook/react": "npm:8.5.2" find-up: "npm:^5.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^7.0.0" resolve: "npm:^1.22.8" tsconfig-paths: "npm:^4.2.0" peerDependencies: - "@storybook/test": 8.5.1 + "@storybook/test": 8.5.2 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.1 + storybook: ^8.5.2 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: "@storybook/test": optional: true - checksum: 10c0/c88740fedbe127fba659c56eaa6f6f49f52720f0b7b22c2b304ca44c54be874941bdb3dfaac96537a6d8c9992c1375c341e21287057e139b985055ab46fa88b9 + checksum: 10c0/3e3cd59022acb9a08dd086f6b5a219b09c43951a4b1b61efa05568aaa3b91450f70b30ad1cd23c79454996446f39322dc5ede6cab462b400e92f035f2fbdba71 languageName: node linkType: hard -"@storybook/react@npm:8.5.1, @storybook/react@npm:^8.5.1": - version: 8.5.1 - resolution: "@storybook/react@npm:8.5.1" +"@storybook/react@npm:8.5.2, @storybook/react@npm:^8.5.2": + version: 8.5.2 + resolution: "@storybook/react@npm:8.5.2" dependencies: - "@storybook/components": "npm:8.5.1" + "@storybook/components": "npm:8.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:8.5.1" - "@storybook/preview-api": "npm:8.5.1" - "@storybook/react-dom-shim": "npm:8.5.1" - "@storybook/theming": "npm:8.5.1" + "@storybook/manager-api": "npm:8.5.2" + "@storybook/preview-api": "npm:8.5.2" + "@storybook/react-dom-shim": "npm:8.5.2" + "@storybook/theming": "npm:8.5.2" peerDependencies: - "@storybook/test": 8.5.1 + "@storybook/test": 8.5.2 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.1 + storybook: ^8.5.2 typescript: ">= 4.2.x" peerDependenciesMeta: "@storybook/test": optional: true typescript: optional: true - checksum: 10c0/c873bf77740cf1603e8b749da2e9df65413a1b62cd80a6b5d9f22caf6576e17610f5ea31963a18ebf54878a5063540e3b3124de37965084e5270fefac90a800a + checksum: 10c0/f8e8c276c22531a59703c26aa9f58a7827110448f8610942fe1ee2f4413eaecde3d6473caaf4195d6ec90164e9851f1871673e41d512c0bcb07d9571eb06a9f2 languageName: node linkType: hard -"@storybook/test@npm:8.5.1, @storybook/test@npm:^8.5.1": - version: 8.5.1 - resolution: "@storybook/test@npm:8.5.1" +"@storybook/test@npm:8.5.2, @storybook/test@npm:^8.5.2": + version: 8.5.2 + resolution: "@storybook/test@npm:8.5.2" dependencies: "@storybook/csf": "npm:0.1.12" "@storybook/global": "npm:^5.0.0" - "@storybook/instrumenter": "npm:8.5.1" + "@storybook/instrumenter": "npm:8.5.2" "@testing-library/dom": "npm:10.4.0" "@testing-library/jest-dom": "npm:6.5.0" "@testing-library/user-event": "npm:14.5.2" "@vitest/expect": "npm:2.0.5" "@vitest/spy": "npm:2.0.5" peerDependencies: - storybook: ^8.5.1 - checksum: 10c0/dca5531a036febf30aafc4568d9453734cec3b6e2c78ed11f96b34accc8c648631de0164d02a5cb4de08d8c0409df8450c1ccbf37b9684e62052ddb8bc3bfa8c + storybook: ^8.5.2 + checksum: 10c0/3fbb5ae9a68ee29d0b525ff1692f933909d5b20e8ecd4dcc429d503af406e4d325f4365aa10d346a2ec83478e1c824558ab88c31335b1f9f1ded7089cbc78682 languageName: node linkType: hard -"@storybook/theming@npm:8.5.1, @storybook/theming@npm:^8.5.1": - version: 8.5.1 - resolution: "@storybook/theming@npm:8.5.1" +"@storybook/theming@npm:8.5.2, @storybook/theming@npm:^8.5.2": + version: 8.5.2 + resolution: "@storybook/theming@npm:8.5.2" peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 10c0/808323c8b27c73dbbbf097740695f8fb0d10714daca55ec63454b234580b326403fe73ff01c36f7b23d78b815f9a9f77979563ba0ee169cdff7d2794c23bfbfd + checksum: 10c0/5e53775f5df8901826e0c8826939ba99e660e967e17c8cdb9089b21431c4eaedf29651ae0eedccc853717ec03b7e0b1769c28a96e3dea4d90115939073cfa352 languageName: node linkType: hard @@ -19891,11 +19891,11 @@ __metadata: languageName: node linkType: hard -"storybook@npm:^8.5.1": - version: 8.5.1 - resolution: "storybook@npm:8.5.1" +"storybook@npm:^8.5.2": + version: 8.5.2 + resolution: "storybook@npm:8.5.2" dependencies: - "@storybook/core": "npm:8.5.1" + "@storybook/core": "npm:8.5.2" peerDependencies: prettier: ^2 || ^3 peerDependenciesMeta: @@ -19905,7 +19905,7 @@ __metadata: getstorybook: ./bin/index.cjs sb: ./bin/index.cjs storybook: ./bin/index.cjs - checksum: 10c0/71519063fc9f97e55108f1917f722a23188aef105b1841ecdc240a52577cef68208c6b806185c4747c6cc183ad848cef05813d306399b37ee82536b78128bd3a + checksum: 10c0/8c6f4bf5782c695fa3a66ebceb0092e04476ecc4c4b681889db9a9875c19e561dcf1b0c68215df1734dff9706b0bb942a5c47426e5825611856b2da37b9bcf0d languageName: node linkType: hard @@ -21640,15 +21640,15 @@ __metadata: "@observablehq/plot": "npm:^0.6.16" "@react-hook/resize-observer": "npm:^2.0.2" "@rollup/plugin-node-resolve": "npm:^16.0.0" - "@storybook/addon-essentials": "npm:^8.5.1" - "@storybook/addon-interactions": "npm:^8.5.1" - "@storybook/addon-links": "npm:^8.5.1" - "@storybook/blocks": "npm:^8.5.1" - "@storybook/builder-vite": "npm:^8.5.1" - "@storybook/react": "npm:^8.5.1" - "@storybook/react-vite": "npm:^8.5.1" - "@storybook/test": "npm:^8.5.1" - "@storybook/theming": "npm:^8.5.1" + "@storybook/addon-essentials": "npm:^8.5.2" + "@storybook/addon-interactions": "npm:^8.5.2" + "@storybook/addon-links": "npm:^8.5.2" + "@storybook/blocks": "npm:^8.5.2" + "@storybook/builder-vite": "npm:^8.5.2" + "@storybook/react": "npm:^8.5.2" + "@storybook/react-vite": "npm:^8.5.2" + "@storybook/test": "npm:^8.5.2" + "@storybook/theming": "npm:^8.5.2" "@table-nav/core": "npm:^0.0.7" "@table-nav/react": "npm:^0.0.7" "@tanstack/react-table": "npm:^8.20.6" @@ -21729,7 +21729,7 @@ __metadata: sharp: "npm:^0.33.5" shell-quote: "npm:^1.8.2" sprintf-js: "npm:^1.1.3" - storybook: "npm:^8.5.1" + storybook: "npm:^8.5.2" storybook-dark-mode: "npm:^4.0.2" throttle-debounce: "npm:^5.0.2" tinycolor2: "npm:^1.6.0" From 2916e01561b299e9e7524124acbe6367465b3655 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:43:30 -0800 Subject: [PATCH 06/17] Bump the dev-dependencies-patch group with 2 updates (#1886) Bumps the dev-dependencies-patch group with 2 updates: [remark-preset-lint-consistent](https://github.com/remarkjs/remark-lint) and [remark-preset-lint-recommended](https://github.com/remarkjs/remark-lint). Updates `remark-preset-lint-consistent` from 6.0.0 to 6.0.1
Commits

Updates `remark-preset-lint-recommended` from 7.0.0 to 7.0.1
Commits
  • 750541e Publish a patch version for all packages
  • b40fe0f Change master in links
  • 48a5393 maximum-line-length: 2.0.1
  • 2e3683a Update dev-dependencies
  • 048f1db maximum-line-length: fix whitelist
  • 1e314a8 no-shell-dollars: 2.0.1
  • cffce16 remark-lint-unordered-list-marker-style: fix typos (#235)
  • dc4f092 Ignore whitespace only lines too
  • 3c896b3 Update dev-dependencies
  • 7c04e5d Fix missing check on one-line code-blocks
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package.json | 4 ++-- yarn.lock | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/package.json b/docs/package.json index b2e8b61e3..81edfb8b4 100644 --- a/docs/package.json +++ b/docs/package.json @@ -54,8 +54,8 @@ "remark-cli": "^12.0.1", "remark-frontmatter": "^5.0.0", "remark-mdx": "^3.1.0", - "remark-preset-lint-consistent": "^6.0.0", - "remark-preset-lint-recommended": "^7.0.0", + "remark-preset-lint-consistent": "^6.0.1", + "remark-preset-lint-recommended": "^7.0.1", "typescript": "^5.7.3", "typescript-eslint": "^8.21.0" }, diff --git a/yarn.lock b/yarn.lock index a31e74017..95e6ab003 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18590,9 +18590,9 @@ __metadata: languageName: node linkType: hard -"remark-preset-lint-consistent@npm:^6.0.0": - version: 6.0.0 - resolution: "remark-preset-lint-consistent@npm:6.0.0" +"remark-preset-lint-consistent@npm:^6.0.1": + version: 6.0.1 + resolution: "remark-preset-lint-consistent@npm:6.0.1" dependencies: remark-lint: "npm:^10.0.0" remark-lint-blockquote-indentation: "npm:^4.0.0" @@ -18609,13 +18609,13 @@ __metadata: remark-lint-strong-marker: "npm:^4.0.0" remark-lint-table-cell-padding: "npm:^5.0.0" unified: "npm:^11.0.0" - checksum: 10c0/f20064bc2dab161fa463a82186b107ac9596cf9e8c308e6cf41de94a5039fe601498de7cff8dc74459d0f0a4247424cc1398407fe2f7404dfebb9e6dd2c62180 + checksum: 10c0/08755494b4097cc11c3f8f354346f8b9319aacdef91c877f19a6ca2722b4de59d636d859bdb129d3a16eb50a7bf594ad3215d560c9063452da28a09d37c2cc37 languageName: node linkType: hard -"remark-preset-lint-recommended@npm:^7.0.0": - version: 7.0.0 - resolution: "remark-preset-lint-recommended@npm:7.0.0" +"remark-preset-lint-recommended@npm:^7.0.1": + version: 7.0.1 + resolution: "remark-preset-lint-recommended@npm:7.0.1" dependencies: remark-lint: "npm:^10.0.0" remark-lint-final-newline: "npm:^3.0.0" @@ -18632,7 +18632,7 @@ __metadata: remark-lint-no-unused-definitions: "npm:^4.0.0" remark-lint-ordered-list-marker-style: "npm:^4.0.0" unified: "npm:^11.0.0" - checksum: 10c0/ee425c9a3733e077889de9e644d6892f846edc4efb23d6a9b1e5e9c0d74d09f0b79cb0bb2d6cd1bca920288435a21a1c034cd6ab692ed00280b26f4f023333e1 + checksum: 10c0/6d6cd159f56a8098e3fdac9d3bc68801f3181faf4bec37628c97f37fd2e69075ee3733268405fbd5bc1d73c25e3be820803ac3efbde68bc5e044df9ab244dd00 languageName: node linkType: hard @@ -21618,8 +21618,8 @@ __metadata: remark-frontmatter: "npm:^5.0.0" remark-gfm: "npm:^4.0.0" remark-mdx: "npm:^3.1.0" - remark-preset-lint-consistent: "npm:^6.0.0" - remark-preset-lint-recommended: "npm:^7.0.0" + remark-preset-lint-consistent: "npm:^6.0.1" + remark-preset-lint-recommended: "npm:^7.0.1" remark-typescript-code-import: "npm:^1.0.1" sass: "npm:^1.83.4" typescript: "npm:^5.7.3" From 7ac3418d3b91779fca4420df7ff839cb0dc137c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:43:49 -0800 Subject: [PATCH 07/17] Bump google.golang.org/api from 0.218.0 to 0.219.0 (#1881) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.218.0 to 0.219.0.
Release notes

Sourced from google.golang.org/api's releases.

v0.219.0

0.219.0 (2025-01-28)

Features

Documentation

  • option: Add warning about externally-provided credentials (#2978) (45c3513)
Changelog

Sourced from google.golang.org/api's changelog.

0.219.0 (2025-01-28)

Features

Documentation

  • option: Add warning about externally-provided credentials (#2978) (45c3513)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/api&package-manager=go_modules&previous-version=0.218.0&new-version=0.219.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 36 ++++++++++++++++++------------------ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index b32bef0ba..765f35d14 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( golang.org/x/mod v0.22.0 golang.org/x/sys v0.29.0 golang.org/x/term v0.28.0 - google.golang.org/api v0.218.0 + google.golang.org/api v0.219.0 gopkg.in/ini.v1 v1.67.0 ) @@ -80,9 +80,9 @@ require ( github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/otel/trace v1.31.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.7.0 // indirect golang.org/x/net v0.34.0 // indirect golang.org/x/oauth2 v0.25.0 // indirect @@ -90,9 +90,9 @@ require ( golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.9.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect - google.golang.org/grpc v1.69.4 // indirect - google.golang.org/protobuf v1.36.3 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 // indirect + google.golang.org/grpc v1.70.0 // indirect + google.golang.org/protobuf v1.36.4 // indirect ) replace github.com/kevinburke/ssh_config => github.com/wavetermdev/ssh_config v0.0.0-20241219203747-6409e4292f34 diff --git a/go.sum b/go.sum index 64e8d740f..8c3f0432a 100644 --- a/go.sum +++ b/go.sum @@ -163,16 +163,16 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= @@ -201,16 +201,16 @@ golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.218.0 h1:x6JCjEWeZ9PFCRe9z0FBrNwj7pB7DOAqT35N+IPnAUA= -google.golang.org/api v0.218.0/go.mod h1:5VGHBAkxrA/8EFjLVEYmMUJ8/8+gWWQ3s4cFH0FxG2M= +google.golang.org/api v0.219.0 h1:nnKIvxKs/06jWawp2liznTBnMRQBEPpGo7I+oEypTX0= +google.golang.org/api v0.219.0/go.mod h1:K6OmjGm+NtLrIkHxv1U3a0qIf/0JOvAHd5O/6AoyKYE= google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= -google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= -google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= -google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 h1:91mG8dNTpkC0uChJUQ9zCiRqx3GEEFOWaRZ0mI6Oj2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= +google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= From 291b70af3011662a44d530b63778ab38a398742d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:44:05 -0800 Subject: [PATCH 08/17] Bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.74.1 to 1.75.1 (#1885) Bumps [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) from 1.74.1 to 1.75.1.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/aws/aws-sdk-go-v2/service/s3&package-manager=go_modules&previous-version=1.74.1&new-version=1.75.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 765f35d14..b5b0aad73 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,9 @@ go 1.23.4 require ( github.com/alexflint/go-filemutex v1.3.0 - github.com/aws/aws-sdk-go-v2 v1.34.0 + github.com/aws/aws-sdk-go-v2 v1.35.0 github.com/aws/aws-sdk-go-v2/config v1.29.1 - github.com/aws/aws-sdk-go-v2/service/s3 v1.74.1 + github.com/aws/aws-sdk-go-v2/service/s3 v1.75.1 github.com/aws/smithy-go v1.22.2 github.com/creack/pty v1.1.21 github.com/emirpasic/gods v1.18.1 @@ -48,14 +48,14 @@ require ( github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.54 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.30 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.30 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.10 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.11 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.11 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.24.11 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.33.9 // indirect diff --git a/go.sum b/go.sum index 8c3f0432a..b98aee761 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/0xrawsec/golang-utils v1.3.2 h1:ww4jrtHRSnX9xrGzJYbalx5nXoZewy4zPxiY+ github.com/0xrawsec/golang-utils v1.3.2/go.mod h1:m7AzHXgdSAkFCD9tWWsApxNVxMlyy7anpPVOyT/yM7E= github.com/alexflint/go-filemutex v1.3.0 h1:LgE+nTUWnQCyRKbpoceKZsPQbs84LivvgwUymZXdOcM= github.com/alexflint/go-filemutex v1.3.0/go.mod h1:U0+VA/i30mGBlLCrFPGtTe9y6wGQfNAWPBTekHQ+c8A= -github.com/aws/aws-sdk-go-v2 v1.34.0 h1:9iyL+cjifckRGEVpRKZP3eIxVlL06Qk1Tk13vreaVQU= -github.com/aws/aws-sdk-go-v2 v1.34.0/go.mod h1:JgstGg0JjWU1KpVJjD5H0y0yyAIpSdKEq556EI6yOOM= +github.com/aws/aws-sdk-go-v2 v1.35.0 h1:jTPxEJyzjSuuz0wB+302hr8Eu9KUI+Zv8zlujMGJpVI= +github.com/aws/aws-sdk-go-v2 v1.35.0/go.mod h1:JgstGg0JjWU1KpVJjD5H0y0yyAIpSdKEq556EI6yOOM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8 h1:zAxi9p3wsZMIaVCdoiQp2uZ9k1LsZvmAnoTBeZPXom0= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8/go.mod h1:3XkePX5dSaxveLAYY7nsbsZZrKxCyEuE5pM4ziFxyGg= github.com/aws/aws-sdk-go-v2/config v1.29.1 h1:JZhGawAyZ/EuJeBtbQYnaoftczcb2drR2Iq36Wgz4sQ= @@ -26,24 +26,24 @@ github.com/aws/aws-sdk-go-v2/credentials v1.17.54 h1:4UmqeOqJPvdvASZWrKlhzpRahAu github.com/aws/aws-sdk-go-v2/credentials v1.17.54/go.mod h1:RTdfo0P0hbbTxIhmQrOsC/PquBZGabEPnCaxxKRPSnI= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24 h1:5grmdTdMsovn9kPZPI23Hhvp0ZyNm5cRO+IZFIYiAfw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24/go.mod h1:zqi7TVKTswH3Ozq28PkmBmgzG1tona7mo9G2IJg4Cis= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.29 h1:Ej0Rf3GMv50Qh4G4852j2djtoDb7AzQ7MuQeFHa3D70= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.29/go.mod h1:oeNTC7PwJNoM5AznVr23wxhLnuJv0ZDe5v7w0wqIs9M= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.29 h1:6e8a71X+9GfghragVevC5bZqvATtc3mAMgxpSNbgzF0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.29/go.mod h1:c4jkZiQ+BWpNqq7VtrxjwISrLrt/VvPq3XiopkUIolI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.30 h1:+7AzSGNhHoY53di13lvztf9Dyd/9ofzoYGBllkWp3a0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.30/go.mod h1:Jxd/FrCny99yURiQiMywgXvBhd7tmgdv6KdlUTNzMSo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.30 h1:Ex06eY6I5rO7IX0HalGfa5nGjpBoOsS1Qm3xfjkuszs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.30/go.mod h1:AvyEMA9QcX59kFhVizBpIBpEMThUTXssuJe+emBdcGM= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.29 h1:g9OUETuxA8i/Www5Cby0R3WSTe7ppFTZXHVLNskNS4w= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.29/go.mod h1:CQk+koLR1QeY1+vm7lqNfFii07DEderKq6T3F1L2pyc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.30 h1:yQSv0NQ4CRHoki6AcV/Ldoa4/QCMJauZkF23qznBCPQ= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.30/go.mod h1:jH3z32wDrsducaYX26xnl41ksYFWqjHphIciwIANZkc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 h1:D4oz8/CzT9bAEYtVhSBmFj2dNOtaHOtMKc2vHBwYizA= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2/go.mod h1:Za3IHqTQ+yNcRHxu1OFucBh0ACZT4j4VQFF0BqpZcLY= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.3 h1:EP1ITDgYVPM2dL1bBBntJ7AW5yTjuWGz9XO+CZwpALU= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.3/go.mod h1:5lWNWeAgWenJ/BZ/CP9k9DjLbC0pjnM045WjXRPPi14= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.10 h1:hN4yJBGswmFTOVYqmbz1GBs9ZMtQe8SrYxPwrkrlRv8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.10/go.mod h1:TsxON4fEZXyrKY+D+3d2gSTyJkGORexIYab9PTf56DA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.10 h1:fXoWC2gi7tdJYNTPnnlSGzEVwewUchOi8xVq/dkg8Qs= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.10/go.mod h1:cvzBApD5dVazHU8C2rbBQzzzsKc8m5+wNJ9mCRZLKPc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.74.1 h1:9LawY3cDJ3HE+v2GMd5SOkNLDwgN4K7TsCjyVBYu/L4= -github.com/aws/aws-sdk-go-v2/service/s3 v1.74.1/go.mod h1:hHnELVnIHltd8EOF3YzahVX6F6y2C6dNqpRj1IMkS5I= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.4 h1:iwk7v5+lUtA0cIQcQM6EyCXtQJZ9MGIWWaf0JKud5UE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.4/go.mod h1:o9mSr0x1NwImSmP9q38aTUhjYwcDm277YUURBjXcC2I= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.11 h1:5JKQ2J3BBW4ovy6A/5Lwx9SpA6IzgH8jB3bquGZ1NUw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.11/go.mod h1:VShCk7rfCzK/b9U1aSkzLwcOoaDlYna16482QqEavis= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.11 h1:P8qJcYGVDswlMkVFhMi7SJmlf0jNA0JRbvE/q2PuXD8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.11/go.mod h1:9yp5x5vYwyhnZZ9cKLBxZmrJTGv99C9iVmG7AKeUvdc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.75.1 h1:hbTWOPUgAnPpk5+G1jZjYnq4eKCAePwRJEqLN1Tj7Bg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.75.1/go.mod h1:Mo2xdnRzOyZQkGHEbhOgooG0eIV+GqS/g8LU4B5iftI= github.com/aws/aws-sdk-go-v2/service/sso v1.24.11 h1:kuIyu4fTT38Kj7YCC7ouNbVZSSpqkZ+LzIfhCr6Dg+I= github.com/aws/aws-sdk-go-v2/service/sso v1.24.11/go.mod h1:Ro744S4fKiCCuZECXgOi760TiYylUM8ZBf6OGiZzJtY= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10 h1:l+dgv/64iVlQ3WsBbnn+JSbkj01jIi+SM0wYsj3y/hY= From 6928cc2acdc2cb9622799468f64fd4e1534381ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:48:59 -0800 Subject: [PATCH 09/17] Bump github.com/aws/aws-sdk-go-v2/config from 1.29.1 to 1.29.3 (#1883) Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.29.1 to 1.29.3.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/aws/aws-sdk-go-v2/config&package-manager=go_modules&previous-version=1.29.1&new-version=1.29.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index b5b0aad73..b501ff2a6 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( github.com/alexflint/go-filemutex v1.3.0 github.com/aws/aws-sdk-go-v2 v1.35.0 - github.com/aws/aws-sdk-go-v2/config v1.29.1 + github.com/aws/aws-sdk-go-v2/config v1.29.3 github.com/aws/aws-sdk-go-v2/service/s3 v1.75.1 github.com/aws/smithy-go v1.22.2 github.com/creack/pty v1.1.21 @@ -46,19 +46,19 @@ require ( cloud.google.com/go/compute/metadata v0.6.0 // indirect cloud.google.com/go/longrunning v0.5.7 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.54 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.56 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.26 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.30 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.30 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.11 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.11 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.11 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.12 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.11 // indirect github.com/ebitengine/purego v0.8.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.2 // indirect diff --git a/go.sum b/go.sum index b98aee761..5c5767229 100644 --- a/go.sum +++ b/go.sum @@ -20,18 +20,18 @@ github.com/aws/aws-sdk-go-v2 v1.35.0 h1:jTPxEJyzjSuuz0wB+302hr8Eu9KUI+Zv8zlujMGJ github.com/aws/aws-sdk-go-v2 v1.35.0/go.mod h1:JgstGg0JjWU1KpVJjD5H0y0yyAIpSdKEq556EI6yOOM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8 h1:zAxi9p3wsZMIaVCdoiQp2uZ9k1LsZvmAnoTBeZPXom0= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8/go.mod h1:3XkePX5dSaxveLAYY7nsbsZZrKxCyEuE5pM4ziFxyGg= -github.com/aws/aws-sdk-go-v2/config v1.29.1 h1:JZhGawAyZ/EuJeBtbQYnaoftczcb2drR2Iq36Wgz4sQ= -github.com/aws/aws-sdk-go-v2/config v1.29.1/go.mod h1:7bR2YD5euaxBhzt2y/oDkt3uNRb6tjFp98GlTFueRwk= -github.com/aws/aws-sdk-go-v2/credentials v1.17.54 h1:4UmqeOqJPvdvASZWrKlhzpRahAulBfyTJQUaYy4+hEI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.54/go.mod h1:RTdfo0P0hbbTxIhmQrOsC/PquBZGabEPnCaxxKRPSnI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24 h1:5grmdTdMsovn9kPZPI23Hhvp0ZyNm5cRO+IZFIYiAfw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24/go.mod h1:zqi7TVKTswH3Ozq28PkmBmgzG1tona7mo9G2IJg4Cis= +github.com/aws/aws-sdk-go-v2/config v1.29.3 h1:a5Ucjxe6iV+LHEBmYA9w40rT5aGxWybx/4l/O/fvJlE= +github.com/aws/aws-sdk-go-v2/config v1.29.3/go.mod h1:pt9z1x12zDiDb4iFLrxoeAKLVCU/Gp9DL/5BnwlY77o= +github.com/aws/aws-sdk-go-v2/credentials v1.17.56 h1:JKMBreKudV+ozx6rZJLvEtiexv48aEdhdC7mXUw9MLs= +github.com/aws/aws-sdk-go-v2/credentials v1.17.56/go.mod h1:S3xRjIHD8HHFgMTz4L56q/7IldfNtGL9JjH/vP3U6DA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.26 h1:XMBqBEuZLf8yxtH+mU/uUDyQbN4iD/xv9h6he2+lzhw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.26/go.mod h1:d0+wQ/3CYGPuHEfBTPpQdfUX7gjk0/Lxs5Q6KzdEGY8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.30 h1:+7AzSGNhHoY53di13lvztf9Dyd/9ofzoYGBllkWp3a0= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.30/go.mod h1:Jxd/FrCny99yURiQiMywgXvBhd7tmgdv6KdlUTNzMSo= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.30 h1:Ex06eY6I5rO7IX0HalGfa5nGjpBoOsS1Qm3xfjkuszs= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.30/go.mod h1:AvyEMA9QcX59kFhVizBpIBpEMThUTXssuJe+emBdcGM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 h1:Pg9URiobXy85kgFev3og2CuOZ8JZUBENF+dcgWBaYNk= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.30 h1:yQSv0NQ4CRHoki6AcV/Ldoa4/QCMJauZkF23qznBCPQ= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.30/go.mod h1:jH3z32wDrsducaYX26xnl41ksYFWqjHphIciwIANZkc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 h1:D4oz8/CzT9bAEYtVhSBmFj2dNOtaHOtMKc2vHBwYizA= @@ -44,12 +44,12 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.11 h1:P8qJcYGVDswlM github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.11/go.mod h1:9yp5x5vYwyhnZZ9cKLBxZmrJTGv99C9iVmG7AKeUvdc= github.com/aws/aws-sdk-go-v2/service/s3 v1.75.1 h1:hbTWOPUgAnPpk5+G1jZjYnq4eKCAePwRJEqLN1Tj7Bg= github.com/aws/aws-sdk-go-v2/service/s3 v1.75.1/go.mod h1:Mo2xdnRzOyZQkGHEbhOgooG0eIV+GqS/g8LU4B5iftI= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.11 h1:kuIyu4fTT38Kj7YCC7ouNbVZSSpqkZ+LzIfhCr6Dg+I= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.11/go.mod h1:Ro744S4fKiCCuZECXgOi760TiYylUM8ZBf6OGiZzJtY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10 h1:l+dgv/64iVlQ3WsBbnn+JSbkj01jIi+SM0wYsj3y/hY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10/go.mod h1:Fzsj6lZEb8AkTE5S68OhcbBqeWPsR8RnGuKPr8Todl8= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.9 h1:BRVDbewN6VZcwr+FBOszDKvYeXY1kJ+GGMCcpghlw0U= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.9/go.mod h1:f6vjfZER1M17Fokn0IzssOTMT2N8ZSq+7jnNF0tArvw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.13 h1:q4pOAKxypbFoUJzOpgo939bF50qb4DgYshiDfcsdN0M= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.13/go.mod h1:G/0PTg7+vQT42ictQGjJhixzTcVZtHFvrN/OeTXrRfQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.12 h1:4sGSGshSSfO1vrcXruPick3ioSf8nhhD6nuB2ni37P4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.12/go.mod h1:NHpu/pLOelViA4qxkAFH10VLqh+XeLhZfXDaFyMVgSs= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.11 h1:RIXOjp7Dp4siCYJRwBHUcBdVgOWflSJGlq4ZhMI5Ta0= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.11/go.mod h1:ZR17k9bPKPR8u0IkyA6xVsjr56doNQ4ZB1fs7abYBfE= github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= From 1a73ca963bda43216dc4176d2e6348d22bfb190a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:49:10 -0800 Subject: [PATCH 10/17] Bump github.com/skeema/knownhosts from 1.3.0 to 1.3.1 (#1882) Bumps [github.com/skeema/knownhosts](https://github.com/skeema/knownhosts) from 1.3.0 to 1.3.1.
Commits
  • 93146c8 update dependency golang.org/x/crypto to v0.25.0
  • 0f2fe42 go.mod: update golang.org/x dependencies
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/skeema/knownhosts&package-manager=go_modules&previous-version=1.3.0&new-version=1.3.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b501ff2a6..dbb49d836 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/sashabaranov/go-openai v1.36.1 github.com/sawka/txwrap v0.2.0 github.com/shirou/gopsutil/v4 v4.24.12 - github.com/skeema/knownhosts v1.3.0 + github.com/skeema/knownhosts v1.3.1 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/spf13/cobra v1.8.1 github.com/ubuntu/gowsl v0.0.0-20240906163211-049fd49bd93b diff --git a/go.sum b/go.sum index 5c5767229..a0ea6e942 100644 --- a/go.sum +++ b/go.sum @@ -131,8 +131,8 @@ github.com/shirou/gopsutil/v4 v4.24.12 h1:qvePBOk20e0IKA1QXrIIU+jmk+zEiYVVx06WjB github.com/shirou/gopsutil/v4 v4.24.12/go.mod h1:DCtMPAad2XceTeIAbGyVfycbYQNBGk2P8cvDi7/VN9o= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= -github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= +github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= +github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= From 70e501a904bd8ded2c3d541fc4e123b4568bf59e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:49:47 -0800 Subject: [PATCH 11/17] Bump github.com/golang-migrate/migrate/v4 from 4.18.1 to 4.18.2 (#1884) Bumps [github.com/golang-migrate/migrate/v4](https://github.com/golang-migrate/migrate) from 4.18.1 to 4.18.2.
Release notes

Sourced from github.com/golang-migrate/migrate/v4's releases.

v4.18.2

Changelog

  • e145cde Bump github.com/golang-jwt/jwt/v4 from 4.4.2 to 4.5.1
  • e22d012 Don't output sensitive information on error
  • e5a152b Drop support for Azure SQL Edge
  • 12c619e Fix CI (#1222)
  • bc06922 Update dktest from v0.4.3 to v0.4.4
  • 7651c8a linter fixes
Commits
  • d477553 Merge pull request #1195 from golang-migrate/dependabot/go_modules/github.com...
  • e145cde Bump github.com/golang-jwt/jwt/v4 from 4.4.2 to 4.5.1
  • 7651c8a linter fixes
  • e5a152b Drop support for Azure SQL Edge
  • 12c619e Fix CI (#1222)
  • bc06922 Update dktest from v0.4.3 to v0.4.4
  • c378583 Merge pull request #1162 from rselbach/rselbach/no-sensitive-info
  • e22d012 Don't output sensitive information on error
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/golang-migrate/migrate/v4&package-manager=go_modules&previous-version=4.18.1&new-version=4.18.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index dbb49d836..6bca8039d 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/emirpasic/gods v1.18.1 github.com/fsnotify/fsnotify v1.8.0 github.com/golang-jwt/jwt/v5 v5.2.1 - github.com/golang-migrate/migrate/v4 v4.18.1 + github.com/golang-migrate/migrate/v4 v4.18.2 github.com/google/generative-ai-go v0.19.0 github.com/google/uuid v1.6.0 github.com/gorilla/handlers v1.5.2 diff --git a/go.sum b/go.sum index a0ea6e942..e883c11e2 100644 --- a/go.sum +++ b/go.sum @@ -75,8 +75,8 @@ github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpv github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-migrate/migrate/v4 v4.18.1 h1:JML/k+t4tpHCpQTCAD62Nu43NUFzHY4CV3uAuvHGC+Y= -github.com/golang-migrate/migrate/v4 v4.18.1/go.mod h1:HAX6m3sQgcdO81tdjn5exv20+3Kb13cmGli1hrD6hks= +github.com/golang-migrate/migrate/v4 v4.18.2 h1:2VSCMz7x7mjyTXx3m2zPokOY82LTRgxK1yQYKo6wWQ8= +github.com/golang-migrate/migrate/v4 v4.18.2/go.mod h1:2CM6tJvn2kqPXwnXO/d3rAQYiyoIm180VsO8PRX6Rpk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/generative-ai-go v0.19.0 h1:R71szggh8wHMCUlEMsW2A/3T+5LdEIkiaHSYgSpUgdg= From c6dffbab2019974cfa3ebd92e0deac42cb861c81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:50:16 -0800 Subject: [PATCH 12/17] Bump the dev-dependencies-minor group with 5 updates (#1887) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps the dev-dependencies-minor group with 5 updates: | Package | From | To | | --- | --- | --- | | [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.18.0` | `9.19.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `22.10.10` | `22.12.0` | | [eslint](https://github.com/eslint/eslint) | `9.18.0` | `9.19.0` | | [semver](https://github.com/npm/node-semver) | `7.6.3` | `7.7.0` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.21.0` | `8.22.0` | Updates `@eslint/js` from 9.18.0 to 9.19.0
Release notes

Sourced from @​eslint/js's releases.

v9.19.0

Features

  • 1637b8e feat: add --report-unused-inline-configs (#19201) (Josh Goldberg ✨)

Bug Fixes

  • aae6717 fix: sync rule type header comments automatically (#19276) (Francesco Trotta)

Documentation

  • cfea9ab docs: Clarify overrideConfig option (#19370) (Nicholas C. Zakas)
  • 2b84f66 docs: Update README (#19362) (Nicholas C. Zakas)
  • 044f93c docs: clarify frozen rule description (#19351) (Pavel)
  • 797ee7c docs: fix Bluesky links (#19368) (Milos Djermanovic)
  • 81a9c0e docs: Update README (GitHub Actions Bot)
  • 093fb3d docs: replace var with let and const in rule examples (#19365) (Tanuj Kanti)
  • 417de32 docs: replace var with const in rule examples (#19352) (jj)
  • 17f2aae docs: update getting-started config to match default generated config (#19308) (0xDev)
  • 8a0a5a8 docs: better global ignores instruction (#19297) (Jacopo Marrone)
  • 6671a2c docs: Update README (GitHub Actions Bot)
  • e39d3f2 docs: fix divider for rule category (#19264) (Tanuj Kanti)
  • e0cf53f docs: fix search result box position for small screens (#19328) (Tanuj Kanti)
  • f92a680 docs: replace var with let or const in rule examples (#19331) (Ravi Teja Kolla)
  • b04b84b docs: revert accidental changes in TS config files docs (#19336) (Francesco Trotta)

Chores

  • 9b9cb05 chore: upgrade @​eslint/js@​9.19.0 (#19371) (Milos Djermanovic)
  • 58560e7 chore: package.json update for @​eslint/js release (Jenkins)
  • 2089707 test: fix failing test in Node.js v22.13.0 (#19345) (Francesco Trotta)
Changelog

Sourced from @​eslint/js's changelog.

v9.19.0 - January 24, 2025

  • 9b9cb05 chore: upgrade @​eslint/js@​9.19.0 (#19371) (Milos Djermanovic)
  • 58560e7 chore: package.json update for @​eslint/js release (Jenkins)
  • cfea9ab docs: Clarify overrideConfig option (#19370) (Nicholas C. Zakas)
  • 2b84f66 docs: Update README (#19362) (Nicholas C. Zakas)
  • 044f93c docs: clarify frozen rule description (#19351) (Pavel)
  • 797ee7c docs: fix Bluesky links (#19368) (Milos Djermanovic)
  • 81a9c0e docs: Update README (GitHub Actions Bot)
  • 093fb3d docs: replace var with let and const in rule examples (#19365) (Tanuj Kanti)
  • 417de32 docs: replace var with const in rule examples (#19352) (jj)
  • 17f2aae docs: update getting-started config to match default generated config (#19308) (0xDev)
  • aae6717 fix: sync rule type header comments automatically (#19276) (Francesco Trotta)
  • 8a0a5a8 docs: better global ignores instruction (#19297) (Jacopo Marrone)
  • 2089707 test: fix failing test in Node.js v22.13.0 (#19345) (Francesco Trotta)
  • 6671a2c docs: Update README (GitHub Actions Bot)
  • 1637b8e feat: add --report-unused-inline-configs (#19201) (Josh Goldberg ✨)
  • e39d3f2 docs: fix divider for rule category (#19264) (Tanuj Kanti)
  • e0cf53f docs: fix search result box position for small screens (#19328) (Tanuj Kanti)
  • f92a680 docs: replace var with let or const in rule examples (#19331) (Ravi Teja Kolla)
  • b04b84b docs: revert accidental changes in TS config files docs (#19336) (Francesco Trotta)
Commits
  • 58560e7 chore: package.json update for @​eslint/js release
  • See full diff in compare view

Updates `@types/node` from 22.10.10 to 22.12.0
Commits

Updates `eslint` from 9.18.0 to 9.19.0
Release notes

Sourced from eslint's releases.

v9.19.0

Features

  • 1637b8e feat: add --report-unused-inline-configs (#19201) (Josh Goldberg ✨)

Bug Fixes

  • aae6717 fix: sync rule type header comments automatically (#19276) (Francesco Trotta)

Documentation

  • cfea9ab docs: Clarify overrideConfig option (#19370) (Nicholas C. Zakas)
  • 2b84f66 docs: Update README (#19362) (Nicholas C. Zakas)
  • 044f93c docs: clarify frozen rule description (#19351) (Pavel)
  • 797ee7c docs: fix Bluesky links (#19368) (Milos Djermanovic)
  • 81a9c0e docs: Update README (GitHub Actions Bot)
  • 093fb3d docs: replace var with let and const in rule examples (#19365) (Tanuj Kanti)
  • 417de32 docs: replace var with const in rule examples (#19352) (jj)
  • 17f2aae docs: update getting-started config to match default generated config (#19308) (0xDev)
  • 8a0a5a8 docs: better global ignores instruction (#19297) (Jacopo Marrone)
  • 6671a2c docs: Update README (GitHub Actions Bot)
  • e39d3f2 docs: fix divider for rule category (#19264) (Tanuj Kanti)
  • e0cf53f docs: fix search result box position for small screens (#19328) (Tanuj Kanti)
  • f92a680 docs: replace var with let or const in rule examples (#19331) (Ravi Teja Kolla)
  • b04b84b docs: revert accidental changes in TS config files docs (#19336) (Francesco Trotta)

Chores

  • 9b9cb05 chore: upgrade @​eslint/js@​9.19.0 (#19371) (Milos Djermanovic)
  • 58560e7 chore: package.json update for @​eslint/js release (Jenkins)
  • 2089707 test: fix failing test in Node.js v22.13.0 (#19345) (Francesco Trotta)
Changelog

Sourced from eslint's changelog.

v9.19.0 - January 24, 2025

  • 9b9cb05 chore: upgrade @​eslint/js@​9.19.0 (#19371) (Milos Djermanovic)
  • 58560e7 chore: package.json update for @​eslint/js release (Jenkins)
  • cfea9ab docs: Clarify overrideConfig option (#19370) (Nicholas C. Zakas)
  • 2b84f66 docs: Update README (#19362) (Nicholas C. Zakas)
  • 044f93c docs: clarify frozen rule description (#19351) (Pavel)
  • 797ee7c docs: fix Bluesky links (#19368) (Milos Djermanovic)
  • 81a9c0e docs: Update README (GitHub Actions Bot)
  • 093fb3d docs: replace var with let and const in rule examples (#19365) (Tanuj Kanti)
  • 417de32 docs: replace var with const in rule examples (#19352) (jj)
  • 17f2aae docs: update getting-started config to match default generated config (#19308) (0xDev)
  • aae6717 fix: sync rule type header comments automatically (#19276) (Francesco Trotta)
  • 8a0a5a8 docs: better global ignores instruction (#19297) (Jacopo Marrone)
  • 2089707 test: fix failing test in Node.js v22.13.0 (#19345) (Francesco Trotta)
  • 6671a2c docs: Update README (GitHub Actions Bot)
  • 1637b8e feat: add --report-unused-inline-configs (#19201) (Josh Goldberg ✨)
  • e39d3f2 docs: fix divider for rule category (#19264) (Tanuj Kanti)
  • e0cf53f docs: fix search result box position for small screens (#19328) (Tanuj Kanti)
  • f92a680 docs: replace var with let or const in rule examples (#19331) (Ravi Teja Kolla)
  • b04b84b docs: revert accidental changes in TS config files docs (#19336) (Francesco Trotta)
Commits

Updates `semver` from 7.6.3 to 7.7.0
Release notes

Sourced from semver's releases.

v7.7.0

7.7.0 (2025-01-29)

Features

Bug Fixes

Documentation

Chores

Changelog

Sourced from semver's changelog.

7.7.0 (2025-01-29)

Features

Bug Fixes

Documentation

Chores

Commits
  • 2cfcbb5 chore: release 7.7.0 (#750)
  • d588e37 fix(diff): fix prerelease to stable version diff logic (#755)
  • 753e02b chore: bump @​npmcli/template-oss from 4.23.3 to 4.23.4 (#747)
  • 8a34bde fix: add identifier validation to inc() (#754)
  • 0864b3c feat: add "release" inc type (#753)
  • 67e5478 docs(readme): added missing period for consistency (#756)
  • 868d4bb docs: clarify comment about obsolete prefixes (#749)
  • 145c554 chore: bump @​npmcli/eslint-config from 4.0.5 to 5.0.0
  • 0b812d5 chore: postinstall for dependabot template-oss PR
  • 6502a15 chore: bump @​npmcli/template-oss from 4.23.1 to 4.23.3
  • Additional commits viewable in compare view

Updates `typescript-eslint` from 8.21.0 to 8.22.0
Release notes

Sourced from typescript-eslint's releases.

v8.22.0

8.22.0 (2025-01-27)

πŸš€ Features

  • parser: add standalone isolatedDeclarations option (#10499)

🩹 Fixes

  • eslint-plugin: [prefer-nullish-coalescing] doesn't report on ternary but on equivalent || (#10517)
  • eslint-plugin: [no-duplicate-type-constituents] handle nested types (#10638)
  • eslint-plugin: [no-shadow] don't report unnecessarily on valid ways of using module augmentation (#10616)
  • eslint-plugin: [no-extraneous-class] handle accessor keyword (#10678)
  • eslint-plugin: [prefer-readonly] autofixer doesn't add type to property that is mutated in the constructor (#10552)
  • eslint-plugin: [no-unnecessary-template-expression] handle template literal type (#10612)
  • type-utils: support matching intersection types in TypeOrValueSpecifier with a PackageSpecifier (#10667)

❀️ Thank You

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from typescript-eslint's changelog.

8.22.0 (2025-01-27)

This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.

You can read about our versioning strategy and releases on our website.

Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package.json | 6 +- package.json | 10 +-- yarn.lock | 165 ++++++++++++++++++++++++---------------------- 3 files changed, 95 insertions(+), 86 deletions(-) diff --git a/docs/package.json b/docs/package.json index 81edfb8b4..801fa300c 100644 --- a/docs/package.json +++ b/docs/package.json @@ -40,12 +40,12 @@ "@docusaurus/module-type-aliases": "3.7.0", "@docusaurus/tsconfig": "3.7.0", "@docusaurus/types": "3.7.0", - "@eslint/js": "^9.18.0", + "@eslint/js": "^9.19.0", "@mdx-js/typescript-plugin": "^0.0.8", "@types/eslint": "^9.6.1", "@types/eslint-config-prettier": "^6.11.3", "@types/ua-parser-js": "^0.7.39", - "eslint": "^9.18.0", + "eslint": "^9.19.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-mdx": "^3.1.5", "prettier": "^3.4.2", @@ -57,7 +57,7 @@ "remark-preset-lint-consistent": "^6.0.1", "remark-preset-lint-recommended": "^7.0.1", "typescript": "^5.7.3", - "typescript-eslint": "^8.21.0" + "typescript-eslint": "^8.22.0" }, "resolutions": { "path-to-regexp@npm:2.2.1": "^3", diff --git a/package.json b/package.json index 5354a60d0..740f96ae9 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@chromatic-com/storybook": "^3.2.4", - "@eslint/js": "^9.18.0", + "@eslint/js": "^9.19.0", "@rollup/plugin-node-resolve": "^16.0.0", "@storybook/addon-essentials": "^8.5.2", "@storybook/addon-interactions": "^8.5.2", @@ -43,7 +43,7 @@ "@types/css-tree": "^2", "@types/debug": "^4", "@types/electron": "^1.6.12", - "@types/node": "^22.10.10", + "@types/node": "^22.12.0", "@types/papaparse": "^5", "@types/pngjs": "^6.0.5", "@types/prop-types": "^15", @@ -61,21 +61,21 @@ "electron": "^34.0.2", "electron-builder": "^25.1.8", "electron-vite": "^2.3.0", - "eslint": "^9.18.0", + "eslint": "^9.19.0", "eslint-config-prettier": "^10.0.1", "prettier": "^3.4.2", "prettier-plugin-jsdoc": "^1.3.2", "prettier-plugin-organize-imports": "^4.1.0", "rollup-plugin-flow": "^1.1.1", "sass": "^1.83.4", - "semver": "^7.6.3", + "semver": "^7.7.0", "storybook": "^8.5.2", "storybook-dark-mode": "^4.0.2", "ts-node": "^10.9.2", "tslib": "^2.8.1", "tsx": "^4.19.2", "typescript": "^5.7.3", - "typescript-eslint": "^8.21.0", + "typescript-eslint": "^8.22.0", "vite": "^6.0.11", "vite-plugin-image-optimizer": "^1.1.8", "vite-plugin-static-copy": "^2.2.0", diff --git a/yarn.lock b/yarn.lock index 95e6ab003..7a83405a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3493,10 +3493,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.18.0, @eslint/js@npm:^9.18.0": - version: 9.18.0 - resolution: "@eslint/js@npm:9.18.0" - checksum: 10c0/3938344c5ac7feef4b73fcb30f3c3e753570cea74c24904bb5d07e9c42fcd34fcbc40f545b081356a299e11f360c9c274b348c05fb0113fc3d492e5175eee140 +"@eslint/js@npm:9.19.0, @eslint/js@npm:^9.19.0": + version: 9.19.0 + resolution: "@eslint/js@npm:9.19.0" + checksum: 10c0/45dc544c8803984f80a438b47a8e578fae4f6e15bc8478a703827aaf05e21380b42a43560374ce4dad0d5cb6349e17430fc9ce1686fed2efe5d1ff117939ff90 languageName: node linkType: hard @@ -6111,12 +6111,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^22.10.10": - version: 22.10.10 - resolution: "@types/node@npm:22.10.10" +"@types/node@npm:^22.12.0": + version: 22.12.0 + resolution: "@types/node@npm:22.12.0" dependencies: undici-types: "npm:~6.20.0" - checksum: 10c0/3425772d4513cd5dbdd87c00acda088113c03a97445f84f6a89744c60a66990b56c9d3a7213d09d57b6b944ae8ff45f985565e0c1846726112588e33a22dd12b + checksum: 10c0/be220706732d95db2ed1c441c1e64cab90bf9a47519ce6f4c79cc5a9ec9d5c517131a149a9ac30afac1a30103e67e3a00d453ba7c1b0141608a3a7ba6397c303 languageName: node linkType: hard @@ -6454,15 +6454,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.21.0" +"@typescript-eslint/eslint-plugin@npm:8.22.0": + version: 8.22.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.22.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.21.0" - "@typescript-eslint/type-utils": "npm:8.21.0" - "@typescript-eslint/utils": "npm:8.21.0" - "@typescript-eslint/visitor-keys": "npm:8.21.0" + "@typescript-eslint/scope-manager": "npm:8.22.0" + "@typescript-eslint/type-utils": "npm:8.22.0" + "@typescript-eslint/utils": "npm:8.22.0" + "@typescript-eslint/visitor-keys": "npm:8.22.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -6471,64 +6471,64 @@ __metadata: "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/4601d21ec35b9fa5cfc1ad0330733ab40d6c6822c7fc15c3584a16f678c9a72e077a1725a950823fe0f499a15f3981795b1ea5d1e7a1be5c7b8296ea9ae6327c + checksum: 10c0/eecc23e05287cc99a43855d64c0f0898f690ee14b8c31b60ba92ce9732443f6b0c9695514b276fb2ecd27e64c15d4c38cd28b570779115525b4dfdbba60e81ca languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/parser@npm:8.21.0" +"@typescript-eslint/parser@npm:8.22.0": + version: 8.22.0 + resolution: "@typescript-eslint/parser@npm:8.22.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.21.0" - "@typescript-eslint/types": "npm:8.21.0" - "@typescript-eslint/typescript-estree": "npm:8.21.0" - "@typescript-eslint/visitor-keys": "npm:8.21.0" + "@typescript-eslint/scope-manager": "npm:8.22.0" + "@typescript-eslint/types": "npm:8.22.0" + "@typescript-eslint/typescript-estree": "npm:8.22.0" + "@typescript-eslint/visitor-keys": "npm:8.22.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/aadebd50ca7aa2d61ad85d890c0d7010f2c293ec4d50a7833ef9674f232f0bc7118faa93a898771fbea50f02d542d687cf3569421b23f72fe6fed6895d5506fc + checksum: 10c0/6575684d4724aa908b0d6a29db5d5054b9277804844ee4179c77371f8b8b84534b9b7e4df0e282c5f39729ae6f0019208a6b83f0ca5d0f06f9da5a06d8ddb4fd languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/scope-manager@npm:8.21.0" +"@typescript-eslint/scope-manager@npm:8.22.0": + version: 8.22.0 + resolution: "@typescript-eslint/scope-manager@npm:8.22.0" dependencies: - "@typescript-eslint/types": "npm:8.21.0" - "@typescript-eslint/visitor-keys": "npm:8.21.0" - checksum: 10c0/ea405e79dc884ea1c76465604db52f9b0941d6cbb0bde6bce1af689ef212f782e214de69d46503c7c47bfc180d763369b7433f1965e3be3c442b417e8c9f8f75 + "@typescript-eslint/types": "npm:8.22.0" + "@typescript-eslint/visitor-keys": "npm:8.22.0" + checksum: 10c0/f393ab32086f4b095fcd77169abb5200ad94f282860944d164cec8c9b70090c36235f49b066ba24dfd953201b7730e48200a254e5950a9a3565acdacbbc0fd64 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/type-utils@npm:8.21.0" +"@typescript-eslint/type-utils@npm:8.22.0": + version: 8.22.0 + resolution: "@typescript-eslint/type-utils@npm:8.22.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.21.0" - "@typescript-eslint/utils": "npm:8.21.0" + "@typescript-eslint/typescript-estree": "npm:8.22.0" + "@typescript-eslint/utils": "npm:8.22.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.0.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/617f5dfe83fd9a7c722b27fa4e7f0c84f29baa94f75a4e8e5ccfd5b0a373437f65724e21b9642870fb0960f204b1a7f516a038200a12f8118f21b1bf86315bf3 + checksum: 10c0/dc457d9184dc2156eda225c63de03b1052d75464d6393edaf0f1728eecf64170f73e19bc9b9d4a4a029870ce25015b59bd6705e1e18b731ca4fcecac4398bfb7 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/types@npm:8.21.0" - checksum: 10c0/67dfd300cc614d7b02e94d0dacfb228a7f4c3fd4eede29c43adb9e9fcc16365ae3df8d6165018da3c123dce65545bef03e3e8183f35e9b3a911ffc727e3274c2 +"@typescript-eslint/types@npm:8.22.0": + version: 8.22.0 + resolution: "@typescript-eslint/types@npm:8.22.0" + checksum: 10c0/6357d0937e2b84ddb00763d05053fe50f2270fa428aa11f1ad6a1293827cf54da7e6d4d20b00b9d4f633b6982a2eb0e494f05285daa1279d8a3493f0d8abae18 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.21.0" +"@typescript-eslint/typescript-estree@npm:8.22.0": + version: 8.22.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.22.0" dependencies: - "@typescript-eslint/types": "npm:8.21.0" - "@typescript-eslint/visitor-keys": "npm:8.21.0" + "@typescript-eslint/types": "npm:8.22.0" + "@typescript-eslint/visitor-keys": "npm:8.22.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -6537,32 +6537,32 @@ __metadata: ts-api-utils: "npm:^2.0.0" peerDependencies: typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/0cf5b0382524f4af54fb5ec71ca7e939ec922711f2d77b383740b28dd4b21407b0ab5dded62df6819d01c12c0b354e95667e3c7025a5d27d05b805161ab94855 + checksum: 10c0/0a9d77fbadfb1e54c06abde424e461103576595c70e50ae8a15a3d7c07f125f253f505208e1ea5cc483b9073d95fc10ce0c4ddfe0fe08ec2aceda6314c341e0d languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/utils@npm:8.21.0" +"@typescript-eslint/utils@npm:8.22.0": + version: 8.22.0 + resolution: "@typescript-eslint/utils@npm:8.22.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.21.0" - "@typescript-eslint/types": "npm:8.21.0" - "@typescript-eslint/typescript-estree": "npm:8.21.0" + "@typescript-eslint/scope-manager": "npm:8.22.0" + "@typescript-eslint/types": "npm:8.22.0" + "@typescript-eslint/typescript-estree": "npm:8.22.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/d8347dbe9176417220aa62902cfc1b2007a9246bb7a8cccdf8590120903eb50ca14cb668efaab4646d086277f2367559985b62230e43ebd8b0723d237eeaa2f2 + checksum: 10c0/6f1e3f9c0fb865c8cef4fdca04679cea7357ed011338b54d80550e9ad5369a3f24cbe4b0985d293192fe351fa133e5f4ea401f47af90bb46c21903bfe087b398 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.21.0" +"@typescript-eslint/visitor-keys@npm:8.22.0": + version: 8.22.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.22.0" dependencies: - "@typescript-eslint/types": "npm:8.21.0" + "@typescript-eslint/types": "npm:8.22.0" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/b3f1412f550e35c0d7ae0410db616951116b365167539f9b85710d8bc2b36b322c5e637caee84cc1ae5df8f1d961880250d52ffdef352b31e5bdbef74ba6fea9 + checksum: 10c0/fd83d2feadaf79950427fbbc3d23ca01cf4646ce7e0dd515a9c881d31ec1cc768e7b8898d3af065e31df39452501a3345092581cbfccac89e89d293519540557 languageName: node linkType: hard @@ -10861,16 +10861,16 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^9.18.0": - version: 9.18.0 - resolution: "eslint@npm:9.18.0" +"eslint@npm:^9.19.0": + version: 9.19.0 + resolution: "eslint@npm:9.19.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.12.1" "@eslint/config-array": "npm:^0.19.0" "@eslint/core": "npm:^0.10.0" "@eslint/eslintrc": "npm:^3.2.0" - "@eslint/js": "npm:9.18.0" + "@eslint/js": "npm:9.19.0" "@eslint/plugin-kit": "npm:^0.2.5" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" @@ -10906,7 +10906,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/7f592ad228b9bd627a24870fdc875bacdab7bf535d4b67316c4cb791e90d0125130a74769f3c407b0c4b7027b3082ef33864a63ee1024552a60a17db60493f15 + checksum: 10c0/3b0dfaeff6a831de086884a3e2432f18468fe37c69f35e1a0a9a2833d9994a65b6dd2a524aaee28f361c849035ad9d15e3841029b67d261d0abd62c7de6d51f5 languageName: node linkType: hard @@ -19218,6 +19218,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.7.0": + version: 7.7.0 + resolution: "semver@npm:7.7.0" + bin: + semver: bin/semver.js + checksum: 10c0/bcd1c03209b4be7d8ca86c976a0410beba7d4ec1d49d846a4be154b958db1ff5eaee50760c1d4f4070b19dee3236b8672d3e09642c53ea23740398bba2538a2d + languageName: node + linkType: hard + "send@npm:0.19.0": version: 0.19.0 resolution: "send@npm:0.19.0" @@ -20686,17 +20695,17 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:^8.21.0": - version: 8.21.0 - resolution: "typescript-eslint@npm:8.21.0" +"typescript-eslint@npm:^8.22.0": + version: 8.22.0 + resolution: "typescript-eslint@npm:8.22.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.21.0" - "@typescript-eslint/parser": "npm:8.21.0" - "@typescript-eslint/utils": "npm:8.21.0" + "@typescript-eslint/eslint-plugin": "npm:8.22.0" + "@typescript-eslint/parser": "npm:8.22.0" + "@typescript-eslint/utils": "npm:8.22.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/44e5c341ad7f0b41dce3b4ca7a4c0a399ebe51a5323d930750db1e308367b4813a620f4c2332a5774a1dccd0047ebbaf993a8b7effd67389e9069b29b5701520 + checksum: 10c0/d7a5ec4a08d0eb0a7cc0bf81919f0305a9fbb091b187cef6d3fa220c1673414dcb46e6cd5c9325050d3df2bbb283756399c1b2720eb4eadaab0bdc3cc8302405 languageName: node linkType: hard @@ -21595,7 +21604,7 @@ __metadata: "@docusaurus/theme-search-algolia": "npm:^3.7.0" "@docusaurus/tsconfig": "npm:3.7.0" "@docusaurus/types": "npm:3.7.0" - "@eslint/js": "npm:^9.18.0" + "@eslint/js": "npm:^9.19.0" "@mdx-js/react": "npm:^3.0.0" "@mdx-js/typescript-plugin": "npm:^0.0.8" "@types/eslint": "npm:^9.6.1" @@ -21604,7 +21613,7 @@ __metadata: "@waveterm/docusaurus-og": "https://github.com/wavetermdev/docusaurus-og.git" clsx: "npm:^2.1.1" docusaurus-plugin-sass: "npm:^0.2.6" - eslint: "npm:^9.18.0" + eslint: "npm:^9.19.0" eslint-config-prettier: "npm:^10.0.1" eslint-plugin-mdx: "npm:^3.1.5" prettier: "npm:^3.4.2" @@ -21623,7 +21632,7 @@ __metadata: remark-typescript-code-import: "npm:^1.0.1" sass: "npm:^1.83.4" typescript: "npm:^5.7.3" - typescript-eslint: "npm:^8.21.0" + typescript-eslint: "npm:^8.22.0" ua-parser-js: "npm:^2.0.0" languageName: unknown linkType: soft @@ -21633,7 +21642,7 @@ __metadata: resolution: "waveterm@workspace:." dependencies: "@chromatic-com/storybook": "npm:^3.2.4" - "@eslint/js": "npm:^9.18.0" + "@eslint/js": "npm:^9.19.0" "@floating-ui/react": "npm:^0.26.28" "@monaco-editor/loader": "npm:^1.4.0" "@monaco-editor/react": "npm:^4.6.0" @@ -21656,7 +21665,7 @@ __metadata: "@types/css-tree": "npm:^2" "@types/debug": "npm:^4" "@types/electron": "npm:^1.6.12" - "@types/node": "npm:^22.10.10" + "@types/node": "npm:^22.12.0" "@types/papaparse": "npm:^5" "@types/pngjs": "npm:^6.0.5" "@types/prop-types": "npm:^15" @@ -21689,7 +21698,7 @@ __metadata: electron-updater: "npm:6.3.9" electron-vite: "npm:^2.3.0" env-paths: "npm:^3.0.0" - eslint: "npm:^9.18.0" + eslint: "npm:^9.19.0" eslint-config-prettier: "npm:^10.0.1" fast-average-color: "npm:^9.4.0" htl: "npm:^0.3.1" @@ -21725,7 +21734,7 @@ __metadata: rollup-plugin-flow: "npm:^1.1.1" rxjs: "npm:^7.8.1" sass: "npm:^1.83.4" - semver: "npm:^7.6.3" + semver: "npm:^7.7.0" sharp: "npm:^0.33.5" shell-quote: "npm:^1.8.2" sprintf-js: "npm:^1.1.3" @@ -21737,7 +21746,7 @@ __metadata: tslib: "npm:^2.8.1" tsx: "npm:^4.19.2" typescript: "npm:^5.7.3" - typescript-eslint: "npm:^8.21.0" + typescript-eslint: "npm:^8.22.0" use-device-pixel-ratio: "npm:^1.1.2" vite: "npm:^6.0.11" vite-plugin-image-optimizer: "npm:^1.1.8" From 2cae9ba7dd8d599cf5c6a60e4ed1580939b43fb0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 13:50:36 -0800 Subject: [PATCH 13/17] Bump the prod-dependencies-minor group with 6 updates (#1888) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the prod-dependencies-minor group with 6 updates: | Package | From | To | | --- | --- | --- | | [@floating-ui/react](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/react) | `0.26.28` | `0.27.3` | | [css-tree](https://github.com/csstree/csstree) | `3.0.1` | `3.1.0` | | [debug](https://github.com/debug-js/debug) | `4.3.7` | `4.4.0` | | [papaparse](https://github.com/mholt/PapaParse) | `5.4.1` | `5.5.2` | | [react-zoom-pan-pinch](https://github.com/prc5/react-zoom-pan-pinch) | `3.6.1` | `3.7.0` | | [yaml](https://github.com/eemeli/yaml) | `2.6.1` | `2.7.0` | Updates `@floating-ui/react` from 0.26.28 to 0.27.3
Release notes

Sourced from @​floating-ui/react's releases.

@​floating-ui/react@​0.27.3

Patch Changes

  • feat(FloatingFocusManager): accept FloatingRootContext as the context prop
  • fix(useListNavigation): check for virtual pointer on pointerenter
  • refactor: use jsx runtime
  • Update dependencies: @floating-ui/utils@0.2.9

@​floating-ui/react@​0.27.2

Patch Changes

  • fix(FloatingFocusManager): prevent stale inert/aria-hidden attributes from being left on outside elements

@​floating-ui/react@​0.27.1

Patch Changes

  • fix(FloatingFocusManager): correctly fallback to container
  • fix(FloatingFocusManager): check for ancestor floating focus element during closeOnFocusOut
  • fix(FloatingFocusManager): avoid marking tree ancestor floating nodes with data-floating-ui-inert when modal=false

@​floating-ui/react@​0.27.0

Minor Changes

  • chore: deprecate inner and useInnerOffset. This technique of aligning an inner element to the reference has poor performance with longer lists, doesn't fit with the middleware paradigm, doesn't work on touch, and has a better custom alternative using native onScroll that is encouraged instead.
  • breaking: drop React 16 support. 17 is the minimum supported version.
  • fix(useId): add | undefined return type for React 17

Patch Changes

  • feat(FloatingFocusManager): add outsideElementsInert prop. This enables pointer modality without a backdrop.
  • perf(useListNavigation): simplify focusing to remove unneeded asynchronicity
  • fix(useDismiss): allow native clicks to work with referencePress
  • fix(useDismiss): read target overflow style for scrollbar press check. Fixes an issue where outside presses would be incorrectly prevented if the target element that was pressed appeared scrollable but was actually not.
  • fix(FloatingFocusManager): check for 'safe-polygon' reason on return focus
Changelog

Sourced from @​floating-ui/react's changelog.

0.27.3

Patch Changes

  • feat(FloatingFocusManager): accept FloatingRootContext as the context prop
  • fix(useListNavigation): check for virtual pointer on pointerenter
  • refactor: use jsx runtime
  • Update dependencies: @floating-ui/utils@0.2.9

0.27.2

Patch Changes

  • fix(FloatingFocusManager): prevent stale inert/aria-hidden attributes from being left on outside elements

0.27.1

Patch Changes

  • fix(FloatingFocusManager): correctly fallback to container
  • fix(FloatingFocusManager): check for ancestor floating focus element during closeOnFocusOut
  • fix(FloatingFocusManager): avoid marking tree ancestor floating nodes with data-floating-ui-inert when modal=false

0.27.0

Minor Changes

  • chore: deprecate inner and useInnerOffset. This technique of aligning an inner element to the reference has poor performance with longer lists, doesn't fit with the middleware paradigm, doesn't work on touch, and has a better custom alternative using native onScroll that is encouraged instead.
  • breaking: drop React 16 support. 17 is the minimum supported version.
  • fix(useId): add | undefined return type for React 17

Patch Changes

  • feat(FloatingFocusManager): add outsideElementsInert prop. This enables pointer modality without a backdrop.
  • perf(useListNavigation): simplify focusing to remove unneeded asynchronicity
  • fix(useDismiss): allow native clicks to work with referencePress
  • fix(useDismiss): read target overflow style for scrollbar press check. Fixes an issue where outside presses would be incorrectly prevented if the target element that was pressed appeared scrollable but was actually not.
  • fix(FloatingFocusManager): check for 'safe-polygon' reason on return focus
Commits
  • b0dfb58 chore: version packages (#3187)
  • 1fa2c50 chore(eslint): add 'eslint-plugin-prettier', apply 'prettier' rules (#3177)
  • 69b5f88 feat(FloatingFocusManager): accept FloatingRootContext (#3182)
  • b6d88be fix(useListNavigation): check for virtual pointer on pointerenter (#3184)
  • 568eab7 refactor: use jsx runtime (#3186)
  • 6a9f758 chore: version packages (#3165)
  • c9f19ec fix(FloatingFocusManager): prevent stale inert/aria-hidden attributes fro...
  • 33bd900 chore: version packages (#3158)
  • e24b4fb fix(FloatingFocusManager): avoid marking tree ancestor floating nodes when `m...
  • c728afa fix(FloatingFocusManager): check for floating focus root element (#3159)
  • Additional commits viewable in compare view

Updates `css-tree` from 3.0.1 to 3.1.0
Release notes

Sourced from css-tree's releases.

3.1.0

  • Added support for boolean expression multiplier in syntax definition, i.e. <boolean-expr[ test ]> (#304)
  • Added source, startOffset, startLine, and startColumn parameters to OffsetToLocation constructor, eliminating the need to call setSource() after creating a new OffsetToLocation instance
  • Exposed OffsetToLocation class in the main entry point, which was previously accessible only via css-tree/tokenizer
  • Fixed Raw node value consumption by ignoring stop tokens inside blocks, resolving an issue where Raw value consumption stopped prematurely. This fix also enables parsing of functions whose content includes stop characters (e.g., semicolons and curly braces) within declaration values, aligning with the latest draft of CSS Values and Units L5.
  • Fixed TokenStream#balance computation to handle unmatched brackets correctly. Previously, when encountering a closing bracket, the TokenStream would prioritize it over unmatched opening brackets, leading to improper parsing. For example, the parser would incorrectly consume the declaration value of .a { prop: ([{); } as ([{) instead of consuming it until all opened brackets were closed (([{); }). Now, unmatched closing brackets are discarded unless they match the most recent opening bracket on the stack. This change aligns CSSTree with CSS specifications and browser behavior.
  • Fixed syntax definition parser to allow a token to be followed by a multiplier (#303)
  • Fixed location for Layer node (#310)
  • Bumped mdn/data to 2.12.2
Changelog

Sourced from css-tree's changelog.

3.1.0 (December 6, 2024)

  • Added support for boolean expression multiplier in syntax definition, i.e. <boolean-expr[ test ]> (#304)
  • Added source, startOffset, startLine, and startColumn parameters to OffsetToLocation constructor, eliminating the need to call setSource() after creating a new OffsetToLocation instance
  • Exposed OffsetToLocation class in the main entry point, which was previously accessible only via css-tree/tokenizer
  • Fixed Raw node value consumption by ignoring stop tokens inside blocks, resolving an issue where Raw value consumption stopped prematurely. This fix also enables parsing of functions whose content includes stop characters (e.g., semicolons and curly braces) within declaration values, aligning with the latest draft of CSS Values and Units Module Level 5.
  • Fixed TokenStream#balance computation to handle unmatched brackets correctly. Previously, when encountering a closing bracket, the TokenStream would prioritize it over unmatched opening brackets, leading to improper parsing. For example, the parser would incorrectly consume the declaration value of .a { prop: ([{); } as ([{) instead of consuming it until all opened brackets were closed (([{); }). Now, unmatched closing brackets are discarded unless they match the most recent opening bracket on the stack. This change aligns CSSTree with CSS specifications and browser behavior.
  • Fixed syntax definition parser to allow a token to be followed by a multiplier (#303)
  • Fixed location for Layer node (#310)
  • Bumped mdn/data to 2.12.2
Commits
  • 354254f 3.1.0
  • 3e0b93b Fix TokenStream#balance computation and
  • 6b24dcc Fix npm audit warning
  • 758ccf7 Fix location of <layer-name> (#310)
  • 7cfec03 Bump esbuild to ^0.24.0
  • eab1c8e Add source, startOffset, startLine, and startColumn parameters to `Of...
  • ab29676 Expose OffsetToLocation in main entry point
  • 0afee3d Update mdn-data to v2.12.2 (#306)
  • 2c95a51 Add lexer can check at-rules syntax
  • 511bed5 Rename <boolean[]> into <boolean-expr[]> (fixes #307)
  • Additional commits viewable in compare view

Updates `debug` from 4.3.7 to 4.4.0
Release notes

Sourced from debug's releases.

4.4.0

Fixes (hopefully) the inefficient regex warnings in .enable().

Minor version as this is invariably going to break certain users who misuse the .enable() API and expected it to work with regexes, which was never supported nor documented. That's on you, sorry - that functionality won't be added back.

Full Changelog: https://github.com/debug-js/debug/compare/4.3.7...4.4.0

Commits

Updates `papaparse` from 5.4.1 to 5.5.2
Commits

Updates `react-zoom-pan-pinch` from 3.6.1 to 3.7.0
Release notes

Sourced from react-zoom-pan-pinch's releases.

v3.7.0

3.7.0 (2025-01-31)

Bug Fixes

Features

  • Support auto align to bounds on resize (#485) (800beb1)
Commits

Updates `yaml` from 2.6.1 to 2.7.0
Release notes

Sourced from yaml's releases.

v2.7.0

The library is now available on JSR as @​eemeli/yaml and on deno.land/x as yaml. In addition to Node.js and browsers, it should work in Deno, Bun, and Cloudflare Workers.

  • Use .ts extension in all relative imports (#591)
  • Ignore newline after block seq indicator as space before value (#590)
  • Require Node.js 14.18 or later (was 14.6) (#598)
Commits
  • 8f512b5 2.7.0
  • 8a7569a ci: Add jsr.jsonc & jsr-publish workflow
  • 8ef085f docs: Fix API docs links
  • 374c19c style: Really use explicit imports for process.env and Buffer
  • 1ab037d style: Include explicit type declarations on all public APIs
  • 4354c42 style: Use explicit imports for process.env and Buffer
  • 2c55723 Merge pull request #591 from eemeli/import-ts
  • ab240c1 fix: Drop .ts extension from import & export paths in .d.ts files
  • c4c49f9 fix: Use separate rather than inline type keyword for TS compatibility
  • 3bec004 ci: Add deno smoke test
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 12 ++++---- yarn.lock | 77 ++++++++++++++++++++++++++++------------------------ 2 files changed, 48 insertions(+), 41 deletions(-) diff --git a/package.json b/package.json index 740f96ae9..d1548f4d6 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "vitest": "^3.0.4" }, "dependencies": { - "@floating-ui/react": "^0.26.28", + "@floating-ui/react": "^0.27.3", "@monaco-editor/loader": "^1.4.0", "@monaco-editor/react": "^4.6.0", "@observablehq/plot": "^0.6.16", @@ -102,9 +102,9 @@ "clsx": "^2.1.1", "color": "^4.2.3", "colord": "^2.9.3", - "css-tree": "^3.0.1", + "css-tree": "^3.1.0", "dayjs": "^1.11.13", - "debug": "^4.3.7", + "debug": "^4.4.0", "electron-updater": "6.3.9", "env-paths": "^3.0.0", "fast-average-color": "^9.4.0", @@ -116,7 +116,7 @@ "monaco-yaml": "^5.2.3", "overlayscrollbars": "^2.10.1", "overlayscrollbars-react": "^0.5.6", - "papaparse": "^5.4.1", + "papaparse": "^5.5.2", "parse-srcset": "^1.0.2", "pngjs": "^7.0.0", "prop-types": "^15.8.1", @@ -127,7 +127,7 @@ "react-frame-component": "^5.2.7", "react-gauge-chart": "^0.5.1", "react-markdown": "^9.0.3", - "react-zoom-pan-pinch": "^3.6.1", + "react-zoom-pan-pinch": "^3.7.0", "rehype-highlight": "^7.0.1", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", @@ -144,7 +144,7 @@ "use-device-pixel-ratio": "^1.1.2", "winston": "^3.17.0", "ws": "^8.18.0", - "yaml": "^2.6.1" + "yaml": "^2.7.0" }, "resolutions": { "send@npm:0.18.0": "0.19.0", diff --git a/yarn.lock b/yarn.lock index 7a83405a6..1ed0e490a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3548,17 +3548,17 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react@npm:^0.26.28": - version: 0.26.28 - resolution: "@floating-ui/react@npm:0.26.28" +"@floating-ui/react@npm:^0.27.3": + version: 0.27.3 + resolution: "@floating-ui/react@npm:0.27.3" dependencies: "@floating-ui/react-dom": "npm:^2.1.2" - "@floating-ui/utils": "npm:^0.2.8" + "@floating-ui/utils": "npm:^0.2.9" tabbable: "npm:^6.0.0" peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 10c0/a42df129e1e976fe8ba3f4c8efdda265a0196c1b66b83f2b9b27423d08dcc765406f893aeff9d830e70e3f14a9d4c490867eb4c32983317cbaa33863b0fae6f6 + react: ">=17.0.0" + react-dom: ">=17.0.0" + checksum: 10c0/9ebc4e82af905cfafeb5cde1dfbc15a2541d4eaaf1e13fb6b8acbb9f0c3535a7c331b8dee3ab5bb03acb21716ee2ab155629a6c14c3227cf959bf8ad92594539 languageName: node linkType: hard @@ -3569,6 +3569,13 @@ __metadata: languageName: node linkType: hard +"@floating-ui/utils@npm:^0.2.9": + version: 0.2.9 + resolution: "@floating-ui/utils@npm:0.2.9" + checksum: 10c0/48bbed10f91cb7863a796cc0d0e917c78d11aeb89f98d03fc38d79e7eb792224a79f538ed8a2d5d5584511d4ca6354ef35f1712659fd569868e342df4398ad6f + languageName: node + linkType: hard + "@gar/promisify@npm:^1.1.3": version: 1.1.3 resolution: "@gar/promisify@npm:1.1.3" @@ -9065,13 +9072,13 @@ __metadata: languageName: node linkType: hard -"css-tree@npm:^3.0.1": - version: 3.0.1 - resolution: "css-tree@npm:3.0.1" +"css-tree@npm:^3.1.0": + version: 3.1.0 + resolution: "css-tree@npm:3.1.0" dependencies: - mdn-data: "npm:2.12.1" + mdn-data: "npm:2.12.2" source-map-js: "npm:^1.0.1" - checksum: 10c0/9f117f3067e68e9edb0b3db0134f420db1a62bede3e84d8835767ecfaa6f8ced5e87989cf39b65ffe65d788c134c8ea9abd7393d7c35838a9da84326adf57a9b + checksum: 10c0/b5715852c2f397c715ca00d56ec53fc83ea596295ae112eb1ba6a1bda3b31086380e596b1d8c4b980fe6da09e7d0fc99c64d5bb7313030dd0fba9c1415f30979 languageName: node linkType: hard @@ -9550,7 +9557,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.7": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -14407,10 +14414,10 @@ __metadata: languageName: node linkType: hard -"mdn-data@npm:2.12.1": - version: 2.12.1 - resolution: "mdn-data@npm:2.12.1" - checksum: 10c0/1a09f441bdd423f2b0ab712665a1a3329fe7b15e9a2dad8c1c10c521ddb204ed186e7ac91052fd53a5ae0a07ac6eae53b5bcbb59ba8a1fb654268611297eea4a +"mdn-data@npm:2.12.2": + version: 2.12.2 + resolution: "mdn-data@npm:2.12.2" + checksum: 10c0/b22443b71d70f72ccc3c6ba1608035431a8fc18c3c8fc53523f06d20e05c2ac10f9b53092759a2ca85cf02f0d37036f310b581ce03e7b99ac74d388ef8152ade languageName: node linkType: hard @@ -15966,10 +15973,10 @@ __metadata: languageName: node linkType: hard -"papaparse@npm:^5.4.1": - version: 5.4.1 - resolution: "papaparse@npm:5.4.1" - checksum: 10c0/201f37c4813453fed5bfb4c01816696b099d2db9ff1e8fb610acc4771fdde91d2a22b6094721edb0fedb21ca3c46f04263f68be4beb3e35b8c72278f0cedc7b7 +"papaparse@npm:^5.5.2": + version: 5.5.2 + resolution: "papaparse@npm:5.5.2" + checksum: 10c0/83b8c0cf570395581a42331cd9231194dbba43bc8c608026739f5180827506575993dc788def039a9666bc103e2a96075de8732ea8a63e507b74c02aa757bcd5 languageName: node linkType: hard @@ -17778,13 +17785,13 @@ __metadata: languageName: node linkType: hard -"react-zoom-pan-pinch@npm:^3.6.1": - version: 3.6.1 - resolution: "react-zoom-pan-pinch@npm:3.6.1" +"react-zoom-pan-pinch@npm:^3.7.0": + version: 3.7.0 + resolution: "react-zoom-pan-pinch@npm:3.7.0" peerDependencies: react: "*" react-dom: "*" - checksum: 10c0/ec32df7ba9c1b8113fa87e5759c6b697f0f985df1be31b26720c3fdff67dc7f31ac13eabad201d7d5a12f2a4bed637bf7090e8a04f0237618bc751cf37c784d9 + checksum: 10c0/96889849800a953128fe7f9e42bed0d5cbc48d03024995b136f5e972146236688efb24d7381d8e6f09598f5512b4897d2420f62d828a665fdf24b745b7d55911 languageName: node linkType: hard @@ -21643,7 +21650,7 @@ __metadata: dependencies: "@chromatic-com/storybook": "npm:^3.2.4" "@eslint/js": "npm:^9.19.0" - "@floating-ui/react": "npm:^0.26.28" + "@floating-ui/react": "npm:^0.27.3" "@monaco-editor/loader": "npm:^1.4.0" "@monaco-editor/react": "npm:^4.6.0" "@observablehq/plot": "npm:^0.6.16" @@ -21690,9 +21697,9 @@ __metadata: clsx: "npm:^2.1.1" color: "npm:^4.2.3" colord: "npm:^2.9.3" - css-tree: "npm:^3.0.1" + css-tree: "npm:^3.1.0" dayjs: "npm:^1.11.13" - debug: "npm:^4.3.7" + debug: "npm:^4.4.0" electron: "npm:^34.0.2" electron-builder: "npm:^25.1.8" electron-updater: "npm:6.3.9" @@ -21709,7 +21716,7 @@ __metadata: monaco-yaml: "npm:^5.2.3" overlayscrollbars: "npm:^2.10.1" overlayscrollbars-react: "npm:^0.5.6" - papaparse: "npm:^5.4.1" + papaparse: "npm:^5.5.2" parse-srcset: "npm:^1.0.2" pngjs: "npm:^7.0.0" prettier: "npm:^3.4.2" @@ -21723,7 +21730,7 @@ __metadata: react-frame-component: "npm:^5.2.7" react-gauge-chart: "npm:^0.5.1" react-markdown: "npm:^9.0.3" - react-zoom-pan-pinch: "npm:^3.6.1" + react-zoom-pan-pinch: "npm:^3.7.0" rehype-highlight: "npm:^7.0.1" rehype-raw: "npm:^7.0.0" rehype-sanitize: "npm:^6.0.0" @@ -21756,7 +21763,7 @@ __metadata: vitest: "npm:^3.0.4" winston: "npm:^3.17.0" ws: "npm:^8.18.0" - yaml: "npm:^2.6.1" + yaml: "npm:^2.7.0" languageName: unknown linkType: soft @@ -22230,12 +22237,12 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.6.1": - version: 2.6.1 - resolution: "yaml@npm:2.6.1" +"yaml@npm:^2.7.0": + version: 2.7.0 + resolution: "yaml@npm:2.7.0" bin: yaml: bin.mjs - checksum: 10c0/aebf07f61c72b38c74d2b60c3a3ccf89ee4da45bcd94b2bfb7899ba07a5257625a7c9f717c65a6fc511563d48001e01deb1d9e55f0133f3e2edf86039c8c1be7 + checksum: 10c0/886a7d2abbd70704b79f1d2d05fe9fb0aa63aefb86e1cb9991837dced65193d300f5554747a872b4b10ae9a12bc5d5327e4d04205f70336e863e35e89d8f4ea9 languageName: node linkType: hard From 750e26017453a4498edb4ea23662420d8928db29 Mon Sep 17 00:00:00 2001 From: Sylvie Crowe <107814465+oneirocosm@users.noreply.github.com> Date: Fri, 31 Jan 2025 13:51:07 -0800 Subject: [PATCH 14/17] fix: use correct mimetypes for .pem and .pub (#1891) This changes the .pem mimetype to application/x-pem-file. It also changes the .pub mimetype to text/plain. Lastly, it updates textApplicationMimetypes with this change. --- frontend/app/view/preview/preview.tsx | 2 +- pkg/util/fileutil/mimetypes.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/app/view/preview/preview.tsx b/frontend/app/view/preview/preview.tsx index 579612f4a..6d046b5ed 100644 --- a/frontend/app/view/preview/preview.tsx +++ b/frontend/app/view/preview/preview.tsx @@ -74,8 +74,8 @@ const SpecializedViewMap: { [view: string]: ({ model }: SpecializedViewProps) => const textApplicationMimetypes = [ "application/sql", - "application/pem-certificate-chain", "application/x-php", + "application/x-pem-file", "application/x-httpd-php", "application/liquid", "application/graphql", diff --git a/pkg/util/fileutil/mimetypes.go b/pkg/util/fileutil/mimetypes.go index cf1b9d069..f6baafad8 100644 --- a/pkg/util/fileutil/mimetypes.go +++ b/pkg/util/fileutil/mimetypes.go @@ -128,7 +128,6 @@ var StaticMimeTypeMap = map[string]string{ ".relo": "application/p2p-overlay+xml", ".pdf": "application/pdf", ".pdx": "application/PDX", - ".pem": "application/pem-certificate-chain", ".pgp": "application/pgp-encrypted", ".asc": "application/pgp-keys", ".sig": "application/pgp-signature", @@ -351,7 +350,6 @@ var StaticMimeTypeMap = map[string]string{ ".ecig": "application/vnd.evolv.ecig.settings", ".ecigtheme": "application/vnd.evolv.ecig.theme", ".mpw": "application/vnd.exstream-empower+zip", - ".pub": "application/vnd.exstream-package", ".ez2": "application/vnd.ezpix-album", ".ez3": "application/vnd.ezpix-package", ".gdz": "application/vnd.familysearch.gedcom+zip", @@ -769,6 +767,7 @@ var StaticMimeTypeMap = map[string]string{ ".gtar": "application/x-gtar", ".tgz": "application/x-gtar-compressed", ".hdf": "application/x-hdf", + ".pem": "application/x-pem-file", ".php": "application/x-php", ".hwp": "application/x-hwp", ".ica": "application/x-ica", @@ -1116,6 +1115,7 @@ var StaticMimeTypeMap = map[string]string{ ".n3": "text/n3", ".txt": "text/plain", ".conf": "text/plain", + ".pub": "text/plain", ".awk": "text/x-awk", ".provn": "text/provenance-notation", ".rst": "text/prs.fallenstein.rst", From 8cd35c4678786d87091eaa936574f70a53c306a8 Mon Sep 17 00:00:00 2001 From: Sylvie Crowe <107814465+oneirocosm@users.noreply.github.com> Date: Fri, 31 Jan 2025 16:37:23 -0800 Subject: [PATCH 15/17] fix: frontend file delete add recursive false (#1892) There was a recent backend change that update the interface to FileDeleteCommand. This updated was not reflected in directorypreview.tsx on the frontend. This updates the frontend to match. --- frontend/app/view/preview/directorypreview.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/app/view/preview/directorypreview.tsx b/frontend/app/view/preview/directorypreview.tsx index 9b951e40c..7bdc275dd 100644 --- a/frontend/app/view/preview/directorypreview.tsx +++ b/frontend/app/view/preview/directorypreview.tsx @@ -639,9 +639,8 @@ function TableBody({ click: () => { fireAndForget(async () => { await RpcApi.FileDeleteCommand(TabRpcClient, { - info: { - path: await model.formatRemoteUri(finfo.path, globalStore.get), - }, + path: await model.formatRemoteUri(finfo.path, globalStore.get), + recursive: false, }).catch((e) => console.log(e)); setRefreshVersion((current) => current + 1); }); From 1a70c8358261d3f15b39c8c6c4d11c94582a172d Mon Sep 17 00:00:00 2001 From: Sylvie Crowe <107814465+oneirocosm@users.noreply.github.com> Date: Fri, 31 Jan 2025 18:11:38 -0800 Subject: [PATCH 16/17] feat: add web zoom to help widget (#1893) The web widget already had a zoom feature, but the help widget did not. This change ports the zoom feature so it is available on the help widget as well. --- frontend/app/view/helpview/helpview.tsx | 62 ++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/frontend/app/view/helpview/helpview.tsx b/frontend/app/view/helpview/helpview.tsx index 30329e541..34ce9ba92 100644 --- a/frontend/app/view/helpview/helpview.tsx +++ b/frontend/app/view/helpview/helpview.tsx @@ -2,7 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 import { BlockNodeModel } from "@/app/block/blocktypes"; -import { getApi } from "@/app/store/global"; +import { getApi, globalStore, WOS } from "@/app/store/global"; +import { RpcApi } from "@/app/store/wshclientapi"; +import { TabRpcClient } from "@/app/store/wshrpcutil"; import { WebView, WebViewModel } from "@/app/view/webview/webview"; import { fireAndForget } from "@/util/util"; import { atom, useAtomValue } from "jotai"; @@ -59,7 +61,61 @@ class HelpViewModel extends WebViewModel { }; } + setZoomFactor(factor: number | null) { + // null is ok (will reset to default) + if (factor != null && factor < 0.1) { + factor = 0.1; + } + if (factor != null && factor > 5) { + factor = 5; + } + const domReady = globalStore.get(this.domReady); + if (!domReady) { + return; + } + this.webviewRef.current?.setZoomFactor(factor || 1); + RpcApi.SetMetaCommand(TabRpcClient, { + oref: WOS.makeORef("block", this.blockId), + meta: { "web:zoom": factor }, // allow null so we can remove the zoom factor here + }); + } + getSettingsMenuItems(): ContextMenuItem[] { + const zoomSubMenu: ContextMenuItem[] = []; + let curZoom = 1; + if (globalStore.get(this.domReady)) { + curZoom = this.webviewRef.current?.getZoomFactor() || 1; + } + const model = this; // for the closure to work (this is getting unset) + function makeZoomFactorMenuItem(label: string, factor: number): ContextMenuItem { + return { + label: label, + type: "checkbox", + click: () => { + model.setZoomFactor(factor); + }, + checked: curZoom == factor, + }; + } + zoomSubMenu.push({ + label: "Reset", + click: () => { + model.setZoomFactor(null); + }, + }); + zoomSubMenu.push(makeZoomFactorMenuItem("25%", 0.25)); + zoomSubMenu.push(makeZoomFactorMenuItem("50%", 0.5)); + zoomSubMenu.push(makeZoomFactorMenuItem("70%", 0.7)); + zoomSubMenu.push(makeZoomFactorMenuItem("80%", 0.8)); + zoomSubMenu.push(makeZoomFactorMenuItem("90%", 0.9)); + zoomSubMenu.push(makeZoomFactorMenuItem("100%", 1)); + zoomSubMenu.push(makeZoomFactorMenuItem("110%", 1.1)); + zoomSubMenu.push(makeZoomFactorMenuItem("120%", 1.2)); + zoomSubMenu.push(makeZoomFactorMenuItem("130%", 1.3)); + zoomSubMenu.push(makeZoomFactorMenuItem("150%", 1.5)); + zoomSubMenu.push(makeZoomFactorMenuItem("175%", 1.75)); + zoomSubMenu.push(makeZoomFactorMenuItem("200%", 2)); + return [ { label: this.webviewRef.current?.isDevToolsOpened() ? "Close DevTools" : "Open DevTools", @@ -73,6 +129,10 @@ class HelpViewModel extends WebViewModel { } }, }, + { + label: "Set Zoom Factor", + submenu: zoomSubMenu, + }, ]; } } From fc298f2a5026af3e541021b697ade863e4fa5d81 Mon Sep 17 00:00:00 2001 From: Sylvie Crowe <107814465+oneirocosm@users.noreply.github.com> Date: Mon, 3 Feb 2025 14:20:50 -0800 Subject: [PATCH 17/17] settings schema.json (#1874) Adds schema.json support to the settings file to provide type hints and other eventual details. This also adds a system to easily add more schema files for other type of configurations. --- Taskfile.yml | 14 ++ cmd/generateschema/main-generateschema.go | 39 +++ frontend/app/view/codeeditor/codeeditor.tsx | 104 ++++---- .../app/view/codeeditor/schemaendpoints.ts | 38 +++ frontend/wave.ts | 2 +- go.mod | 6 + go.sum | 19 ++ pkg/schema/schema.go | 54 ++++ pkg/web/web.go | 3 + schema/settings.json | 232 ++++++++++++++++++ 10 files changed, 468 insertions(+), 43 deletions(-) create mode 100644 cmd/generateschema/main-generateschema.go create mode 100644 frontend/app/view/codeeditor/schemaendpoints.ts create mode 100644 pkg/schema/schema.go create mode 100644 schema/settings.json diff --git a/Taskfile.yml b/Taskfile.yml index 6509bbef8..7be83f6c4 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -114,6 +114,18 @@ tasks: - task: build:server - task: build:wsh + build:schema: + desc: Build the schema for configuration. + sources: + - "cmd/generateschema/*.go" + - "pkg/wconfig/*.go" + generates: + - "dist/schema/**/*" + cmds: + - go run cmd/generateschema/main-generateschema.go + - '{{.RMRF}} "dist/schema"' + - task: copyfiles:'schema':'dist/schema' + build:server: desc: Build the wavesrv component. cmds: @@ -243,6 +255,8 @@ tasks: cmds: - go run cmd/generatets/main-generatets.go - go run cmd/generatego/main-generatego.go + deps: + - build:schema sources: - "cmd/generatego/*.go" - "cmd/generatets/*.go" diff --git a/cmd/generateschema/main-generateschema.go b/cmd/generateschema/main-generateschema.go new file mode 100644 index 000000000..bb0d09d6a --- /dev/null +++ b/cmd/generateschema/main-generateschema.go @@ -0,0 +1,39 @@ +// Copyright 2025, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "encoding/json" + "fmt" + "log" + "os" + + "github.com/invopop/jsonschema" + "github.com/wavetermdev/waveterm/pkg/util/utilfn" + "github.com/wavetermdev/waveterm/pkg/wconfig" +) + +const WaveSchemaSettingsFileName = "schema/settings.json" + +func main() { + settingsSchema := jsonschema.Reflect(&wconfig.SettingsType{}) + + jsonSettingsSchema, err := json.MarshalIndent(settingsSchema, "", " ") + if err != nil { + log.Fatalf("failed to parse local schema: %v", err) + } + /* + err = os.MkdirAll(WaveSchemaSettingsFileName, 0755) + if err != nil { + log.Fatalf("failed to create schema dir: %v", err) + } + */ + written, err := utilfn.WriteFileIfDifferent(WaveSchemaSettingsFileName, jsonSettingsSchema) + if !written { + fmt.Fprintf(os.Stderr, "no changes to %s\n", WaveSchemaSettingsFileName) + } + if err != nil { + log.Fatalf("failed to write local schema: %v", err) + } +} diff --git a/frontend/app/view/codeeditor/codeeditor.tsx b/frontend/app/view/codeeditor/codeeditor.tsx index 9947dab69..a71bd8a7c 100644 --- a/frontend/app/view/codeeditor/codeeditor.tsx +++ b/frontend/app/view/codeeditor/codeeditor.tsx @@ -9,11 +9,15 @@ import type * as MonacoTypes from "monaco-editor/esm/vs/editor/editor.api"; import { configureMonacoYaml } from "monaco-yaml"; import React, { useMemo, useRef } from "react"; +import { RpcApi } from "@/app/store/wshclientapi"; +import { TabRpcClient } from "@/app/store/wshrpcutil"; +import { makeConnRoute } from "@/util/util"; import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker"; import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker"; import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker"; import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker"; import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker"; +import { SchemaEndpoints, getSchemaEndpointInfo } from "./schemaendpoints"; import ymlWorker from "./yamlworker?worker"; import "./codeeditor.scss"; @@ -42,48 +46,45 @@ window.MonacoEnvironment = { }, }; -export function loadMonaco() { +export async function loadMonaco() { loader.config({ paths: { vs: "monaco" } }); - loader - .init() - .then(() => { - monaco.editor.defineTheme("wave-theme-dark", { - base: "vs-dark", - inherit: true, - rules: [], - colors: { - "editor.background": "#00000000", - "editorStickyScroll.background": "#00000055", - "minimap.background": "#00000077", - focusBorder: "#00000000", - }, - }); - monaco.editor.defineTheme("wave-theme-light", { - base: "vs", - inherit: true, - rules: [], - colors: { - "editor.background": "#fefefe", - focusBorder: "#00000000", - }, - }); - configureMonacoYaml(monaco, { - validate: true, - schemas: [], - }); - // Disable default validation errors for typescript and javascript - monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({ - noSemanticValidation: true, - }); - monaco.languages.json.jsonDefaults.setDiagnosticsOptions({ - validate: true, - allowComments: false, // Set to true if you want to allow comments in JSON - schemas: [], // You can specify JSON schemas here if needed - }); - }) - .catch((e) => { - console.error("error loading monaco", e); - }); + await loader.init(); + + monaco.editor.defineTheme("wave-theme-dark", { + base: "vs-dark", + inherit: true, + rules: [], + colors: { + "editor.background": "#00000000", + "editorStickyScroll.background": "#00000055", + "minimap.background": "#00000077", + focusBorder: "#00000000", + }, + }); + monaco.editor.defineTheme("wave-theme-light", { + base: "vs", + inherit: true, + rules: [], + colors: { + "editor.background": "#fefefe", + focusBorder: "#00000000", + }, + }); + configureMonacoYaml(monaco, { + validate: true, + schemas: [], + }); + // Disable default validation errors for typescript and javascript + monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({ + noSemanticValidation: true, + }); + const schemas = await Promise.all(SchemaEndpoints.map((endpoint) => getSchemaEndpointInfo(endpoint))); + monaco.languages.json.jsonDefaults.setDiagnosticsOptions({ + validate: true, + allowComments: false, // Set to true if you want to allow comments in JSON + enableSchemaRequest: true, + schemas, + }); } function defaultEditorOptions(): MonacoTypes.editor.IEditorOptions { @@ -125,6 +126,7 @@ export function CodeEditor({ blockId, text, language, filename, meta, onChange, const wordWrap = useOverrideConfigAtom(blockId, "editor:wordwrap") ?? false; const fontSize = boundNumber(useOverrideConfigAtom(blockId, "editor:fontsize"), 6, 64); const theme = "wave-theme-dark"; + const [absPath, setAbsPath] = React.useState(""); React.useEffect(() => { return () => { @@ -135,6 +137,24 @@ export function CodeEditor({ blockId, text, language, filename, meta, onChange, }; }, []); + React.useEffect(() => { + const inner = async () => { + try { + const fileInfo = await RpcApi.RemoteFileJoinCommand(TabRpcClient, [filename], { + route: makeConnRoute(meta.connection ?? ""), + }); + setAbsPath(`${fileInfo.dir}/${fileInfo.name}`); + } catch (e) { + setAbsPath(filename); + } + }; + inner(); + }, [filename]); + + React.useEffect(() => { + console.log("abspath is", absPath); + }, [absPath]); + function handleEditorChange(text: string, ev: MonacoTypes.editor.IModelContentChangedEvent) { if (onChange) { onChange(text); @@ -165,7 +185,7 @@ export function CodeEditor({ blockId, text, language, filename, meta, onChange, options={editorOpts} onChange={handleEditorChange} onMount={handleEditorOnMount} - path={filename} + path={absPath} language={language} /> diff --git a/frontend/app/view/codeeditor/schemaendpoints.ts b/frontend/app/view/codeeditor/schemaendpoints.ts new file mode 100644 index 000000000..19b1a546a --- /dev/null +++ b/frontend/app/view/codeeditor/schemaendpoints.ts @@ -0,0 +1,38 @@ +// Copyright 2025, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +import { getApi } from "@/app/store/global"; +import { getWebServerEndpoint } from "@/util/endpoints"; + +type EndpointInfo = { + uri: string; + fileMatch: Array; + schema: object; +}; + +const allFilepaths: Map> = new Map(); +allFilepaths.set(`${getWebServerEndpoint()}/schema/settings.json`, [`${getApi().getConfigDir()}/settings.json`]); + +async function getSchemaEndpointInfo(endpoint: string): Promise { + let schema: Object; + try { + const data = await fetch(endpoint); + const fullSchema: object = await data.json(); + const schemaRef: string = fullSchema?.["$ref"]; + schema = fullSchema?.[schemaRef]; + } catch (e) { + console.log("cannot find schema:", e); + schema = {}; + } + const fileMatch = allFilepaths.get(endpoint) ?? []; + + return { + uri: endpoint, + fileMatch, + schema, + }; +} + +const SchemaEndpoints = Array.from(allFilepaths.keys()); + +export { getSchemaEndpointInfo, SchemaEndpoints }; diff --git a/frontend/wave.ts b/frontend/wave.ts index 1a0ec3f41..ea49cbb6b 100644 --- a/frontend/wave.ts +++ b/frontend/wave.ts @@ -183,7 +183,7 @@ async function initWave(initOpts: WaveInitOpts) { registerGlobalKeys(); registerElectronReinjectKeyHandler(); registerControlShiftStateUpdateHandler(); - setTimeout(loadMonaco, 30); + await loadMonaco(); const fullConfig = await RpcApi.GetFullConfigCommand(TabRpcClient); console.log("fullconfig", fullConfig); globalStore.set(atoms.fullConfigAtom, fullConfig); diff --git a/go.mod b/go.mod index 6bca8039d..73748e4fa 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/gorilla/handlers v1.5.2 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.3 + github.com/invopop/jsonschema v0.13.0 github.com/jmoiron/sqlx v1.4.0 github.com/kevinburke/ssh_config v1.2.0 github.com/mattn/go-sqlite3 v1.14.24 @@ -59,6 +60,8 @@ require ( github.com/aws/aws-sdk-go-v2/service/sso v1.24.13 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.12 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.33.11 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/buger/jsonparser v1.1.1 // indirect github.com/ebitengine/purego v0.8.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -71,12 +74,14 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/ubuntu/decorate v0.0.0-20230125165522-2d5b0a9bb117 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect @@ -93,6 +98,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 // indirect google.golang.org/grpc v1.70.0 // indirect google.golang.org/protobuf v1.36.4 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) replace github.com/kevinburke/ssh_config => github.com/wavetermdev/ssh_config v0.0.0-20241219203747-6409e4292f34 diff --git a/go.sum b/go.sum index e883c11e2..e871be95d 100644 --- a/go.sum +++ b/go.sum @@ -52,6 +52,10 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.33.11 h1:RIXOjp7Dp4siCYJRwBHUcBdVgOW github.com/aws/aws-sdk-go-v2/service/sts v1.33.11/go.mod h1:ZR17k9bPKPR8u0IkyA6xVsjr56doNQ4ZB1fs7abYBfE= github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -105,12 +109,21 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= @@ -122,6 +135,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sashabaranov/go-openai v1.36.1 h1:EVfRXwIlW2rUzpx6vR+aeIKCK/xylSrVYAx1TMTSX3g= github.com/sashabaranov/go-openai v1.36.1/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= @@ -157,6 +172,8 @@ github.com/wavetermdev/htmltoken v0.2.0 h1:sFVPPemlDv7/jg7n4Hx1AEF2m9MVAFjFpELWf github.com/wavetermdev/htmltoken v0.2.0/go.mod h1:5FM0XV6zNYiNza2iaTcFGj+hnMtgqumFHO31Z8euquk= github.com/wavetermdev/ssh_config v0.0.0-20241219203747-6409e4292f34 h1:I8VZVTZEXhnzfN7jB9a7TZYpzNO48sCUWMRXHM9XWSA= github.com/wavetermdev/ssh_config v0.0.0-20241219203747-6409e4292f34/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= @@ -212,6 +229,8 @@ google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40Rmc google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/pkg/schema/schema.go b/pkg/schema/schema.go new file mode 100644 index 000000000..c4825cf3a --- /dev/null +++ b/pkg/schema/schema.go @@ -0,0 +1,54 @@ +// Copyright 2025, Command Line Inc. +// SPDX-License-Identifier: Apache-2.0 + +package schema + +import ( + "log" + "net/http" + "os" + "path/filepath" + + "github.com/wavetermdev/waveterm/pkg/wavebase" +) + +var schemaHandler http.Handler + +func GetSchemaHandler() http.Handler { + schemaStaticPath := filepath.Join(wavebase.GetWaveAppPath(), "schema") + stat, err := os.Stat(schemaStaticPath) + if schemaHandler == nil { + log.Println("Schema is nil, initializing") + if err == nil && stat.IsDir() { + log.Printf("Found static site at %s, serving\n", schemaStaticPath) + schemaHandler = http.FileServer(JsonDir{http.Dir(schemaStaticPath)}) + } else { + log.Printf("Did not find static site at %s, serving not found handler. stat: %v, err: %v\n", schemaStaticPath, stat, err) + schemaHandler = http.NotFoundHandler() + } + } + return addHeaders(schemaHandler) +} + +func addHeaders(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Content-Type", "application/schema+json") + next.ServeHTTP(w, r) + }) +} + +type JsonDir struct { + d http.Dir +} + +func (d JsonDir) Open(name string) (http.File, error) { + // Try name as supplied + f, err := d.d.Open(name) + if os.IsNotExist(err) { + // Not found, try with .json + if f, err := d.d.Open(name + ".json"); err == nil { + return f, nil + } + } + return f, err +} diff --git a/pkg/web/web.go b/pkg/web/web.go index 6cc1f999b..7450d6cb5 100644 --- a/pkg/web/web.go +++ b/pkg/web/web.go @@ -25,6 +25,7 @@ import ( "github.com/wavetermdev/waveterm/pkg/docsite" "github.com/wavetermdev/waveterm/pkg/filestore" "github.com/wavetermdev/waveterm/pkg/panichandler" + "github.com/wavetermdev/waveterm/pkg/schema" "github.com/wavetermdev/waveterm/pkg/service" "github.com/wavetermdev/waveterm/pkg/wavebase" "github.com/wavetermdev/waveterm/pkg/wshrpc" @@ -419,6 +420,7 @@ func MakeUnixListener() (net.Listener, error) { } const docsitePrefix = "/docsite/" +const schemaPrefix = "/schema/" // blocking func RunWebServer(listener net.Listener) { @@ -428,6 +430,7 @@ func RunWebServer(listener net.Listener) { gr.HandleFunc("/wave/service", WebFnWrap(WebFnOpts{JsonErrors: true}, handleService)) gr.HandleFunc("/vdom/{uuid}/{path:.*}", WebFnWrap(WebFnOpts{AllowCaching: true}, handleVDom)) gr.PathPrefix(docsitePrefix).Handler(http.StripPrefix(docsitePrefix, docsite.GetDocsiteHandler())) + gr.PathPrefix(schemaPrefix).Handler(http.StripPrefix(schemaPrefix, schema.GetSchemaHandler())) handler := http.TimeoutHandler(gr, HttpTimeoutDuration, "Timeout") if wavebase.IsDevMode() { handler = handlers.CORS(handlers.AllowedOrigins([]string{"*"}))(handler) diff --git a/schema/settings.json b/schema/settings.json new file mode 100644 index 000000000..abe5caac4 --- /dev/null +++ b/schema/settings.json @@ -0,0 +1,232 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://github.com/wavetermdev/waveterm/pkg/wconfig/settings-type", + "$ref": "#/$defs/SettingsType", + "$defs": { + "SettingsType": { + "properties": { + "app:*": { + "type": "boolean" + }, + "app:globalhotkey": { + "type": "string" + }, + "app:dismissarchitecturewarning": { + "type": "boolean" + }, + "ai:*": { + "type": "boolean" + }, + "ai:preset": { + "type": "string" + }, + "ai:apitype": { + "type": "string" + }, + "ai:baseurl": { + "type": "string" + }, + "ai:apitoken": { + "type": "string" + }, + "ai:name": { + "type": "string" + }, + "ai:model": { + "type": "string" + }, + "ai:orgid": { + "type": "string" + }, + "ai:apiversion": { + "type": "string" + }, + "ai:maxtokens": { + "type": "number" + }, + "ai:timeoutms": { + "type": "number" + }, + "ai:fontsize": { + "type": "number" + }, + "ai:fixedfontsize": { + "type": "number" + }, + "term:*": { + "type": "boolean" + }, + "term:fontsize": { + "type": "number" + }, + "term:fontfamily": { + "type": "string" + }, + "term:theme": { + "type": "string" + }, + "term:disablewebgl": { + "type": "boolean" + }, + "term:localshellpath": { + "type": "string" + }, + "term:localshellopts": { + "items": { + "type": "string" + }, + "type": "array" + }, + "term:scrollback": { + "type": "integer" + }, + "term:copyonselect": { + "type": "boolean" + }, + "term:transparency": { + "type": "number" + }, + "term:allowbracketedpaste": { + "type": "boolean" + }, + "editor:minimapenabled": { + "type": "boolean" + }, + "editor:stickyscrollenabled": { + "type": "boolean" + }, + "editor:wordwrap": { + "type": "boolean" + }, + "editor:fontsize": { + "type": "number" + }, + "web:*": { + "type": "boolean" + }, + "web:openlinksinternally": { + "type": "boolean" + }, + "web:defaulturl": { + "type": "string" + }, + "web:defaultsearch": { + "type": "string" + }, + "blockheader:*": { + "type": "boolean" + }, + "blockheader:showblockids": { + "type": "boolean" + }, + "autoupdate:*": { + "type": "boolean" + }, + "autoupdate:enabled": { + "type": "boolean" + }, + "autoupdate:intervalms": { + "type": "number" + }, + "autoupdate:installonquit": { + "type": "boolean" + }, + "autoupdate:channel": { + "type": "string" + }, + "markdown:fontsize": { + "type": "number" + }, + "markdown:fixedfontsize": { + "type": "number" + }, + "preview:showhiddenfiles": { + "type": "boolean" + }, + "tab:preset": { + "type": "string" + }, + "widget:*": { + "type": "boolean" + }, + "widget:showhelp": { + "type": "boolean" + }, + "window:*": { + "type": "boolean" + }, + "window:transparent": { + "type": "boolean" + }, + "window:blur": { + "type": "boolean" + }, + "window:opacity": { + "type": "number" + }, + "window:bgcolor": { + "type": "string" + }, + "window:reducedmotion": { + "type": "boolean" + }, + "window:tilegapsize": { + "type": "integer" + }, + "window:showmenubar": { + "type": "boolean" + }, + "window:nativetitlebar": { + "type": "boolean" + }, + "window:disablehardwareacceleration": { + "type": "boolean" + }, + "window:maxtabcachesize": { + "type": "integer" + }, + "window:magnifiedblockopacity": { + "type": "number" + }, + "window:magnifiedblocksize": { + "type": "number" + }, + "window:magnifiedblockblurprimarypx": { + "type": "integer" + }, + "window:magnifiedblockblursecondarypx": { + "type": "integer" + }, + "window:confirmclose": { + "type": "boolean" + }, + "window:savelastwindow": { + "type": "boolean" + }, + "window:dimensions": { + "type": "string" + }, + "window:zoom": { + "type": "number" + }, + "telemetry:*": { + "type": "boolean" + }, + "telemetry:enabled": { + "type": "boolean" + }, + "conn:*": { + "type": "boolean" + }, + "conn:askbeforewshinstall": { + "type": "boolean" + }, + "conn:wshenabled": { + "type": "boolean" + } + }, + "additionalProperties": false, + "type": "object" + } + } +} \ No newline at end of file