From d88dbbc90f28af884b7d0d989bb0fe34118c9a4e Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 2 Apr 2023 13:59:26 -0400 Subject: [PATCH 01/51] WIP --- go.mod | 3 + go.sum | 6 ++ server/smtp_server.go | 77 +++++++++++++++++++---- server/smtp_server_test.go | 125 +++++++++++++++++++++++++++++++++++++ 4 files changed, 200 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index d5a9025e..10d32350 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require github.com/pkg/errors v0.9.1 // indirect require ( firebase.google.com/go/v4 v4.10.0 + github.com/microcosm-cc/bluemonday v1.0.23 github.com/prometheus/client_golang v1.14.0 github.com/stripe/stripe-go/v74 v74.14.0 ) @@ -39,6 +40,7 @@ require ( cloud.google.com/go/longrunning v0.4.1 // indirect github.com/AlekSi/pointer v1.2.0 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect + github.com/aymerick/douceur v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -50,6 +52,7 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.8.0 // indirect + github.com/gorilla/css v1.0.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/go.sum b/go.sum index 8c166afd..27679caa 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,8 @@ github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -85,6 +87,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9 github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -95,6 +99,8 @@ github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwp github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= +github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/olebedev/when v0.0.0-20221205223600-4d190b02b8d8 h1:0uFGkScHef2Xd8g74BMHU1jFcnKEm0PzrPn4CluQ9FI= github.com/olebedev/when v0.0.0-20221205223600-4d190b02b8d8/go.mod h1:T0THb4kP9D3NNqlvCwIG4GyUioTAzEhB4RNVzig/43E= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= diff --git a/server/smtp_server.go b/server/smtp_server.go index 16d97328..fe7e3298 100644 --- a/server/smtp_server.go +++ b/server/smtp_server.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "github.com/emersion/go-smtp" + "github.com/microcosm-cc/bluemonday" "io" "mime" "mime/multipart" @@ -13,6 +14,7 @@ import ( "net/http" "net/http/httptest" "net/mail" + "regexp" "strings" "sync" ) @@ -231,37 +233,66 @@ func readMailBody(body io.Reader, header mail.Header) (string, error) { if err != nil { return "", err } - if strings.ToLower(contentType) == "text/plain" { - return readPlainTextMailBody(body, header.Get("Content-Transfer-Encoding")) - } else if strings.HasPrefix(strings.ToLower(contentType), "multipart/") { - return readMultipartMailBody(body, params, 0) + canonicalContentType := strings.ToLower(contentType) + if canonicalContentType == "text/plain" || canonicalContentType == "text/html" { + return readTextMailBody(body, canonicalContentType, header.Get("Content-Transfer-Encoding")) + } else if strings.HasPrefix(canonicalContentType, "multipart/") { + return readMultipartMailBody(body, params) } return "", errUnsupportedContentType } -func readMultipartMailBody(body io.Reader, params map[string]string, depth int) (string, error) { +func readMultipartMailBody(body io.Reader, params map[string]string) (string, error) { + parts := make(map[string]string) + if err := readMultipartMailBodyParts(body, params, 0, parts); err != nil && err != io.EOF { + return "", err + } else if s, ok := parts["text/plain"]; ok { + return s, nil + } else if s, ok := parts["text/html"]; ok { + return s, nil + } + return "", io.EOF +} + +func readMultipartMailBodyParts(body io.Reader, params map[string]string, depth int, parts map[string]string) error { if depth >= maxMultipartDepth { - return "", errMultipartNestedTooDeep + return errMultipartNestedTooDeep } mr := multipart.NewReader(body, params["boundary"]) for { part, err := mr.NextPart() if err != nil { // may be io.EOF - return "", err + return err } partContentType, partParams, err := mime.ParseMediaType(part.Header.Get("Content-Type")) if err != nil { - return "", err + return err } - if strings.ToLower(partContentType) == "text/plain" { - return readPlainTextMailBody(part, part.Header.Get("Content-Transfer-Encoding")) + canonicalPartContentType := strings.ToLower(partContentType) + if canonicalPartContentType == "text/plain" || canonicalPartContentType == "text/html" { + s, err := readTextMailBody(part, canonicalPartContentType, part.Header.Get("Content-Transfer-Encoding")) + if err != nil { + return err + } + parts[canonicalPartContentType] = s } else if strings.HasPrefix(strings.ToLower(partContentType), "multipart/") { - return readMultipartMailBody(part, partParams, depth+1) + if err := readMultipartMailBodyParts(part, partParams, depth+1, parts); err != nil { + return err + } } // Continue with next part } } +func readTextMailBody(reader io.Reader, contentType, transferEncoding string) (string, error) { + if contentType == "text/plain" { + return readPlainTextMailBody(reader, transferEncoding) + } else if contentType == "text/html" { + return readHTMLMailBody(reader, transferEncoding) + } + return "", fmt.Errorf("unsupported content type: %s", contentType) +} + func readPlainTextMailBody(reader io.Reader, transferEncoding string) (string, error) { if strings.ToLower(transferEncoding) == "base64" { reader = base64.NewDecoder(base64.StdEncoding, reader) @@ -272,3 +303,27 @@ func readPlainTextMailBody(reader io.Reader, transferEncoding string) (string, e } return string(body), nil } + +func readHTMLMailBody(reader io.Reader, transferEncoding string) (string, error) { + body, err := readPlainTextMailBody(reader, transferEncoding) + if err != nil { + return "", err + } + stripped := bluemonday. + StrictPolicy(). + AddSpaceWhenStrippingTag(true). + Sanitize(body) + return removeExtraEmptyLines(stripped), nil +} + +func removeExtraEmptyLines(str string) string { + // Replace lines that contain only spaces with empty lines + re := regexp.MustCompile(`(?m)^\s+$`) + str = re.ReplaceAllString(str, "") + + // Remove more than 2 consecutive empty lines + re = regexp.MustCompile(`\n{3,}`) + str = re.ReplaceAllString(str, "\n\n") + + return str +} diff --git a/server/smtp_server_test.go b/server/smtp_server_test.go index 49085d79..1e504521 100644 --- a/server/smtp_server_test.go +++ b/server/smtp_server_test.go @@ -492,6 +492,131 @@ L0VOIj4KClRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZnJvbSBUcnVlTkFTIENPUkUuCg== writeAndReadUntilLine(t, email, c, scanner, "554 5.0.0 Error: transaction failed, blame it on the weather: multipart message nested too deep") } +func TestSmtpBackend_HTMLEmail(t *testing.T) { + email := `EHLO example.com +MAIL FROM: test@mydomain.me +RCPT TO: ntfy-mytopic@ntfy.sh +DATA +Message-Id: <51610934ss4.mmailer@fritz.box> +From: +To: , + +Date: Thu, 30 Mar 2023 02:56:53 +0000 +Subject: A HTML email +Mime-Version: 1.0 +Content-Type: text/html; + charset="utf-8" +Content-Transfer-Encoding: quoted-printable + +<=21DOCTYPE html> + + +Alerttitle + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +headertext of table + +
+
+ + + + +
+" Very important information about a change in your +home automation setup + +Now the light is on +
+
+ + + + +
+
+If you don't want to recieve this message anymore, stop the push + services in your FRITZ=21Box=2E
+Here you can see the active push services: "System > Push Service"=2E +
+
+ + + + +
+This mail has ben sent by your FRITZ=21Box automatically=2E +
+
+
+ + +. +` + + s, c, _, scanner := newTestSMTPServer(t, func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/mytopic", r.URL.Path) + require.Equal(t, "A HTML email", r.Header.Get("Title")) + require.Equal(t, "what's up", readAll(t, r.Body)) + }) + defer s.Close() + defer c.Close() + writeAndReadUntilLine(t, email, c, scanner, "250 2.0.0 OK: queued") +} + func TestSmtpBackend_PlaintextWithToken(t *testing.T) { email := `EHLO example.com MAIL FROM: phil@example.com From 5dafd7e4a7799dbb00925890c13f0965eff83a07 Mon Sep 17 00:00:00 2001 From: Mazurky Date: Thu, 28 Sep 2023 12:10:35 +0000 Subject: [PATCH 02/51] Translated using Weblate (Slovak) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/sk/ --- web/public/static/langs/sk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/sk.json b/web/public/static/langs/sk.json index 8ea1b45f..0e3f57a7 100644 --- a/web/public/static/langs/sk.json +++ b/web/public/static/langs/sk.json @@ -231,7 +231,7 @@ "prefs_reservations_dialog_title_delete": "Odstrániť rezervovanú tému", "prefs_users_table": "Tabuľka používateľov", "prefs_reservations_table_topic_header": "Téma", - "reservation_delete_dialog_submit_button": "Odstrániť rezerváciu", + "reservation_delete_dialog_submit_button": "Vymazať rezerváciu", "prefs_reservations_limit_reached": "Dosiahli ste limit rezervovaných tém.", "account_upgrade_dialog_interval_monthly": "Mesačne", "prefs_users_add_button": "Pridať používateľa", From ba0cc7fbf97b6ee8a9b1d8d16ce79bf9f8c5b94e Mon Sep 17 00:00:00 2001 From: noman <27938023+noman-land@users.noreply.github.com> Date: Sun, 8 Oct 2023 15:58:29 -0400 Subject: [PATCH 03/51] fix: Remove errant word from Action buttons docs --- docs/publish.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/publish.md b/docs/publish.md index 6df859cf..41370778 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -1131,7 +1131,7 @@ As of today, the following actions are supported: when the action button is tapped (only supported on Android) * [`http`](#send-http-request): Sends HTTP POST/GET/PUT request when the action button is tapped -Here's an example of what that a notification with actions can look like: +Here's an example of what a notification with actions can look like:
![notification with actions](static/img/android-screenshot-notification-actions.png){ width=500 } From 73d2b3363ba78e7598b9bdf96557919020bae449 Mon Sep 17 00:00:00 2001 From: "Carlos M. Silva" Date: Fri, 13 Oct 2023 20:57:06 +0000 Subject: [PATCH 04/51] Translated using Weblate (Portuguese (Brazil)) Currently translated at 57.5% (220 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt_BR/ --- web/public/static/langs/pt_BR.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/pt_BR.json b/web/public/static/langs/pt_BR.json index 1bb0cd92..89a01d89 100644 --- a/web/public/static/langs/pt_BR.json +++ b/web/public/static/langs/pt_BR.json @@ -192,7 +192,7 @@ "action_bar_reservation_add": "Reserve topic", "action_bar_reservation_edit": "Change reservation", "signup_disabled": "Registrar está desativado", - "signup_error_username_taken": "Usuário {{username}} já existe", + "signup_error_username_taken": "Usuário {{username}} já existe", "signup_error_creation_limit_reached": "Limite de criação de contas atingido", "action_bar_reservation_delete": "Remover reserva", "action_bar_account": "Conta", From 2f2918bd3b9c6549a5274878791cc806831dd81c Mon Sep 17 00:00:00 2001 From: PW Date: Mon, 16 Oct 2023 02:51:18 +0000 Subject: [PATCH 05/51] Translated using Weblate (Chinese (Traditional)) Currently translated at 73.0% (279 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/zh_Hant/ --- web/public/static/langs/zh_Hant.json | 36 +++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/zh_Hant.json b/web/public/static/langs/zh_Hant.json index 0d7f3f48..6d351930 100644 --- a/web/public/static/langs/zh_Hant.json +++ b/web/public/static/langs/zh_Hant.json @@ -243,5 +243,39 @@ "account_basics_phone_numbers_copied_to_clipboard": "電話號碼已複製到剪貼簿", "account_basics_phone_numbers_dialog_number_label": "電話號碼", "account_basics_phone_numbers_dialog_channel_call": "通話", - "account_usage_calls_title": "已播出電話" + "account_usage_calls_title": "已播出電話", + "account_tokens_dialog_title_create": "建立存取權杖", + "account_upgrade_dialog_tier_current_label": "目前", + "account_tokens_table_token_header": "權杖", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "節省高達{{discount}}%", + "account_tokens_dialog_expires_never": "權杖永遠不會過期", + "account_delete_title": "刪除帳戶", + "account_delete_dialog_label": "密碼", + "account_upgrade_dialog_interval_monthly": "每月", + "account_tokens_table_never_expires": "永不過期", + "account_tokens_delete_dialog_title": "删除存取權杖", + "account_upgrade_dialog_button_cancel": "取消", + "account_tokens_table_label_header": "標籤", + "account_upgrade_dialog_button_cancel_subscription": "取消訂閱", + "account_tokens_dialog_title_edit": "編輯存取權杖", + "account_delete_dialog_button_cancel": "取消", + "account_tokens_table_copied_to_clipboard": "已複製存取權杖", + "account_upgrade_dialog_title": "更改帳戶方案", + "account_tokens_delete_dialog_submit_button": "永久删除權杖", + "account_delete_description": "永久刪除你的帳戶", + "account_tokens_title": "存取權杖", + "account_delete_dialog_button_submit": "永久刪除帳戶", + "account_tokens_dialog_title_delete": "删除存取權杖", + "account_upgrade_dialog_interval_yearly": "每年", + "account_upgrade_dialog_button_redirect_signup": "立即註冊", + "account_tokens_dialog_button_cancel": "取消", + "account_tokens_dialog_button_update": "更新權杖", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} 總儲存空間", + "account_tokens_table_cannot_delete_or_edit": "無法編輯或刪除當前階段權杖", + "account_tokens_table_current_session": "目前瀏覽器階段", + "account_upgrade_dialog_button_pay_now": "立即付款及訂閱", + "account_upgrade_dialog_tier_selected_label": "已選擇", + "account_upgrade_dialog_button_update_subscription": "更改訂閱", + "account_tokens_dialog_button_create": "建立權杖", + "account_tokens_table_create_token_button": "建立存取權杖" } From 7516d25bc6fdc34179a5eb4fed189ae8da506c0e Mon Sep 17 00:00:00 2001 From: Rhodri Date: Sun, 15 Oct 2023 21:03:05 +0000 Subject: [PATCH 06/51] Translated using Weblate (Welsh) Currently translated at 12.0% (46 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/cy/ --- web/public/static/langs/cy.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/cy.json b/web/public/static/langs/cy.json index 68846b8f..da6c9b41 100644 --- a/web/public/static/langs/cy.json +++ b/web/public/static/langs/cy.json @@ -39,5 +39,10 @@ "publish_dialog_attach_placeholder": "Atodi ffeil drwy URL, e.e. https://f-droid.org/F-Droid.apk", "notifications_click_copy_url_button": "Copio linc", "notifications_actions_open_url_title": "Ewch i {{url}}", - "publish_dialog_email_label": "Ebost" + "publish_dialog_email_label": "Ebost", + "signup_form_confirm_password": "Cadarnhau cyfrinair", + "signup_form_button_submit": "Cofrestru", + "common_back": "Yn ôl", + "common_copy_to_clipboard": "Copio i'r clipfwrdd", + "signup_already_have_account": "Gyda chyfrif yn barod? Mewngofnodi!" } From 483edb70bfc6c0e6b06777258597d02078c06495 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 18 Oct 2023 09:52:18 +0200 Subject: [PATCH 07/51] doc/integrations: link RouterOS Scripts ... which has a module to send notifications to Ntfy. --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index fcc51248..5375314a 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -133,6 +133,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy-ios-url-share](https://www.icloud.com/shortcuts/be8a7f49530c45f79733cfe3e41887e6) - An iOS shortcut that lets you share URLs easily and quickly. - [ntfy-ios-filesharing](https://www.icloud.com/shortcuts/fe948d151b2e4ae08fb2f9d6b27d680b) - An iOS shortcut that lets you share files from your share feed to a topic of your choice. - [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes +- [RouterOS Scripts](https://git.eworm.de/cgit/routeros-scripts/about/) - a collection of scripts for MikroTik RouterOS ## Blog + forum posts From ef45ea5a50ffd010685e4dfb116f355783fc7daa Mon Sep 17 00:00:00 2001 From: imkero Date: Thu, 19 Oct 2023 07:48:06 +0000 Subject: [PATCH 08/51] fix(i18n): correct usage of language str having underline --- web/src/app/utils.js | 10 ++++++++-- web/src/components/App.jsx | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/web/src/app/utils.js b/web/src/app/utils.js index d0ae15ce..6b3849f5 100644 --- a/web/src/app/utils.js +++ b/web/src/app/utils.js @@ -130,14 +130,20 @@ export const hashCode = (s) => { return hash; }; +/** + * convert `i18n.language` style str (e.g.: `en_US`) to kebab-case (e.g.: `en-US`), + * which is expected by `` and `Intl.DateTimeFormat` + */ +export const getKebabCaseLangStr = (language) => language.replace(/_/g, '-'); + export const formatShortDateTime = (timestamp, language) => - new Intl.DateTimeFormat(language, { + new Intl.DateTimeFormat(getKebabCaseLangStr(language), { dateStyle: "short", timeStyle: "short", }).format(new Date(timestamp * 1000)); export const formatShortDate = (timestamp, language) => - new Intl.DateTimeFormat(language, { dateStyle: "short" }).format(new Date(timestamp * 1000)); + new Intl.DateTimeFormat(getKebabCaseLangStr(language), { dateStyle: "short" }).format(new Date(timestamp * 1000)); export const formatBytes = (bytes, decimals = 2) => { if (bytes === 0) return "0 bytes"; diff --git a/web/src/components/App.jsx b/web/src/components/App.jsx index d22ec66f..7f84b7de 100644 --- a/web/src/components/App.jsx +++ b/web/src/components/App.jsx @@ -11,7 +11,7 @@ import ActionBar from "./ActionBar"; import Preferences from "./Preferences"; import subscriptionManager from "../app/SubscriptionManager"; import userManager from "../app/UserManager"; -import { expandUrl } from "../app/utils"; +import { expandUrl, getKebabCaseLangStr } from "../app/utils"; import ErrorBoundary from "./ErrorBoundary"; import routes from "./routes"; import { useAccountListener, useBackgroundProcesses, useConnectionListeners, useWebPushTopics } from "./hooks"; @@ -56,7 +56,7 @@ const App = () => { ); useEffect(() => { - document.documentElement.setAttribute("lang", i18n.language); + document.documentElement.setAttribute("lang", getKebabCaseLangStr(i18n.language)); document.dir = languageDir; }, [i18n.language, languageDir]); From e7c03650798cc54f74797f7c357d2ecce24454b9 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:15:42 -0400 Subject: [PATCH 09/51] Changelog --- docs/releases.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releases.md b/docs/releases.md index 15fdd114..cac34a3c 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1291,6 +1291,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) * Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) * PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) +* Correct usage of language str having underline ([#922](https://github.com/binwiederhier/ntfy/pull/922), thanks to [@imkero](https://github.com/imkero)) ### ntfy Android app v1.16.1 (UNRELEASED) From 70b084457ae1ca7aff9aaeb82bdaef2aee4ff148 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:18:03 -0400 Subject: [PATCH 10/51] Bump deps --- go.mod | 43 +++-- go.sum | 56 ++++++ web/package-lock.json | 432 +++++++++++++++++++++--------------------- 3 files changed, 299 insertions(+), 232 deletions(-) diff --git a/go.mod b/go.mod index 6a2cffea..27ee4332 100644 --- a/go.mod +++ b/go.mod @@ -6,20 +6,20 @@ require ( cloud.google.com/go/firestore v1.13.0 // indirect cloud.google.com/go/storage v1.33.0 // indirect github.com/BurntSushi/toml v1.3.2 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/emersion/go-smtp v0.18.0 - github.com/gabriel-vasile/mimetype v1.4.2 + github.com/gabriel-vasile/mimetype v1.4.3 github.com/gorilla/websocket v1.5.0 github.com/mattn/go-sqlite3 v1.14.17 github.com/olebedev/when v1.0.0 github.com/stretchr/testify v1.8.1 github.com/urfave/cli/v2 v2.25.7 - golang.org/x/crypto v0.13.0 - golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sync v0.3.0 - golang.org/x/term v0.12.0 + golang.org/x/crypto v0.14.0 + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sync v0.4.0 + golang.org/x/term v0.13.0 golang.org/x/time v0.3.0 - google.golang.org/api v0.143.0 + google.golang.org/api v0.147.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -29,17 +29,17 @@ require github.com/pkg/errors v0.9.1 // indirect require ( firebase.google.com/go/v4 v4.12.1 - github.com/SherClockHolmes/webpush-go v1.2.0 + github.com/SherClockHolmes/webpush-go v1.3.0 github.com/prometheus/client_golang v1.17.0 github.com/stripe/stripe-go/v74 v74.30.0 ) require ( cloud.google.com/go v0.110.8 // indirect - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute v1.23.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect - cloud.google.com/go/longrunning v0.5.1 // indirect + cloud.google.com/go/iam v1.1.3 // indirect + cloud.google.com/go/longrunning v0.5.2 // indirect github.com/AlekSi/pointer v1.2.0 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -50,31 +50,32 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.3.1 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/kr/text v0.2.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect - github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/sys v0.12.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine/v2 v2.0.5 // indirect - google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect - google.golang.org/grpc v1.58.2 // indirect + google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index bf112048..083a5423 100644 --- a/go.sum +++ b/go.sum @@ -3,14 +3,20 @@ cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.1 h1:V97tBoDaZHb6leicZ1G6DLK2BAaZLJ/7+9BB/En3hR0= +cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/firestore v1.13.0 h1:/3S4RssUV4GO/kvgJZB+tayjhOfyAHs+KcpJgRVu/Qk= cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.3 h1:18tKG7DzydKWUnLjonWcJO6wjSCAtzh4GcRKlH/Hrzc= +cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/longrunning v0.5.2 h1:u+oFqfEwwU7F9dIELigxbe0XVnBAo9wqMuQLA50CZ5k= +cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= cloud.google.com/go/storage v1.33.0 h1:PVrDOkIC8qQVa1P3SXGpQvfuJhN2LHOoyZvWs8D2X5M= cloud.google.com/go/storage v1.33.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= firebase.google.com/go/v4 v4.12.0 h1:I6dCkcWUMFNkFdWgzlf8SLWecQnKdFgJhMv5fT9l1qI= @@ -26,6 +32,8 @@ github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= github.com/SherClockHolmes/webpush-go v1.2.0 h1:sGv0/ZWCvb1HUH+izLqrb2i68HuqD/0Y+AmGQfyqKJA= github.com/SherClockHolmes/webpush-go v1.2.0/go.mod h1:w6X47YApe/B9wUz2Wh8xukxlyupaxSSEbu6yKJcHN2w= +github.com/SherClockHolmes/webpush-go v1.3.0 h1:CAu3FvEE9QS4drc3iKNgpBWFfGqNthKlZhp5QpYnu6k= +github.com/SherClockHolmes/webpush-go v1.3.0/go.mod h1:AxRHmJuYwKGG1PVgYzToik1lphQvDnqFYDqimHvwhIw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -35,6 +43,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -50,6 +60,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -82,6 +94,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -101,6 +115,8 @@ github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6 github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/olebedev/when v1.0.0 h1:T2DZCj8HxUhOVxcqaLOmzuTr+iZLtMHsZEim7mjIA2w= github.com/olebedev/when v1.0.0/go.mod h1:T0THb4kP9D3NNqlvCwIG4GyUioTAzEhB4RNVzig/43E= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -116,8 +132,12 @@ github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUo github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= @@ -145,13 +165,17 @@ golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 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/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -162,18 +186,27 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -183,17 +216,27 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -205,14 +248,19 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 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/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.142.0 h1:mf+7EJ94fi5ZcnpPy+m0Yv2dkz8bKm+UL0snTCuwXlY= google.golang.org/api v0.142.0/go.mod h1:zJAN5o6HRqR7O+9qJUFOWrZkYE66RH+efPBdTLA4xBA= google.golang.org/api v0.143.0 h1:o8cekTkqhywkbZT6p1UHJPZ9+9uuCAJs/KYomxZB8fA= google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= +google.golang.org/api v0.147.0 h1:Can3FaQo9LlVqxJCodNmeZW/ib3/qKAY3rFeXiHo5gc= +google.golang.org/api v0.147.0/go.mod h1:pQ/9j83DcmPd/5C9e2nFOdjjNkDZ1G+zkbK2uvdkJMs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= @@ -224,10 +272,16 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0= google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 h1:U7+wNaVuSTaUqNvK2+osJ9ejEZxbjHHk8F2b6Hpx0AE= google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -235,6 +289,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/web/package-lock.json b/web/package-lock.json index 3ce24105..13d2357d 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -80,18 +80,18 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", - "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -99,10 +99,10 @@ "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.0", + "@babel/helpers": "^7.23.2", "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -220,9 +220,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -442,13 +442,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", - "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0" }, "engines": { @@ -775,14 +775,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", - "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1562,12 +1562,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", - "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.20", + "@babel/compat-data": "^7.23.2", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -1593,15 +1593,15 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.15", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.15", + "@babel/plugin-transform-block-scoping": "^7.23.0", "@babel/plugin-transform-class-properties": "^7.22.5", "@babel/plugin-transform-class-static-block": "^7.22.11", "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.15", + "@babel/plugin-transform-destructuring": "^7.23.0", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", "@babel/plugin-transform-dynamic-import": "^7.22.11", @@ -1613,9 +1613,9 @@ "@babel/plugin-transform-literals": "^7.22.5", "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", @@ -1624,7 +1624,7 @@ "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-optional-chaining": "^7.23.0", "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-property-in-object": "^7.22.11", @@ -1641,10 +1641,10 @@ "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.19", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1676,9 +1676,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", - "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1701,9 +1701,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", - "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -2277,9 +2277,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2304,9 +2304,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2428,9 +2428,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2449,14 +2449,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.17", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.17.tgz", - "integrity": "sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==", + "version": "5.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz", + "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==", "dependencies": { - "@babel/runtime": "^7.22.15", + "@babel/runtime": "^7.23.1", "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -2480,20 +2480,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.11.tgz", - "integrity": "sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz", + "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.11.tgz", - "integrity": "sha512-aHReLasBuS/+hhPzbZCgZ0eTcZ2QRnoC2WNK7XvdAf3l+LjC1flzjh6GWw1tZJ5NHnZ+bivdwtLFQ8XTR96JkA==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.14.tgz", + "integrity": "sha512-vwuaMsKvI7AWTeYqR8wYbpXijuU8PzMAJWRAq2DDIuOZPxjKyHlr8WQ25+azZYkIXtJ7AqnVb1ZmHdEyB4/kug==", "dependencies": { - "@babel/runtime": "^7.22.15" + "@babel/runtime": "^7.23.1" }, "engines": { "node": ">=12.0.0" @@ -2514,17 +2514,17 @@ } }, "node_modules/@mui/material": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.11.tgz", - "integrity": "sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.14.tgz", + "integrity": "sha512-cAmCwAHFQXxb44kWbVFkhKATN8tACgMsFwrXo8ro6WzYW73U/qsR5AcCiJIhCyYYg+gcftfkmNcpRaV3JjhHCg==", "dependencies": { - "@babel/runtime": "^7.22.15", - "@mui/base": "5.0.0-beta.17", - "@mui/core-downloads-tracker": "^5.14.11", - "@mui/system": "^5.14.11", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", - "@types/react-transition-group": "^4.4.6", + "@babel/runtime": "^7.23.1", + "@mui/base": "5.0.0-beta.20", + "@mui/core-downloads-tracker": "^5.14.14", + "@mui/system": "^5.14.14", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", + "@types/react-transition-group": "^4.4.7", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", @@ -2558,12 +2558,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.11.tgz", - "integrity": "sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz", + "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==", "dependencies": { - "@babel/runtime": "^7.22.15", - "@mui/utils": "^5.14.11", + "@babel/runtime": "^7.23.1", + "@mui/utils": "^5.14.13", "prop-types": "^15.8.1" }, "engines": { @@ -2584,11 +2584,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.11.tgz", - "integrity": "sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz", + "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==", "dependencies": { - "@babel/runtime": "^7.22.15", + "@babel/runtime": "^7.23.1", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2615,15 +2615,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.11.tgz", - "integrity": "sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz", + "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==", "dependencies": { - "@babel/runtime": "^7.22.15", - "@mui/private-theming": "^5.14.11", - "@mui/styled-engine": "^5.14.11", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", + "@babel/runtime": "^7.23.1", + "@mui/private-theming": "^5.14.14", + "@mui/styled-engine": "^5.14.13", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2654,11 +2654,11 @@ } }, "node_modules/@mui/types": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", - "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.6.tgz", + "integrity": "sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==", "peerDependencies": { - "@types/react": "*" + "@types/react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2667,12 +2667,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.11.tgz", - "integrity": "sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.14.tgz", + "integrity": "sha512-3AKp8uksje5sRfVrtgG9Q/2TBsHWVBUtA0NaXliZqGcXo8J+A+Agp0qUW2rJ+ivgPWTCCubz9FZVT2IQZ3bGsw==", "dependencies": { - "@babel/runtime": "^7.22.15", - "@types/prop-types": "^15.7.5", + "@babel/runtime": "^7.23.1", + "@types/prop-types": "^15.7.7", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2738,9 +2738,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", - "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.10.0.tgz", + "integrity": "sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw==", "engines": { "node": ">=14.0.0" } @@ -2758,9 +2758,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2771,18 +2771,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -2790,9 +2790,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -2811,33 +2811,36 @@ "dev": true }, "node_modules/@types/mdast": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz", - "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.14.tgz", + "integrity": "sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==", "dependencies": { "@types/unist": "^2" } }, "node_modules/@types/node": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.0.tgz", - "integrity": "sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==", - "dev": true + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.25.1" + } }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", + "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" }, "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==" + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" }, "node_modules/@types/react": { - "version": "18.2.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.24.tgz", - "integrity": "sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw==", + "version": "18.2.29", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.29.tgz", + "integrity": "sha512-Z+ZrIRocWtdD70j45izShRwDuiB4JZqDegqMFW/I8aG5DxxLKOzVNoq62UIO82v9bdgi+DO1jvsb9sTEZUSm+Q==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2845,9 +2848,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.7.tgz", - "integrity": "sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", + "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", "dependencies": { "@types/react": "*" } @@ -2862,20 +2865,20 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==" + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" }, "node_modules/@types/trusted-types": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", - "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", + "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", "dev": true }, "node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.9.tgz", + "integrity": "sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==" }, "node_modules/@vitejs/plugin-react": { "version": "4.1.0", @@ -3164,13 +3167,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.4.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -3178,12 +3181,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz", - "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", + "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.4.3", "core-js-compat": "^3.32.2" }, "peerDependencies": { @@ -3191,12 +3194,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" + "@babel/helper-define-polyfill-provider": "^0.4.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3311,9 +3314,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001542", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001542.tgz", - "integrity": "sha512-UrtAXVcj1mvPBFQ4sKd38daP8dEcXXr5sQe6QNNinaPd0iA/cxg9/l3VrSdL73jgw5sKyuQ6jNgiKO12W3SsVA==", + "version": "1.0.30001551", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", + "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", "dev": true, "funding": [ { @@ -3550,9 +3553,9 @@ } }, "node_modules/define-data-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.2.1", @@ -3644,9 +3647,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.537", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.537.tgz", - "integrity": "sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==", + "version": "1.4.559", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.559.tgz", + "integrity": "sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==", "dev": true }, "node_modules/emoji-regex": { @@ -3844,15 +3847,15 @@ } }, "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", + "@eslint/js": "8.51.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4132,12 +4135,12 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4226,9 +4229,9 @@ "dev": true }, "node_modules/eslint/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4474,12 +4477,12 @@ } }, "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, @@ -4538,9 +4541,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -4696,12 +4703,9 @@ "dev": true }, "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "engines": { "node": ">= 0.4.0" } @@ -5614,9 +5618,9 @@ } }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -5978,9 +5982,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", + "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6465,11 +6469,11 @@ } }, "node_modules/react-router": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz", - "integrity": "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.17.0.tgz", + "integrity": "sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA==", "dependencies": { - "@remix-run/router": "1.9.0" + "@remix-run/router": "1.10.0" }, "engines": { "node": ">=14.0.0" @@ -6479,12 +6483,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz", - "integrity": "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.17.0.tgz", + "integrity": "sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==", "dependencies": { - "@remix-run/router": "1.9.0", - "react-router": "6.16.0" + "@remix-run/router": "1.10.0", + "react-router": "6.17.0" }, "engines": { "node": ">=14.0.0" @@ -6663,9 +6667,9 @@ } }, "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -7164,9 +7168,9 @@ } }, "node_modules/terser": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.20.0.tgz", - "integrity": "sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==", + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", + "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -7357,6 +7361,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -7582,9 +7592,9 @@ } }, "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", "dev": true, "dependencies": { "esbuild": "^0.18.10", From c6b8ea90b79841259b36e43670274612b85e813c Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:32:39 -0400 Subject: [PATCH 11/51] Thank you @YezGotIt for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0fae8469..6e69d27d 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 7c3fd42a867d52a2d447144bfa9a2cbfb4022045 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:33:40 -0400 Subject: [PATCH 12/51] Thank you @thomasskou for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6e69d27d..049b6910 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From ca6bc1dcb02602d4f1fb3609a528a794f5cedab9 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:38:12 -0400 Subject: [PATCH 13/51] Thank you @surfernv for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 049b6910..c20c9971 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From b811da6b830efe52b5d83e8a6f37d0997f956aef Mon Sep 17 00:00:00 2001 From: FOSSMan <137928236+0xFOSSMan@users.noreply.github.com> Date: Fri, 20 Oct 2023 18:42:44 +0000 Subject: [PATCH 14/51] Added ntfy.fossman.de to docs/integrations.md/Alternative ntfy Servers --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index 5375314a..2bd2344d 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -236,6 +236,7 @@ ntfy community. Thanks to everyone running a public server. **You guys rock!** | [ntfy.envs.net](https://ntfy.envs.net) | 🇩🇪 Germany | | [ntfy.mzte.de](https://ntfy.mzte.de/) | 🇩🇪 Germany | | [ntfy.hostux.net](https://ntfy.hostux.net/) | 🇫🇷 France | +| [ntfy.fossman.de](https://ntfy.fossman.de/) | 🇩🇪 Germany | Please be aware that **server operators can log your messages**. The project also cannot guarantee the reliability and uptime of third party servers, so use of each server is **at your own discretion**. From 554547b431f462ea0df72d79e3680c7570f65080 Mon Sep 17 00:00:00 2001 From: Dan Lousqui Date: Mon, 23 Oct 2023 21:22:21 +0200 Subject: [PATCH 15/51] doc/integrations: link to ntfy-android-builder --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index 5375314a..48d33abe 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -72,6 +72,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## Projects + scripts +- [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell) - [Grafana-to-ntfy](https://github.com/kittyandrew/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Rust) - [Grafana-ntfy-webhook-integration](https://github.com/academo/grafana-alerting-ntfy-webhook-integration) - Integrates Grafana alerts webhooks (Go) - [Grafana-to-ntfy](https://gitlab.com/Saibe1111/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Node Js) From 6dbdabf9fd325a1010e6144a60b9bf7bdc9dc673 Mon Sep 17 00:00:00 2001 From: Dan Lousqui Date: Mon, 23 Oct 2023 22:15:01 +0200 Subject: [PATCH 16/51] doc/integrations: link to ntfy-android-builder --- docs/integrations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index 48d33abe..6a9766b9 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -72,7 +72,6 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## Projects + scripts -- [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell) - [Grafana-to-ntfy](https://github.com/kittyandrew/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Rust) - [Grafana-ntfy-webhook-integration](https://github.com/academo/grafana-alerting-ntfy-webhook-integration) - Integrates Grafana alerts webhooks (Go) - [Grafana-to-ntfy](https://gitlab.com/Saibe1111/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Node Js) @@ -135,6 +134,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy-ios-filesharing](https://www.icloud.com/shortcuts/fe948d151b2e4ae08fb2f9d6b27d680b) - An iOS shortcut that lets you share files from your share feed to a topic of your choice. - [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes - [RouterOS Scripts](https://git.eworm.de/cgit/routeros-scripts/about/) - a collection of scripts for MikroTik RouterOS +- [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell) ## Blog + forum posts From 27f8cc0e5282c2861f0e2f48041becaa914ebd8d Mon Sep 17 00:00:00 2001 From: dgtlmoon Date: Sat, 28 Oct 2023 19:04:56 +0200 Subject: [PATCH 17/51] Adding changedetection.io integration guide --- docs/examples.md | 16 ++++++++++++++++ docs/integrations.md | 1 + docs/static/img/cdio-setup.jpg | Bin 0 -> 158553 bytes 3 files changed, 17 insertions(+) create mode 100644 docs/static/img/cdio-setup.jpg diff --git a/docs/examples.md b/docs/examples.md index 8164e2bf..a0e121fe 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -135,6 +135,22 @@ You can send a message during a workflow run with curl. Here is an example sendi ${{ secrets.NTFY_URL }} ``` +## Changedetection.io +NTFY is an excellent choice for getting notifications when a website has a change sent to your mobile (or desktop), +[changedetection.io](https://changedetection.io) or [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) +uses [apprise](https://github.com/caronc/apprise) library for notification integrations. + +To add any NTFY(s) notification to a website change simply add the [NTFY style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) +to the notification list. + +For example `ntfy://{topic}` or `ntfy://{user}:{password}@{host}:{port}/{topics}` + +In your changedetection.io installation, click `Edit` > `Notifications` on a single watch then add the special NTFY URL +to the Notification List. + +![ntfy alerts on website change](static/img/cdio-setup.jpg) + + ## Watchtower (shoutrrr) You can use [shoutrrr](https://containrrr.dev/shoutrrr/latest/services/ntfy/) to send [Watchtower](https://github.com/containrrr/watchtower/) notifications to your ntfy topic. diff --git a/docs/integrations.md b/docs/integrations.md index f5c5fe83..a8ffa6a9 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -24,6 +24,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [diun](https://crazymax.dev/diun/) - Docker Image Update Notifier - [Cloudron](https://www.cloudron.io/store/sh.ntfy.cloudronapp.html) - Platform that makes it easy to manage web apps on your server - [Xitoring](https://xitoring.com/docs/notifications/notification-roles/ntfy/) - Server and Uptime monitoring +- [changedetection.io](https://changedetection.io) ⭐ - Website change detection and notification ## Integration via HTTP/SMTP/etc. diff --git a/docs/static/img/cdio-setup.jpg b/docs/static/img/cdio-setup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2f9e44cb2ff668da992555e9171229b7d8849836 GIT binary patch literal 158553 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%0DsB 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 I{k`&k0NcX>(f|Me literal 0 HcmV?d00001 From 03e7a3ea65030423df4f1a2b811c5ee92fb1544c Mon Sep 17 00:00:00 2001 From: dgtlmoon Date: Sat, 28 Oct 2023 19:08:14 +0200 Subject: [PATCH 18/51] lower case --- docs/examples.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/examples.md b/docs/examples.md index a0e121fe..9f951422 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -136,21 +136,20 @@ You can send a message during a workflow run with curl. Here is an example sendi ``` ## Changedetection.io -NTFY is an excellent choice for getting notifications when a website has a change sent to your mobile (or desktop), +ntfy is an excellent choice for getting notifications when a website has a change sent to your mobile (or desktop), [changedetection.io](https://changedetection.io) or [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) uses [apprise](https://github.com/caronc/apprise) library for notification integrations. -To add any NTFY(s) notification to a website change simply add the [NTFY style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) +To add any ntfy(s) notification to a website change simply add the [NTFY style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) to the notification list. For example `ntfy://{topic}` or `ntfy://{user}:{password}@{host}:{port}/{topics}` -In your changedetection.io installation, click `Edit` > `Notifications` on a single watch then add the special NTFY URL -to the Notification List. +In your changedetection.io installation, click `Edit` > `Notifications` on a single website watch (or group) then add +the special ntfy Apprise Notification URL to the Notification List. ![ntfy alerts on website change](static/img/cdio-setup.jpg) - ## Watchtower (shoutrrr) You can use [shoutrrr](https://containrrr.dev/shoutrrr/latest/services/ntfy/) to send [Watchtower](https://github.com/containrrr/watchtower/) notifications to your ntfy topic. From e2097e856ea7f523c6ac8320b4ec978a7469b750 Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Sat, 28 Oct 2023 13:33:39 -0400 Subject: [PATCH 19/51] Update install.md Add macOS client.yml location to the list of locations given --- docs/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index ed101554..c1a621d7 100644 --- a/docs/install.md +++ b/docs/install.md @@ -14,7 +14,7 @@ We support amd64, armv7 and arm64. 1. Install ntfy using one of the methods described below 2. Then (optionally) edit `/etc/ntfy/server.yml` for the server (Linux only, see [configuration](config.md) or [sample server.yml](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml)) -3. Or (optionally) create/edit `~/.config/ntfy/client.yml` (for the non-root user) or `/etc/ntfy/client.yml` (for the root user), see [sample client.yml](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml)) +3. Or (optionally) create/edit `~/.config/ntfy/client.yml` (for the non-root user), `~/Library/Application Support/ntfy/client.yml` (for the macOS non-root user), or `/etc/ntfy/client.yml` (for the root user), see [sample client.yml](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml)) To run the ntfy server, then just run `ntfy serve` (or `systemctl start ntfy` when using the deb/rpm). To send messages, use `ntfy publish`. To subscribe to topics, use `ntfy subscribe` (see [subscribing via CLI](subscribe/cli.md) From 2afe1fbeedea74065f3ba1d1b8aa8679e76cc742 Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Sat, 28 Oct 2023 13:35:52 -0400 Subject: [PATCH 20/51] Update cli.md Add macOS client location to the options listed --- docs/subscribe/cli.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/subscribe/cli.md b/docs/subscribe/cli.md index 59cfc8e7..7f589d3c 100644 --- a/docs/subscribe/cli.md +++ b/docs/subscribe/cli.md @@ -10,7 +10,7 @@ to topics via the ntfy CLI. The CLI is included in the same `ntfy` binary that c ## Install + configure To install the ntfy CLI, simply **follow the steps outlined on the [install page](../install.md)**. The ntfy server and client are the same binary, so it's all very convenient. After installing, you can (optionally) configure the client -by creating `~/.config/ntfy/client.yml` (for the non-root user), or `/etc/ntfy/client.yml` (for the root user). You +by creating `~/.config/ntfy/client.yml` (for the non-root user), `~/Library/Application Support/ntfy/client.yml` (for the macOS non-root user), or `/etc/ntfy/client.yml` (for the root user). You can find a [skeleton config](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml) on GitHub. If you just want to use [ntfy.sh](https://ntfy.sh), you don't have to change anything. If you **self-host your own server**, From 7791901b2d32fa5a167de13c5b69c04980d31b54 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:10:35 -0400 Subject: [PATCH 21/51] Thank you @bear for your sponsorship. Awesome user name too! --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c20c9971..8c633163 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 6d451785f08147b06b847887cb1306b82a1b2de6 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:13:26 -0400 Subject: [PATCH 22/51] Thank you @richardleach for your sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8c633163..3b98ddf5 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), From a3663e43e4162e6aa3fc6f185fed48a5742a6555 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:14:07 -0400 Subject: [PATCH 23/51] Thank you for your donation @cminter --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3b98ddf5..1754ea5d 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From cad38573d76f8236c6eba53c1388135650564f26 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:15:20 -0400 Subject: [PATCH 24/51] Thank you for your donation @bahur142 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1754ea5d..bb8879af 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 8e0491220158aa86078f384391914f67894fa700 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:32:08 -0400 Subject: [PATCH 25/51] Fixing docs links --- docs/develop.md | 2 +- docs/emojis.md | 4 ++-- docs/examples.md | 4 ++-- docs/releases.md | 2 +- scripts/emoji-convert.sh | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/develop.md b/docs/develop.md index 05b55773..b090c8c5 100644 --- a/docs/develop.md +++ b/docs/develop.md @@ -429,7 +429,7 @@ steps: ### XCode setup -1. Follow step 4 of [https://firebase.google.com/docs/ios/setup](Add Firebase to your Apple project) to install the +1. Follow step 4 of [Add Firebase to your Apple project](https://firebase.google.com/docs/ios/setup) to install the `firebase-ios-sdk` in XCode, if it's not already present - you can select any packages in addition to Firebase Core / Firebase Messaging 1. Similarly, install the SQLite.swift package dependency in XCode 1. When running the debug build, ensure XCode is pointed to the connected iOS device - registering for push notifications does not work in the iOS simulators diff --git a/docs/emojis.md b/docs/emojis.md index fa01bb47..d801ae09 100644 --- a/docs/emojis.md +++ b/docs/emojis.md @@ -2,9 +2,9 @@ -You can [tag messages](../publish/#tags-emojis) with emojis 🥳 🎉 and other relevant strings. Matching tags are automatically +You can [tag messages](publish.md#tags-emojis) with emojis 🥳 🎉 and other relevant strings. Matching tags are automatically converted to emojis. This is a reference of all supported emojis. To learn more about the feature, please refer to the -[tagging and emojis page](../publish/#tags-emojis). +[tagging and emojis page](publish.md#tags-emojis). diff --git a/docs/examples.md b/docs/examples.md index 9f951422..4e936d91 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -137,10 +137,10 @@ You can send a message during a workflow run with curl. Here is an example sendi ## Changedetection.io ntfy is an excellent choice for getting notifications when a website has a change sent to your mobile (or desktop), -[changedetection.io](https://changedetection.io) or [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) +[changedetection.io](https://changedetection.io) or on GitHub ([dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io)) uses [apprise](https://github.com/caronc/apprise) library for notification integrations. -To add any ntfy(s) notification to a website change simply add the [NTFY style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) +To add any ntfy(s) notification to a website change simply add the [ntfy style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) to the notification list. For example `ntfy://{topic}` or `ntfy://{user}:{password}@{host}:{port}/{topics}` diff --git a/docs/releases.md b/docs/releases.md index cac34a3c..0cac2dea 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1273,7 +1273,7 @@ Released Dec 28, 2021 **Features & bug fixes:** -* [Publish messages via e-mail](ntfy.sh/docs/publish/#e-mail-publishing) #66 +* [Publish messages via e-mail](publish.md#e-mail-publishing) #66 * Server-side work to support [unifiedpush.org](https://unifiedpush.org) #64 * Fixing the Santa bug #65 diff --git a/scripts/emoji-convert.sh b/scripts/emoji-convert.sh index 61ad5f79..8cbe397b 100755 --- a/scripts/emoji-convert.sh +++ b/scripts/emoji-convert.sh @@ -25,9 +25,9 @@ elif [[ "$1" == *.md ]]; then -You can [tag messages](../publish/#tags-emojis) with emojis 🥳 🎉 and other relevant strings. Matching tags are automatically +You can [tag messages](publish.md#tags-emojis) with emojis 🥳 🎉 and other relevant strings. Matching tags are automatically converted to emojis. This is a reference of all supported emojis. To learn more about the feature, please refer to the -[tagging and emojis page](../publish/#tags-emojis). +[tagging and emojis page](publish.md#tags-emojis).
" > "$1" From b3534aecda1a557ce4149dd958c615ae89de1aa2 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 19:57:06 -0400 Subject: [PATCH 26/51] Format fixes --- Makefile | 12 ++++++------ web/src/app/utils.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 8cb75238..10624ed5 100644 --- a/Makefile +++ b/Makefile @@ -39,8 +39,8 @@ help: @echo " make web-deps - Install web app dependencies (npm install the universe)" @echo " make web-build - Actually build the web app" @echo " make web-lint - Run eslint on the web app" - @echo " make web-format - Run prettier on the web app" - @echo " make web-format-check - Run prettier on the web app, but don't change anything" + @echo " make web-fmt - Run prettier on the web app" + @echo " make web-fmt-check - Run prettier on the web app, but don't change anything" @echo @echo "Build documentation:" @echo " make docs - Build the documentation" @@ -151,10 +151,10 @@ web-deps: web-deps-update: cd web && npm update -web-format: +web-fmt: cd web && npm run format -web-format-check: +web-fmt-check: cd web && npm run format:check web-lint: @@ -248,7 +248,7 @@ cli-build-results: # Test/check targets -check: test web-format-check fmt-check vet web-lint lint staticcheck +check: test web-fmt-check fmt-check vet web-lint lint staticcheck test: .PHONY go test $(shell go list ./... | grep -vE 'ntfy/(test|examples|tools)') @@ -275,7 +275,7 @@ coverage-upload: # Lint/formatting targets -fmt: +fmt: web-fmt gofmt -s -w . fmt-check: diff --git a/web/src/app/utils.js b/web/src/app/utils.js index 6b3849f5..08710c1f 100644 --- a/web/src/app/utils.js +++ b/web/src/app/utils.js @@ -134,7 +134,7 @@ export const hashCode = (s) => { * convert `i18n.language` style str (e.g.: `en_US`) to kebab-case (e.g.: `en-US`), * which is expected by `` and `Intl.DateTimeFormat` */ -export const getKebabCaseLangStr = (language) => language.replace(/_/g, '-'); +export const getKebabCaseLangStr = (language) => language.replace(/_/g, "-"); export const formatShortDateTime = (timestamp, language) => new Intl.DateTimeFormat(getKebabCaseLangStr(language), { From c332c132faf8c0ec2798ba89fdd8c17bca55fb7f Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 20:04:37 -0400 Subject: [PATCH 27/51] Fix CI --- server/server_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/server_test.go b/server/server_test.go index d78533e9..d60c775a 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -512,6 +512,8 @@ func TestServer_PublishAtAndPrune(t *testing.T) { messages := toMessages(t, response.Body.String()) require.Equal(t, 1, len(messages)) // Not affected by pruning require.Equal(t, "a message", messages[0].Message) + + time.Sleep(time.Second) // FIXME CI failing not sure why } func TestServer_PublishAndMultiPoll(t *testing.T) { From d3565c9b87440931992874aebf55e7d8db9e96d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Seppo=20Lehtim=C3=A4ki?= Date: Sat, 4 Nov 2023 19:39:29 +0100 Subject: [PATCH 28/51] Added translation using Weblate (Finnish) --- web/public/static/langs/fi.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/public/static/langs/fi.json diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/web/public/static/langs/fi.json @@ -0,0 +1 @@ +{} From 8dd4c3e3c0fffb4516bb313a54a979ea0174c77d Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 6 Nov 2023 05:48:47 -0500 Subject: [PATCH 29/51] Bump deps --- docs/releases.md | 2 +- go.mod | 38 ++-- go.sum | 127 ++++------- web/package-lock.json | 490 ++++++++++++++++++++++-------------------- 4 files changed, 314 insertions(+), 343 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 0cac2dea..73e5eb20 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1291,7 +1291,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) * Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) * PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) -* Correct usage of language str having underline ([#922](https://github.com/binwiederhier/ntfy/pull/922), thanks to [@imkero](https://github.com/imkero)) +* Fix web app crash in Edge for languages with underline in locale ([#922](https://github.com/binwiederhier/ntfy/pull/922)/[#912](https://github.com/binwiederhier/ntfy/issues/912)/[#852](https://github.com/binwiederhier/ntfy/issues/852), thanks to [@imkero](https://github.com/imkero)) ### ntfy Android app v1.16.1 (UNRELEASED) diff --git a/go.mod b/go.mod index 27ee4332..95365372 100644 --- a/go.mod +++ b/go.mod @@ -3,23 +3,23 @@ module heckel.io/ntfy go 1.18 require ( - cloud.google.com/go/firestore v1.13.0 // indirect - cloud.google.com/go/storage v1.33.0 // indirect + cloud.google.com/go/firestore v1.14.0 // indirect + cloud.google.com/go/storage v1.34.1 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/emersion/go-smtp v0.18.0 github.com/gabriel-vasile/mimetype v1.4.3 - github.com/gorilla/websocket v1.5.0 - github.com/mattn/go-sqlite3 v1.14.17 + github.com/gorilla/websocket v1.5.1 + github.com/mattn/go-sqlite3 v1.14.18 github.com/olebedev/when v1.0.0 github.com/stretchr/testify v1.8.1 github.com/urfave/cli/v2 v2.25.7 golang.org/x/crypto v0.14.0 golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sync v0.4.0 + golang.org/x/sync v0.5.0 golang.org/x/term v0.13.0 - golang.org/x/time v0.3.0 - google.golang.org/api v0.147.0 + golang.org/x/time v0.4.0 + google.golang.org/api v0.149.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -35,11 +35,11 @@ require ( ) require ( - cloud.google.com/go v0.110.8 // indirect - cloud.google.com/go/compute v1.23.1 // indirect + cloud.google.com/go v0.110.10 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.3 // indirect - cloud.google.com/go/longrunning v0.5.2 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/longrunning v0.5.4 // indirect github.com/AlekSi/pointer v1.2.0 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -50,13 +50,11 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.6.0 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/kr/text v0.2.0 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect @@ -67,14 +65,14 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine/v2 v2.0.5 // indirect - google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 083a5423..d93f52d2 100644 --- a/go.sum +++ b/go.sum @@ -1,26 +1,18 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= -cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.1 h1:V97tBoDaZHb6leicZ1G6DLK2BAaZLJ/7+9BB/En3hR0= -cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= +cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/firestore v1.13.0 h1:/3S4RssUV4GO/kvgJZB+tayjhOfyAHs+KcpJgRVu/Qk= -cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.3 h1:18tKG7DzydKWUnLjonWcJO6wjSCAtzh4GcRKlH/Hrzc= -cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= -cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/longrunning v0.5.2 h1:u+oFqfEwwU7F9dIELigxbe0XVnBAo9wqMuQLA50CZ5k= -cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= -cloud.google.com/go/storage v1.33.0 h1:PVrDOkIC8qQVa1P3SXGpQvfuJhN2LHOoyZvWs8D2X5M= -cloud.google.com/go/storage v1.33.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= -firebase.google.com/go/v4 v4.12.0 h1:I6dCkcWUMFNkFdWgzlf8SLWecQnKdFgJhMv5fT9l1qI= -firebase.google.com/go/v4 v4.12.0/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/storage v1.34.1 h1:H2Af2dU5J0PF7A5B+ECFIce+RqxVnrVilO+cu0TS3MI= +cloud.google.com/go/storage v1.34.1/go.mod h1:VN1ElqqvR9adg1k9xlkUJ55cMOP1/QjnNNuT5xQL6dY= firebase.google.com/go/v4 v4.12.1 h1:tDNvobifGsx/1HSFLnM0fmNfx/CDZSgsTO2KhZtgpcs= firebase.google.com/go/v4 v4.12.1/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= @@ -30,8 +22,6 @@ github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8 github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= -github.com/SherClockHolmes/webpush-go v1.2.0 h1:sGv0/ZWCvb1HUH+izLqrb2i68HuqD/0Y+AmGQfyqKJA= -github.com/SherClockHolmes/webpush-go v1.2.0/go.mod h1:w6X47YApe/B9wUz2Wh8xukxlyupaxSSEbu6yKJcHN2w= github.com/SherClockHolmes/webpush-go v1.3.0 h1:CAu3FvEE9QS4drc3iKNgpBWFfGqNthKlZhp5QpYnu6k= github.com/SherClockHolmes/webpush-go v1.3.0/go.mod h1:AxRHmJuYwKGG1PVgYzToik1lphQvDnqFYDqimHvwhIw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -41,8 +31,6 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -58,8 +46,6 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= @@ -92,29 +78,24 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ= -github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= -github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/olebedev/when v1.0.0 h1:T2DZCj8HxUhOVxcqaLOmzuTr+iZLtMHsZEim7mjIA2w= @@ -123,19 +104,11 @@ 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.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= @@ -161,13 +134,10 @@ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsr github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -188,25 +158,18 @@ golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -218,16 +181,12 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -237,10 +196,10 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -251,16 +210,10 @@ 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/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.142.0 h1:mf+7EJ94fi5ZcnpPy+m0Yv2dkz8bKm+UL0snTCuwXlY= -google.golang.org/api v0.142.0/go.mod h1:zJAN5o6HRqR7O+9qJUFOWrZkYE66RH+efPBdTLA4xBA= -google.golang.org/api v0.143.0 h1:o8cekTkqhywkbZT6p1UHJPZ9+9uuCAJs/KYomxZB8fA= -google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= -google.golang.org/api v0.147.0 h1:Can3FaQo9LlVqxJCodNmeZW/ib3/qKAY3rFeXiHo5gc= -google.golang.org/api v0.147.0/go.mod h1:pQ/9j83DcmPd/5C9e2nFOdjjNkDZ1G+zkbK2uvdkJMs= +google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= @@ -270,25 +223,17 @@ google.golang.org/appengine/v2 v2.0.5/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0= -google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 h1:U7+wNaVuSTaUqNvK2+osJ9ejEZxbjHHk8F2b6Hpx0AE= -google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 h1:HJMDndgxest5n2y77fnErkM62iUsptE/H8p0dC2Huo4= +google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= -google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/web/package-lock.json b/web/package-lock.json index 13d2357d..7e3fcfdb 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -2245,18 +2245,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2304,9 +2304,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2347,12 +2347,12 @@ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -2374,9 +2374,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { @@ -2438,9 +2438,9 @@ } }, "node_modules/@mapbox/hast-util-table-cell-style": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", - "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.1.tgz", + "integrity": "sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==", "dependencies": { "unist-util-visit": "^1.4.1" }, @@ -2449,14 +2449,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz", - "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==", + "version": "5.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.22.tgz", + "integrity": "sha512-l4asGID5tmyerx9emJfXOKLyXzaBtdXNIFE3M+IrSZaFtGFvaQKHhc3+nxxSxPf1+G44psjczM0ekRQCdXx9HA==", "dependencies": { - "@babel/runtime": "^7.23.1", + "@babel/runtime": "^7.23.2", "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -2480,20 +2480,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz", - "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.16.tgz", + "integrity": "sha512-97isBjzH2v1K7oB4UH2f4NOkBShOynY6dhnoR2XlUk/g6bb7ZBv2I3D1hvvqPtpEigKu93e7f/jAYr5d9LOc5w==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.14.tgz", - "integrity": "sha512-vwuaMsKvI7AWTeYqR8wYbpXijuU8PzMAJWRAq2DDIuOZPxjKyHlr8WQ25+azZYkIXtJ7AqnVb1ZmHdEyB4/kug==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.16.tgz", + "integrity": "sha512-wmOgslMEGvbHZjFLru8uH5E+pif/ciXAvKNw16q6joK6EWVWU5rDYWFknDaZhCvz8ZE/K8ZnJQ+lMG6GgHzXbg==", "dependencies": { - "@babel/runtime": "^7.23.1" + "@babel/runtime": "^7.23.2" }, "engines": { "node": ">=12.0.0" @@ -2514,17 +2514,17 @@ } }, "node_modules/@mui/material": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.14.tgz", - "integrity": "sha512-cAmCwAHFQXxb44kWbVFkhKATN8tACgMsFwrXo8ro6WzYW73U/qsR5AcCiJIhCyYYg+gcftfkmNcpRaV3JjhHCg==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.16.tgz", + "integrity": "sha512-W4zZ4vnxgGk6/HqBwgsDHKU7x2l2NhX+r8gAwfg58Rhu3ikfY7NkIS6y8Gl3NkATc4GG1FNaGjjpQKfJx3U6Jw==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/base": "5.0.0-beta.20", - "@mui/core-downloads-tracker": "^5.14.14", - "@mui/system": "^5.14.14", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "@types/react-transition-group": "^4.4.7", + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.22", + "@mui/core-downloads-tracker": "^5.14.16", + "@mui/system": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", @@ -2558,12 +2558,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz", - "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.16.tgz", + "integrity": "sha512-FNlL0pTSEBh8nXsVWreCHDSHk+jG8cBx1sxRbT8JVtL+PYbYPi802zfV4B00Kkf0LNRVRvAVQwojMWSR/MYGng==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/utils": "^5.14.13", + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.16", "prop-types": "^15.8.1" }, "engines": { @@ -2584,11 +2584,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz", - "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.16.tgz", + "integrity": "sha512-FfvYvTG/Zd+KXMMImbcMYEeQAbONGuX5Vx3gBmmtB6KyA7Mvm9Pma1ly3R0gc44yeoFd+2wBjn1feS8h42HW5w==", "dependencies": { - "@babel/runtime": "^7.23.1", + "@babel/runtime": "^7.23.2", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2615,15 +2615,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz", - "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.16.tgz", + "integrity": "sha512-uKnPfsDqDs8bbN54TviAuoGWOmFiQLwNZ3Wvj+OBkJCzwA6QnLb/sSeCB7Pk3ilH4h4jQ0BHtbR+Xpjy9wlOuA==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/private-theming": "^5.14.14", - "@mui/styled-engine": "^5.14.13", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.16", + "@mui/styled-engine": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2654,9 +2654,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.6.tgz", - "integrity": "sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==", + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.8.tgz", + "integrity": "sha512-9u0ji+xspl96WPqvrYJF/iO+1tQ1L5GTaDOeG3vCR893yy7VcWwRNiVMmPdPNpMDqx0WV1wtEW9OMwK9acWJzQ==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -2667,12 +2667,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.14.tgz", - "integrity": "sha512-3AKp8uksje5sRfVrtgG9Q/2TBsHWVBUtA0NaXliZqGcXo8J+A+Agp0qUW2rJ+ivgPWTCCubz9FZVT2IQZ3bGsw==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.16.tgz", + "integrity": "sha512-3xV31GposHkwRbQzwJJuooWpK2ybWdEdeUPtRjv/6vjomyi97F3+68l+QVj9tPTvmfSbr2sx5c/NuvDulrdRmA==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@types/prop-types": "^15.7.7", + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.9", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2738,9 +2738,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.10.0.tgz", - "integrity": "sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", + "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", "engines": { "node": ">=14.0.0" } @@ -2819,12 +2819,12 @@ } }, "node_modules/@types/node": { - "version": "20.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", - "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", "dev": true, "dependencies": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" } }, "node_modules/@types/parse-json": { @@ -2838,9 +2838,9 @@ "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" }, "node_modules/@types/react": { - "version": "18.2.29", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.29.tgz", - "integrity": "sha512-Z+ZrIRocWtdD70j45izShRwDuiB4JZqDegqMFW/I8aG5DxxLKOzVNoq62UIO82v9bdgi+DO1jvsb9sTEZUSm+Q==", + "version": "18.2.35", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.35.tgz", + "integrity": "sha512-LG3xpFZ++rTndV+/XFyX5vUP7NI9yxyk+MQvBDq+CVs8I9DLSc3Ymwb1Vmw5YDoeNeHN4PDZa3HylMKJYT9PNQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2880,16 +2880,22 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.9.tgz", "integrity": "sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==" }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vitejs/plugin-react": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", - "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz", + "integrity": "sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==", "dev": true, "dependencies": { - "@babel/core": "^7.22.20", + "@babel/core": "^7.23.2", "@babel/plugin-transform-react-jsx-self": "^7.22.5", "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "@types/babel__core": "^7.20.2", + "@types/babel__core": "^7.20.3", "react-refresh": "^0.14.0" }, "engines": { @@ -2900,9 +2906,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3093,15 +3099,15 @@ } }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, "node_modules/asynciterator.prototype": { @@ -3135,9 +3141,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true, "engines": { "node": ">=4" @@ -3181,13 +3187,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" + "core-js-compat": "^3.33.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3293,13 +3299,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3314,9 +3321,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001551", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", - "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "dev": true, "funding": [ { @@ -3444,9 +3451,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", "dev": true, "dependencies": { "browserslist": "^4.22.1" @@ -3601,9 +3608,9 @@ } }, "node_modules/dexie-react-hooks": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/dexie-react-hooks/-/dexie-react-hooks-1.1.6.tgz", - "integrity": "sha512-xSblWtmPwhafWNWMECsW7zMMmBu8goH3QqTxEfwBNoNG1mgsM0oFclippev7ss9HhKICqBwTjgqpscci5Ed4mA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/dexie-react-hooks/-/dexie-react-hooks-1.1.7.tgz", + "integrity": "sha512-Lwv5W0Hk+uOW3kGnsU9GZoR1er1B7WQ5DSdonoNG+focTNeJbHW6vi6nBoX534VKI3/uwHebYzSw1fwY6a7mTw==", "peerDependencies": { "@types/react": ">=16", "dexie": "^3.2 || ^4.0.1-alpha", @@ -3647,9 +3654,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.559", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.559.tgz", - "integrity": "sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==", + "version": "1.4.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", + "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", "dev": true }, "node_modules/emoji-regex": { @@ -3675,26 +3682,26 @@ } }, "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -3704,7 +3711,7 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", @@ -3718,7 +3725,7 @@ "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -3750,26 +3757,26 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -3847,18 +3854,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3999,26 +4007,26 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -4051,27 +4059,27 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -4544,7 +4552,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4586,15 +4593,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4702,14 +4709,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -4728,12 +4727,12 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4778,6 +4777,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", @@ -4921,13 +4931,13 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -5053,11 +5063,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5633,12 +5643,15 @@ "dev": true }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/leven": { @@ -5925,9 +5938,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -5982,9 +5995,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", - "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6341,9 +6354,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -6469,11 +6482,11 @@ } }, "node_modules/react-router": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.17.0.tgz", - "integrity": "sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", + "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", "dependencies": { - "@remix-run/router": "1.10.0" + "@remix-run/router": "1.11.0" }, "engines": { "node": ">=14.0.0" @@ -6483,12 +6496,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.17.0.tgz", - "integrity": "sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", + "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", "dependencies": { - "@remix-run/router": "1.10.0", - "react-router": "6.17.0" + "@remix-run/router": "1.11.0", + "react-router": "6.18.0" }, "engines": { "node": ">=14.0.0" @@ -6832,6 +6845,21 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -7168,9 +7196,9 @@ } }, "node_modules/terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -7362,9 +7390,9 @@ } }, "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -7506,9 +7534,9 @@ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -7771,13 +7799,13 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" From d4af2be7a00ea07260d8aaf51cfdc2a54f58ac51 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 6 Nov 2023 05:49:36 -0500 Subject: [PATCH 30/51] Thank you @pgwiebes for your sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bb8879af..339506dd 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From abe7275f0cfceecb7e3027f02c47f3823291cd50 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 6 Nov 2023 05:55:04 -0500 Subject: [PATCH 31/51] Remove Python version check --- Makefile | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 10624ed5..88c22033 100644 --- a/Makefile +++ b/Makefile @@ -111,18 +111,7 @@ build-deps-ubuntu: docs: docs-deps docs-build docs-build: .PHONY - @if ! /bin/echo -e "import sys\nif sys.version_info < (3,8):\n exit(1)" | python3; then \ - if which python3.8; then \ - echo "python3.8 $(shell which mkdocs) build"; \ - python3.8 $(shell which mkdocs) build; \ - else \ - echo "ERROR: Python version too low. mkdocs-material needs >= 3.8"; \ - exit 1; \ - fi; \ - else \ - echo "mkdocs build"; \ - mkdocs build; \ - fi + mkdocs build docs-deps: .PHONY pip3 install -r requirements.txt From 28c653043e05fbb35ffd6ec6ecaa7c8f654300c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Seppo=20Lehtim=C3=A4ki?= Date: Sun, 5 Nov 2023 07:41:29 +0000 Subject: [PATCH 32/51] Translated using Weblate (Finnish) Currently translated at 93.7% (358 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fi/ --- web/public/static/langs/fi.json | 361 +++++++++++++++++++++++++++++++- 1 file changed, 360 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json index 0967ef42..7275a72f 100644 --- a/web/public/static/langs/fi.json +++ b/web/public/static/langs/fi.json @@ -1 +1,360 @@ -{} +{ + "publish_dialog_message_placeholder": "Kirjoita viesti tähän", + "account_upgrade_dialog_tier_features_no_calls": "Ei puheluita", + "account_upgrade_dialog_billing_contact_email": "Laskutukseen liittyvissä kysymyksissä contact us suoraan.", + "account_tokens_dialog_title_create": "Luo käyttöoikeustunnus", + "prefs_reservations_dialog_title_edit": "Muokkaa varattua topikkia", + "account_basics_tier_interval_monthly": "Kuukausittain", + "publish_dialog_checkbox_publish_another": "Julkaise toinen", + "publish_dialog_details_examples_description": "Katso esimerkkejä ja yksityiskohtaisen kuvauksen kaikista lähetysominaisuuksista dokumentaatiosta.", + "account_basics_tier_canceled_subscription": "Tilauksesi peruutettiin ja se muutetaan maksuttomaksi tiliksi {{date}}.", + "priority_default": "oletus", + "prefs_notifications_min_priority_title": "Vähimmäisprioriteetti", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} päivittäisiä puheluja", + "account_upgrade_dialog_tier_current_label": "Nykyinen", + "action_bar_account": "Kirjautuminen", + "publish_dialog_filename_placeholder": "Liitetiedoston nimi", + "account_basics_password_dialog_current_password_incorrect": "Salasana virheellinen", + "account_tokens_table_token_header": "Token", + "prefs_notifications_delete_after_never": "Ei koskaan", + "prefs_users_description": "Lisää/poista käyttäjiä suojatuista topikeista täällä. Huomaa, että käyttäjätunnus ja salasana on tallennettu selaimen paikalliseen tallennustilaan.", + "account_basics_phone_numbers_dialog_number_label": "Puhelinnumero", + "subscribe_dialog_subscribe_description": "Aiheet eivät välttämättä ole salasanasuojattuja, joten valitse nimi, jota ei ole helposti arvatavissa. Kun olet tilannut, voit käyttää PUT/POST ilmoituksia.", + "action_bar_logo_alt": "ntfy logo", + "account_basics_password_dialog_button_submit": "Vaihda salasana", + "publish_dialog_emoji_picker_show": "Valitse emoji", + "account_basics_username_title": "Käyttäjätunnus", + "login_disabled": "Kirjautuminen poissa käytöstä", + "account_basics_phone_numbers_dialog_check_verification_button": "Vahvista koodi", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "säästä jopa {{discount}}%", + "account_tokens_dialog_label": "Etiketti, esim. Tutka-ilmoitukset", + "common_add": "Lisää", + "account_tokens_table_expires_header": "Vanhenee", + "account_upgrade_dialog_proration_info": "Osuus suhde: Kun päivität maksullisten pakettien välillä, hintaero veloitetaan välittömästi. Kun siirryt alemmalle tasolle, saldoa käytetään tulevien laskutuskausien maksamiseen.", + "prefs_reservations_dialog_access_label": "Oikeudet", + "account_usage_attachment_storage_title": "Liiteiden säilytys", + "prefs_users_dialog_username_label": "Username, esim pena", + "message_bar_error_publishing": "Virhe ilmoituksen julkaisemisessa", + "publish_dialog_chip_delay_label": "Viivästytä toimitusta", + "account_usage_messages_title": "Julkaistut viestit", + "notifications_attachment_open_button": "Avaa liite", + "emoji_picker_search_clear": "Tyhjennä haku", + "prefs_reservations_table_not_subscribed": "Ei tilattu", + "publish_dialog_topic_placeholder": "Topikin nimi, esim. erkin_hälyt", + "account_upgrade_dialog_tier_features_emails_other": "{{emails}} päivittäisiä emaileja", + "prefs_notifications_min_priority_max_only": "Vain maksimi prioriteetti", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} päivittäisiä puheluja", + "prefs_notifications_sound_description_some": "Ilmoitukset soittavat {{sound}} äänen saapuessaan", + "prefs_reservations_edit_button": "Muokkaa topikin oikeuksia", + "account_basics_phone_numbers_dialog_verify_button_sms": "Lähetä SMS", + "account_basics_tier_change_button": "Vaihda", + "account_tokens_dialog_expires_never": "Käyttöoikeus ei vanhene koskaan", + "subscribe_dialog_login_title": "Kirjautuminen vaaditaan", + "account_tokens_dialog_expires_x_days": "Tunnus vanhenee {{days}} päivän kuluttua", + "notifications_new_indicator": "Uusi ilmoitus", + "prefs_reservations_table_everyone_read_only": "Minä voin julkaista ja tilata, kaikki voivat tilata", + "prefs_reservations_table_everyone_deny_all": "Vain minä voin julkaista ja tilata", + "publish_dialog_chip_topic_label": "Vaihda topikkia", + "account_basics_phone_numbers_dialog_description": "Jotta voit käyttää puheluilmoitusominaisuutta, sinun on lisättävä ja vahvistettava vähintään yksi puhelinnumero. Vahvistus voidaan tehdä tekstiviestillä tai puhelimitse.", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} varatut topikit", + "publish_dialog_tags_placeholder": "Pilkuilla eroteltu luettelo tunnisteista, esim. varoitus, srv1-varmuuskopio", + "account_delete_title": "Poista tili", + "publish_dialog_attached_file_remove": "Poista liitetiedosto", + "nav_button_connecting": "yhdistää", + "account_delete_dialog_label": "Salasana", + "subscribe_dialog_login_button_login": "Kirjaudu", + "account_upgrade_dialog_tier_features_no_reservations": "Ei varattuja topikkeja", + "message_bar_type_message": "Kirjoita viesti tähän", + "publish_dialog_base_url_label": "Palvelun URL", + "signup_form_confirm_password": "Vahvista salasana", + "prefs_users_table_cannot_delete_or_edit": "Kirjautunutta käyttäjää ei voi poistaa tai muokata", + "account_basics_tier_admin_suffix_with_tier": "(mukana {{tier}} tier)", + "prefs_notifications_delete_after_three_hours_description": "Ilmoitukset poistetaan automaattisesti kolmen tunnin kuluttua", + "publish_dialog_chip_email_label": "Lähetä sähköpostiin", + "publish_dialog_attach_label": "Liitteen URL-osoite", + "signup_form_username": "Käyttäjätunnus", + "prefs_notifications_delete_after_three_hours": "Kolmen tunnin jälkeen", + "nav_button_muted": "Ilmoitukset mykistetty", + "action_bar_profile_settings": "Asetukset", + "signup_error_creation_limit_reached": "Tilin lisäämisraja saavutettu", + "notifications_attachment_open_title": "Siirry osoitteeseen {{url}}", + "prefs_notifications_min_priority_description_x_or_higher": "Näytä ilmoitukset, jos prioriteetti on {{number}} ({{name}}) tai suurempi", + "reservation_delete_dialog_description": "Varauksen poistaminen luopuu topikin omistajuudesta ja antaa muiden varata sen. Voit säilyttää tai poistaa olemassa olevia viestejä ja liitteitä.", + "subscribe_dialog_login_username_label": "Käyttäjätunnus, esim. pentti", + "subscribe_dialog_error_user_not_authorized": "Käyttäjää {{username}} ei ole valtuutettu", + "prefs_reservations_table_everyone_read_write": "Jokainen voi julkaista ja tilata", + "prefs_reservations_dialog_title_delete": "Poista topikin varaus", + "prefs_users_table": "Käyttäjä taulukko", + "prefs_reservations_table_topic_header": "Topikki", + "action_bar_toggle_mute": "Hiljennä/poista hiljennys", + "reservation_delete_dialog_submit_button": "Poista varaus", + "account_basics_title": "Tili", + "nav_button_documentation": "Käyttäjä oppaat", + "prefs_reservations_limit_reached": "Olet saavuttanut varattujen topikkien rajan.", + "account_upgrade_dialog_interval_monthly": "Kuukausittain", + "prefs_users_add_button": "Lisää käyttäjä", + "account_upgrade_dialog_tier_features_messages_other": "{{messages}} päivittäisiä viestejä", + "publish_dialog_delay_reset": "Poista viivästetty toimitus", + "account_basics_phone_numbers_no_phone_numbers_yet": "Ei puhelinnumeroita vielä", + "action_bar_toggle_action_menu": "Avaa/sulje toiminto valikko", + "subscribe_dialog_subscribe_button_generate_topic_name": "Luo nimi", + "notifications_list_item": "Ilmoitus", + "prefs_appearance_language_title": "Kieli", + "notifications_attachment_link_expired": "latauslinkki vanhentunut", + "subscribe_dialog_login_password_label": "Salasana", + "prefs_notifications_delete_after_one_day_description": "Ilmoitukset poistetaan automaattisesti yhden päivän kuluttua", + "subscribe_dialog_subscribe_button_subscribe": "Tilaa", + "account_tokens_table_never_expires": "Ei vanhene koskaan", + "account_tokens_delete_dialog_title": "Poista käyttöoikeustunnus", + "prefs_notifications_delete_after_one_month": "Kuukauden kuluttua", + "publish_dialog_chip_call_label": "Puhelu", + "account_basics_phone_numbers_dialog_title": "Lisää puhelinnumero", + "account_tokens_delete_dialog_description": "Ennen kuin poistat käyttöoikeustunnuksen, varmista, että mikään sovellus tai komentosarja ei käytä sitä aktiivisesti. Tätä toimintoa ei voi kumota.", + "nav_button_all_notifications": "Kaikki ilmoitukset", + "account_upgrade_dialog_button_cancel": "Peruuta", + "notifications_attachment_image": "Liitekuva", + "account_tokens_table_label_header": "Merkki", + "notifications_attachment_file_document": "muu asiakirja", + "publish_dialog_button_cancel": "Peruuta", + "account_upgrade_dialog_billing_contact_website": "Laskutukseen liittyvissä kysymyksissä käy website.", + "signup_form_button_submit": "Kirjaudu linkki", + "account_basics_username_admin_tooltip": "Olet pääkäyttäjä", + "prefs_notifications_delete_after_never_description": "Ilmoituksia eivät koskaan poisteta automaattisesti", + "account_delete_dialog_description": "Tämä poistaa pysyvästi tilisi, mukaan lukien kaikki palvelimelle tallennetut tiedot. Poistamisen jälkeen käyttäjätunnuksesi on poissa käytöstä 7 päivään. Jos todella haluat jatkaa, vahvista salasanasi alla olevaan kenttään.", + "publish_dialog_email_reset": "Poista sähköpostin edelleenlähetys", + "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} varatut topikit", + "account_usage_reservations_none": "Tälle tilille ei ole varattu topikkeja", + "prefs_notifications_sound_description_none": "Ilmoitukset eivät toista ääntä saapuessaan", + "account_tokens_description": "Käytä käyttjätunnuksia, kun julkaiset ja tilaat ntfy API:n kautta, jotta sinun ei tarvitse lähettää tilisi tunnistetietoja. Katso lisätietoja documentation.", + "common_back": "Takaisin", + "prefs_reservations_table": "Varattujen topikkien taulukko", + "emoji_picker_search_placeholder": "Etsi emoji", + "subscribe_dialog_subscribe_topic_placeholder": "Topikin nimi, esim. pentin_hälyt", + "account_upgrade_dialog_button_cancel_subscription": "Peruuta tilaus", + "notifications_attachment_file_audio": "äänitiedosto", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} päivittäisiä emaileja", + "action_bar_sign_up": "Kirjautuminen", + "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} tiedostokoko", + "notifications_mark_read": "Merkitse luetuksi", + "prefs_reservations_description": "Voit varata topikien nimiä henkilökohtaiseen käyttöön täältä. Aiheen varaaminen antaa sinulle topikin omistajuuden ja voit määrittää topikkiin liittyviä käyttöoikeuksia muille käyttäjille.", + "notifications_attachment_copy_url_title": "Kopioi liitteen URL-osoite leikepöydälle", + "account_usage_title": "Käytössä", + "account_basics_tier_upgrade_button": "Päivitä Pro versioon", + "prefs_users_description_no_sync": "Käyttäjiä ja salasanoja ei ole synkronoitu tiliisi.", + "account_tokens_dialog_title_edit": "Muokkaa käyttöoikeustunnusta", + "nav_button_publish_message": "Julkaisutiedot", + "prefs_users_table_base_url_header": "Palvelin URL", + "notifications_click_copy_url_title": "Kopioi linkin URL-osoite leikepöydälle", + "publish_dialog_attach_reset": "Poista liitteen URL-osoite", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} päivittäisiä viestejä", + "account_upgrade_dialog_reservations_warning_one": "Valittu taso sallii vähemmän varattuja topikeita kuin nykyinen tasosi. Ennen kuin muutat tasosi, poista vähintään yksi varaus. Voit poistaa varauksia Asetuksista.", + "common_copy_to_clipboard": "Kopioi leikkelepöydälle", + "alert_not_supported_description": "Selaimesi ei tue ilmoituksia.", + "subscribe_dialog_error_topic_already_reserved": "Topikki on jo varattu", + "message_bar_publish": "Julkaise viesti", + "alert_grant_description": "Myönnä selaimelle lupa näyttää työpöytäilmoituksia.", + "prefs_users_table_user_header": "Käyttäjä", + "error_boundary_stack_trace": "Pinon jälki", + "prefs_users_dialog_password_label": "Salasana", + "prefs_notifications_delete_after_one_week": "Viikon kuluttua", + "publish_dialog_priority_low": "Matala tärkeys", + "publish_dialog_priority_label": "Prioriteetti", + "prefs_reservations_delete_button": "Poista topikin oikeudet", + "account_basics_tier_admin_suffix_no_tier": "(no tier)", + "prefs_notifications_delete_after_one_week_description": "Ilmoitukset poistetaan automaattisesti viikon kuluttua", + "error_boundary_unsupported_indexeddb_description": "Ntfy-verkkosovellus tarvitsee IndexedDB:n toimiakseen, eikä selaimesi tue IndexedDB:tä yksityisessä selaustilassa.

Vaikka tämä on valitettavaa, ntfy-verkon käyttäminen ei myöskään ole kovin järkevää yksityisessä selaustilassa, koska kaikki on tallennettu selaimen tallennustilaan. Voit lukea siitä lisää tästä GitHub-numerosta tai puhua meille Discordissa tai Matrixissa.", + "subscribe_dialog_subscribe_button_cancel": "Peruuta", + "notifications_attachment_copy_url_button": "Kopioi URL", + "account_basics_tier_payment_overdue": "Maksusi on myöhässä. Päivitä maksutapasi, tai tilisi poistetaan pian.", + "publish_dialog_title_placeholder": "Ilmoituksen otsikko, esim. Levytilan hälytys", + "account_basics_tier_description": "Tilisi taso", + "account_basics_phone_numbers_description": "Puheluilmoituksia varten", + "prefs_reservations_dialog_title_add": "Varaa topikki", + "account_basics_tier_free": "Vapaa", + "account_upgrade_dialog_cancel_warning": "Tämä peruuttaa tilauksesi ja alentaa tilisi {{date}}. Tuona päivänä topikit sekä palvelimen välimuistissa olevat viestit poistetaan.", + "notifications_click_copy_url_button": "Kopioi linkki", + "account_basics_tier_admin": "Admin", + "subscribe_dialog_subscribe_title": "Tilaa topikki", + "nav_topics_title": "Tilatut topikit", + "prefs_notifications_sound_title": "Ilmoitusääni", + "prefs_notifications_min_priority_default_and_higher": "Oletusprioriteetti ja korkeammat", + "prefs_reservations_table_access_header": "Oikeudet", + "action_bar_show_menu": "Näytä menu", + "action_bar_settings": "Asetukset", + "notifications_copied_to_clipboard": "Kopioitu leikepöydälle", + "account_delete_dialog_button_cancel": "Peruuta", + "publish_dialog_delay_placeholder": "Toimituksen viivästyminen, esim. {{unixTimestamp}}, {{relativeTime}} tai \"{{naturalLanguage}}\" (vain englanti)", + "account_tokens_table_copied_to_clipboard": "Käyttöoikeustunnus kopioitu", + "alert_grant_title": "Ilmoitukset on poistettu käytöstä", + "account_tokens_dialog_expires_x_hours": "Tunnus vanhenee {{hours}} tunnin kuluttua", + "prefs_users_edit_button": "Muokkaa käyttäjää", + "account_upgrade_dialog_title": "Muuta tilitasoa", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Ei vahvistettuja puhelinnumeroita", + "priority_low": "matala", + "prefs_reservations_table_click_to_subscribe": "Tilaa napsauttamalla", + "account_basics_password_description": "Vaihda tilisi salasana", + "publish_dialog_call_label": "Puhelu", + "account_usage_calls_title": "Soitetut puhelut", + "error_boundary_description": "Näin ei selvästikään pitäisi tapahtua. Pahoittelut tästä.
Jos sinulla on hetki aikaa, ilmoita tästä GitHubissa tai ilmoita meille Discordin tai Matrix kautta.", + "signup_form_toggle_password_visibility": "Vaihda salasanan näkyvyys", + "login_link_signup": "Kirjaudu linkki", + "publish_dialog_message_label": "Viesti", + "publish_dialog_attached_file_title": "Liitetiedosto:", + "priority_min": "min", + "action_bar_sign_in": "Kirjaudu sisään", + "action_bar_unsubscribe": "Peruuta tilaus", + "account_basics_tier_basic": "Perus", + "signup_title": "Lisää ntfy tili", + "prefs_notifications_min_priority_description_any": "Näytetään kaikki ilmoitukset tärkeydestä riippumatta", + "error_boundary_gathering_info": "Kerää lisätietoja…", + "publish_dialog_priority_max": "Max. prioriteetti", + "error_boundary_unsupported_indexeddb_title": "Yksityistä selaamista ei tueta", + "prefs_notifications_delete_after_one_day": "Yhden päivän jälkeen", + "error_boundary_title": "Voi ei, ntfy kaatui", + "action_bar_change_display_name": "Näyttönimen vaihtaminen", + "notifications_attachment_file_app": "Android-sovellustiedosto", + "alert_not_supported_context_description": "Ilmoituksia tuetaan vain HTTPS:n kautta. Tämä on Ilmoitussovellusliittymän rajoitus.", + "reservation_delete_dialog_action_keep_description": "Palvelimelle välimuistiin tallennetut viestit ja liitteet tulevat julkiseksi topikin nimen tietävälle henkilölle.", + "prefs_reservations_add_button": "Lisää varattu topik", + "prefs_reservations_title": "Varatut topikit", + "account_basics_phone_numbers_copied_to_clipboard": "Puhelinnumero kopioitu leikepöydälle", + "prefs_reservations_dialog_description": "Topikin varaaminen antaa sinulle aiheen omistajuuden ja voit määrittää aiheeseen liittyviä käyttöoikeuksia muille käyttäjille.", + "account_basics_tier_title": "Tilin tyyppi", + "account_usage_cannot_create_portal_session": "Laskutusportaalin avaaminen epäonnistui", + "account_tokens_delete_dialog_submit_button": "Poista tunnus pysyvästi", + "account_delete_description": "Poista tilisi pysyvästi", + "account_basics_phone_numbers_dialog_number_placeholder": "esim. +35812345678", + "account_basics_phone_numbers_dialog_code_placeholder": "esim. 123456", + "prefs_notifications_title": "Ilmoitukset", + "account_basics_tier_manage_billing_button": "Hallinnoi laskutusta", + "account_tokens_title": "Käyttöoikeudet", + "publish_dialog_email_label": "Email", + "account_basics_username_description": "Hei, se olet sinä ❤", + "prefs_reservations_dialog_topic_label": "Topik", + "account_basics_password_dialog_confirm_password_label": "Vahvista salasana", + "action_bar_reservation_edit": "Muokkaa varatopikkia", + "publish_dialog_base_url_placeholder": "Palvelun URL-osoite, esim. https://example.com", + "prefs_users_title": "Hallinnoi käyttäjiä", + "account_basics_tier_interval_yearly": "vuosittain", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} Laskutetaan kuukausittain.", + "action_bar_clear_notifications": "Poista kaikki ilmoitukset", + "account_delete_dialog_button_submit": "Poista tili pysyvästi", + "account_basics_phone_numbers_dialog_channel_call": "Soitto", + "account_basics_password_title": "Salasana", + "account_basics_password_dialog_new_password_label": "Uusi salasana", + "nav_upgrade_banner_label": "Päivitä ntfy Prohon", + "account_tokens_dialog_expires_unchanged": "Jätä viimeinen käyttöpäivä ennalleen", + "publish_dialog_delay_label": "Viive", + "error_boundary_button_copy_stack_trace": "Kopioi pinon jälki", + "publish_dialog_button_send": "Lähetä", + "action_bar_reservation_delete": "Poista varatopikit", + "publish_dialog_button_cancel_sending": "Peruuta lähetys", + "account_tokens_dialog_title_delete": "Poista käyttöoikeustunnus", + "account_usage_of_limit": "limiitistä {{limit}}", + "publish_dialog_attach_placeholder": "Liitä tiedosto URL-osoitteen mukaan, esim. https://f-droid.org/F-Droid.apk", + "publish_dialog_email_placeholder": "Osoite, johon ilmoitus välitetään, esim. urpo@example.com", + "notifications_attachment_link_expires": "linkki vanhenee {{date}}", + "action_bar_send_test_notification": "Lähetä testi ilmoitus", + "reservation_delete_dialog_action_keep_title": "Säilytä välimuistissa olevat viestit ja liitteet", + "prefs_notifications_sound_no_sound": "Ei ääntä", + "account_upgrade_dialog_interval_yearly": "Vuosittain", + "publish_dialog_tags_label": "Tagit", + "signup_form_password": "Salasana", + "action_bar_reservation_limit_reached": "Varatopikien raja", + "account_upgrade_dialog_button_redirect_signup": "Kirjaudu nyt", + "publish_dialog_click_placeholder": "URL-osoite, joka avautuu, kun ilmoitusta napsautetaan", + "alert_not_supported_title": "Ilmoituksia ei tueta", + "account_tokens_dialog_button_cancel": "Peruuta", + "subscribe_dialog_error_user_anonymous": "Anonyymi", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} laskutetaan vuosittain. Tallenna {{save}}.", + "prefs_notifications_min_priority_high_and_higher": "Korkea prioriteetti ja korkeammat", + "account_usage_basis_ip_description": "Tämän tilin käyttötilastot ja rajoitukset perustuvat IP-osoitteeseesi, joten ne voidaan jakaa muiden käyttäjien kanssa. Yllä esitetyt rajat ovat likimääräisiä perustuen olemassa oleviin rajoituksiin.", + "publish_dialog_priority_high": "Korkea prioriteetti", + "login_form_button_submit": "Kirjaudu", + "account_basics_password_dialog_title": "Vaihda salasana", + "priority_max": "max", + "notifications_attachment_file_image": "kuvatiedosto", + "account_usage_limits_reset_daily": "Käyttörajat nollataan päivittäin keskiyöllä (UTC)", + "account_usage_unlimited": "Rajoittamaton", + "prefs_users_delete_button": "Poista käyttäjä", + "publish_dialog_click_label": "Napsauta URL-osoitetta", + "prefs_notifications_min_priority_any": "Kaikki prioriteetit", + "account_tokens_dialog_expires_label": "Käyttöoikeustunnus vanhenee", + "publish_dialog_filename_label": "Tiedostonimi", + "publish_dialog_chip_attach_file_label": "Liitä paikallinen tiedosto", + "account_basics_phone_numbers_title": "Puhelinnumerot", + "prefs_notifications_delete_after_title": "Poista ilmoitukset", + "account_upgrade_dialog_interval_yearly_discount_save": "säästä {{discount}}%", + "signup_disabled": "Kirjautuminen estetty", + "publish_dialog_drop_file_here": "Pudota tiedosto tähän", + "prefs_users_dialog_title_edit": "Muokkaa käyttäjää", + "account_basics_password_dialog_current_password_label": "Nykyinen salasana", + "prefs_notifications_min_priority_low_and_higher": "Matala prioriteetti ja korkeammat", + "action_bar_profile_title": "Profiili", + "account_tokens_dialog_button_update": "Päivitä tunnus", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} lopullinen tiedostokoko", + "publish_dialog_title_label": "Otsikko", + "prefs_reservations_table_everyone_write_only": "Minä voin julkaista ja tilata, kaikki voivat julkaista", + "prefs_appearance_title": "Näkymä", + "publish_dialog_topic_reset": "Resetoi topikki", + "account_tokens_table_cannot_delete_or_edit": "Nykyistä istuntotunnusta ei voi muokata tai poistaa", + "notifications_tags": "Tagit", + "prefs_notifications_sound_play": "Toista valittu ääni", + "account_tokens_table_last_access_header": "Viimeinen käyty", + "action_bar_profile_logout": "Kirjaudu ulos", + "publish_dialog_attached_file_filename_placeholder": "Liitetiedoston nimi", + "publish_dialog_priority_default": "Oletusprioriteetti", + "subscribe_dialog_subscribe_base_url_label": "Palvelimen URL", + "account_tokens_table_last_origin_tooltip": "Napsauta IP-osoitteesta {{ip}}, etsiäksesi", + "account_usage_reservations_title": "Varatut topikit", + "account_upgrade_dialog_tier_price_per_month": "Kuukausi", + "message_bar_show_dialog": "Näytä julkaisu dialogi", + "publish_dialog_chip_attach_url_label": "Liitä tiedosto URL-osoitteen mukaan", + "account_usage_calls_none": "Tällä tilillä ei voi soittaa puheluita", + "notifications_click_open_button": "Avaa linkki", + "account_tokens_table_current_session": "Nykyinen selainistunto", + "account_upgrade_dialog_button_pay_now": "Maksa nyt ja tilaa", + "nav_upgrade_banner_description": "Varaa aiheita, lisää viestejä ja sähköposteja sekä suurempia liitteitä", + "publish_dialog_call_reset": "Poista puhelu", + "publish_dialog_other_features": "Muut ominaisuudet:", + "subscribe_dialog_subscribe_use_another_label": "Käytä toista palvelinta", + "reservation_delete_dialog_action_delete_title": "Poista välimuistissa olevat viestit ja liitteet", + "signup_error_username_taken": "Käyttäjätunnus {{username}} on jo varattu", + "account_basics_phone_numbers_dialog_code_label": "Vahvistuskoodi", + "nav_button_subscribe": "Tilaa topik", + "publish_dialog_topic_label": "Topikin nimi", + "reservation_delete_dialog_action_delete_description": "Välimuistissa olevat viestit ja liitteet poistetaan pysyvästi. Tätä toimintoa ei voi kumota.", + "alert_grant_button": "Myönnä nyt", + "account_basics_tier_paid_until": "Tilaus maksettu {{date}} asti, ja se uusitaan automaattisesti", + "account_usage_attachment_storage_description": "{{tiedostokoko}} per tiedosto, poistettu {{expiry}} jälkeen", + "publish_dialog_chip_click_label": "Napsauta URL-osoitetta", + "prefs_notifications_delete_after_one_month_description": "Ilmoitukset poistetaan automaattisesti kuukauden kuluttua", + "common_cancel": "Peruuta", + "account_basics_phone_numbers_dialog_verify_button_call": "Soita minulle", + "signup_already_have_account": "Onko sinulla jo tili ? Kirjaudu sisään !", + "publish_dialog_call_item": "Soita puhelinnumeroon {{number}}", + "nav_button_account": "Tili", + "publish_dialog_click_reset": "Poista napsautettava URL-osoite", + "login_title": "Kirjaudu sisään ntfy-tilillesi", + "notifications_list": "Ilmoitusluettelo", + "common_save": "Tallenna", + "prefs_users_dialog_base_url_label": "Palvelin URL, esim. https://ntfy.sh", + "account_usage_emails_title": "Sähköpostit lähetetty", + "account_basics_phone_numbers_dialog_channel_sms": "SMS", + "action_bar_reservation_add": "Varalla oleva topikki", + "account_upgrade_dialog_tier_selected_label": "Valittu", + "account_upgrade_dialog_button_update_subscription": "Päivitä tilaus", + "notifications_attachment_file_video": "videotiedosto", + "priority_high": "korkea", + "notifications_priority_x": "Prioriteetti {{priority}}", + "account_delete_dialog_billing_warning": "Tilin poistaminen peruuttaa myös laskutustilauksesi välittömästi. Et voi enää käyttää laskutuksen hallintapaneelia.", + "prefs_notifications_min_priority_description_max": "Näytä ilmoitukset, jos prioriteetti on 5 (max)", + "subscribe_dialog_login_description": "Tämä Topikki on suojattu salasanalla. Anna käyttäjätunnus ja salasana.", + "account_upgrade_dialog_reservations_warning_other": "Valittu taso sallii vähemmän varattuja topikkeja kuin nykyinen tasosi. Ennen kuin muutat tasosi, poista vähintään {{count}} varausta. Voit poistaa varauksia Asetuksista.", + "prefs_users_dialog_title_add": "Lisää käyttäjä", + "account_tokens_dialog_button_create": "Luo tunnus", + "nav_button_settings": "Asetukset", + "publish_dialog_priority_min": "Min. etusijalla", + "account_tokens_table_create_token_button": "Luo käyttöoikeustunnus", + "notifications_delete": "Poista" +} From 3f3af275e77d50891ace4a38f83df102923b92de Mon Sep 17 00:00:00 2001 From: artemislena Date: Tue, 7 Nov 2023 20:00:10 +0100 Subject: [PATCH 33/51] T.: Fixed broken links --- docs/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.md b/docs/index.md index 27314f1a..462a0fee 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,9 +3,9 @@ ntfy lets you **send push notifications to your phone or desktop via scripts fro or POST requests. I use it to notify myself when scripts fail, or long-running commands complete. ## Step 1: Get the app - - - + + + To [receive notifications on your phone](subscribe/phone.md), install the app, either via Google Play or F-Droid. Once installed, open it and subscribe to a topic of your choosing. Topics don't have to explicitly be created, so just From 92cfa4040b5483290a2f0abadf0226518d9e1069 Mon Sep 17 00:00:00 2001 From: Jordan Hotmann Date: Wed, 8 Nov 2023 13:06:50 -0700 Subject: [PATCH 34/51] Append /v2 to module so version 2 can be used as a go package --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 95365372..8e1beb23 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module heckel.io/ntfy +module heckel.io/ntfy/v2 go 1.18 From c42f6289f6f21fcc605f78d2a94f19393c88a2c4 Mon Sep 17 00:00:00 2001 From: Samuele Radici Date: Thu, 9 Nov 2023 19:23:23 +0000 Subject: [PATCH 35/51] Translated using Weblate (Italian) Currently translated at 80.8% (309 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/it/ --- web/public/static/langs/it.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index 99d2cfff..9e8ea53d 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -304,5 +304,8 @@ "account_usage_basis_ip_description": "Le statistiche di utilizzo e i limiti per questo account sono basati sul tuo indirizzo IP, quindi potrebbero essere in condivisione con altri utenti. I limiti mostrati sopra sono approssimazioni basate sui limiti esistenti.", "account_usage_calls_none": "Questo account non può effettuare chiamate", "account_delete_dialog_billing_warning": "Eliminando il tuo account perderai immediatamente il tuo abbonamento. Non potrai più accedere alla dashboard di fatturazione.", - "account_delete_dialog_label": "Password" + "account_delete_dialog_label": "Password", + "account_upgrade_dialog_tier_features_no_reservations": "Nessun argomento riservato", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} messaggi giornalieri", + "account_upgrade_dialog_reservations_warning_one": "Il livello selezionato consente meno argomenti riservati rispetto al livello corrente. Prima di cambiare il livello, si prega di eliminare almeno una prenotazione. È possibile rimuovere le prenotazioni nel Impostazioni." } From bd2088c480d4e03c7ad2da206acdd55064230857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Seppo=20Lehtim=C3=A4ki?= Date: Sun, 12 Nov 2023 10:07:45 +0000 Subject: [PATCH 36/51] Translated using Weblate (Finnish) Currently translated at 95.8% (366 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fi/ --- web/public/static/langs/fi.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json index 7275a72f..ec590ecd 100644 --- a/web/public/static/langs/fi.json +++ b/web/public/static/langs/fi.json @@ -356,5 +356,13 @@ "nav_button_settings": "Asetukset", "publish_dialog_priority_min": "Min. etusijalla", "account_tokens_table_create_token_button": "Luo käyttöoikeustunnus", - "notifications_delete": "Poista" + "notifications_delete": "Poista", + "notifications_actions_not_supported": "Toimintoa ei tueta verkkosovelluksessa", + "notifications_actions_open_url_title": "Siirry osoitteeseen {{url}}", + "notifications_none_for_any_title": "Et ole saanut ilmoituksia.", + "notifications_none_for_topic_description": "Jos haluat lähettää ilmoituksia tähän topikkiin, PUT tai POST topikin URL-osoitteeseen.", + "notifications_none_for_any_description": "Jos haluat lähettää ilmoituksia topikkiin, PUT tai POST topikin URL-osoitteeseen. Tässä on esimerkki yhden topikin käyttämisestä.", + "notifications_no_subscriptions_title": "Näyttää siltä, että sinulla ei ole vielä tilauksia.", + "notifications_none_for_topic_title": "Et ole vielä saanut ilmoituksia tästä topikista.", + "notifications_actions_http_request_title": "Lähetä HTTP {{method}} to {{url}}" } From 16d490474d4a84b870cc06218e5605bfbce40cc4 Mon Sep 17 00:00:00 2001 From: wunter8 Date: Mon, 13 Nov 2023 11:19:19 -0700 Subject: [PATCH 37/51] remove broken link --- docs/integrations.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index a8ffa6a9..3488cfbe 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -83,7 +83,6 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [backup-projects](https://gist.github.com/anthonyaxenov/826ba65abbabd5b00196bc3e6af76002) - Stupidly simple backup script for own projects (Shell) - [grav-plugin-whistleblower](https://github.com/Himmlisch-Studios/grav-plugin-whistleblower) - Grav CMS plugin to get notifications via ntfy (PHP) - [ntfy-server-status](https://github.com/filip2cz/ntfy-server-status) - Checking if server is online and reporting through ntfy (C) -- [borg-based backup](https://github.com/davidhi7/backup) - Simple borg-based backup script with notifications based on ntfy.sh or Discord webhooks (Python/Shell) - [ntfy.sh *arr script](https://github.com/agent-squirrel/nfty-arr-script) - Quick and hacky script to get sonarr/radarr to notify the ntfy.sh service (Shell) - [website-watcher](https://github.com/muety/website-watcher) - A small tool to watch websites for changes (with XPath support) (Python) - [siteeagle](https://github.com/tpanum/siteeagle) - A small Python script to monitor websites and notify changes (Python) From 058de2d761f941345ef3ee229c8a33a4a13f442e Mon Sep 17 00:00:00 2001 From: Vincent Van Ouytsel Date: Mon, 13 Nov 2023 20:22:13 +0100 Subject: [PATCH 38/51] docs: add jetspotter integration --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a8ffa6a9..a514f1dc 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -136,6 +136,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes - [RouterOS Scripts](https://git.eworm.de/cgit/routeros-scripts/about/) - a collection of scripts for MikroTik RouterOS - [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell) +- [jetspotter](https://github.com/vvanouytsel/jetspotter) - a tool to send notifications whenever specified types of aircraft are spotted near a specified location ## Blog + forum posts From 9f738e4a85d20a34540c348d4b3e23d72c1ad18e Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 15 Nov 2023 05:43:11 -0500 Subject: [PATCH 39/51] Thank you @ralhei for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 339506dd..3066f72f 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 262bb723d97bf9f7cf9c7f8c8d17bfcab81f822d Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 15 Nov 2023 05:44:02 -0500 Subject: [PATCH 40/51] Thank you @TechMDW for your generous sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3066f72f..90d9285f 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From a533f352b2e03f6e71506d10eb41d91428cd728e Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 15 Nov 2023 05:55:01 -0500 Subject: [PATCH 41/51] Bump pipelines --- .github/workflows/build.yaml | 4 ++-- .github/workflows/release.yaml | 4 ++-- .github/workflows/test.yaml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index de22292a..cb310934 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,12 +11,12 @@ jobs: name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20.x' + go-version: '1.21.x' - name: Install node uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' cache: 'npm' cache-dependency-path: './web/package-lock.json' - diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b61e3361..c630a2d3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -14,12 +14,12 @@ jobs: name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20.x' + go-version: '1.21.x' - name: Install node uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' cache: 'npm' cache-dependency-path: './web/package-lock.json' - diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f76862a9..53eb1d67 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -11,12 +11,12 @@ jobs: name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20.x' + go-version: '1.21.x' - name: Install node uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' cache: 'npm' cache-dependency-path: './web/package-lock.json' - From 5acc6ad0c48ba9a35628834e8defec0809b508d1 Mon Sep 17 00:00:00 2001 From: wunter8 Date: Wed, 15 Nov 2023 09:28:35 -0700 Subject: [PATCH 42/51] Add JS websocket example --- .../web-example-websocket/example-ws.html | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 examples/web-example-websocket/example-ws.html diff --git a/examples/web-example-websocket/example-ws.html b/examples/web-example-websocket/example-ws.html new file mode 100644 index 00000000..7025aa60 --- /dev/null +++ b/examples/web-example-websocket/example-ws.html @@ -0,0 +1,56 @@ + + + + + ntfy.sh: WebSocket Example + + + + +

ntfy.sh: WebSocket Example

+

+ This is an example showing how to use ntfy.sh with + WebSocket.
+ This example doesn't need a server. You can just save the HTML page and run it from anywhere. +

+ +

Log:

+
+ + + + + From c2d6e0e31632f3fc5a0d6fe5611140557f42b540 Mon Sep 17 00:00:00 2001 From: wunter8 Date: Wed, 15 Nov 2023 09:31:34 -0700 Subject: [PATCH 43/51] Include link to websocket example in docs --- docs/subscribe/api.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/subscribe/api.md b/docs/subscribe/api.md index 58da9752..3f1c0e81 100644 --- a/docs/subscribe/api.md +++ b/docs/subscribe/api.md @@ -190,9 +190,10 @@ format. Keepalive messages are sent as empty lines. ## WebSockets You may also subscribe to topics via [WebSockets](https://en.wikipedia.org/wiki/WebSocket), which is also widely -supported in many languages. Most notably, WebSockets are natively supported in JavaScript. On the command line, -I recommend [websocat](https://github.com/vi/websocat), a fantastic tool similar to `socat` or `curl`, but specifically -for WebSockets. +supported in many languages. Most notably, WebSockets are natively supported in JavaScript. You may also want to +check out the [full example on GitHub](https://github.com/binwiederhier/ntfy/tree/main/examples/web-example-websocket). +On the command line, I recommend [websocat](https://github.com/vi/websocat), a fantastic tool similar to `socat` +or `curl`, but specifically for WebSockets. The WebSockets endpoint is available at `/ws` and returns messages as JSON objects similar to the [JSON stream endpoint](#subscribe-as-json-stream). From df6d76084476d6d2cd0f67b8100326507e779897 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 05:22:56 -0500 Subject: [PATCH 44/51] Remove twemoji from docs --- Makefile | 2 +- mkdocs.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 88c22033..61f3a22c 100644 --- a/Makefile +++ b/Makefile @@ -111,7 +111,7 @@ build-deps-ubuntu: docs: docs-deps docs-build docs-build: .PHONY - mkdocs build + mkdocs build docs-deps: .PHONY pip3 install -r requirements.txt diff --git a/mkdocs.yml b/mkdocs.yml index 7b14ee0c..98a2d078 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -64,7 +64,6 @@ markdown_extensions: - attr_list - md_in_html - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji emoji_generator: !!python/name:materialx.emoji.to_svg plugins: From c0fab933a5a4e144654c01d30318d5a3d1ec71b7 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 05:31:53 -0500 Subject: [PATCH 45/51] Build docs in venv --- .gitignore | 3 ++- Dockerfile-build | 6 ++++-- Makefile | 17 ++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index b60c9b23..7cbb52ac 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ secrets/ node_modules/ .DS_Store __pycache__ -web/dev-dist/ \ No newline at end of file +web/dev-dist/ +venv/ diff --git a/Dockerfile-build b/Dockerfile-build index 6e96c7d4..a0608b12 100644 --- a/Dockerfile-build +++ b/Dockerfile-build @@ -11,7 +11,9 @@ RUN apt-get update && apt-get install -y \ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" >> /etc/apt/sources.list.d/nodesource.list \ && apt-get update \ && apt-get install -y \ - python3-pip nodejs \ + python3-pip \ + python3-venv \ + nodejs \ && rm -rf /var/lib/apt/lists/* WORKDIR /app @@ -23,7 +25,7 @@ RUN make docs-deps ADD ./mkdocs.yml . ADD ./docs ./docs RUN make docs-build - + # web ADD ./web/package.json ./web/package-lock.json ./web/ RUN make web-deps diff --git a/Makefile b/Makefile index 61f3a22c..a29fb4f5 100644 --- a/Makefile +++ b/Makefile @@ -95,6 +95,7 @@ docker-dev: --build-arg COMMIT=$(COMMIT) \ ./ + # Ubuntu-specific build-deps-ubuntu: @@ -103,21 +104,27 @@ build-deps-ubuntu: curl \ gcc-aarch64-linux-gnu \ gcc-arm-linux-gnueabi \ + python3 \ + python3-venv \ jq which pip3 || sudo apt-get install -y python3-pip + # Documentation docs: docs-deps docs-build -docs-build: .PHONY - mkdocs build +docs-venv: .PHONY + python3 -m venv ./venv -docs-deps: .PHONY - pip3 install -r requirements.txt +docs-build: docs-venv + (. venv/bin/activate && mkdocs build) + +docs-deps: docs-venv + (. venv/bin/activate && pip3 install -r requirements.txt) docs-deps-update: .PHONY - pip3 install -r requirements.txt --upgrade + (. venv/bin/activate && pip3 install -r requirements.txt --upgrade) # Web app From 73eaf7b8b6379f7ab81952d2052286669280ffb2 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 05:41:41 -0500 Subject: [PATCH 46/51] Finnish translation --- docs/releases.md | 4 ++++ web/src/components/Preferences.jsx | 2 ++ 2 files changed, 6 insertions(+) diff --git a/docs/releases.md b/docs/releases.md index 73e5eb20..ef09c741 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1293,6 +1293,10 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) * Fix web app crash in Edge for languages with underline in locale ([#922](https://github.com/binwiederhier/ntfy/pull/922)/[#912](https://github.com/binwiederhier/ntfy/issues/912)/[#852](https://github.com/binwiederhier/ntfy/issues/852), thanks to [@imkero](https://github.com/imkero)) +**Additional languages:** + +* Finnish (thanks to [@Seppo](https://hosted.weblate.org/user/Seppo/) + ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** diff --git a/web/src/components/Preferences.jsx b/web/src/components/Preferences.jsx index 546ecbe3..6770f282 100644 --- a/web/src/components/Preferences.jsx +++ b/web/src/components/Preferences.jsx @@ -544,6 +544,7 @@ const Language = () => { "🇯🇵", "🇷🇺", "🇹🇷", + "🇫🇮", ]).slice(0, 3); const showFlags = !navigator.userAgent.includes("Windows"); let title = t("prefs_appearance_language_title"); @@ -588,6 +589,7 @@ const Language = () => { Português (Brasil) Polski Русский + Suomi Svenska Türkçe From 7f1855ad4dca4d2d75e8374cb02c6d2bf265d836 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 09:49:35 -0500 Subject: [PATCH 47/51] It's better than nothing --- docs/releases.md | 1 + server/smtp_server.go | 19 +- server/smtp_server_test.go | 647 ++++++++++++++++++++++++++++++++++++- 3 files changed, 654 insertions(+), 13 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index ef09c741..e56f8847 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1287,6 +1287,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** +* Support for HTML-only emails ([#690](https://github.com/binwiederhier/ntfy/issues/690), thanks to [@teastrainer](https://github.com/teastrainer) and [@CrazyWolf13](https://github.com/CrazyWolf13) for reporting) * Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) * Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) diff --git a/server/smtp_server.go b/server/smtp_server.go index 76f439e7..467b8ca4 100644 --- a/server/smtp_server.go +++ b/server/smtp_server.go @@ -29,6 +29,11 @@ var ( errUnsupportedContentType = errors.New("unsupported content type") ) +var ( + onlySpacesRegex = regexp.MustCompile(`(?m)^\s+$`) + consecutiveNewLinesRegex = regexp.MustCompile(`\n{3,}`) +) + const ( maxMultipartDepth = 2 ) @@ -319,14 +324,8 @@ func readHTMLMailBody(reader io.Reader, transferEncoding string) (string, error) return removeExtraEmptyLines(stripped), nil } -func removeExtraEmptyLines(str string) string { - // Replace lines that contain only spaces with empty lines - re := regexp.MustCompile(`(?m)^\s+$`) - str = re.ReplaceAllString(str, "") - - // Remove more than 2 consecutive empty lines - re = regexp.MustCompile(`\n{3,}`) - str = re.ReplaceAllString(str, "\n\n") - - return str +func removeExtraEmptyLines(s string) string { + s = onlySpacesRegex.ReplaceAllString(s, "") + s = consecutiveNewLinesRegex.ReplaceAllString(s, "\n\n") + return s } diff --git a/server/smtp_server_test.go b/server/smtp_server_test.go index bdee0785..93335905 100644 --- a/server/smtp_server_test.go +++ b/server/smtp_server_test.go @@ -651,7 +651,7 @@ Now the light is on

-If you don't want to recieve this message anymore, stop the push +If you don't want to receive this message anymore, stop the push services in your FRITZ=21Box=2E
Here you can see the active push services: "System > Push Service"=2E @@ -686,7 +686,649 @@ This mail has ben sent by your +Received: from ccm30.constantcontact.com (ccm30.constantcontact.com. [208.75.123.226]) + by mx.google.com with ESMTPS id h2-20020a05620a21c200b0076eeed38118si5450962qka.131.2023.10.30.06.23.07 + for + (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); + Mon, 30 Oct 2023 06:23:08 -0700 (PDT) +Received-SPF: pass (google.com: domain of aigxeklyirlg+dvwkrmsgua==_1133104752381_suqcukvbeeynm/owplvdba==@in.constantcontact.com designates 208.75.123.226 as permitted sender) client-ip=208.75.123.226; +Authentication-Results: mx.google.com; + dkim=pass header.i=@spamspam.com header.s=2020294246 header.b=G8y6xmtK; + dkim=pass header.i=@auth.ccsend.com header.s=1000073432 header.b=ht8IksVK; + spf=pass (google.com: domain of aigxeklyirlg+dvwkrmsgua==_1133104752381_suqcukvbeeynm/owplvdba==@in.constantcontact.com designates 208.75.123.226 as permitted sender) smtp.mailfrom="AigXeKlyIRLG+DvWkRMsGUA==_1133104752381_sUQcUKVBEeynm/oWPlvDBA==@in.constantcontact.com"; + dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=spamspam.com +Return-Path: +Received: from [10.252.0.3] ([10.252.0.3:53254] helo=p2-jbemailsyndicator12.ctct.net) by 10.249.225.20 (envelope-from ) (ecelerity 4.3.1.999 r(:)) with ESMTP id A4/82-60517-B3EAF356; Mon, 30 Oct 2023 09:23:07 -0400 +DKIM-Signature: v=1; q=dns/txt; a=rsa-sha256; c=relaxed/relaxed; s=2020294246; d=spamspam.com; h=date:mime-version:subject:X-Feedback-ID:X-250ok-CID:message-id:from:reply-to:list-unsubscribe:list-unsubscribe-post:to; bh=BERwBIp6fBgrZePFKQjyNMmgPkcnq1Zy1jPO8M0T4Ok=; b=G8y6xmtKv8asfEXA9o8dP+6foQjclo6j5sFREYVIJBbj5YJ5tqoiv5B04/qoRkoTBFDhmjt+BUua7AqDgPSnwbP2iPSA4fTJehnHhut1PyVUp/9vqSYlhxQehfdhma8tPg8ArKfYIKmfKJwKRaQBU0JHCaB1m+5LNQQX3UjkxAg= +DKIM-Signature: v=1; q=dns/txt; a=rsa-sha256; c=relaxed/relaxed; s=1000073432; d=auth.ccsend.com; h=date:mime-version:subject:X-Feedback-ID:X-250ok-CID:message-id:from:reply-to:list-unsubscribe:list-unsubscribe-post:to; bh=BERwBIp6fBgrZePFKQjyNMmgPkcnq1Zy1jPO8M0T4Ok=; b=ht8IksVKYY/Kb3dUERWoeW4eVdYjKL6F4PEoIZOhfFXor6XAIbPnd3A/CPmbmoqFZjnKh5OdcUy1N5qEoj8w1Q3TmN8/ySQkqrlrmSDSZIHZMY7Qp9/TJrqUe4RMFOO1KKIN6Y0vGP1+dWe98msMAHwvi2qMjG9aEKLfFr2JUTQ= +Message-ID: <1140728754828.1133104752381.1941549819.0.260913JL.2002@synd.ccsend.com> +Date: Mon, 30 Oct 2023 09:23:07 -0400 (EDT) +From: spamspam Loan Servicing +Reply-To: marklake@spamspam.com +To: somebody@gmail.com +Subject: Buying a home? You deserve the confidence of Pre-Approval +MIME-Version: 1.0 +Content-Type: multipart/alternative; boundary="----=_Part_75055660_144854819.1698672187348" +List-Unsubscribe: +List-Unsubscribe-Post: List-Unsubscribe=One-Click +X-Campaign-Activity-ID: 8a05de2a-5c88-44b1-be0e-f5a444cb0650 +X-250ok-CID: 8a05de2a-5c88-44b1-be0e-f5a444cb0650 +X-Channel-ID: b1441c50-a541-11ec-a79b-fa163e5bc304 +X-Return-Path-Hint: AbeefbeefbeefbeefbeefUA==_1133104752381_sUQcUKVBEeynm/oWPlvDBA==@in.constantcontact.com +X-Roving-Campaignid: 1140728754811 +X-Roving-Id: 1133104752381.1111111111 +X-Feedback-ID: b1441c50-a541-11ec-beef-beefbeefbeefbeef5de2a-5c88-44b1-be0e-f5a444cb0650:1133104752381:CTCT +X-CTCT-ID: b13a9586-a541-11ec-beef-beefbeefbeef + +------=_Part_75055660_144854819.1698672187348 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +When you're buying a home, Pre-Approval gives you confidence you're in the = +right price range and shows sellers you mean business. xxxxxxxxx SELLING or= + BUYING? Call: 844-590-2275 Get Your Homebuying PRE-APPROVAL IN 24-HOURS* G= +et Pre-Approved When you're buying a home, Pre-Approval gives you confidenc= +e you're in the right price range and shows sellers you mean business. xxx= +xxxxxxGet Pre-Approved today! Click or Call to Get Pre-Approved 844-590-227= +5 Get Pre-Approved nmlsconsumeraccess.org/ *The 24 hour timeframe is for mo= +st approvals, however if additional information is needed or a request is o= +n a holiday, the time for preapproval may be greater than 24 hours. This em= +ail is for informational purposes only and is not an offer, loan approval o= +r loan commitment. Mortgage rates are subject to change without notice. Som= +e terms and restrictions may apply to certain loan programs. Refinancing ex= +isting loans may result in total finance charges being higher over the life= + of the loan, reduction in payments may partially reflect a longer loan ter= +m. This information is provided as guidance and illustrative purposes only = +and does not constitute legal or financial advice. We are not liable or bou= +nd legally for any answers provided to any user for our process or position= + on an issue. This information may change from time to time and at any time= + without notification. The most current information will be updated periodi= +cally and posted in the online forum. spamspam Loan Servicing, LLC. NMLS#39= +1521. nmlsconsumeraccess.org. You are receiving this information as a curre= +nt loan customer with spamspam Loan Servicing, LLC. Not licensed for lendin= +g activities in any of the U.S. territories. Not authorized to originate lo= +ans in the State of New York. Licensed by the Dept. of Financial Protection= + and Innovation under the California Residential Mortgage .Lending Act #413= +1216. This email was sent to somebody@gmail.com Version 103023PCHPrAp= +9 xxxxxxxxx spamspam Loan Servicing | 4425 Ponce de Leon Blvd 5-251, Coral = +Gables, FL 33146-1837 Unsubscribe somebody@gmail.com Update Profile |= + Our Privacy Policy | Constant Contact Data Notice Sent by marklake@spamspa= +m.com +------=_Part_75055660_144854819.1698672187348 +Content-Type: text/html; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + + + +
When you're buying a home, Pre-Approval = +gives you confidence you're in the right price range and shows sellers= + you mean business.
3D""
+
= +
3D""
= +
+
3D""
+
+

SELLING or BUYING?

+

Call: 844-590-2275

+
+
+

Get Your Homebuying

+

PRE-APPROVAL IN 24-HOURS*

+
= + 3D"" = +
Get Pre-Approved
= + +


+

When you're buying= + a home, Pre-Approval gives you confidence you're in the right price range = +and shows sellers you mean business.

+

Get Pre-Ap= +proved today!

+
+
+


+

Click or Call to Get Pre-Approved

+

844-590-2275= +

+
Get Pre-Approved
+
3D""
<= +tr>
+
+


+

nmlsconsumeraccess.org/

+

*The 24 hour timeframe is for= + most approvals, however if additional information is needed or a request i= +s on a holiday, the time for preapproval may be greater than 24 hours.

+

This email is for informational purposes only and is not an offer,= + loan approval or loan commitment. Mortgage rates are subject to change wit= +hout notice. Some terms and restrictions may apply to certain loan programs= +. Refinancing existing loans may result in total finance charges being high= +er over the life of the loan, reduction in payments may partially reflect a= + longer loan term. This information is provided as guidance and illustrativ= +e purposes only and does not constitute legal or financial advice. We are n= +ot liable or bound legally for any answers provided to any user for our pro= +cess or position on an issue. This information may change from time to time= + and at any time without notification. The most current information will be= + updated periodically and posted in the online forum.

+

spamspam Loan Servicing, LLC. NMLS#391521. nmlsconsumeraccess.org.= + You are receiving this information as a current loan customer with spamspa= +m Loan Servicing, LLC. Not licensed for lending activities in any of the U.= +S. territories. Not authorized to originate loans in the State of New York.= + Licensed by the Dept. of Financial Protection and Innovation under the Cal= +ifornia Residential Mortgage .Lending Act #4131216.

+


+

This email was sent to somebody@gmail.com

+

Version 103023PCHPrAp9

+



+
+
= +
3D""
= +
= +
+ + + +
+
+ + + + +
+ + + + + + + + + + +
+spamspam Loan Servicing | 4425 Ponce de= + Leon Blvd 5-251, Coral Gables, FL 33146-1837 +
+ + + + + + + + + + +
+Uns= +ubscribe somebody@gmail.com + +
+Upd= +ate Profile | +Our Privacy Policy | +Constant Contact Data Noti= +ce +
+Sent by +marklake@spamspam.com +
+
+
+
+
+
= +
+ +------=_Part_75055660_144854819.1698672187348-- +. +` + +func TestSmtpBackend_Spam_Text(t *testing.T) { + email := spamEmail + s, c, _, scanner := newTestSMTPServer(t, func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/mytopic", r.URL.Path) + require.Equal(t, "Buying a home? You deserve the confidence of Pre-Approval", r.Header.Get("Title")) + actual := readAll(t, r.Body) + expected := "When you're buying a home, Pre-Approval gives you confidence you're in the right price range and shows sellers you mean business. xxxxxxxxx SELLING or BUYING? Call: 844-590-2275 Get Your Homebuying PRE-APPROVAL IN 24-HOURS* Get Pre-Approved When you're buying a home, Pre-Approval gives you confidence you're in the right price range and shows sellers you mean business. xxxxxxxxxGet Pre-Approved today! Click or Call to Get Pre-Approved 844-590-2275 Get Pre-Approved nmlsconsumeraccess.org/ *The 24 hour timeframe is for most approvals, however if additional information is needed or a request is on a holiday, the time for preapproval may be greater than 24 hours. This email is for informational purposes only and is not an offer, loan approval or loan commitment. Mortgage rates are subject to change without notice. Some terms and restrictions may apply to certain loan programs. Refinancing existing loans may result in total finance charges being higher over the life of the loan, reduction in payments may partially reflect a longer loan term. This information is provided as guidance and illustrative purposes only and does not constitute legal or financial advice. We are not liable or bound legally for any answers provided to any user for our process or position on an issue. This information may change from time to time and at any time without notification. The most current information will be updated periodically and posted in the online forum. spamspam Loan Servicing, LLC. NMLS#391521. nmlsconsumeraccess.org. You are receiving this information as a current loan customer with spamspam Loan Servicing, LLC. Not licensed for lending activities in any of the U.S. territories. Not authorized to originate loans in the State of New York. Licensed by the Dept. of Financial Protection and Innovation under the California Residential Mortgage .Lending Act #4131216. This email was sent to somebody@gmail.com Version 103023PCHPrAp9 xxxxxxxxx spamspam Loan Servicing | 4425 Ponce de Leon Blvd 5-251, Coral Gables, FL 33146-1837 Unsubscribe somebody@gmail.com Update Profile | Our Privacy Policy | Constant Contact Data Notice Sent by marklake@spamspam.com" + require.Equal(t, expected, actual) + }) + defer s.Close() + defer c.Close() + writeAndReadUntilLine(t, email, c, scanner, "250 2.0.0 OK: queued") +} + +func TestSmtpBackend_Spam_HTML(t *testing.T) { + email := strings.ReplaceAll(spamEmail, "text/plain", "text/not-plain-anymore") // We artificially force HTML parsing here + s, c, _, scanner := newTestSMTPServer(t, func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/mytopic", r.URL.Path) + require.Equal(t, "Buying a home? You deserve the confidence of Pre-Approval", r.Header.Get("Title")) + actual := readAll(t, r.Body) + expected := `When you're buying a home, Pre-Approval gives you confidence you're in the right price range and shows sellers you mean business. + ` + "\u200a" + ` + + SELLING or BUYING? + Call: 844-590-2275 + + Get Your Homebuying + PRE-APPROVAL IN 24-HOURS * + Get Pre-Approved + + When you're buying a home, Pre-Approval gives you confidence you're in the right price range and shows sellers you mean business. + ` + "\ufeff" + `Get Pre-Approved today! + + Click or Call to Get Pre-Approved + 844-590-2275 + Get Pre-Approved + + nmlsconsumeraccess.org/ + *The 24 hour timeframe is for most approvals, however if additional information is needed or a request is on a holiday, the time for preapproval may be greater than 24 hours. + This email is for informational purposes only and is not an offer, loan approval or loan commitment. Mortgage rates are subject to change without notice. Some terms and restrictions may apply to certain loan programs Refinancing existing loans may result in total finance charges being higher over the life of the loan, reduction in payments may partially reflect a longer loan term. This information is provided as guidance and illustrative purposes only and does not constitute legal or financial advice. We are not liable or bound legally for any answers provided to any user for our process or position on an issue. This information may change from time to time and at any time without notification. The most current information will be updated periodically and posted in the online forum. + spamspam Loan Servicing, LLC. NMLS#391521. nmlsconsumeraccess.org. You are receiving this information as a current loan customer with spamspam Loan Servicing, LLC. Not licensed for lending activities in any of the U.S. territories. Not authorized to originate loans in the State of New York. Licensed by the Dept. of Financial Protection and Innovation under the California Residential Mortgage .Lending Act #4131216. + + This email was sent to somebody@gmail.com + Version 103023PCHPrAp9 + ` + "\ufeff" + ` + + spamspam Loan Servicing | 4425 Ponce de Leon Blvd 5-251 , Coral Gables, FL 33146-1837 + + Unsubscribe somebody@gmail.com + + Update Profile | + Our Privacy Policy | + Constant Contact Data Notice + +Sent by + marklake@spamspam.com` + require.Equal(t, expected, actual) }) defer s.Close() defer c.Close() @@ -764,7 +1406,6 @@ func readUntilLine(t *testing.T, conn net.Conn, scanner *bufio.Scanner, expected return } output += text + "\n" - //fmt.Println(text) } t.Fatalf("Expected line '%s' not found in output:\n%s", expectedLine, output) } From 37091f25a887778e40870fea72a33953a6ad981c Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 09:51:23 -0500 Subject: [PATCH 48/51] Add PR link --- docs/releases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index e56f8847..372ff435 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1287,7 +1287,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** -* Support for HTML-only emails ([#690](https://github.com/binwiederhier/ntfy/issues/690), thanks to [@teastrainer](https://github.com/teastrainer) and [@CrazyWolf13](https://github.com/CrazyWolf13) for reporting) +* Support for HTML-only emails ([#690](https://github.com/binwiederhier/ntfy/issues/690)/[#693](https://github.com/binwiederhier/ntfy/pull/693), thanks to [@teastrainer](https://github.com/teastrainer) and [@CrazyWolf13](https://github.com/CrazyWolf13) for reporting) * Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) * Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) From 859a4e4f79aafd258a24b90ebde56859242f6457 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 09:58:32 -0500 Subject: [PATCH 49/51] Added another test --- server/smtp_server_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/server/smtp_server_test.go b/server/smtp_server_test.go index 93335905..90374ea8 100644 --- a/server/smtp_server_test.go +++ b/server/smtp_server_test.go @@ -1335,6 +1335,36 @@ Sent by writeAndReadUntilLine(t, email, c, scanner, "250 2.0.0 OK: queued") } +func TestSmtpBackend_HTMLOnly_FromDiskStation(t *testing.T) { + email := `EHLO example.com +MAIL FROM: synology@mydomain.me +RCPT TO: synology@mydomain.me +DATA +From: "=?UTF-8?B?Um9iYmll?=" +To: +Message-Id: <640e6f562895d.6c9584bcfa491ac9c546b480b32ffc1d@mydomain.me> +MIME-Version: 1.0 +Subject: =?UTF-8?B?W1N5bm9sb2d5IE5BU10gVGVzdCBNZXNzYWdlIGZyb20gTGl0dHNfTkFT?= +Content-Type: text/html; charset=utf-8 +Content-Transfer-Encoding: 8bit + +Congratulations! You have successfully set up the email notification on Synology_NAS.
For further system configurations, please visit http://192.168.1.28:5000/, http://172.16.60.5:5000/.
(If you cannot connect to the server, please contact the administrator.)

From Synology_NAS


+. +` + s, c, conf, scanner := newTestSMTPServer(t, func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/synology", r.URL.Path) + require.Equal(t, "[Synology NAS] Test Message from Litts_NAS", r.Header.Get("Title")) + actual := readAll(t, r.Body) + expected := `Congratulations! You have successfully set up the email notification on Synology_NAS. For further system configurations, please visit http://192.168.1.28:5000/, http://172.16.60.5:5000/. (If you cannot connect to the server, please contact the administrator.) From Synology_NAS` + require.Equal(t, expected, actual) + }) + conf.SMTPServerDomain = "mydomain.me" + conf.SMTPServerAddrPrefix = "" + defer s.Close() + defer c.Close() + writeAndReadUntilLine(t, email, c, scanner, "250 2.0.0 OK: queued") +} + func TestSmtpBackend_PlaintextWithToken(t *testing.T) { email := `EHLO example.com MAIL FROM: phil@example.com From 22f48c5ad3ec77e9afa3b3865c581adbe315d39a Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 20:54:58 -0500 Subject: [PATCH 50/51] Change mod path --- README.md | 2 +- client/client.go | 4 ++-- client/client_test.go | 6 +++--- client/config_test.go | 2 +- client/options.go | 2 +- cmd/access.go | 4 ++-- cmd/access_test.go | 4 ++-- cmd/app.go | 2 +- cmd/app_test.go | 4 ++-- cmd/config_loader.go | 2 +- cmd/publish.go | 6 +++--- cmd/publish_test.go | 4 ++-- cmd/serve.go | 8 ++++---- cmd/serve_test.go | 6 +++--- cmd/subscribe.go | 6 +++--- cmd/tier.go | 4 ++-- cmd/tier_test.go | 4 ++-- cmd/token.go | 4 ++-- cmd/token_test.go | 4 ++-- cmd/user.go | 4 ++-- cmd/user_test.go | 6 +++--- cmd/webpush_test.go | 2 +- go.mod | 2 +- go.sum | 33 +++++++-------------------------- log/event.go | 2 +- main.go | 2 +- server/actions.go | 2 +- server/config.go | 2 +- server/config_test.go | 2 +- server/errors.go | 2 +- server/file_cache.go | 4 ++-- server/file_cache_test.go | 2 +- server/log.go | 4 ++-- server/message_cache.go | 4 ++-- server/server.go | 6 +++--- server/server_account.go | 6 +++--- server/server_account_test.go | 6 +++--- server/server_admin.go | 2 +- server/server_admin_test.go | 4 ++-- server/server_firebase.go | 4 ++-- server/server_firebase_test.go | 2 +- server/server_manager.go | 4 ++-- server/server_matrix.go | 2 +- server/server_middleware.go | 2 +- server/server_payments.go | 6 +++--- server/server_payments_test.go | 4 ++-- server/server_test.go | 6 +++--- server/server_twilio.go | 6 +++--- server/server_twilio_test.go | 4 ++-- server/server_webpush.go | 4 ++-- server/server_webpush_test.go | 4 ++-- server/smtp_sender.go | 4 ++-- server/topic.go | 4 ++-- server/types.go | 6 +++--- server/util.go | 2 +- server/visitor.go | 6 +++--- server/webpush_store.go | 2 +- test/server.go | 2 +- user/manager.go | 4 ++-- user/manager_test.go | 2 +- user/types.go | 2 +- util/batching_queue_test.go | 2 +- 62 files changed, 120 insertions(+), 139 deletions(-) diff --git a/README.md b/README.md index 90d9285f..d4c30ca0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # ntfy.sh | Send push notifications to your phone or desktop via PUT/POST [![Release](https://img.shields.io/github/release/binwiederhier/ntfy.svg?color=success&style=flat-square)](https://github.com/binwiederhier/ntfy/releases/latest) -[![Go Reference](https://pkg.go.dev/badge/heckel.io/ntfy.svg)](https://pkg.go.dev/heckel.io/ntfy) +[![Go Reference](https://pkg.go.dev/badge/heckel.io/ntfy.svg)](https://pkg.go.dev/heckel.io/ntfy/v2) [![Tests](https://github.com/binwiederhier/ntfy/workflows/test/badge.svg)](https://github.com/binwiederhier/ntfy/actions) [![Go Report Card](https://goreportcard.com/badge/github.com/binwiederhier/ntfy)](https://goreportcard.com/report/github.com/binwiederhier/ntfy) [![codecov](https://codecov.io/gh/binwiederhier/ntfy/branch/main/graph/badge.svg?token=A597KQ463G)](https://codecov.io/gh/binwiederhier/ntfy) diff --git a/client/client.go b/client/client.go index 93cf7da5..c2260966 100644 --- a/client/client.go +++ b/client/client.go @@ -7,8 +7,8 @@ import ( "encoding/json" "errors" "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "io" "net/http" "regexp" diff --git a/client/client_test.go b/client/client_test.go index f0b15a3f..a6784ff8 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -3,9 +3,9 @@ package client_test import ( "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" - "heckel.io/ntfy/test" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/test" "os" "testing" "time" diff --git a/client/config_test.go b/client/config_test.go index c85d3d49..5d9eeecc 100644 --- a/client/config_test.go +++ b/client/config_test.go @@ -2,7 +2,7 @@ package client_test import ( "github.com/stretchr/testify/require" - "heckel.io/ntfy/client" + "heckel.io/ntfy/v2/client" "os" "path/filepath" "testing" diff --git a/client/options.go b/client/options.go index 630f1554..027b7fb5 100644 --- a/client/options.go +++ b/client/options.go @@ -2,7 +2,7 @@ package client import ( "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "net/http" "strings" "time" diff --git a/cmd/access.go b/cmd/access.go index 87f01d11..c6be94b5 100644 --- a/cmd/access.go +++ b/cmd/access.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" ) func init() { diff --git a/cmd/access_test.go b/cmd/access_test.go index 359beb92..81c9f2b9 100644 --- a/cmd/access_test.go +++ b/cmd/access_test.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" - "heckel.io/ntfy/test" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/test" "testing" ) diff --git a/cmd/app.go b/cmd/app.go index edef5b47..d88a9d58 100644 --- a/cmd/app.go +++ b/cmd/app.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/log" "os" "regexp" ) diff --git a/cmd/app_test.go b/cmd/app_test.go index ec27a67d..f7d752f0 100644 --- a/cmd/app_test.go +++ b/cmd/app_test.go @@ -4,8 +4,8 @@ import ( "bytes" "encoding/json" "github.com/urfave/cli/v2" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/log" "os" "strings" "testing" diff --git a/cmd/config_loader.go b/cmd/config_loader.go index 9f0a5769..e6180bed 100644 --- a/cmd/config_loader.go +++ b/cmd/config_loader.go @@ -5,7 +5,7 @@ import ( "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" "gopkg.in/yaml.v2" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "os" ) diff --git a/cmd/publish.go b/cmd/publish.go index 5ffe3adf..aaec35e9 100644 --- a/cmd/publish.go +++ b/cmd/publish.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "io" "os" "os/exec" diff --git a/cmd/publish_test.go b/cmd/publish_test.go index a254f47d..31d01cb5 100644 --- a/cmd/publish_test.go +++ b/cmd/publish_test.go @@ -3,8 +3,8 @@ package cmd import ( "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/test" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/test" + "heckel.io/ntfy/v2/util" "net/http" "net/http/httptest" "os" diff --git a/cmd/serve.go b/cmd/serve.go index 87b83dda..9fcf550c 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -6,7 +6,7 @@ import ( "errors" "fmt" "github.com/stripe/stripe-go/v74" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "io/fs" "math" "net" @@ -17,12 +17,12 @@ import ( "syscall" "time" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/log" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" - "heckel.io/ntfy/server" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/util" ) func init() { diff --git a/cmd/serve_test.go b/cmd/serve_test.go index 774166c3..9e16540b 100644 --- a/cmd/serve_test.go +++ b/cmd/serve_test.go @@ -12,9 +12,9 @@ import ( "github.com/gorilla/websocket" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "heckel.io/ntfy/client" - "heckel.io/ntfy/test" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/test" + "heckel.io/ntfy/v2/util" ) func init() { diff --git a/cmd/subscribe.go b/cmd/subscribe.go index 77a1b5f1..1a0a7a6f 100644 --- a/cmd/subscribe.go +++ b/cmd/subscribe.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "os" "os/exec" "os/user" diff --git a/cmd/tier.go b/cmd/tier.go index f1c8ddcb..63b023f9 100644 --- a/cmd/tier.go +++ b/cmd/tier.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" ) func init() { diff --git a/cmd/tier_test.go b/cmd/tier_test.go index 1774aa27..145f273e 100644 --- a/cmd/tier_test.go +++ b/cmd/tier_test.go @@ -3,8 +3,8 @@ package cmd import ( "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" - "heckel.io/ntfy/test" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/test" "testing" ) diff --git a/cmd/token.go b/cmd/token.go index ab9f4447..cb92a130 100644 --- a/cmd/token.go +++ b/cmd/token.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "net/netip" "time" ) diff --git a/cmd/token_test.go b/cmd/token_test.go index 40d7be7b..03295081 100644 --- a/cmd/token_test.go +++ b/cmd/token_test.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" - "heckel.io/ntfy/test" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/test" "regexp" "testing" ) diff --git a/cmd/user.go b/cmd/user.go index a96c7089..9ab487dd 100644 --- a/cmd/user.go +++ b/cmd/user.go @@ -6,13 +6,13 @@ import ( "crypto/subtle" "errors" "fmt" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "os" "strings" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" ) const ( diff --git a/cmd/user_test.go b/cmd/user_test.go index 1149285f..e1bdd3ab 100644 --- a/cmd/user_test.go +++ b/cmd/user_test.go @@ -3,9 +3,9 @@ package cmd import ( "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" - "heckel.io/ntfy/test" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/test" + "heckel.io/ntfy/v2/user" "os" "path/filepath" "testing" diff --git a/cmd/webpush_test.go b/cmd/webpush_test.go index 1b364701..51926ca1 100644 --- a/cmd/webpush_test.go +++ b/cmd/webpush_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" + "heckel.io/ntfy/v2/server" ) func TestCLI_WebPush_GenerateKeys(t *testing.T) { diff --git a/go.mod b/go.mod index 567dc662..c4f4fdc9 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( golang.org/x/sync v0.5.0 golang.org/x/term v0.14.0 golang.org/x/time v0.4.0 - google.golang.org/api v0.150.0 + google.golang.org/api v0.151.0 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index c672f742..2031b653 100644 --- a/go.sum +++ b/go.sum @@ -11,8 +11,6 @@ cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= -cloud.google.com/go/storage v1.34.1 h1:H2Af2dU5J0PF7A5B+ECFIce+RqxVnrVilO+cu0TS3MI= -cloud.google.com/go/storage v1.34.1/go.mod h1:VN1ElqqvR9adg1k9xlkUJ55cMOP1/QjnNNuT5xQL6dY= cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= firebase.google.com/go/v4 v4.12.1 h1:tDNvobifGsx/1HSFLnM0fmNfx/CDZSgsTO2KhZtgpcs= @@ -42,8 +40,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= -github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead h1:fI1Jck0vUrXT8bnphprS1EoVRe2Q5CKCX8iDlpqjQ/Y= -github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 h1:hH4PQfOndHDlpzYfLAAfl63E8Le6F2+EL/cdhlkyRJY= github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= github.com/emersion/go-smtp v0.17.0 h1:tq90evlrcyqRfE6DSXaWVH54oX6OuZOQECEmhWBMEtI= @@ -85,7 +81,9 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -95,18 +93,16 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= @@ -127,6 +123,7 @@ github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGy github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -136,7 +133,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -153,8 +149,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -175,13 +169,9 @@ golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -208,8 +198,6 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -235,10 +223,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= -google.golang.org/api v0.150.0 h1:Z9k22qD289SZ8gCJrk4DrWXkNjtfvKAUo/l1ma8eBYE= -google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.151.0 h1:FhfXLO/NFdJIzQtCqjpysWwqKk8AzGWBUhMIx67cVDU= +google.golang.org/api v0.151.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= @@ -248,16 +234,10 @@ google.golang.org/appengine/v2 v2.0.5/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 h1:HJMDndgxest5n2y77fnErkM62iUsptE/H8p0dC2Huo4= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -283,6 +263,7 @@ google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/log/event.go b/log/event.go index b4b8f59f..f16eb180 100644 --- a/log/event.go +++ b/log/event.go @@ -3,7 +3,7 @@ package log import ( "encoding/json" "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "log" "os" "sort" diff --git a/main.go b/main.go index 5b1428d1..d4600dc8 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,7 @@ package main import ( "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/cmd" + "heckel.io/ntfy/v2/cmd" "os" "runtime" ) diff --git a/server/actions.go b/server/actions.go index 80065873..98b90558 100644 --- a/server/actions.go +++ b/server/actions.go @@ -4,7 +4,7 @@ import ( "encoding/json" "errors" "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "regexp" "strings" "unicode/utf8" diff --git a/server/config.go b/server/config.go index 9815aa88..a0cfdcd5 100644 --- a/server/config.go +++ b/server/config.go @@ -5,7 +5,7 @@ import ( "net/netip" "time" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" ) // Defines default config settings (excluding limits, see below) diff --git a/server/config_test.go b/server/config_test.go index 14f028f1..0dae5725 100644 --- a/server/config_test.go +++ b/server/config_test.go @@ -2,7 +2,7 @@ package server_test import ( "github.com/stretchr/testify/assert" - "heckel.io/ntfy/server" + "heckel.io/ntfy/v2/server" "testing" ) diff --git a/server/errors.go b/server/errors.go index 27ba3df0..072bdc01 100644 --- a/server/errors.go +++ b/server/errors.go @@ -3,7 +3,7 @@ package server import ( "encoding/json" "fmt" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/log" "net/http" ) diff --git a/server/file_cache.go b/server/file_cache.go index c097aefb..758d38ee 100644 --- a/server/file_cache.go +++ b/server/file_cache.go @@ -3,8 +3,8 @@ package server import ( "errors" "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "io" "os" "path/filepath" diff --git a/server/file_cache_test.go b/server/file_cache_test.go index 8f267a73..e7dee3b3 100644 --- a/server/file_cache_test.go +++ b/server/file_cache_test.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "os" "strings" "testing" diff --git a/server/log.go b/server/log.go index 978d0593..3d11ac47 100644 --- a/server/log.go +++ b/server/log.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/emersion/go-smtp" "github.com/gorilla/websocket" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "net/http" "strings" "unicode/utf8" diff --git a/server/message_cache.go b/server/message_cache.go index 8a613ff1..f0744abb 100644 --- a/server/message_cache.go +++ b/server/message_cache.go @@ -10,8 +10,8 @@ import ( "time" _ "github.com/mattn/go-sqlite3" // SQLite driver - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" ) var ( diff --git a/server/server.go b/server/server.go index 0ab36524..c0f3b641 100644 --- a/server/server.go +++ b/server/server.go @@ -30,9 +30,9 @@ import ( "github.com/gorilla/websocket" "github.com/prometheus/client_golang/prometheus/promhttp" "golang.org/x/sync/errgroup" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" ) // Server is the main server, providing the UI and API for ntfy diff --git a/server/server_account.go b/server/server_account.go index f26cc2ff..cb841d07 100644 --- a/server/server_account.go +++ b/server/server_account.go @@ -2,9 +2,9 @@ package server import ( "encoding/json" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "net/http" "net/netip" "strings" diff --git a/server/server_account_test.go b/server/server_account_test.go index 119efb16..4c269c2f 100644 --- a/server/server_account_test.go +++ b/server/server_account_test.go @@ -3,9 +3,9 @@ package server import ( "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/netip" "path/filepath" diff --git a/server/server_admin.go b/server/server_admin.go index 9380a5ff..fc9dfed1 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -1,7 +1,7 @@ package server import ( - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "net/http" ) diff --git a/server/server_admin_test.go b/server/server_admin_test.go index 1513ea40..c2f8f95a 100644 --- a/server/server_admin_test.go +++ b/server/server_admin_test.go @@ -2,8 +2,8 @@ package server import ( "github.com/stretchr/testify/require" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "sync/atomic" "testing" "time" diff --git a/server/server_firebase.go b/server/server_firebase.go index b8158d2f..4a0cb7f9 100644 --- a/server/server_firebase.go +++ b/server/server_firebase.go @@ -8,8 +8,8 @@ import ( "firebase.google.com/go/v4/messaging" "fmt" "google.golang.org/api/option" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "strings" ) diff --git a/server/server_firebase_test.go b/server/server_firebase_test.go index fb27ea05..9b653a29 100644 --- a/server/server_firebase_test.go +++ b/server/server_firebase_test.go @@ -4,7 +4,7 @@ import ( "encoding/json" "errors" "fmt" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "net/netip" "strings" "sync" diff --git a/server/server_manager.go b/server/server_manager.go index 66d449de..9f5fe888 100644 --- a/server/server_manager.go +++ b/server/server_manager.go @@ -1,8 +1,8 @@ package server import ( - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "strings" ) diff --git a/server/server_matrix.go b/server/server_matrix.go index c25a1b59..f99bea8f 100644 --- a/server/server_matrix.go +++ b/server/server_matrix.go @@ -4,7 +4,7 @@ import ( "bytes" "encoding/json" "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "io" "net/http" "strings" diff --git a/server/server_middleware.go b/server/server_middleware.go index b1428154..b2ce6f70 100644 --- a/server/server_middleware.go +++ b/server/server_middleware.go @@ -3,7 +3,7 @@ package server import ( "net/http" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" ) type contextKey int diff --git a/server/server_payments.go b/server/server_payments.go index 1e98d059..334301bb 100644 --- a/server/server_payments.go +++ b/server/server_payments.go @@ -11,9 +11,9 @@ import ( "github.com/stripe/stripe-go/v74/price" "github.com/stripe/stripe-go/v74/subscription" "github.com/stripe/stripe-go/v74/webhook" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/http" "net/netip" diff --git a/server/server_payments_test.go b/server/server_payments_test.go index ebd559e7..8da47a65 100644 --- a/server/server_payments_test.go +++ b/server/server_payments_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/require" "github.com/stripe/stripe-go/v74" "golang.org/x/time/rate" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/netip" "path/filepath" diff --git a/server/server_test.go b/server/server_test.go index d60c775a..d387c359 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -7,7 +7,7 @@ import ( "encoding/json" "fmt" "golang.org/x/crypto/bcrypt" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "io" "math/rand" "net/http" @@ -24,8 +24,8 @@ import ( "github.com/SherClockHolmes/webpush-go" "github.com/stretchr/testify/require" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" ) func TestMain(m *testing.M) { diff --git a/server/server_twilio.go b/server/server_twilio.go index 093abe63..9a8ef8ad 100644 --- a/server/server_twilio.go +++ b/server/server_twilio.go @@ -4,9 +4,9 @@ import ( "bytes" "encoding/xml" "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/http" "net/url" diff --git a/server/server_twilio_test.go b/server/server_twilio_test.go index af694a77..89a36051 100644 --- a/server/server_twilio_test.go +++ b/server/server_twilio_test.go @@ -2,8 +2,8 @@ package server import ( "github.com/stretchr/testify/require" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/http" "net/http/httptest" diff --git a/server/server_webpush.go b/server/server_webpush.go index bb0f5408..cd41759d 100644 --- a/server/server_webpush.go +++ b/server/server_webpush.go @@ -8,8 +8,8 @@ import ( "strings" "github.com/SherClockHolmes/webpush-go" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" ) const ( diff --git a/server/server_webpush_test.go b/server/server_webpush_test.go index c0db79c6..c32c7bf8 100644 --- a/server/server_webpush_test.go +++ b/server/server_webpush_test.go @@ -4,8 +4,8 @@ import ( "encoding/json" "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/http" "net/http/httptest" diff --git a/server/smtp_sender.go b/server/smtp_sender.go index 9093687e..21eaf682 100644 --- a/server/smtp_sender.go +++ b/server/smtp_sender.go @@ -11,8 +11,8 @@ import ( "sync" "time" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" ) type mailer interface { diff --git a/server/topic.go b/server/topic.go index 5dfafbe3..49def94b 100644 --- a/server/topic.go +++ b/server/topic.go @@ -5,8 +5,8 @@ import ( "sync" "time" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" ) const ( diff --git a/server/types.go b/server/types.go index eeb566fc..fb08fb05 100644 --- a/server/types.go +++ b/server/types.go @@ -5,10 +5,10 @@ import ( "net/netip" "time" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" ) // List of possible events diff --git a/server/util.go b/server/util.go index 09536765..fe5b3ea3 100644 --- a/server/util.go +++ b/server/util.go @@ -3,7 +3,7 @@ package server import ( "context" "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "io" "mime" "net/http" diff --git a/server/visitor.go b/server/visitor.go index e4c06f66..f8dc416a 100644 --- a/server/visitor.go +++ b/server/visitor.go @@ -2,14 +2,14 @@ package server import ( "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" "net/netip" "sync" "time" "golang.org/x/time/rate" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" ) const ( diff --git a/server/webpush_store.go b/server/webpush_store.go index b2ab0d11..62a35f7d 100644 --- a/server/webpush_store.go +++ b/server/webpush_store.go @@ -3,7 +3,7 @@ package server import ( "database/sql" "errors" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "net/netip" "time" diff --git a/test/server.go b/test/server.go index 0b9200a6..18529359 100644 --- a/test/server.go +++ b/test/server.go @@ -2,7 +2,7 @@ package test import ( "fmt" - "heckel.io/ntfy/server" + "heckel.io/ntfy/v2/server" "math/rand" "net/http" "path/filepath" diff --git a/user/manager.go b/user/manager.go index 324b7684..33e0ac4b 100644 --- a/user/manager.go +++ b/user/manager.go @@ -9,8 +9,8 @@ import ( "github.com/mattn/go-sqlite3" "github.com/stripe/stripe-go/v74" "golang.org/x/crypto/bcrypt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "net/netip" "strings" "sync" diff --git a/user/manager_test.go b/user/manager_test.go index 468dc36a..cf797fca 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/require" "github.com/stripe/stripe-go/v74" "golang.org/x/crypto/bcrypt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "net/netip" "path/filepath" "strings" diff --git a/user/types.go b/user/types.go index 11895785..68ee02f3 100644 --- a/user/types.go +++ b/user/types.go @@ -3,7 +3,7 @@ package user import ( "errors" "github.com/stripe/stripe-go/v74" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/log" "net/netip" "regexp" "strings" diff --git a/util/batching_queue_test.go b/util/batching_queue_test.go index b3c41a4c..728095ca 100644 --- a/util/batching_queue_test.go +++ b/util/batching_queue_test.go @@ -2,7 +2,7 @@ package util_test import ( "github.com/stretchr/testify/require" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "math/rand" "sync" "testing" From b65044712b42390b169116bb67f0aeb4b08b72c7 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 21:04:49 -0500 Subject: [PATCH 51/51] Fix linter --- cmd/serve_test.go | 4 ---- server/server_test.go | 2 +- server/topic_test.go | 4 ++-- test/server.go | 5 ----- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/cmd/serve_test.go b/cmd/serve_test.go index 9e16540b..748adbd8 100644 --- a/cmd/serve_test.go +++ b/cmd/serve_test.go @@ -17,10 +17,6 @@ import ( "heckel.io/ntfy/v2/util" ) -func init() { - rand.Seed(time.Now().UnixMilli()) -} - func TestCLI_Serve_Unix_Curl(t *testing.T) { sockFile := filepath.Join(t.TempDir(), "ntfy.sock") configFile := newEmptyFile(t) // Avoid issues with existing server.yml file on system diff --git a/server/server_test.go b/server/server_test.go index d387c359..5f2bac6a 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -3,13 +3,13 @@ package server import ( "bufio" "context" + "crypto/rand" "encoding/base64" "encoding/json" "fmt" "golang.org/x/crypto/bcrypt" "heckel.io/ntfy/v2/user" "io" - "math/rand" "net/http" "net/http/httptest" "net/netip" diff --git a/server/topic_test.go b/server/topic_test.go index 41a29cfd..8de16111 100644 --- a/server/topic_test.go +++ b/server/topic_test.go @@ -69,7 +69,7 @@ func TestTopic_Subscribe_DuplicateID(t *testing.T) { t.Parallel() to := newTopic("mytopic") - // Fix random seed to force same number generation + //lint:ignore SA1019 Fix random seed to force same number generation rand.Seed(1) a := rand.Int() to.subscribers[a] = &topicSubscriber{ @@ -82,7 +82,7 @@ func TestTopic_Subscribe_DuplicateID(t *testing.T) { return nil } - // Force rand.Int to generate the same id once more + //lint:ignore SA1019 Force rand.Int to generate the same id once more rand.Seed(1) id := to.Subscribe(subFn, "b", func() {}) res := to.subscribers[id] diff --git a/test/server.go b/test/server.go index 18529359..9d75a2c7 100644 --- a/test/server.go +++ b/test/server.go @@ -7,13 +7,8 @@ import ( "net/http" "path/filepath" "testing" - "time" ) -func init() { - rand.Seed(time.Now().UnixMilli()) -} - // StartServer starts a server.Server with a random port and waits for the server to be up func StartServer(t *testing.T) (*server.Server, int) { return StartServerWithConfig(t, server.NewConfig())