From 39d80df80933b205269fa76482966f1f67f35ce8 Mon Sep 17 00:00:00 2001 From: Matthias Gliwka Date: Sun, 10 Aug 2025 10:34:26 +0200 Subject: [PATCH 1/6] Feature: Allow rejected SMTP recipients to be silently dropped (#549) --- cmd/root.go | 4 + config/config.go | 3 + internal/smtpd/main.go | 19 ++-- internal/smtpd/smtpd.go | 71 +++++++++------ internal/smtpd/smtpd_test.go | 169 +++++++++++++++++++++++++++++++++++ 5 files changed, 232 insertions(+), 34 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index e8912cf..27a1370 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -126,6 +126,7 @@ func init() { rootCmd.Flags().BoolVar(&config.SMTPStrictRFCHeaders, "smtp-strict-rfc-headers", config.SMTPStrictRFCHeaders, "Return SMTP error if message headers contain ") rootCmd.Flags().IntVar(&config.SMTPMaxRecipients, "smtp-max-recipients", config.SMTPMaxRecipients, "Maximum SMTP recipients allowed") rootCmd.Flags().StringVar(&config.SMTPAllowedRecipients, "smtp-allowed-recipients", config.SMTPAllowedRecipients, "Only allow SMTP recipients matching a regular expression (default allow all)") + rootCmd.Flags().BoolVar(&config.SMTPSilentlyDropRejectedRecipients, "smtp-silently-drop-rejected-recipients", config.SMTPSilentlyDropRejectedRecipients, "Accept emails to rejected recipients with 2xx response but silently drop them") rootCmd.Flags().BoolVar(&smtpd.DisableReverseDNS, "smtp-disable-rdns", smtpd.DisableReverseDNS, "Disable SMTP reverse DNS lookups") // SMTP relay @@ -301,6 +302,9 @@ func initConfigFromEnv() { if len(os.Getenv("MP_SMTP_ALLOWED_RECIPIENTS")) > 0 { config.SMTPAllowedRecipients = os.Getenv("MP_SMTP_ALLOWED_RECIPIENTS") } + if getEnabledFromEnv("MP_SMTP_SILENTLY_DROP_REJECTED_RECIPIENTS") { + config.SMTPSilentlyDropRejectedRecipients = true + } if getEnabledFromEnv("MP_SMTP_DISABLE_RDNS") { smtpd.DisableReverseDNS = true } diff --git a/config/config.go b/config/config.go index f5d54cf..fcba310 100644 --- a/config/config.go +++ b/config/config.go @@ -181,6 +181,9 @@ var ( // SMTPAllowedRecipientsRegexp is the compiled version of SMTPAllowedRecipients SMTPAllowedRecipientsRegexp *regexp.Regexp + // SMTPSilentlyDropRejectedRecipients if true, will accept emails to rejected recipients with 2xx response but silently drop them + SMTPSilentlyDropRejectedRecipients bool + // POP3Listen address - if set then Mailpit will start the POP3 server and listen on this address POP3Listen = "[::]:1110" diff --git a/internal/smtpd/main.go b/internal/smtpd/main.go index ca61771..f093e8b 100644 --- a/internal/smtpd/main.go +++ b/internal/smtpd/main.go @@ -194,15 +194,16 @@ func listenAndServe(addr string, handler MsgIDHandler, authHandler AuthHandler) Debug = true // to enable Mailpit logging srv := &Server{ - Addr: addr, - MsgIDHandler: handler, - HandlerRcpt: handlerRcpt, - AppName: "Mailpit", - Hostname: "", - AuthHandler: nil, - AuthRequired: false, - MaxRecipients: config.SMTPMaxRecipients, - DisableReverseDNS: DisableReverseDNS, + Addr: addr, + MsgIDHandler: handler, + HandlerRcpt: handlerRcpt, + AppName: "Mailpit", + Hostname: "", + AuthHandler: nil, + AuthRequired: false, + MaxRecipients: config.SMTPMaxRecipients, + SilentlyDropRejectedRecipients: config.SMTPSilentlyDropRejectedRecipients, + DisableReverseDNS: DisableReverseDNS, LogRead: func(remoteIP, verb, line string) { logger.Log().Debugf("[smtpd] %s (%s) %s", verbLogTranslator(verb), remoteIP, line) }, diff --git a/internal/smtpd/smtpd.go b/internal/smtpd/smtpd.go index 29cb30b..4ed7223 100644 --- a/internal/smtpd/smtpd.go +++ b/internal/smtpd/smtpd.go @@ -92,26 +92,27 @@ type LogFunc func(remoteIP, verb, line string) // Server is an SMTP server. type Server struct { - Addr string // TCP address to listen on, defaults to ":25" (all addresses, port 25) if empty - AppName string - AuthHandler AuthHandler - AuthMechs map[string]bool // Override list of allowed authentication mechanisms. Currently supported: LOGIN, PLAIN, CRAM-MD5. Enabling LOGIN and PLAIN will reduce RFC 4954 compliance. - AuthRequired bool // Require authentication for every command except AUTH, EHLO, HELO, NOOP, RSET or QUIT as per RFC 4954. Ignored if AuthHandler is not configured. - DisableReverseDNS bool // Disable reverse DNS lookups, enforces "unknown" hostname - Handler Handler - HandlerRcpt HandlerRcpt - Hostname string - LogRead LogFunc - LogWrite LogFunc - MaxSize int // Maximum message size allowed, in bytes - MaxRecipients int // Maximum number of recipients, defaults to 100. - MsgIDHandler MsgIDHandler - Timeout time.Duration - TLSConfig *tls.Config - TLSListener bool // Listen for incoming TLS connections only (not recommended as it may reduce compatibility). Ignored if TLS is not configured. - TLSRequired bool // Require TLS for every command except NOOP, EHLO, STARTTLS, or QUIT as per RFC 3207. Ignored if TLS is not configured. - Protocol string // Default tcp, supports unix - SocketPerm fs.FileMode // if using Unix socket, socket permissions + Addr string // TCP address to listen on, defaults to ":25" (all addresses, port 25) if empty + AppName string + AuthHandler AuthHandler + AuthMechs map[string]bool // Override list of allowed authentication mechanisms. Currently supported: LOGIN, PLAIN, CRAM-MD5. Enabling LOGIN and PLAIN will reduce RFC 4954 compliance. + AuthRequired bool // Require authentication for every command except AUTH, EHLO, HELO, NOOP, RSET or QUIT as per RFC 4954. Ignored if AuthHandler is not configured. + DisableReverseDNS bool // Disable reverse DNS lookups, enforces "unknown" hostname + Handler Handler + HandlerRcpt HandlerRcpt + Hostname string + LogRead LogFunc + LogWrite LogFunc + MaxSize int // Maximum message size allowed, in bytes + MaxRecipients int // Maximum number of recipients, defaults to 100. + MsgIDHandler MsgIDHandler + SilentlyDropRejectedRecipients bool // Accept emails to rejected recipients with 2xx response but silently drop them + Timeout time.Duration + TLSConfig *tls.Config + TLSListener bool // Listen for incoming TLS connections only (not recommended as it may reduce compatibility). Ignored if TLS is not configured. + TLSRequired bool // Require TLS for every command except NOOP, EHLO, STARTTLS, or QUIT as per RFC 3207. Ignored if TLS is not configured. + Protocol string // Default tcp, supports unix + SocketPerm fs.FileMode // if using Unix socket, socket permissions inShutdown int32 // server was closed or shutdown openSessions int32 // count of open sessions @@ -363,6 +364,7 @@ func (s *session) serve() { var from string var gotFrom bool var to []string + var hasRejectedRecipients bool var buffer bytes.Buffer // RFC 5321 specifies support for minimum of 100 recipients is required. @@ -397,6 +399,7 @@ loop: from = "" gotFrom = false to = nil + hasRejectedRecipients = false buffer.Reset() case "EHLO": s.remoteName = args @@ -406,6 +409,7 @@ loop: from = "" gotFrom = false to = nil + hasRejectedRecipients = false buffer.Reset() case "MAIL": if s.srv.TLSConfig != nil && s.srv.TLSRequired && !s.tls { @@ -457,6 +461,7 @@ loop: } to = nil + hasRejectedRecipients = false buffer.Reset() case "RCPT": if s.srv.TLSConfig != nil && s.srv.TLSRequired && !s.tls { @@ -492,6 +497,9 @@ loop: if accept { to = append(to, match[1]) s.writef("250 2.1.5 Ok") + } else if s.srv.SilentlyDropRejectedRecipients { + hasRejectedRecipients = true + s.writef("250 2.1.5 Ok") } else { s.writef("550 5.1.0 Requested action not taken: mailbox unavailable") } @@ -506,7 +514,8 @@ loop: s.writef("530 5.7.0 Authentication required") break } - if !gotFrom || len(to) == 0 { + hasRecipients := len(to) > 0 || hasRejectedRecipients + if !gotFrom || !hasRecipients { s.writef("503 5.5.1 Bad sequence of commands (MAIL & RCPT required before DATA)") break } @@ -536,11 +545,13 @@ loop: // Create Received header & write message body into buffer. buffer.Reset() - buffer.Write(s.makeHeaders(to)) + if len(to) > 0 { + buffer.Write(s.makeHeaders(to)) + } buffer.Write(data) - // Pass mail on to handler. - if s.srv.Handler != nil { + // Pass mail on to handler only if there are valid recipients. + if len(to) > 0 && s.srv.Handler != nil { err := s.srv.Handler(s.conn.RemoteAddr(), from, to, buffer.Bytes()) if err != nil { checkErrFormat := regexp.MustCompile(`^([2-5][0-9]{2})[\s\-](.+)$`) @@ -552,7 +563,7 @@ loop: break } s.writef("250 2.0.0 Ok: queued") - } else if s.srv.MsgIDHandler != nil { + } else if len(to) > 0 && s.srv.MsgIDHandler != nil { msgID, err := s.srv.MsgIDHandler(s.conn.RemoteAddr(), from, to, buffer.Bytes(), s.username) if err != nil { checkErrFormat := regexp.MustCompile(`^([2-5][0-9]{2})[\s\-](.+)$`) @@ -570,6 +581,13 @@ loop: s.writef("250 2.0.0 Ok: queued") } } else { + if hasRejectedRecipients && Debug { + if s.srv.LogWrite != nil { + s.srv.LogWrite(s.remoteIP, "DEBUG", "Message from sender silently dropped (rejected recipients)") + } else { + log.Printf("%s DEBUG Message from sender silently dropped (rejected recipients)", s.remoteIP) + } + } s.writef("250 2.0.0 Ok: queued") } @@ -577,6 +595,7 @@ loop: from = "" gotFrom = false to = nil + hasRejectedRecipients = false buffer.Reset() case "QUIT": s.writef("221 2.0.0 %s %s ESMTP Service closing transmission channel", s.srv.Hostname, s.srv.AppName) @@ -590,6 +609,7 @@ loop: from = "" gotFrom = false to = nil + hasRejectedRecipients = false buffer.Reset() case "NOOP": s.writef("250 2.0.0 Ok") @@ -666,6 +686,7 @@ loop: from = "" gotFrom = false to = nil + hasRejectedRecipients = false buffer.Reset() case "AUTH": if s.srv.TLSConfig != nil && s.srv.TLSRequired && !s.tls { diff --git a/internal/smtpd/smtpd_test.go b/internal/smtpd/smtpd_test.go index 0f75482..37a9e84 100644 --- a/internal/smtpd/smtpd_test.go +++ b/internal/smtpd/smtpd_test.go @@ -1598,3 +1598,172 @@ func TestCmdShutdown(t *testing.T) { _ = conn.Close() } + +type mockDropRejectedHandler struct { + handlerCalled int + lastFrom string + lastTo []string + msgIDCalled int + lastMsgIDFrom string + lastMsgIDTo []string +} + +func (m *mockDropRejectedHandler) handler(remoteAddr net.Addr, from string, to []string, data []byte) error { + m.handlerCalled++ + m.lastFrom = from + m.lastTo = append([]string{}, to...) // copy slice + return nil +} + +func (m *mockDropRejectedHandler) msgIDHandler(remoteAddr net.Addr, from string, to []string, data []byte, username *string) (string, error) { + m.msgIDCalled++ + m.lastMsgIDFrom = from + m.lastMsgIDTo = append([]string{}, to...) // copy slice + return "test-message-id", nil +} + +// Test the SilentlyDropRejectedRecipients option +func TestSilentlyDropRejectedRecipients(t *testing.T) { + tests := []struct { + name string + silentlyDropRejectedRecipients bool + handlerRcpt func(net.Addr, string, string) bool + rcptCommands []struct{ addr, expectedCode string } + expectedHandlerCalls int + expectedHandlerRecipients []string + useMsgIDHandler bool + }{ + { + name: "Disabled_DefaultBehavior", + silentlyDropRejectedRecipients: false, + handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { + return !strings.HasSuffix(to, "@rejected.com") + }, + rcptCommands: []struct{ addr, expectedCode string }{ + {"valid@example.com", "250"}, + {"invalid@rejected.com", "550"}, + }, + expectedHandlerCalls: 1, + expectedHandlerRecipients: []string{"valid@example.com"}, + }, + { + name: "Enabled_MixedRecipients", + silentlyDropRejectedRecipients: true, + handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { + return !strings.HasSuffix(to, "@rejected.com") + }, + rcptCommands: []struct{ addr, expectedCode string }{ + {"valid1@example.com", "250"}, + {"valid2@example.com", "250"}, + {"invalid1@rejected.com", "250"}, // Now accepted but dropped + {"invalid2@rejected.com", "250"}, // Now accepted but dropped + }, + expectedHandlerCalls: 1, + expectedHandlerRecipients: []string{"valid1@example.com", "valid2@example.com"}, + }, + { + name: "Enabled_AllRejected", + silentlyDropRejectedRecipients: true, + handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { + return false // Reject all + }, + rcptCommands: []struct{ addr, expectedCode string }{ + {"test1@example.com", "250"}, // Accepted but dropped + {"test2@example.com", "250"}, // Accepted but dropped + }, + expectedHandlerCalls: 0, // No handler calls since all rejected + expectedHandlerRecipients: nil, + }, + { + name: "Enabled_OnlyValid", + silentlyDropRejectedRecipients: true, + handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { + return strings.HasSuffix(to, "@valid.com") + }, + rcptCommands: []struct{ addr, expectedCode string }{ + {"user1@valid.com", "250"}, + {"user2@valid.com", "250"}, + {"user3@valid.com", "250"}, + }, + expectedHandlerCalls: 1, + expectedHandlerRecipients: []string{"user1@valid.com", "user2@valid.com", "user3@valid.com"}, + }, + { + name: "Enabled_WithMsgIDHandler", + silentlyDropRejectedRecipients: true, + handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { + return !strings.HasSuffix(to, "@rejected.com") + }, + rcptCommands: []struct{ addr, expectedCode string }{ + {"valid@example.com", "250"}, + {"invalid@rejected.com", "250"}, // Accepted but dropped + }, + expectedHandlerCalls: 1, + expectedHandlerRecipients: []string{"valid@example.com"}, + useMsgIDHandler: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mock := &mockDropRejectedHandler{} + + server := &Server{ + Hostname: "mail.example.com", + AppName: "TestMail", + MaxRecipients: 100, + HandlerRcpt: tt.handlerRcpt, + SilentlyDropRejectedRecipients: tt.silentlyDropRejectedRecipients, + } + + if tt.useMsgIDHandler { + server.MsgIDHandler = mock.msgIDHandler + } else { + server.Handler = mock.handler + } + + conn := newConn(t, server) + defer func() { _ = conn.Close() }() + + cmdCode(t, conn, "HELO host.example.com", "250") + cmdCode(t, conn, "MAIL FROM:", "250") + + // Send RCPT commands + for _, rcpt := range tt.rcptCommands { + cmdCode(t, conn, "RCPT TO:<"+rcpt.addr+">", rcpt.expectedCode) + } + + // Send DATA + cmdCode(t, conn, "DATA", "354") + cmdCode(t, conn, "Subject: Test\r\n\r\nTest message\r\n.", "250") + cmdCode(t, conn, "QUIT", "221") + + // Verify handler calls + if tt.useMsgIDHandler { + if mock.msgIDCalled != tt.expectedHandlerCalls { + t.Errorf("Expected %d MsgIDHandler calls, got %d", tt.expectedHandlerCalls, mock.msgIDCalled) + } + if tt.expectedHandlerCalls > 0 { + if mock.lastMsgIDFrom != "sender@example.com" { + t.Errorf("Expected from 'sender@example.com', got '%s'", mock.lastMsgIDFrom) + } + if !reflect.DeepEqual(mock.lastMsgIDTo, tt.expectedHandlerRecipients) { + t.Errorf("Expected recipients %v, got %v", tt.expectedHandlerRecipients, mock.lastMsgIDTo) + } + } + } else { + if mock.handlerCalled != tt.expectedHandlerCalls { + t.Errorf("Expected %d handler calls, got %d", tt.expectedHandlerCalls, mock.handlerCalled) + } + if tt.expectedHandlerCalls > 0 { + if mock.lastFrom != "sender@example.com" { + t.Errorf("Expected from 'sender@example.com', got '%s'", mock.lastFrom) + } + if !reflect.DeepEqual(mock.lastTo, tt.expectedHandlerRecipients) { + t.Errorf("Expected recipients %v, got %v", tt.expectedHandlerRecipients, mock.lastTo) + } + } + } + }) + } +} From 41ef4ecd60a0313b35176d902c593f1eae85dba8 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sun, 10 Aug 2025 21:04:22 +1200 Subject: [PATCH 2/6] Rename smtp-silently-drop-rejected-recipients to smtp-ignore-rejected-recipients --- cmd/root.go | 6 ++--- config/config.go | 12 +++++++-- internal/smtpd/main.go | 20 +++++++-------- internal/smtpd/smtpd.go | 44 ++++++++++++++++----------------- internal/smtpd/smtpd_test.go | 48 ++++++++++++++++++------------------ 5 files changed, 69 insertions(+), 61 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 27a1370..082ca57 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -126,7 +126,7 @@ func init() { rootCmd.Flags().BoolVar(&config.SMTPStrictRFCHeaders, "smtp-strict-rfc-headers", config.SMTPStrictRFCHeaders, "Return SMTP error if message headers contain ") rootCmd.Flags().IntVar(&config.SMTPMaxRecipients, "smtp-max-recipients", config.SMTPMaxRecipients, "Maximum SMTP recipients allowed") rootCmd.Flags().StringVar(&config.SMTPAllowedRecipients, "smtp-allowed-recipients", config.SMTPAllowedRecipients, "Only allow SMTP recipients matching a regular expression (default allow all)") - rootCmd.Flags().BoolVar(&config.SMTPSilentlyDropRejectedRecipients, "smtp-silently-drop-rejected-recipients", config.SMTPSilentlyDropRejectedRecipients, "Accept emails to rejected recipients with 2xx response but silently drop them") + rootCmd.Flags().BoolVar(&config.SMTPIgnoreRejectedRecipients, "smtp-ignore-rejected-recipients", config.SMTPIgnoreRejectedRecipients, "Ignore rejected SMTP recipients with 2xx response") rootCmd.Flags().BoolVar(&smtpd.DisableReverseDNS, "smtp-disable-rdns", smtpd.DisableReverseDNS, "Disable SMTP reverse DNS lookups") // SMTP relay @@ -302,8 +302,8 @@ func initConfigFromEnv() { if len(os.Getenv("MP_SMTP_ALLOWED_RECIPIENTS")) > 0 { config.SMTPAllowedRecipients = os.Getenv("MP_SMTP_ALLOWED_RECIPIENTS") } - if getEnabledFromEnv("MP_SMTP_SILENTLY_DROP_REJECTED_RECIPIENTS") { - config.SMTPSilentlyDropRejectedRecipients = true + if getEnabledFromEnv("MP_SMTP_IGNORE_REJECTED_RECIPIENTS") { + config.SMTPIgnoreRejectedRecipients = true } if getEnabledFromEnv("MP_SMTP_DISABLE_RDNS") { smtpd.DisableReverseDNS = true diff --git a/config/config.go b/config/config.go index fcba310..4a6a91b 100644 --- a/config/config.go +++ b/config/config.go @@ -181,8 +181,8 @@ var ( // SMTPAllowedRecipientsRegexp is the compiled version of SMTPAllowedRecipients SMTPAllowedRecipientsRegexp *regexp.Regexp - // SMTPSilentlyDropRejectedRecipients if true, will accept emails to rejected recipients with 2xx response but silently drop them - SMTPSilentlyDropRejectedRecipients bool + // SMTPIgnoreRejectedRecipients if true, will accept emails to rejected recipients with 2xx response but silently drop them + SMTPIgnoreRejectedRecipients bool // POP3Listen address - if set then Mailpit will start the POP3 server and listen on this address POP3Listen = "[::]:1110" @@ -584,6 +584,14 @@ func VerifyConfig() error { logger.Log().Infof("[smtp] only allowing recipients matching regexp: %s", SMTPAllowedRecipients) } + if SMTPIgnoreRejectedRecipients { + if SMTPAllowedRecipientsRegexp == nil { + logger.Log().Warn("[smtp] ignoring rejected recipients has no effect without setting smtp-allowed-recipients") + } else { + logger.Log().Info("[smtp] ignoring rejected recipients") + } + } + if err := parseRelayConfig(SMTPRelayConfigFile); err != nil { return err } diff --git a/internal/smtpd/main.go b/internal/smtpd/main.go index f093e8b..cec013c 100644 --- a/internal/smtpd/main.go +++ b/internal/smtpd/main.go @@ -194,16 +194,16 @@ func listenAndServe(addr string, handler MsgIDHandler, authHandler AuthHandler) Debug = true // to enable Mailpit logging srv := &Server{ - Addr: addr, - MsgIDHandler: handler, - HandlerRcpt: handlerRcpt, - AppName: "Mailpit", - Hostname: "", - AuthHandler: nil, - AuthRequired: false, - MaxRecipients: config.SMTPMaxRecipients, - SilentlyDropRejectedRecipients: config.SMTPSilentlyDropRejectedRecipients, - DisableReverseDNS: DisableReverseDNS, + Addr: addr, + MsgIDHandler: handler, + HandlerRcpt: handlerRcpt, + AppName: "Mailpit", + Hostname: "", + AuthHandler: nil, + AuthRequired: false, + MaxRecipients: config.SMTPMaxRecipients, + IgnoreRejectedRecipients: config.SMTPIgnoreRejectedRecipients, + DisableReverseDNS: DisableReverseDNS, LogRead: func(remoteIP, verb, line string) { logger.Log().Debugf("[smtpd] %s (%s) %s", verbLogTranslator(verb), remoteIP, line) }, diff --git a/internal/smtpd/smtpd.go b/internal/smtpd/smtpd.go index 4ed7223..da1b816 100644 --- a/internal/smtpd/smtpd.go +++ b/internal/smtpd/smtpd.go @@ -92,27 +92,27 @@ type LogFunc func(remoteIP, verb, line string) // Server is an SMTP server. type Server struct { - Addr string // TCP address to listen on, defaults to ":25" (all addresses, port 25) if empty - AppName string - AuthHandler AuthHandler - AuthMechs map[string]bool // Override list of allowed authentication mechanisms. Currently supported: LOGIN, PLAIN, CRAM-MD5. Enabling LOGIN and PLAIN will reduce RFC 4954 compliance. - AuthRequired bool // Require authentication for every command except AUTH, EHLO, HELO, NOOP, RSET or QUIT as per RFC 4954. Ignored if AuthHandler is not configured. - DisableReverseDNS bool // Disable reverse DNS lookups, enforces "unknown" hostname - Handler Handler - HandlerRcpt HandlerRcpt - Hostname string - LogRead LogFunc - LogWrite LogFunc - MaxSize int // Maximum message size allowed, in bytes - MaxRecipients int // Maximum number of recipients, defaults to 100. - MsgIDHandler MsgIDHandler - SilentlyDropRejectedRecipients bool // Accept emails to rejected recipients with 2xx response but silently drop them - Timeout time.Duration - TLSConfig *tls.Config - TLSListener bool // Listen for incoming TLS connections only (not recommended as it may reduce compatibility). Ignored if TLS is not configured. - TLSRequired bool // Require TLS for every command except NOOP, EHLO, STARTTLS, or QUIT as per RFC 3207. Ignored if TLS is not configured. - Protocol string // Default tcp, supports unix - SocketPerm fs.FileMode // if using Unix socket, socket permissions + Addr string // TCP address to listen on, defaults to ":25" (all addresses, port 25) if empty + AppName string + AuthHandler AuthHandler + AuthMechs map[string]bool // Override list of allowed authentication mechanisms. Currently supported: LOGIN, PLAIN, CRAM-MD5. Enabling LOGIN and PLAIN will reduce RFC 4954 compliance. + AuthRequired bool // Require authentication for every command except AUTH, EHLO, HELO, NOOP, RSET or QUIT as per RFC 4954. Ignored if AuthHandler is not configured. + DisableReverseDNS bool // Disable reverse DNS lookups, enforces "unknown" hostname + Handler Handler + HandlerRcpt HandlerRcpt + Hostname string + LogRead LogFunc + LogWrite LogFunc + MaxSize int // Maximum message size allowed, in bytes + MaxRecipients int // Maximum number of recipients, defaults to 100. + MsgIDHandler MsgIDHandler + IgnoreRejectedRecipients bool // Accept emails to rejected recipients with 2xx response but silently drop them + Timeout time.Duration + TLSConfig *tls.Config + TLSListener bool // Listen for incoming TLS connections only (not recommended as it may reduce compatibility). Ignored if TLS is not configured. + TLSRequired bool // Require TLS for every command except NOOP, EHLO, STARTTLS, or QUIT as per RFC 3207. Ignored if TLS is not configured. + Protocol string // Default tcp, supports unix + SocketPerm fs.FileMode // if using Unix socket, socket permissions inShutdown int32 // server was closed or shutdown openSessions int32 // count of open sessions @@ -497,7 +497,7 @@ loop: if accept { to = append(to, match[1]) s.writef("250 2.1.5 Ok") - } else if s.srv.SilentlyDropRejectedRecipients { + } else if s.srv.IgnoreRejectedRecipients { hasRejectedRecipients = true s.writef("250 2.1.5 Ok") } else { diff --git a/internal/smtpd/smtpd_test.go b/internal/smtpd/smtpd_test.go index 37a9e84..63b5219 100644 --- a/internal/smtpd/smtpd_test.go +++ b/internal/smtpd/smtpd_test.go @@ -1622,20 +1622,20 @@ func (m *mockDropRejectedHandler) msgIDHandler(remoteAddr net.Addr, from string, return "test-message-id", nil } -// Test the SilentlyDropRejectedRecipients option -func TestSilentlyDropRejectedRecipients(t *testing.T) { +// Test the IgnoreRejectedRecipients option +func TestIgnoreRejectedRecipients(t *testing.T) { tests := []struct { - name string - silentlyDropRejectedRecipients bool - handlerRcpt func(net.Addr, string, string) bool - rcptCommands []struct{ addr, expectedCode string } - expectedHandlerCalls int - expectedHandlerRecipients []string - useMsgIDHandler bool + name string + IgnoreRejectedRecipients bool + handlerRcpt func(net.Addr, string, string) bool + rcptCommands []struct{ addr, expectedCode string } + expectedHandlerCalls int + expectedHandlerRecipients []string + useMsgIDHandler bool }{ { - name: "Disabled_DefaultBehavior", - silentlyDropRejectedRecipients: false, + name: "Disabled_DefaultBehavior", + IgnoreRejectedRecipients: false, handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { return !strings.HasSuffix(to, "@rejected.com") }, @@ -1647,8 +1647,8 @@ func TestSilentlyDropRejectedRecipients(t *testing.T) { expectedHandlerRecipients: []string{"valid@example.com"}, }, { - name: "Enabled_MixedRecipients", - silentlyDropRejectedRecipients: true, + name: "Enabled_MixedRecipients", + IgnoreRejectedRecipients: true, handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { return !strings.HasSuffix(to, "@rejected.com") }, @@ -1662,8 +1662,8 @@ func TestSilentlyDropRejectedRecipients(t *testing.T) { expectedHandlerRecipients: []string{"valid1@example.com", "valid2@example.com"}, }, { - name: "Enabled_AllRejected", - silentlyDropRejectedRecipients: true, + name: "Enabled_AllRejected", + IgnoreRejectedRecipients: true, handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { return false // Reject all }, @@ -1675,8 +1675,8 @@ func TestSilentlyDropRejectedRecipients(t *testing.T) { expectedHandlerRecipients: nil, }, { - name: "Enabled_OnlyValid", - silentlyDropRejectedRecipients: true, + name: "Enabled_OnlyValid", + IgnoreRejectedRecipients: true, handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { return strings.HasSuffix(to, "@valid.com") }, @@ -1689,8 +1689,8 @@ func TestSilentlyDropRejectedRecipients(t *testing.T) { expectedHandlerRecipients: []string{"user1@valid.com", "user2@valid.com", "user3@valid.com"}, }, { - name: "Enabled_WithMsgIDHandler", - silentlyDropRejectedRecipients: true, + name: "Enabled_WithMsgIDHandler", + IgnoreRejectedRecipients: true, handlerRcpt: func(remoteAddr net.Addr, from string, to string) bool { return !strings.HasSuffix(to, "@rejected.com") }, @@ -1709,11 +1709,11 @@ func TestSilentlyDropRejectedRecipients(t *testing.T) { mock := &mockDropRejectedHandler{} server := &Server{ - Hostname: "mail.example.com", - AppName: "TestMail", - MaxRecipients: 100, - HandlerRcpt: tt.handlerRcpt, - SilentlyDropRejectedRecipients: tt.silentlyDropRejectedRecipients, + Hostname: "mail.example.com", + AppName: "TestMail", + MaxRecipients: 100, + HandlerRcpt: tt.handlerRcpt, + IgnoreRejectedRecipients: tt.IgnoreRejectedRecipients, } if tt.useMsgIDHandler { From a54697b3dec169c433e0267d806c7025cbc39758 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sun, 10 Aug 2025 21:14:38 +1200 Subject: [PATCH 3/6] Chore: Update Go dependencies --- go.mod | 26 ++++++++++++------------ go.sum | 62 ++++++++++++++++++++++++++++++---------------------------- 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/go.mod b/go.mod index a4b3b67..579f243 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/axllent/ghru/v2 v2.0.2 github.com/axllent/semver v1.0.0 github.com/goccy/go-yaml v1.18.0 - github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b + github.com/gomarkdown/markdown v0.0.0-20250731182530-5d03d1963446 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.3 github.com/jhillyerd/enmime/v2 v2.2.0 @@ -17,18 +17,18 @@ require ( github.com/leporo/sqlf v1.4.0 github.com/lithammer/shortuuid/v4 v4.2.0 github.com/mneis/go-telnet v0.0.0-20221017141824-6f643e477c62 - github.com/prometheus/client_golang v1.22.0 + github.com/prometheus/client_golang v1.23.0 github.com/rqlite/gorqlite v0.0.0-20250609141355-ac86a4a1c9a8 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.7 github.com/tg123/go-htpasswd v1.2.4 github.com/vanng822/go-premailer v1.25.0 - golang.org/x/crypto v0.40.0 - golang.org/x/net v0.42.0 - golang.org/x/text v0.27.0 + golang.org/x/crypto v0.41.0 + golang.org/x/net v0.43.0 + golang.org/x/text v0.28.0 golang.org/x/time v0.12.0 - modernc.org/sqlite v1.38.1 + modernc.org/sqlite v1.38.2 ) require ( @@ -51,7 +51,7 @@ require ( github.com/ncruces/go-strftime v0.1.9 // indirect github.com/olekukonko/errors v1.1.0 // indirect github.com/olekukonko/ll v0.0.9 // indirect - github.com/olekukonko/tablewriter v1.0.8 // indirect + github.com/olekukonko/tablewriter v1.0.9 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect @@ -62,12 +62,12 @@ require ( github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/vanng822/css v1.0.1 // indirect - golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect - golang.org/x/image v0.29.0 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/sys v0.34.0 // indirect - google.golang.org/protobuf v1.36.6 // indirect - modernc.org/libc v1.66.4 // indirect + golang.org/x/exp v0.0.0-20250808145144-a408d31f581a // indirect + golang.org/x/image v0.30.0 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/sys v0.35.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + modernc.org/libc v1.66.6 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 9303cf4..6d009a1 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,8 @@ github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f h1:3BSP1Tbs2djlpprl7wCLuiqMaUh5SJkkzI2gDs+FgLs= github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14= -github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b h1:EY/KpStFl60qA17CptGXhwfZ+k1sFNJIUNR8DdbcuUk= -github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= +github.com/gomarkdown/markdown v0.0.0-20250731182530-5d03d1963446 h1:DCrj2T/IjH7beow847X2wc/lQRAQlvUQYxCyZE9wA+E= +github.com/gomarkdown/markdown v0.0.0-20250731182530-5d03d1963446/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -80,14 +80,14 @@ github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5 github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI= github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= -github.com/olekukonko/tablewriter v1.0.8 h1:f6wJzHg4QUtJdvrVPKco4QTrAylgaU0+b9br/lJxEiQ= -github.com/olekukonko/tablewriter v1.0.8/go.mod h1:H428M+HzoUXC6JU2Abj9IT9ooRmdq9CxuDmKMtrOCMs= +github.com/olekukonko/tablewriter v1.0.9 h1:XGwRsYLC2bY7bNd93Dk51bcPZksWZmLYuaTHR0FqfL8= +github.com/olekukonko/tablewriter v1.0.9/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= @@ -133,25 +133,27 @@ github.com/vanng822/css v1.0.1/go.mod h1:tcnB1voG49QhCrwq1W0w5hhGasvOg+VQp9i9H1r github.com/vanng822/go-premailer v1.25.0 h1:hGHKfroCXrCDTyGVR8o4HCON5/HWvc7C1uocS+VnaZs= github.com/vanng822/go-premailer v1.25.0/go.mod h1:8WJKIPZtegxqSOA8+eDFx7QNesKmMYfGEIodLTJqrtM= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= -golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= -golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= -golang.org/x/image v0.29.0 h1:HcdsyR4Gsuys/Axh0rDEmlBmB68rW1U9BUdB3UVHsas= -golang.org/x/image v0.29.0/go.mod h1:RVJROnf3SLK8d26OW91j4FrIHGbsJ8QnbEocVTOWQDA= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/exp v0.0.0-20250808145144-a408d31f581a h1:Y+7uR/b1Mw2iSXZ3G//1haIiSElDQZ8KWh0h+sZPG90= +golang.org/x/exp v0.0.0-20250808145144-a408d31f581a/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg= +golang.org/x/image v0.30.0 h1:jD5RhkmVAnjqaCUXfbGBrn3lpxbknfN9w2UhHHU+5B4= +golang.org/x/image v0.30.0/go.mod h1:SAEUTxCCMWSrJcCy/4HwavEsfZZJlYxeHLc6tTiAe/c= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -161,8 +163,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -185,8 +187,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -205,8 +207,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -215,17 +217,17 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM= -modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/cc/v4 v4.26.3 h1:yEN8dzrkRFnn4PUUKXLYIqVf2PJYAEjMTFjO3BDGc3I= +modernc.org/cc/v4 v4.26.3/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU= modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE= modernc.org/fileutil v1.3.8 h1:qtzNm7ED75pd1C7WgAGcK4edm4fvhtBsEiI/0NQ54YM= @@ -234,8 +236,8 @@ modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/libc v1.66.4 h1:EW4EaqAVngI6f5KWiFibu41IYFMv/F7KEtR+NRHrS/Q= -modernc.org/libc v1.66.4/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8= +modernc.org/libc v1.66.6 h1:RyQpwAhM/19nXD8y3iejM/AjmKwY2TjxZTlUWTsWw2U= +modernc.org/libc v1.66.6/go.mod h1:j8z0EYAuumoMQ3+cWXtmw6m+LYn3qm8dcZDFtFTSq+M= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= @@ -244,8 +246,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.38.1 h1:jNnIjleVta+DKSAr3TnkKK87EEhjPhBLzi6hvIX9Bas= -modernc.org/sqlite v1.38.1/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= +modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek= +modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= From 6051952a9beeeb596411babbcafaa17f236f77f9 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sun, 10 Aug 2025 21:17:32 +1200 Subject: [PATCH 4/6] Chore: Update node dependencies --- package-lock.json | 596 ++++++++++++++++++++++++---------------------- 1 file changed, 317 insertions(+), 279 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5053452..01418f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -108,9 +108,9 @@ } }, "node_modules/@bufbuild/protobuf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.6.2.tgz", - "integrity": "sha512-vLu7SRY84CV/Dd+NUdgtidn2hS5hSMUC1vDBY0VcviTdgRYkU43vIz3vIFbmx14cX1r+mM7WjzE5Fl1fGEM0RQ==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.6.3.tgz", + "integrity": "sha512-w/gJKME9mYN7ZoUAmSMAWXk4hkVpxRKvEJCb3dV5g9wwWdxTJJ0ayOJAVcNxtdqaxDyFuC0uz4RSGVacJ030PQ==", "dev": true, "license": "(Apache-2.0 AND BSD-3-Clause)", "peer": true @@ -600,9 +600,9 @@ } }, "node_modules/@eslint/compat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.3.1.tgz", - "integrity": "sha512-k8MHony59I5EPic6EQTCNOuPoVBnoYXkP+20xvwFjN7t0qI3ImyvyBgg+hIVPwC8JaxVjjUZld+cLfBLFDLucg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.3.2.tgz", + "integrity": "sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -633,9 +633,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -643,9 +643,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -680,9 +680,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", - "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", + "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", "dev": true, "license": "MIT", "engines": { @@ -703,13 +703,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -1131,13 +1131,13 @@ "license": "Apache-2.0" }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.44.tgz", - "integrity": "sha512-+IOyUl0Gl125t3/ULi6Bc7HbvSMHqOSXmDqL9qAYrOxIaQVasHgIq+sye6g/3TsqAE8xZ7gtfsaA53UlclotFg==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.45.tgz", + "integrity": "sha512-2npCF6V4QYSRv8USSmQ9jmsnNrjhTww4C84+cetNpxvTYXmEi9bRwIfzn2LH7DedsZsOJOMucVbJkCcRB/VC2Q==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-error": "^1.0.0-beta.44", + "@swagger-api/apidom-error": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1145,14 +1145,14 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.44.tgz", - "integrity": "sha512-6TXqyO/aJv1QgY/iTiNVI0ECedKIMIOM5KlblWZfm1uy4djNy1FA8Z3x49WESNlYRklEiYHZ/3HVthoLa6hSOA==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.45.tgz", + "integrity": "sha512-JEKf/bIl0RgaYAILlSDjuWhcg/+gbrI6p6OZuXR7EVxPlPNBAsme98UYyICA9AENyi2fzxwCP5eDRFl4cIzMHQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", + "@swagger-api/apidom-ast": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -1162,37 +1162,37 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.44.tgz", - "integrity": "sha512-GwLzYvDsXPmhJYKibS86RS6Kkdj7h2bFrTuqQ2f9FV9mdgG7EOh3yC6tNdd0Q/WvcFzd5i+APNX0PrYg/kfLiw==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.45.tgz", + "integrity": "sha512-kEy7blIEF77BnoqLhGW3h3I+evPHrtZwKe4fSw22UEUJUTG1Daw9FhaSgfBNptifZzzdLgiVDujrIOI6SpkH3Q==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.44.tgz", - "integrity": "sha512-2/E3+LFuqnTUay14+Qv3doXzPZMrS/Ed638Gd8byB4XNUY/0zQYwHTEca5QOxadNFh86zG+DnQQl+DC3ARkmTg==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.45.tgz", + "integrity": "sha512-s8eMDc/zL5W9mtBRbjEGPDt9yNJlpq9S+7/ACLjlSg1J3toadZmNiyR0svVLroVzVZHD5aGClGRpdammbO/PhQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", "@swaggerexpert/json-pointer": "^2.10.1" } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.44.tgz", - "integrity": "sha512-4lz7pIzD0J1X2/pSsYYxu3pH2xDXVpxvjZJDEB81LElxq5IOuGvtKK38Na0tM9pv3oYyJTWbUdT3Ili9O7URyQ==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.45.tgz", + "integrity": "sha512-uX+lkOi1g32mIhBVtMm5a304H68GIR4IXf/wiD6mdf2iwjfR0+drn/4NmirZqrNvlMtmf1a6VSe4u6KE3OBIpw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1200,15 +1200,15 @@ } }, "node_modules/@swagger-api/apidom-ns-arazzo-1": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-beta.44.tgz", - "integrity": "sha512-Ui0eTJf1mX+MTuxvBWDl7RQ7jtZhPRBT1OfqMYCOneKbajZtka+U9fNUWgRwIuieRn3bHr3T5+s3jRK5AKZ7nQ==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-beta.45.tgz", + "integrity": "sha512-ZjzTvby6Zvu7vh6uabRCGsnhAPeefxgJQ7DPKLELe9KyzcT+OqorjDtfaESFy4zzIMokalJcja/in29yTS+kxw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1216,15 +1216,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.44.tgz", - "integrity": "sha512-RGA1348E0gfSCpaD7nwYW2377ArDPyhnkzckeLafBYwhCDjOtjZTbJZ5ljnvAQmpv37pmy+ev/uIFUCpyIJ0qQ==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.45.tgz", + "integrity": "sha512-OQY2cSs5oZo0/rlGa8hHfgu7DFQ6lDhBC+IAKp0E7gF27oH2Yy9BEHlxHUA3iUeCMxDfIo021+Qc8FpNqivtxA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1232,15 +1232,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-beta.44.tgz", - "integrity": "sha512-wPRDhIueKa20jZ1zvu//I48p9AzbJdC/KHsicJoRW7y0HgIZpG0AIB6fc1N0p/8NMibOq0JEIdIVYYvhmW9pAg==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-beta.45.tgz", + "integrity": "sha512-StoPoa1yI5gBfPZ57LhA41f+JNJ/JnrsWZnmDlJG8W2hyjJAeyVkOo0qoVpt40240WZmH2EuywIFrdD+n+hrLA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1248,15 +1248,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-beta.44.tgz", - "integrity": "sha512-QwE0gnDO8GfGEpZdWDjFAkoBH+6atPk/oeX/OFjFOOkwMJXSZiIQbx69xefS1XEMSg40aOHKIjpeSTzErirEfg==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-beta.45.tgz", + "integrity": "sha512-l70stVPz1kGIiM7t55twYhfI2GwDKLOjfr+Py1Rknyo75LYw08QhppZ7PxWamgvKmoYfBnGeaoC+18Q2dn2Bhg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1264,14 +1264,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.44.tgz", - "integrity": "sha512-p392XjvmJ9NTxIzQ5/l33rzOm4hx4XDRWe+SwuciTg4NsuNQupTq3zrvXagCVepzYBlSg/1k0SYCm7yVRR+VJw==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.45.tgz", + "integrity": "sha512-tlDz4+Ko+ylVWSpSprZM9WoBMfmBxoUxcxvbkcafCJTO4MCQuytYaW3p/BIMscCsa0LP1eR4ycMY8h445ur58Q==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.44", - "@swagger-api/apidom-core": "^1.0.0-beta.44", + "@swagger-api/apidom-ast": "^1.0.0-beta.45", + "@swagger-api/apidom-core": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1279,15 +1279,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.44.tgz", - "integrity": "sha512-aodklkUWZ774je8VMDge/OFpDNeefZc+5jKymtMip1uYbVLmO7ByvkqSR665xXqOA8VMEzsG+q59L+4UX3jObA==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.45.tgz", + "integrity": "sha512-wBkk2AqDddZvf1VixAuwFu9LRTJya3yL+FAmg4KyMGrA32VOFYupe9jc1RmV/noTfGwf5AWZVnuGo9xiI2z4Wg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1295,15 +1295,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.44.tgz", - "integrity": "sha512-CbPRkDusgxBBF4MuBz8T88CYmqnqOUd3VqbTHU948Q2KqvcleI2W+HiTgJfBew0XkEiIwbWwRPdfBuuWZwVtyg==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.45.tgz", + "integrity": "sha512-EggsaTXUw0j8PmcO+IxnoJ7TyXz8sNarPlB2EGNqVT3qEwGQn96qXZ8pZab0sr1iStIWzyAaXMKrnmlcSIDpSQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1311,16 +1311,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.44.tgz", - "integrity": "sha512-T5PSrtqFcUpIPKJq7Z0aAQthxm4S5F5Ke5Nuk9UDfvD6FHDsk8nRc+GSleSt/Je4X0aqc/G2ZsztH1b5bWZ06g==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.45.tgz", + "integrity": "sha512-OY/FM8lDB6MzJfTgqHPj6k6Kk62Uho5gynsZLyroxgTz+Ez9zSdgA+p8+mdE4hBQxfwSnUtaiFMWgAzY+12Q9A==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1328,15 +1328,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.44.tgz", - "integrity": "sha512-2S3mymU47rWVBxJipA1qseVXE11Q4N3gKu/joxw40V6qB1UhCTzl4IjJaYhGKE+eGkJ3i6CCocHHlNlnTX0Pcg==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.45.tgz", + "integrity": "sha512-HaacHMmYfMp9UNSTONVxGRQDlQn8yEIOklHowI+/u8SRqdV87dE9UQhp8AMGw2hfnYiyt8ADFdPsLnYR6LEq7g==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1344,17 +1344,17 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.44.tgz", - "integrity": "sha512-pSxoB/xZq1B7vjt2kC8DObpaMZgZ4qdLplVJFZgh23ohnU6D/ubaJhe04kS0vxVMpwrcEjYU44t7paMLEUr1nA==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.45.tgz", + "integrity": "sha512-irU2jMOZNWf/lAXc/JuWohHs55MQe7Rb36xzAqoyOjauk2nj/ougy5b+xvG3dLZu3ZKc/X9kmimPPLTs7P2Xhw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.44", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-json-pointer": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.44", + "@swagger-api/apidom-ast": "^1.0.0-beta.45", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1362,112 +1362,112 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.44.tgz", - "integrity": "sha512-mhPA7qn0NXh84Vw2hwtK+9sOplV3bf9HJiZ1M3YyjTnhXGVf3lBNvi2f2OzLPdiYwNTG0p3N43f3v+SQzLVbKg==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.45.tgz", + "integrity": "sha512-F8Glj81vrYc9oghEeM1Pfo8qbOptEl3tPOU3hQIqDM4pqMRuB3vwYfoZLVnwpewXacBRgwUiXXnaWV7alMnPzg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.44.tgz", - "integrity": "sha512-So6M95X5G3PQ4AboP6HzA30c7XdpYXDognslELAvZpl8OEG8nVaKyqn7+lRsK2pG6oBSYBaqEialZNZly7Np5Q==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.45.tgz", + "integrity": "sha512-Xdhk2yffGD2KcncTs8uNeiKBeBvr0njRRlhfSKdewb91SHXqyh2eKf168M6UPdT0dg3QQKdCT5lV+meKcYGpkw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-beta.44.tgz", - "integrity": "sha512-avgDrkdSpbAzEb6++qdEqckO7Yyh538FBnk1A9+OfkYSj7k83yx5azngAmr66tBG3oSSCELTmEpXM+oyBGHH/Q==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-beta.45.tgz", + "integrity": "sha512-SMJseBO32aHPXskwYThT2y3Py2B8B4gKqGXl+ZlMGCaM72Fnnr0hbqtI8wt2v58F97qVlTYvXvTSfQGUuUh/Kg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-beta.44.tgz", - "integrity": "sha512-kUxujeqr0Av8IY1T5xxZXaj/0tV/dQGqCDv9cLcnivKEp2gnCFxwkdKMlRCosMpPOb+ApOcUYtgGYM/RnkyGbg==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-beta.45.tgz", + "integrity": "sha512-w9v3E0F9OKSUoK2DtMphpUO2Dd+op+YrwHAYyZTbKL48DEd+Ez5L9wW1bURpfNMSaRjm5H9BrMM2eVdSz8TFQw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.44.tgz", - "integrity": "sha512-Q+qc+tTucc5Ol1ikeEVbt9DasnlXhM8MtY6Ej6ylDS+eSPzZMw09vU2V6Tk/QWSoSDHSqZMHt9G12SHI78LrbA==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.45.tgz", + "integrity": "sha512-7txrflmTsG2400mHq6rswnxi6+r+H7vtL0Mfb0lMj4docaSODnTdEiNjG35jaQaBMbMEtRPokJ6i4018SNFy3Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.44.tgz", - "integrity": "sha512-E4PVQLIWI3QG7UVHL23Qf4GUQCzTyRfiiMHt34gySTtFIE9OV48hIax3J85dF2DMR1CXtzj86zQTacYYe84EUQ==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.45.tgz", + "integrity": "sha512-laxCy1UmLjlUGRRlcEEQLHWmzwnUq750SFjnBUJe70DxNrBr68UqlLqKC/kGkpOOgsf+NMWhqSkS8WQ/eLsQww==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.44.tgz", - "integrity": "sha512-KeMu0tHLXNNJaZkR0blzHl3KvCfkde414h9FMosBH+zh4KLA0wmly1Mn+9tzvAbBa7vqxKmHg1o/7vDU2ZGA3Q==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.45.tgz", + "integrity": "sha512-5fFln56FM/6xEvGEAjk+GvTcmts8P5nnCPNDQpxc/PVDcLxC0gzyp5bjkOLmj9nZXqCQRzm/PH0bmxGQv4JSmg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.44", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", + "@swagger-api/apidom-ast": "^1.0.0-beta.45", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -1477,112 +1477,112 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.44.tgz", - "integrity": "sha512-F3Um4/raAob3M/CLOCrl1qrOb/Z+E1elMGpGupyk3uqgj0xQ0otlwzJS+2gz0LAJHofzq2WLZGDRsKlPaepTtQ==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.45.tgz", + "integrity": "sha512-lFRbbCGyGilEkNLgZyJeHK2sUsmtEKljkvyZytjGXshd45lLkHD+/1vByKhClbyoA+aIk8lzLpeaMECbOH+a9w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.44.tgz", - "integrity": "sha512-Jw0BxctNKmDifDh5Jo3exhp9VtWz/OZR8qqCL1y65ySvIr4MkCkvEmGTvfdXGZrxwhPVm5QDmJ5/X0MKHi/ZDQ==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.45.tgz", + "integrity": "sha512-AMCSLQhWcsTvlAhZMIwGezXBxhqLnnQQPkZHwKBFA1sD0FLZJKmIs1bxuEuo3iKNHKfDvbKJLQsr6OOqCg1MtQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.44.tgz", - "integrity": "sha512-NWeHqHBr/XpQkDnomMCzENujzYx/zE9Jo7NgzPhDMH3kgS/3snwrgNRFRDMCazwDqdjWfhivHdE5biqsOGEe7A==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.45.tgz", + "integrity": "sha512-rnao77rKeLHrpfM/QRzsOVNaaqZVYv4QID35GDOkuIHjjDNTjmquUsuWscAtI32P7tJHmPrLAJWKxb48W02mmw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.44.tgz", - "integrity": "sha512-TfgItza/SrM5YsLhEdl75HHGwlnVKVveWh2miF1MTsI9K3k3I4Zv0nUnKNlH+R9TY6DXUr7c52c4Jf672VyLxQ==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.45.tgz", + "integrity": "sha512-zilhJHYEV0cGde6ZdAfB+/4OnzHW8OCLO7bXmtoXdsxwJV0DHnwjrq2FgOlwqWBPWRIlyFwBwdUO0Rd5P4re3g==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.44.tgz", - "integrity": "sha512-g0+N/XpJTMioHfXGh5roTXPZO6AounZCpMfe2GpfdHLRN4hpxzffd+xZLVMmcaFt1x3XYAhBFCxNXIumg5Pw5A==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.45.tgz", + "integrity": "sha512-loof/awV/RNIaCHqr4+uVVjdSayAvNyxjLszyd0moAQv/247mfjvCH0h9VLIlpjI4kf+C3q4bhyYYaeVl9MSVg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.44.tgz", - "integrity": "sha512-cddGQ9XUafxv6ERO53JOxryZL968TwjNfsc/9NB9KYHTv32sk73cncIh5KfmGd7SH5UExmGv4YD93n7r2i7ePw==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.45.tgz", + "integrity": "sha512-h2oHGosYXditkPJ66aGEsvz6zpM6N26ay1ZRhk9LjuSA8S4BqFYY+MbJVD6C0LLP6Mn5jvDWCUq7yB0DTWNxpg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.44", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.45", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.44.tgz", - "integrity": "sha512-2UUKNaI9CESIN1f8skTzVHTVujuJyK5T0SE6THQ8wcihPhyoRaCUU4kcSSx22IxPIABFQ21+RYZ0sM3D5dOZ2Q==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.45.tgz", + "integrity": "sha512-/Emcfl4Va1GJB7kU2DWZBrqAn6dLi/sclPa4z0sjg+2EtOJ9l9zw3sKc4d7cEY5PX2QzgD8bFxBYrP9lU03IZw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.44", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", + "@swagger-api/apidom-ast": "^1.0.0-beta.45", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", @@ -1634,14 +1634,14 @@ } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.44.tgz", - "integrity": "sha512-qXaL0H8ehmMX7NLYKSrIVl1ayE5e2jsvZ3ApcksmHYWUKsbuDTfKB7pKR78VporRv+SRXiq2WGeeYY1bCuCHKA==", + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.45.tgz", + "integrity": "sha512-1EbK7P6oki5mR8bho+E0yoc9JwhOT/vboTjidolH8Fjw/WuE6GcMHX+8OBcwcgjt9hXWsY3YfvZFwK7baxkPnQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.44", - "@swagger-api/apidom-error": "^1.0.0-beta.44", + "@swagger-api/apidom-core": "^1.0.0-beta.45", + "@swagger-api/apidom-error": "^1.0.0-beta.45", "@types/ramda": "~0.30.0", "axios": "^1.9.0", "minimatch": "^7.4.3", @@ -2214,9 +2214,9 @@ "license": "MIT" }, "node_modules/core-js-pure": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.44.0.tgz", - "integrity": "sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.0.tgz", + "integrity": "sha512-OtwjqcDpY2X/eIIg1ol/n0y/X8A9foliaNt1dSK0gV3J2/zw+89FcNG3mPK+N8YWts4ZFUPxnrAzsxs/lf8yDA==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -2496,20 +2496,20 @@ } }, "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", + "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", + "@eslint/js": "9.33.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -2573,9 +2573,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.3.0.tgz", - "integrity": "sha512-A0u9snqjCfYaPnqqOaH6MBLVWDUIN4trXn8J3x67uDcXvR7X6Ut8p16N+nYhMCQ9Y7edg2BIRGzfyZsY0IdqoQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.4.0.tgz", + "integrity": "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw==", "dev": true, "license": "MIT", "dependencies": { @@ -2793,9 +2793,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -2978,9 +2978,9 @@ } }, "node_modules/ical.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.2.0.tgz", - "integrity": "sha512-P8gjWkTEd5M/SEEvBVPPO/KC+V+HRNRZh3xfCDTVWmUTEfVbL8JaK5GTWS2MJ55aLMhfXhbh7kYzd0nrBARjsA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.2.1.tgz", + "integrity": "sha512-yK/UlPbEs316igb/tjRgbFA8ZV75rCsBJp/hWOatpyaPNlgw0dGDmU+FoicOcwX4xXkeXOkYiOmCqNPFpNPkQg==", "license": "MPL-2.0" }, "node_modules/ieee754": { @@ -3817,9 +3817,9 @@ "license": "ISC" }, "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3838,9 +3838,9 @@ } }, "node_modules/sass-embedded": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.89.2.tgz", - "integrity": "sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.90.0.tgz", + "integrity": "sha512-XP1EltyLLfuU5FsGVjSz8PcT925oA3rDnJTWOEBHR42k62ZEbKTcZ4gVlFwKi0Ggzi5E8v1K2BplD8ELHwusYg==", "dev": true, "license": "MIT", "peer": true, @@ -3861,28 +3861,48 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.89.2", - "sass-embedded-android-arm64": "1.89.2", - "sass-embedded-android-riscv64": "1.89.2", - "sass-embedded-android-x64": "1.89.2", - "sass-embedded-darwin-arm64": "1.89.2", - "sass-embedded-darwin-x64": "1.89.2", - "sass-embedded-linux-arm": "1.89.2", - "sass-embedded-linux-arm64": "1.89.2", - "sass-embedded-linux-musl-arm": "1.89.2", - "sass-embedded-linux-musl-arm64": "1.89.2", - "sass-embedded-linux-musl-riscv64": "1.89.2", - "sass-embedded-linux-musl-x64": "1.89.2", - "sass-embedded-linux-riscv64": "1.89.2", - "sass-embedded-linux-x64": "1.89.2", - "sass-embedded-win32-arm64": "1.89.2", - "sass-embedded-win32-x64": "1.89.2" + "sass-embedded-all-unknown": "1.90.0", + "sass-embedded-android-arm": "1.90.0", + "sass-embedded-android-arm64": "1.90.0", + "sass-embedded-android-riscv64": "1.90.0", + "sass-embedded-android-x64": "1.90.0", + "sass-embedded-darwin-arm64": "1.90.0", + "sass-embedded-darwin-x64": "1.90.0", + "sass-embedded-linux-arm": "1.90.0", + "sass-embedded-linux-arm64": "1.90.0", + "sass-embedded-linux-musl-arm": "1.90.0", + "sass-embedded-linux-musl-arm64": "1.90.0", + "sass-embedded-linux-musl-riscv64": "1.90.0", + "sass-embedded-linux-musl-x64": "1.90.0", + "sass-embedded-linux-riscv64": "1.90.0", + "sass-embedded-linux-x64": "1.90.0", + "sass-embedded-unknown-all": "1.90.0", + "sass-embedded-win32-arm64": "1.90.0", + "sass-embedded-win32-x64": "1.90.0" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.90.0.tgz", + "integrity": "sha512-/n7jTQvI+hftDDrHzK19G4pxfDzOhtjuQO1K54ui1pT2S0sWfWDjCYUbQgtWQ6FO7g5qWS0hgmrWdc7fmS3rgA==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "sass": "1.90.0" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.89.2.tgz", - "integrity": "sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.90.0.tgz", + "integrity": "sha512-usF6kVJQWa1CMgPH1nCT1y8KEmAT2fzB00dDIPBYHq8U5VZLCihi2bJRP5U9NlcwP1TlKGKCjwsbIdSjDKfecg==", "cpu": [ "arm" ], @@ -3898,9 +3918,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.89.2.tgz", - "integrity": "sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.90.0.tgz", + "integrity": "sha512-bkTlewzWksa6Sj4Zs1CWiutnvUbsO3xuYh2QBRknXsOtuMlfTPoXnwhCnyE4lSvUxw2qxSbv+NdQev9qMfsBgA==", "cpu": [ "arm64" ], @@ -3916,9 +3936,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.89.2.tgz", - "integrity": "sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.90.0.tgz", + "integrity": "sha512-bpqCIOaX+0Lou/BNJ4iJIKbWbVaYXFdg26C3gG6gxxKZRzp/6OYCxHrIQDwhKz6YC8Q5rwNPMpfDVYbWPcgroA==", "cpu": [ "riscv64" ], @@ -3934,9 +3954,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.89.2.tgz", - "integrity": "sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.90.0.tgz", + "integrity": "sha512-GNxVKnCMd/p2icZ+Q4mhvNk19NrLXq1C4guiqjrycHYQLEnxRkjbW1QXYiL+XyDn4e+Bcq0knzG0I9pMuNZxkg==", "cpu": [ "x64" ], @@ -3952,9 +3972,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.89.2.tgz", - "integrity": "sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.90.0.tgz", + "integrity": "sha512-qr4KBMJfBA+lzXiWnP00qzpLzHQzGd1OSK3VHcUFjZ8l7VOYf2R7Tc3fcTLhpaNPMJtTK0jrk8rFqBvsiZExnA==", "cpu": [ "arm64" ], @@ -3970,9 +3990,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.2.tgz", - "integrity": "sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.90.0.tgz", + "integrity": "sha512-z2nr1nNqtWDLVRwTbHtL7zriK90U7O/Gb15UaCSMYeAz9Y+wog5s/sDEKm0+GsVdzzkaCaMZRWGN4jTilnUwmQ==", "cpu": [ "x64" ], @@ -3988,9 +4008,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.89.2.tgz", - "integrity": "sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.90.0.tgz", + "integrity": "sha512-FeBxI5Q2HvM3CCadcEcQgvWbDPVs2YEF0PZ87fbAVTCG8dV+iNnQreSz7GRJroknpvbRhm5t2gedvcgmTnPb2Q==", "cpu": [ "arm" ], @@ -4006,9 +4026,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.89.2.tgz", - "integrity": "sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.90.0.tgz", + "integrity": "sha512-SPMcGZuP71Fj8btCGtlBnv8h8DAbJn8EQfLzXs9oo6NGFFLVjNGiFpqGfgtUV6DLWCuaRyEFeViO7wZow/vKGQ==", "cpu": [ "arm64" ], @@ -4024,9 +4044,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.89.2.tgz", - "integrity": "sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.90.0.tgz", + "integrity": "sha512-EB2z0fUXdUdvSoddf4DzdZQkD/xyreD72gwAi8YScgUvR4HMXI7bLcK/n78Rft6OnqvV8090hjC8FsLDo3x5xQ==", "cpu": [ "arm" ], @@ -4042,9 +4062,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.89.2.tgz", - "integrity": "sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.90.0.tgz", + "integrity": "sha512-xLH7+PFq763MoEm3vI7hQk5E+nStiLWbijHEYW/tEtCbcQIphgzSkDItEezxXew3dU4EJ1jqrBUySPdoXFLqWA==", "cpu": [ "arm64" ], @@ -4060,9 +4080,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.89.2.tgz", - "integrity": "sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.90.0.tgz", + "integrity": "sha512-L21UkOgnSrD+ERF+jo1IWneGv40t0ap9+3cI+wZWYhQS5MkxponhT9QaNU57JEDJwB9mOl01LVw14opz4SN+VQ==", "cpu": [ "riscv64" ], @@ -4078,9 +4098,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.89.2.tgz", - "integrity": "sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.90.0.tgz", + "integrity": "sha512-NeAycQlsdhFdnIeSmRmScYUyCd+uE+x15NLFunbF8M0PgCKurrUhaxgGKSuBbaK56FpxarKOHCqcOrWbemIGzQ==", "cpu": [ "x64" ], @@ -4096,9 +4116,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.89.2.tgz", - "integrity": "sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.90.0.tgz", + "integrity": "sha512-lJopaQhW8S+kaQ61vMqq3c+bOurcf9RdZf2EmzQYpc2y1vT5cWfRNrRkbAgO/23IQxsk/fq3UIUnsjnyQmi6MA==", "cpu": [ "riscv64" ], @@ -4114,9 +4134,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.89.2.tgz", - "integrity": "sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.90.0.tgz", + "integrity": "sha512-Cc061gBfMPwH9rN7neQaH36cvOQC+dFMSGIeX5qUOhrEL4Ng51iqBV6aI4RIB1jCFGth6eDydVRN1VdV9qom8A==", "cpu": [ "x64" ], @@ -4131,10 +4151,28 @@ "node": ">=14.0.0" } }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.90.0.tgz", + "integrity": "sha512-DBGzHVCJDqtjTHZFohush9YTxd4ZxhIygIRTNRXnA0359woF9Z8AS7/YxfzwkqrTX5durSJa6ZamGFYVLoRphQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], + "peer": true, + "dependencies": { + "sass": "1.90.0" + } + }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.89.2.tgz", - "integrity": "sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.90.0.tgz", + "integrity": "sha512-c3/vL/CATnaW3x/6kcNbCROEOUU7zvJpIURp7M9664GJj08/gLPRWKNruw0OkAPQ3C5TTQz7+/fQWEpRA6qmvA==", "cpu": [ "arm64" ], @@ -4150,9 +4188,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.89.2.tgz", - "integrity": "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.90.0.tgz", + "integrity": "sha512-PFwdW7AYtCkwi3NfWFeexvIZEJ0nuShp8Bjjc3px756+18yYwBWa78F4TGdIQmJfpYKBhgkVjFOctwq+NCHntA==", "cpu": [ "x64" ], From 4619d9be880d60e423571cc29b3a8d7fe1d2aef7 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sun, 10 Aug 2025 21:18:23 +1200 Subject: [PATCH 5/6] Chore: Update caniemail test database --- internal/htmlcheck/caniemail-data.json | 80 +++++++++++++------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/internal/htmlcheck/caniemail-data.json b/internal/htmlcheck/caniemail-data.json index b1780b8..ac22c99 100644 --- a/internal/htmlcheck/caniemail-data.json +++ b/internal/htmlcheck/caniemail-data.json @@ -1,6 +1,6 @@ { "api_version":"1.0.4", - "last_update_date":"2025-06-12 18:27:28 +0000", + "last_update_date":"2025-08-01 15:36:41 +0000", "nicenames":{"family":{"gmail":"Gmail","outlook":"Outlook","yahoo":"Yahoo! Mail","apple-mail":"Apple Mail","aol":"AOL","thunderbird":"Mozilla Thunderbird","microsoft":"Microsoft","samsung-email":"Samsung Email","sfr":"SFR","orange":"Orange","protonmail":"ProtonMail","hey":"HEY","mail-ru":"Mail.ru","fastmail":"Fastmail","laposte":"LaPoste.net","t-online-de":"T-online.de","free-fr":"Free.fr","gmx":"GMX","web-de":"WEB.DE","ionos-1and1":"1&1","rainloop":"RainLoop","wp-pl":"WP.pl"},"platform":{"desktop-app":"Desktop","desktop-webmail":"Desktop Webmail","mobile-webmail":"Mobile Webmail","webmail":"Webmail","ios":"iOS","android":"Android","windows":"Windows","macos":"macOS","windows-mail":"Windows Mail","outlook-com":"Outlook.com"},"support":{"supported":"Supported","mitigated":"Partially supported","unsupported":"Not supported","unknown":"Support unknown","mixed":"Mixed support"},"category":{"html":"HTML","css":"CSS","image":"Image formats","others":"Others"}}, "data":[ { @@ -110,7 +110,7 @@ "last_test_date":"2023-12-19", "test_url":"https://www.caniemail.com/tests/css-font-face.html", "test_results_url":"https://app.emailonacid.com/app/acidtest/veY9MhuhgFeF1ly5crrhTXawfLJSwxgpYi27OElI7iSoc/list", - "stats":{"apple-mail":{"macos":{"12.2":"y"},"ios":{"10.3":"y","12.3.1":"y"}},"gmail":{"desktop-webmail":{"2019-07":"n #6"},"ios":{"2019-07":"n"},"android":{"2019-07":"n"},"mobile-webmail":{"2020-02":"n"}},"orange":{"desktop-webmail":{"2019-05":"a #2","2021-03":"n #7","2024-03":"n"},"ios":{"2019-07":"y","2024-03":"n"},"android":{"2019-07":"a #1","2024-04":"n"}},"outlook":{"windows":{"2003":"a #3","2007":"a #4 #5","2010":"a #4 #5","2013":"a #4 #5","2016":"a #4 #5","2019":"a #4"},"windows-mail":{"2020-01":"n"},"macos":{"2011":"y","2016":"y","16.80":"n"},"outlook-com":{"2019-07":"n","2023-12":"n"},"ios":{"2.51.1":"y","3.29.0":"n"},"android":{"2019-07":"n"}},"samsung-email":{"android":{"6.0":"y #8","2021-11":"y #8"}},"sfr":{"desktop-webmail":{"2019-07":"a #2"},"ios":{"2019-07":"n"},"android":{"2019-07":"n"}},"thunderbird":{"macos":{"60.7":"y","78.5":"y"}},"aol":{"desktop-webmail":{"2020-01":"n"},"ios":{"2020-01":"n"},"android":{"2020-01":"n"}},"yahoo":{"desktop-webmail":{"2019-07":"n"},"ios":{"2019-07":"n"},"android":{"2019-07":"n"}},"protonmail":{"desktop-webmail":{"2020-03":"n"},"ios":{"2020-03":"n"},"android":{"2020-03":"y"}},"hey":{"desktop-webmail":{"2020-06":"y"}},"mail-ru":{"desktop-webmail":{"2020-10":"n"}},"fastmail":{"desktop-webmail":{"2021-07":"n"}},"laposte":{"desktop-webmail":{"2021-08":"a #2"}},"gmx":{"desktop-webmail":{"2022-06":"n"},"ios":{"2022-06":"y"},"android":{"2022-06":"n"}},"web-de":{"desktop-webmail":{"2022-06":"n"},"ios":{"2022-06":"y"},"android":{"2022-06":"n"}},"ionos-1and1":{"desktop-webmail":{"2022-06":"y"},"android":{"2022-06":"n"}}}, + "stats":{"apple-mail":{"macos":{"12.2":"y"},"ios":{"10.3":"y","12.3.1":"y"}},"gmail":{"desktop-webmail":{"2019-07":"n #6"},"ios":{"2019-07":"n"},"android":{"2019-07":"n"},"mobile-webmail":{"2020-02":"n"}},"orange":{"desktop-webmail":{"2019-05":"a #2","2021-03":"n #7","2024-03":"n"},"ios":{"2019-07":"y","2024-03":"n"},"android":{"2019-07":"a #1","2024-04":"n"}},"outlook":{"windows":{"2003":"a #3","2007":"a #4 #5","2010":"a #4 #5","2013":"a #4 #5","2016":"a #4 #5","2019":"a #4"},"windows-mail":{"2020-01":"n"},"macos":{"2011":"y","2016":"y","16.80":"n"},"outlook-com":{"2019-07":"n","2023-12":"n"},"ios":{"2.51.1":"y","3.29.0":"n"},"android":{"2019-07":"n"}},"samsung-email":{"android":{"6.0":"y #8","2021-11":"y #8"}},"sfr":{"desktop-webmail":{"2019-07":"a #2","2025-07":"n"},"ios":{"2019-07":"n"},"android":{"2019-07":"n"}},"thunderbird":{"macos":{"60.7":"y","78.5":"y"}},"aol":{"desktop-webmail":{"2020-01":"n"},"ios":{"2020-01":"n"},"android":{"2020-01":"n"}},"yahoo":{"desktop-webmail":{"2019-07":"n"},"ios":{"2019-07":"n"},"android":{"2019-07":"n"}},"protonmail":{"desktop-webmail":{"2020-03":"n"},"ios":{"2020-03":"n"},"android":{"2020-03":"y"}},"hey":{"desktop-webmail":{"2020-06":"y"}},"mail-ru":{"desktop-webmail":{"2020-10":"n"}},"fastmail":{"desktop-webmail":{"2021-07":"n"}},"laposte":{"desktop-webmail":{"2021-08":"a #2","2025-07":"n"}},"gmx":{"desktop-webmail":{"2022-06":"n"},"ios":{"2022-06":"y"},"android":{"2022-06":"n"}},"web-de":{"desktop-webmail":{"2022-06":"n"},"ios":{"2022-06":"y"},"android":{"2022-06":"n"}},"ionos-1and1":{"desktop-webmail":{"2022-06":"y"},"android":{"2022-06":"n"}}}, "notes":null, "notes_by_num":{"1":"Partial. Only supported through a `` tag.","2":"Partial. Only supported directly through a `