diff --git a/.changeset/angry-apes-double.md b/.changeset/angry-apes-double.md new file mode 100644 index 0000000000000..458faef378b9c --- /dev/null +++ b/.changeset/angry-apes-double.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/models': patch +'@rocket.chat/meteor': patch +--- + +Enable room search by Cyrillic characters in channel names (e.g. "тест"). diff --git a/.changeset/big-fireants-leave.md b/.changeset/big-fireants-leave.md new file mode 100644 index 0000000000000..cecaefba64ab9 --- /dev/null +++ b/.changeset/big-fireants-leave.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/apps-engine': patch +'@rocket.chat/meteor': patch +--- + +Fixes an issue where apps that import node native modules with the optional `node:` specifier would fail to construct diff --git a/.changeset/bright-boats-speak.md b/.changeset/bright-boats-speak.md new file mode 100644 index 0000000000000..90f03d9b12a7f --- /dev/null +++ b/.changeset/bright-boats-speak.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Removes deprecated search federated rooms diff --git a/.changeset/bump-patch-1759183373373.md b/.changeset/bump-patch-1759183373373.md new file mode 100644 index 0000000000000..e1eaa7980afb1 --- /dev/null +++ b/.changeset/bump-patch-1759183373373.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1759794256315.md b/.changeset/bump-patch-1759794256315.md new file mode 100644 index 0000000000000..e1eaa7980afb1 --- /dev/null +++ b/.changeset/bump-patch-1759794256315.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1760065167698.md b/.changeset/bump-patch-1760065167698.md new file mode 100644 index 0000000000000..e1eaa7980afb1 --- /dev/null +++ b/.changeset/bump-patch-1760065167698.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1760188097117.md b/.changeset/bump-patch-1760188097117.md new file mode 100644 index 0000000000000..e1eaa7980afb1 --- /dev/null +++ b/.changeset/bump-patch-1760188097117.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1760611771833.md b/.changeset/bump-patch-1760611771833.md new file mode 100644 index 0000000000000..e1eaa7980afb1 --- /dev/null +++ b/.changeset/bump-patch-1760611771833.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1760649147890.md b/.changeset/bump-patch-1760649147890.md new file mode 100644 index 0000000000000..e1eaa7980afb1 --- /dev/null +++ b/.changeset/bump-patch-1760649147890.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1760713438306.md b/.changeset/bump-patch-1760713438306.md new file mode 100644 index 0000000000000..e1eaa7980afb1 --- /dev/null +++ b/.changeset/bump-patch-1760713438306.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/clean-feet-worry.md b/.changeset/clean-feet-worry.md new file mode 100644 index 0000000000000..107aa31a1ace9 --- /dev/null +++ b/.changeset/clean-feet-worry.md @@ -0,0 +1,9 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/gazzodown": patch +"@rocket.chat/rest-typings": minor +--- + +Fixes search by name in custom emojis list, by adding a correct parameter to the endpoint `emoji-custom.all` + +Now the endpoint `emoji-custom.all` accepts a `name` as parameter, so the filter should work on emojis page withouth the necessity of set `ALLOW_UNSAFE_QUERY_AND_FIELDS_API_PARAMS` env var diff --git a/.changeset/cold-colts-hear.md b/.changeset/cold-colts-hear.md new file mode 100644 index 0000000000000..fa33690dba859 --- /dev/null +++ b/.changeset/cold-colts-hear.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/i18n': minor +'@rocket.chat/meteor': minor +--- + +Replaces some texts in order to improve the E2E encryption communication on the UI diff --git a/.changeset/cool-pets-switch.md b/.changeset/cool-pets-switch.md new file mode 100644 index 0000000000000..38cadab03f70f --- /dev/null +++ b/.changeset/cool-pets-switch.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Adds deprecation warning on `livechat:removeCustomField` with new endpoint replacing it; `livechat/custom-fields.delete` diff --git a/.changeset/cuddly-dots-end.md b/.changeset/cuddly-dots-end.md new file mode 100644 index 0000000000000..32eba4e0320de --- /dev/null +++ b/.changeset/cuddly-dots-end.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Adds deprecation warning on `livechat:saveAgentInfo` with new endpoint replacing it; `livechat/agents.saveInfo` diff --git a/.changeset/curvy-cars-attend.md b/.changeset/curvy-cars-attend.md new file mode 100644 index 0000000000000..1e5a186fd61bb --- /dev/null +++ b/.changeset/curvy-cars-attend.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue with iframe authentication where login should always fallback to iframe authentication in case of any erorrs. diff --git a/.changeset/fast-phones-poke.md b/.changeset/fast-phones-poke.md new file mode 100644 index 0000000000000..c0255f88396a8 --- /dev/null +++ b/.changeset/fast-phones-poke.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes `channels.messages`, `groups.messages`, `dm.messages` and `im.messages` APIs to filter out deleted messages. diff --git a/.changeset/few-flowers-bow.md b/.changeset/few-flowers-bow.md new file mode 100644 index 0000000000000..648e4ac82cf5f --- /dev/null +++ b/.changeset/few-flowers-bow.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixes stale phone numbers being available for outbound message diff --git a/.changeset/fifty-ducks-vanish.md b/.changeset/fifty-ducks-vanish.md new file mode 100644 index 0000000000000..51d35b02742fb --- /dev/null +++ b/.changeset/fifty-ducks-vanish.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Adds deprecation warning on `saveCannedResponse` diff --git a/.changeset/five-carpets-perform.md b/.changeset/five-carpets-perform.md new file mode 100644 index 0000000000000..28763e43e089b --- /dev/null +++ b/.changeset/five-carpets-perform.md @@ -0,0 +1,9 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/i18n": minor +"@rocket.chat/model-typings": minor +"@rocket.chat/models": minor +"@rocket.chat/rest-typings": minor +--- + +Adds new endpoint to disable Livechat Contacts by its id, with a new permission `delete-livechat-contact`. diff --git a/.changeset/fluffy-dryers-obey.md b/.changeset/fluffy-dryers-obey.md new file mode 100644 index 0000000000000..fd75b2efa15e2 --- /dev/null +++ b/.changeset/fluffy-dryers-obey.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Prevent `Export Messages` tab from closing when selecting messages by clicking outside of it and preference "Hide Contextual Bar by clicking outside of it" is set true. diff --git a/.changeset/fresh-deers-march.md b/.changeset/fresh-deers-march.md new file mode 100644 index 0000000000000..2e0ec5d1bb39f --- /dev/null +++ b/.changeset/fresh-deers-march.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Adds deprecation warning to `livechat:getAnalyticsChartData`, as well as it adds a new endpoint to replace it; `livechat/analytics/dashboards/charts-data` diff --git a/.changeset/gentle-months-kick.md b/.changeset/gentle-months-kick.md new file mode 100644 index 0000000000000..87c82962ee380 --- /dev/null +++ b/.changeset/gentle-months-kick.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue where deleted messages remain visible until a manual page refresh when "Message removed" is hidden in hidden system messages settings. diff --git a/.changeset/green-ants-shop.md b/.changeset/green-ants-shop.md new file mode 100644 index 0000000000000..74a11f9c9e848 --- /dev/null +++ b/.changeset/green-ants-shop.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': minor +--- + +Fixes login using iframe authentication. diff --git a/.changeset/grumpy-berries-arrive.md b/.changeset/grumpy-berries-arrive.md new file mode 100644 index 0000000000000..eacb88108a0f7 --- /dev/null +++ b/.changeset/grumpy-berries-arrive.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Security Hotfix (https://docs.rocket.chat/docs/security-fixes-and-updates) diff --git a/.changeset/itchy-news-design.md b/.changeset/itchy-news-design.md new file mode 100644 index 0000000000000..99c40b96a3475 --- /dev/null +++ b/.changeset/itchy-news-design.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Adds deprecation warning on `livechat:getRoutingConfig`, as well as it adds new endpoint to replace it; `livechat/config/routing` diff --git a/.changeset/late-impalas-battle.md b/.changeset/late-impalas-battle.md new file mode 100644 index 0000000000000..2afb0c518a5f1 --- /dev/null +++ b/.changeset/late-impalas-battle.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/i18n': patch +'@rocket.chat/meteor': patch +--- + +Changes the feedback message when inviting external users to a federated channel diff --git a/.changeset/lazy-kings-appear.md b/.changeset/lazy-kings-appear.md new file mode 100644 index 0000000000000..b34df4f6f8c52 --- /dev/null +++ b/.changeset/lazy-kings-appear.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Disables cache for outbound message providers to ensure UI is always up to date diff --git a/.changeset/metal-jobs-learn.md b/.changeset/metal-jobs-learn.md new file mode 100644 index 0000000000000..89116e9001d58 --- /dev/null +++ b/.changeset/metal-jobs-learn.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue where the omnichannel default priorities are not being translated in the sidebar room menu diff --git a/.changeset/mighty-clouds-run.md b/.changeset/mighty-clouds-run.md new file mode 100644 index 0000000000000..6b9770e1c386a --- /dev/null +++ b/.changeset/mighty-clouds-run.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fix issue where resending the welcome email could include unresolved placeholders (e.g., `[name]`, `[email]`). diff --git a/.changeset/neat-spoons-worry.md b/.changeset/neat-spoons-worry.md new file mode 100644 index 0000000000000..6994c4b07a258 --- /dev/null +++ b/.changeset/neat-spoons-worry.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/i18n': patch +'@rocket.chat/meteor': patch +--- + +Adds missing tooltip when adding users to federated room, indicating verification status diff --git a/.changeset/new-poems-compare.md b/.changeset/new-poems-compare.md new file mode 100644 index 0000000000000..84a83bc6e5cff --- /dev/null +++ b/.changeset/new-poems-compare.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixes a missing translation on the create channel/team modal diff --git a/.changeset/nice-balloons-relax.md b/.changeset/nice-balloons-relax.md new file mode 100644 index 0000000000000..951859657182c --- /dev/null +++ b/.changeset/nice-balloons-relax.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Adds deprecation warning on `livechat:removeRoom`, use `livechat/inquiries.take` instead diff --git a/.changeset/nice-bottles-breathe.md b/.changeset/nice-bottles-breathe.md new file mode 100644 index 0000000000000..89a85ce3afba8 --- /dev/null +++ b/.changeset/nice-bottles-breathe.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/core-services': patch +'@rocket.chat/meteor': patch +--- + +Fixes `teams.addMembers` API to assign team member roles properly. diff --git a/.changeset/ninety-rocks-hope.md b/.changeset/ninety-rocks-hope.md new file mode 100644 index 0000000000000..4164ad9356465 --- /dev/null +++ b/.changeset/ninety-rocks-hope.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Adds deprecation warning on `livechat:removeAllClosedRooms` with new endpoint replacing it; `livechat/rooms.removeAllClosedRooms` diff --git a/.changeset/old-meals-pull.md b/.changeset/old-meals-pull.md new file mode 100644 index 0000000000000..80a5dadf14f02 --- /dev/null +++ b/.changeset/old-meals-pull.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/apps-engine': patch +'@rocket.chat/meteor': patch +--- + +Changes a strict behavior on reporting slash commands provided by apps diff --git a/.changeset/pink-pens-march.md b/.changeset/pink-pens-march.md new file mode 100644 index 0000000000000..2f0b4d63ea55d --- /dev/null +++ b/.changeset/pink-pens-march.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes reactivity when creating a federated room, that was wrongly showing Join button on composer, requiring a reload or change of route to be able to send a message. diff --git a/.changeset/polite-garlics-wash.md b/.changeset/polite-garlics-wash.md new file mode 100644 index 0000000000000..d81c8107f1d35 --- /dev/null +++ b/.changeset/polite-garlics-wash.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': minor +--- + +It removes the encrypted input from the edit room panel in order to avoid duplicated configurations with the same purpose diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 0000000000000..17c04aa4e8e2d --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,144 @@ +{ + "mode": "pre", + "tag": "rc", + "initialVersions": { + "@rocket.chat/meteor": "7.11.0-develop", + "rocketchat-services": "2.0.28", + "@rocket.chat/uikit-playground": "0.6.28", + "@rocket.chat/account-service": "0.4.37", + "@rocket.chat/authorization-service": "0.4.37", + "@rocket.chat/ddp-streamer": "0.3.37", + "@rocket.chat/federation-service": "0.1.0", + "@rocket.chat/omnichannel-transcript": "0.4.37", + "@rocket.chat/presence-service": "0.4.37", + "@rocket.chat/queue-worker": "0.4.37", + "@rocket.chat/stream-hub-service": "0.4.37", + "@rocket.chat/federation-matrix": "0.0.1", + "@rocket.chat/license": "1.0.28", + "@rocket.chat/media-calls": "0.0.1", + "@rocket.chat/network-broker": "0.2.16", + "@rocket.chat/omni-core-ee": "0.0.2", + "@rocket.chat/omnichannel-services": "0.3.34", + "@rocket.chat/pdf-worker": "0.3.16", + "@rocket.chat/presence": "0.2.37", + "@rocket.chat/ui-theming": "0.4.3", + "@rocket.chat/account-utils": "0.0.2", + "@rocket.chat/agenda": "0.1.0", + "@rocket.chat/api-client": "0.2.37", + "@rocket.chat/apps": "0.5.16", + "@rocket.chat/apps-engine": "1.55.0", + "@rocket.chat/base64": "1.0.13", + "@rocket.chat/cas-validate": "0.0.3", + "@rocket.chat/core-services": "0.10.0", + "@rocket.chat/core-typings": "7.11.0-develop", + "@rocket.chat/cron": "0.1.37", + "@rocket.chat/ddp-client": "0.3.37", + "@rocket.chat/desktop-api": "1.0.0", + "@rocket.chat/eslint-config": "0.7.0", + "@rocket.chat/favicon": "0.0.2", + "@rocket.chat/freeswitch": "1.2.24", + "@rocket.chat/fuselage-ui-kit": "22.0.0", + "@rocket.chat/gazzodown": "22.0.0", + "@rocket.chat/http-router": "7.9.4", + "@rocket.chat/i18n": "1.10.0", + "@rocket.chat/instance-status": "0.1.37", + "@rocket.chat/jest-presets": "0.0.1", + "@rocket.chat/jwt": "0.1.1", + "@rocket.chat/livechat": "1.23.8", + "@rocket.chat/log-format": "0.0.2", + "@rocket.chat/logger": "0.0.2", + "@rocket.chat/media-signaling": "0.0.1", + "@rocket.chat/message-parser": "0.31.32", + "@rocket.chat/message-types": "0.0.1", + "@rocket.chat/mock-providers": "0.3.0", + "@rocket.chat/model-typings": "1.7.0", + "@rocket.chat/models": "1.6.0", + "@rocket.chat/mongo-adapter": "0.0.2", + "@rocket.chat/poplib": "0.0.2", + "@rocket.chat/omni-core": "0.0.2", + "@rocket.chat/password-policies": "0.0.2", + "@rocket.chat/patch-injection": "0.0.1", + "@rocket.chat/peggy-loader": "0.31.27", + "@rocket.chat/random": "1.2.2", + "@rocket.chat/release-action": "2.2.3", + "@rocket.chat/release-changelog": "0.1.0", + "@rocket.chat/rest-typings": "7.11.0-develop", + "@rocket.chat/server-cloud-communication": "0.0.2", + "@rocket.chat/server-fetch": "0.0.3", + "@rocket.chat/sha256": "1.0.12", + "@rocket.chat/storybook-config": "0.0.1", + "@rocket.chat/tools": "0.2.3", + "@rocket.chat/tracing": "0.0.1", + "@rocket.chat/tsconfig": "0.0.0", + "@rocket.chat/ui-avatar": "18.0.0", + "@rocket.chat/ui-client": "22.0.0", + "@rocket.chat/ui-composer": "0.5.2", + "@rocket.chat/ui-contexts": "22.0.0", + "@rocket.chat/ui-kit": "0.37.0", + "@rocket.chat/ui-video-conf": "22.0.0", + "@rocket.chat/ui-voip": "12.0.0", + "@rocket.chat/web-ui-registration": "22.0.0" + }, + "changesets": [ + "angry-apes-double", + "big-fireants-leave", + "bright-boats-speak", + "bump-patch-1759183373373", + "bump-patch-1759794256315", + "bump-patch-1760065167698", + "bump-patch-1760188097117", + "bump-patch-1760611771833", + "bump-patch-1760649147890", + "bump-patch-1760713438306", + "clean-feet-worry", + "cold-colts-hear", + "cool-pets-switch", + "cuddly-dots-end", + "curvy-cars-attend", + "fast-phones-poke", + "few-flowers-bow", + "fifty-ducks-vanish", + "five-carpets-perform", + "fluffy-dryers-obey", + "fresh-deers-march", + "gentle-months-kick", + "green-ants-shop", + "grumpy-berries-arrive", + "itchy-news-design", + "late-impalas-battle", + "lazy-kings-appear", + "metal-jobs-learn", + "mighty-clouds-run", + "neat-spoons-worry", + "new-poems-compare", + "nice-balloons-relax", + "nice-bottles-breathe", + "ninety-rocks-hope", + "old-meals-pull", + "pink-pens-march", + "polite-garlics-wash", + "purple-sheep-bathe", + "quiet-spoons-lick", + "rare-plants-shake", + "rare-walls-press", + "rich-parrots-lie", + "rich-rules-sleep", + "rotten-dolphins-sort", + "shaggy-lobsters-attack", + "shy-dolphins-share", + "slow-ants-divide", + "strong-cars-drum", + "sweet-ghosts-teach", + "tasty-ravens-grow", + "thin-parents-beam", + "thirty-wasps-promise", + "twelve-cougars-suffer", + "two-owls-flow", + "two-planes-call", + "two-years-love", + "unlucky-peas-wink", + "weak-windows-doubt", + "witty-candles-impress", + "witty-impalas-flow" + ] +} diff --git a/.changeset/purple-sheep-bathe.md b/.changeset/purple-sheep-bathe.md new file mode 100644 index 0000000000000..4ebcedc841b75 --- /dev/null +++ b/.changeset/purple-sheep-bathe.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/i18n': minor +'@rocket.chat/meteor': minor +--- + +Introduces the ability to reset the e2e encrypted password from the enter e2e encrypted password modal diff --git a/.changeset/quiet-spoons-lick.md b/.changeset/quiet-spoons-lick.md new file mode 100644 index 0000000000000..14a08d72a9281 --- /dev/null +++ b/.changeset/quiet-spoons-lick.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue where isn't possible to scroll the discussion list diff --git a/.changeset/rare-plants-shake.md b/.changeset/rare-plants-shake.md new file mode 100644 index 0000000000000..74d80ba21a464 --- /dev/null +++ b/.changeset/rare-plants-shake.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Adds deprecation warning on `livechat:saveDepartment` diff --git a/.changeset/rare-walls-press.md b/.changeset/rare-walls-press.md new file mode 100644 index 0000000000000..ba1b05402b187 --- /dev/null +++ b/.changeset/rare-walls-press.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/i18n': patch +'@rocket.chat/meteor': patch +--- + +Fixes an issue where the encryption toggle was incorrectly reset/disabled/enabled in the Teams creation modal when Broadcast or Private was toggled, or when the user lacked unrelated permissions. diff --git a/.changeset/rich-parrots-lie.md b/.changeset/rich-parrots-lie.md new file mode 100644 index 0000000000000..788d358fa7b56 --- /dev/null +++ b/.changeset/rich-parrots-lie.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/ui-contexts': patch +'@rocket.chat/meteor': patch +--- + +Show iframe authentication page, when login through iframe authentication API token fails diff --git a/.changeset/rich-rules-sleep.md b/.changeset/rich-rules-sleep.md new file mode 100644 index 0000000000000..d96fda4156168 --- /dev/null +++ b/.changeset/rich-rules-sleep.md @@ -0,0 +1,20 @@ +--- +'@rocket.chat/web-ui-registration': patch +'@rocket.chat/storybook-config': patch +'@rocket.chat/fuselage-ui-kit': patch +'@rocket.chat/ui-theming': patch +'@rocket.chat/ui-video-conf': patch +'@rocket.chat/uikit-playground': patch +'@rocket.chat/ui-composer': patch +'@rocket.chat/gazzodown': patch +'@rocket.chat/ui-avatar': patch +'@rocket.chat/ui-client': patch +'@rocket.chat/ui-voip': patch +'@rocket.chat/core-typings': minor +'@rocket.chat/apps-engine': minor +'@rocket.chat/license': minor +'@rocket.chat/i18n': minor +'@rocket.chat/meteor': minor +--- + +Introduces the Outbound Message feature to Omnichannel, allowing organizations to initiate proactive communication with contacts through their preferred messaging channel directly from Rocket.Chat diff --git a/.changeset/rotten-dolphins-sort.md b/.changeset/rotten-dolphins-sort.md new file mode 100644 index 0000000000000..d74b363b3df07 --- /dev/null +++ b/.changeset/rotten-dolphins-sort.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/i18n': patch +'@rocket.chat/meteor': patch +--- + +Adds a validation to external users when creating a channel that is not federated diff --git a/.changeset/shaggy-lobsters-attack.md b/.changeset/shaggy-lobsters-attack.md new file mode 100644 index 0000000000000..db422bd9a56b6 --- /dev/null +++ b/.changeset/shaggy-lobsters-attack.md @@ -0,0 +1,4 @@ +--- +"@rocket.chat/meteor": patch +--- +Fixes canned messages contextual bar "Create" button not being affected by the correct permission diff --git a/.changeset/shy-dolphins-share.md b/.changeset/shy-dolphins-share.md new file mode 100644 index 0000000000000..d1dea022140ba --- /dev/null +++ b/.changeset/shy-dolphins-share.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixes intermittent error "Cannot read properties of undefined" when editing messages diff --git a/.changeset/slow-ants-divide.md b/.changeset/slow-ants-divide.md new file mode 100644 index 0000000000000..1fb4533c72e81 --- /dev/null +++ b/.changeset/slow-ants-divide.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue where the omnichannel default priorities are not being translated in priorities list diff --git a/.changeset/strong-cars-drum.md b/.changeset/strong-cars-drum.md new file mode 100644 index 0000000000000..8a7298a26ad41 --- /dev/null +++ b/.changeset/strong-cars-drum.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue with inconsistent tooltip display in the permission row diff --git a/.changeset/sweet-ghosts-teach.md b/.changeset/sweet-ghosts-teach.md new file mode 100644 index 0000000000000..c79d34f166537 --- /dev/null +++ b/.changeset/sweet-ghosts-teach.md @@ -0,0 +1,7 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/i18n": minor +"@rocket.chat/ui-voip": minor +--- + +Introduces a new voice call architecture along with a new and improved call widget experience. diff --git a/.changeset/tasty-ravens-grow.md b/.changeset/tasty-ravens-grow.md new file mode 100644 index 0000000000000..94666c330ca46 --- /dev/null +++ b/.changeset/tasty-ravens-grow.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/apps-engine': patch +'@rocket.chat/meteor': patch +--- + +Fixes an issue where an object reference leak would cause invalid data to be stored in the database during app installation diff --git a/.changeset/thin-parents-beam.md b/.changeset/thin-parents-beam.md new file mode 100644 index 0000000000000..721be9fbdc2c7 --- /dev/null +++ b/.changeset/thin-parents-beam.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixes issue with Login Detection emails showing undefined values instead of the user agent info diff --git a/.changeset/thirty-wasps-promise.md b/.changeset/thirty-wasps-promise.md new file mode 100644 index 0000000000000..9e0dc2989b558 --- /dev/null +++ b/.changeset/thirty-wasps-promise.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Add OpenAPI support for the Rocket.Chat chat.unPinMessage API endpoints by migrating to a modern chained route definition syntax and utilizing shared AJV schemas for validation to enhance API documentation and ensure type safety through response validation. diff --git a/.changeset/twelve-cougars-suffer.md b/.changeset/twelve-cougars-suffer.md new file mode 100644 index 0000000000000..9438752251f9f --- /dev/null +++ b/.changeset/twelve-cougars-suffer.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Adds deprecation warning on `livechat:saveCustomField` with new endpoint replacing it; `livechat/custom-fields.save` diff --git a/.changeset/two-owls-flow.md b/.changeset/two-owls-flow.md new file mode 100644 index 0000000000000..7313c108fdd67 --- /dev/null +++ b/.changeset/two-owls-flow.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Prevents adding a external user to a non federated room through Members tab diff --git a/.changeset/two-planes-call.md b/.changeset/two-planes-call.md new file mode 100644 index 0000000000000..9408c05d62419 --- /dev/null +++ b/.changeset/two-planes-call.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue where users table headers are being displayed when there's no results diff --git a/.changeset/two-years-love.md b/.changeset/two-years-love.md new file mode 100644 index 0000000000000..580a11432ae1e --- /dev/null +++ b/.changeset/two-years-love.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/desktop-api': minor +--- + +Defines `reloadServer()` method for the context bridge object type. diff --git a/.changeset/unlucky-peas-wink.md b/.changeset/unlucky-peas-wink.md new file mode 100644 index 0000000000000..9466edf97bd33 --- /dev/null +++ b/.changeset/unlucky-peas-wink.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Adds deprecation warning on `livechat:sendTranscript` with endpoint replacing it; `livechat/trasncript` diff --git a/.changeset/weak-windows-doubt.md b/.changeset/weak-windows-doubt.md new file mode 100644 index 0000000000000..9dfcde6067fc7 --- /dev/null +++ b/.changeset/weak-windows-doubt.md @@ -0,0 +1,10 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/i18n": minor +"@rocket.chat/mock-providers": minor +"@rocket.chat/ui-client": minor +"@rocket.chat/ui-contexts": minor +"@rocket.chat/ui-voip": minor +--- + +Introduces a new flow for requesting device permissions for Voice Calling, prompting the user before the request. Also solves a few issues with the device selection menu. diff --git a/.changeset/witty-candles-impress.md b/.changeset/witty-candles-impress.md new file mode 100644 index 0000000000000..5f44199edf35b --- /dev/null +++ b/.changeset/witty-candles-impress.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes button `Add members` not being disabled on a federated room memers tab, when no user is selected diff --git a/.changeset/witty-impalas-flow.md b/.changeset/witty-impalas-flow.md new file mode 100644 index 0000000000000..f0685178bf1ec --- /dev/null +++ b/.changeset/witty-impalas-flow.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/ui-client': minor +'@rocket.chat/meteor': minor +--- + +Improves the Outbound Message modal’s scrolling on smaller viewports and with large templates diff --git a/.cursor/files/test-cases.json b/.cursor/files/test-cases.json new file mode 100644 index 0000000000000..1e8d0437bb461 --- /dev/null +++ b/.cursor/files/test-cases.json @@ -0,0 +1 @@ +{"cases":[],"suites":[{"id":606,"title":"Rocket.Chat","description":null,"preconditions":null,"suites":[{"id":6,"title":"Admin","description":null,"preconditions":null,"suites":[{"id":995,"title":"Login methods","description":null,"preconditions":null,"suites":[{"id":302,"title":"LDAP","description":null,"preconditions":null,"suites":[{"id":21,"title":"LDAP","description":null,"preconditions":null,"suites":[{"id":27,"title":"Data Sync Basic User","description":null,"preconditions":null,"suites":[],"cases":[{"id":3158,"title":"Group Filter: Load only users that are in a specific group.","description":null,"preconditions":"Have LDAP enable","postconditions":null,"priority":"medium","severity":"major","type":"functional","behavior":"positive","automation":"to-be-automated","status":"actual","is_flaky":"no","layer":"api","milestone":null,"custom_fields":[],"steps_type":"classic","steps":[{"position":1,"action":"Go to apache > New Entry > GroupofNames","expected_result":"a new group is going to be created","data":"","steps":[]},{"position":2,"action":"Add a member to the group","expected_result":"able to add","data":"","steps":[]},{"position":3,"action":"Go to Rocket.chat > workspace > settings > ldap > User search > Group Filter click enable","expected_result":"able to enable","data":"","steps":[]},{"position":4,"action":"On Group ObjectClass fill with groupOfNames","expected_result":"able to fill","data":"","steps":[]},{"position":5,"action":"on Group Member Attribute fill with member","expected_result":"able to fill","data":"","steps":[]},{"position":6,"action":"on Group Group Member Format fill with uid=#{username},ou=users,dc=rcldap,dc=com,dc=br","expected_result":"able to fill","data":"","steps":[]},{"position":7,"action":"on Group name","expected_result":"put rc","data":"","steps":[]},{"position":8,"action":"Click on save","expected_result":"Able to save","data":"","steps":[]},{"position":9,"action":"Click on Sync","expected_result":"able to sync","data":"","steps":[]},{"position":10,"action":"Go to users","expected_result":"Only the members of the group should be on the list.","data":"","steps":[]}],"tags":[],"params":[],"is_muted":"no"}]}],"cases":[]}],"cases":[{"id":2657,"title":"Sync users from oAuth with LDAP","description":null,"preconditions":null,"postconditions":null,"priority":"undefined","severity":"normal","type":"other","behavior":"undefined","automation":"is-not-automated","status":"actual","is_flaky":"no","layer":"unknown","milestone":null,"custom_fields":[],"steps_type":"classic","steps":[{"position":1,"action":"Go to **Workspace > Settings > LDAP > Enterprise**","expected_result":"","data":"","steps":[]},{"position":2,"action":"Disable \"Background Sync Import New Users\"","expected_result":"","data":"","steps":[]},{"position":3,"action":"Enable \"Background Sync Update Existing Users\" setting","expected_result":"","data":"","steps":[]},{"position":4,"action":"Go to \"Data Sync\" tab","expected_result":"","data":"","steps":[]},{"position":5,"action":"Enable \"Merge existent users\"","expected_result":"","data":"","steps":[]},{"position":6,"action":"On another browser window, login for the first time with an user via OAuth","expected_result":"","data":"","steps":[]},{"position":7,"action":"On the LDAP, change the information from the user","expected_result":"","data":"e.g: Change the name and the avatar","steps":[]},{"position":8,"action":"Go to **Workspace > Settings > LDAP > Enterprise**","expected_result":"","data":"","steps":[]},{"position":9,"action":"Click on \"Sync Now\"","expected_result":"","data":"","steps":[]},{"position":10,"action":"Go to Workspace -> Users","expected_result":"","data":"","steps":[]},{"position":11,"action":"Validate the information from the oAuth User","expected_result":"The name and avatar should be updated to match with LDAP","data":"","steps":[]}],"tags":[],"params":[],"is_muted":"no"}]}],"cases":[]},{"id":593,"title":"Settings","description":null,"preconditions":null,"suites":[{"id":804,"title":"Accounts","description":null,"preconditions":null,"suites":[{"id":805,"title":"Registration","description":null,"preconditions":null,"suites":[],"cases":[{"id":2969,"title":"Enable Manually Approve New Users","description":null,"preconditions":null,"postconditions":null,"priority":"high","severity":"major","type":"functional","behavior":"positive","automation":"automated","status":"actual","is_flaky":"no","layer":"e2e","milestone":null,"custom_fields":[],"steps_type":"classic","steps":[{"position":1,"action":"Go to Account > Registration","expected_result":"Able to go","data":"","steps":[]},{"position":2,"action":"Enable the toggle \"Manually enable new users\"","expected_result":"Able to enable","data":"","steps":[]},{"position":3,"action":"Click Save changes","expected_result":"Able to save","data":"","steps":[]},{"position":4,"action":"Make logout","expected_result":"Able to logout","data":"","steps":[]},{"position":5,"action":"Click Create User","expected_result":"Goes to the page create users","data":"","steps":[]},{"position":6,"action":"Fill all the required fields","expected_result":"Able to fill","data":"","steps":[]},{"position":7,"action":"Click Join team","expected_result":"A toast is gonna appear \"Before you can log in, your account must be manually activated by an administrator\"","data":"","steps":[]},{"position":8,"action":"On the login page, fill the username and Password with the user that you just create","expected_result":"A message is gonna appear \"Before you can login, your account must be manually activated by an administrator\"","data":"","steps":[]},{"position":9,"action":"Log in with a Admin","expected_result":"Able to log in","data":"","steps":[]},{"position":10,"action":"Go to Workspace > Users","expected_result":"Able to open the page","data":"","steps":[]},{"position":11,"action":"Find the user that you just create and click","expected_result":"A side menu is going to show","data":"","steps":[]},{"position":12,"action":"Click on the three dots and then click in Activate","expected_result":"The status of user is gonna change from diable to offline","data":"","steps":[]},{"position":13,"action":"Logout","expected_result":"Able to logout","data":"","steps":[]},{"position":14,"action":"Try again login with the user that you created","expected_result":"is redirect to the home page.","data":"","steps":[]}],"tags":[],"params":[],"is_muted":"no"}]}],"cases":[]},{"id":981,"title":"Messages","description":null,"preconditions":null,"suites":[],"cases":[{"id":3517,"title":"Validate auto cleanup functionality on OEmbed cache","description":null,"preconditions":null,"postconditions":null,"priority":"undefined","severity":"normal","type":"other","behavior":"undefined","automation":"is-not-automated","status":"actual","is_flaky":"no","layer":"unknown","milestone":null,"custom_fields":[{"id":1,"internal_id":1,"title":"Automation/Manual Link","type":1,"value":"Not Automated"}],"steps_type":"classic","steps":[{"position":1,"action":"Send some messages containing links with previews","expected_result":"","data":"","steps":[]},{"position":2,"action":"Go to\u00a0**Workspace > Settings > Message**","expected_result":"","data":"","steps":[]},{"position":3,"action":"Set the Embed Cache Expiration Days setting to a specific value (e.g., 0 days).","expected_result":"","data":"","steps":[]},{"position":4,"action":"Change the Cron job value in the code","expected_result":"","data":"The cron job runs everydat at 2:24am (this can be changed in\u00a0[this line](https://github.com/RocketChat/Rocket.Chat/pull/31336/files#diff-21161a95fbf3394faa4f2af4add5e90d8eeeb279694d3107c86f834c41059e99R6)\u00a0for test purposes -- use it as\u00a0`* * * * *`\u00a0to run every minute, for example).","steps":[]},{"position":5,"action":"Wait the time set for the cron job to run","expected_result":"A cron job to erase all OEmbed cache registries older than\u00a0`Embed Cache Expiration`\u00a0days should be erased from the database (there should be no document in the\u00a0`rocketchat_oembed_cache collection`\u00a0with an\u00a0`updatedAt`\u00a0field older than defined in the setting).","data":"","steps":[]}],"tags":[],"params":[],"is_muted":"no"}]}],"cases":[]}],"cases":[]},{"id":607,"title":"Chat","description":null,"preconditions":null,"suites":[{"id":272,"title":"Messages","description":"General Test Cases for using the message composer and dealing with messages in the chat of a channel","preconditions":null,"suites":[],"cases":[{"id":2280,"title":"Attachment description and attachment preview size","description":"In this task fixed the bug where the attachment description would break to match the preview attachment size. In this test case, we want to make sure the attachment is not breaking regardless of the room type.","preconditions":"* You need to have an image file in your computer","postconditions":null,"priority":"undefined","severity":"normal","type":"other","behavior":"undefined","automation":"is-not-automated","status":"actual","is_flaky":"no","layer":"unknown","milestone":null,"custom_fields":[],"steps_type":"classic","steps":[{"position":1,"action":"Login the server","expected_result":"","data":"","steps":[]},{"position":2,"action":"Create a room","expected_result":"","data":"","steps":[]},{"position":3,"action":"Open the room and on the message composer, click on \u201c+\u201d \u2192 \u201cComputer\u201d","expected_result":"","data":"","steps":[]},{"position":4,"action":"Select an image from your computer","expected_result":"","data":"","steps":[]},{"position":5,"action":"Add the file description as a long text","expected_result":"","data":"You can use the text generated by this website: https://www.lipsum.com/","steps":[]},{"position":6,"action":"Send the image","expected_result":"The text should fill in the screen and not break lines before it","data":"","steps":[]}],"tags":[],"params":[{"title":"room","values":["channel","team","direct message","discussion"]}],"is_muted":"no"}]}],"cases":[]}],"cases":[]}]} \ No newline at end of file diff --git a/.cursor/rules/playwright.mdc b/.cursor/rules/playwright.mdc new file mode 100644 index 0000000000000..1276ee2ce715d --- /dev/null +++ b/.cursor/rules/playwright.mdc @@ -0,0 +1,67 @@ +--- +description: +globs: +alwaysApply: false +--- +# Cursor AI Rules for Playwright Test Development + +## Context & Role +You are a Senior QA Automation Engineer with deep expertise in: +- TypeScript/JavaScript development +- Playwright end-to-end testing framework +- Frontend/Backend testing strategies +- Rocket.Chat application testing + +## Code Quality Standards +- Write concise, technical TypeScript/JavaScript with accurate typing +- Use descriptive test names that clearly communicate expected behavior +- Follow DRY (Do not Repeat Yourself) principles by extracting reusable logic into helper functions +- Avoid code comments in the implementation + +## File Structure & Organization +- **Test Location**: All test files must be created in `apps/meteor/tests/e2e/` +- **Page Objects**: Utilize existing page objects pattern from `apps/meteor/tests/e2e/page-objects/` +- **File Naming**: Use `.spec.ts` extension (e.g., `login.spec.ts`) +- **Configuration**: Reference `playwright.config.ts` for global settings + +## Playwright Best Practices + +### Locator Strategy +- **Avoid using `page.locator()`** - always prefer semantic locators, such as: + - `page.getByRole()` for interactive elements + - `page.getByLabel()` for form fields + - `page.getByText()` for text content + - `page.getByTitle()` for titled elements +- Store commonly used locators in variables/constants for reuse + +### Test Structure +- Use `test.beforeAll()` and `test.afterAll()` for setup/teardown +- Use `test.step()` for complex test scenarios to improve organization +- Group related tests in the same file +- Utilize Playwright fixtures (`test`, `page`, `expect`) for consistency + +### Assertions & Waiting +- Prefer to use web-first assertions (`toBeVisible`, `toHaveText`, etc.) whenever possible +- Use `expect` matchers for assertions (`toEqual`, `toContain`, `toBeTruthy`, `toHaveLength`, etc.) that can be used to assert any conditions and avoid using `assert` statements +- Use `page.waitFor()` with specific conditions instead of hardcoded timeouts +- Implement proper wait strategies for dynamic content + +### Architecture Patterns +- Follow Page Object Model pattern consistently +- Maintain test isolation between test cases +- Ensure clean state for each test execution +- Ensure tests run reliably in parallel without shared state conflicts +- Reuse existing test files when appropriate, create new ones when needed + +## Reference Documentation +- Primary: [Playwright Testing Guide](mdc:https:/playwright.dev/docs/writing-tests) +- Secondary: [Rocket.Chat Documentation](mdc:https:/docs.rocket.chat/docs/rocketchat) + +## Expected Output Format +When generating tests, provide: +1. Complete, runnable TypeScript test files +2. Proper import statements and dependencies +3. Well-structured test suites with clear describe/test blocks +4. Implementation that follows all above guidelines without deviation + +Focus on creating maintainable, reliable end-to-end tests that accurately reflect user workflows and system behavior. diff --git a/.cursor/rules/test-cases.mdc b/.cursor/rules/test-cases.mdc new file mode 100644 index 0000000000000..71afc52f71941 --- /dev/null +++ b/.cursor/rules/test-cases.mdc @@ -0,0 +1,63 @@ +--- +description: +globs: +alwaysApply: false +--- +# Cursor AI Rules for Manual Test Case Creation + +## Context & Role +You are a Senior QA Engineer at Rocket.Chat, responsible for designing high-quality manual test cases that ensure product stability and comprehensive feature coverage. You deliver clear, concise tests that enable effective validation and maintain consistent quality standards. + +## Required Context Files +**MANDATORY**: Always load these files into context before creating test cases: +- [test-cases.json](mdc:.cursor/files/test-cases.json) - Reference format and existing test case structures + +## Test Case Standards + +### Quality Requirements +- Write test cases in Markdown format following the standardized template +- Include ALL necessary components: Title, Description, Preconditions, Type, Steps, and Expected Result +- Ensure steps are clear, concise, and reproducible by any team member +- Keep naming consistent and easy to search or filter in reports +- Focus on comprehensive feature coverage and edge case validation + +### Test Type Classification +Define the most appropriate test type for each scenario: +- **API**: Backend service testing, data validation, integration points +- **E2E**: Complete user workflows, cross-system functionality +- **Unit**: Individual component or function testing + +### Content Guidelines +- Use descriptive, searchable titles that clearly identify the feature being tested +- Write concise descriptions that explain the test's purpose +- List specific preconditions required before test execution +- Create step-by-step instructions that any team member can follow +- Define clear, measurable expected results + +## Standard Test Case Format + +```markdown +## Test Case: [Descriptive Title] +**Description**: [Short, clear description of what is being tested] +**Preconditions**: [List of required setup conditions] +**Type:** [api/e2e/unit] + +**Steps**: +1. [step 1] +2. [step 2] +**Expected Result**: [Specific, measurable expected outcome] +``` + +## Reference Documentation +- Primary: [Rocket.Chat Documentation](https://docs.rocket.chat/docs/rocketchat) +- Context: Use provided reference files for implementation guidance + +## Expected Output Format +When creating test cases, provide: +1. Complete test cases following the exact markdown format +2. Appropriate test type classification based on scope +3. Comprehensive step coverage without gaps +4. Clear, actionable instructions for manual execution +5. Specific expected results that can be validated + +Focus on creating test cases that can later be converted into automated tests while ensuring thorough manual validation coverage. diff --git a/.github/actions/build-docker/action.yml b/.github/actions/build-docker/action.yml index 5bc982877ad0f..60d197325bed8 100644 --- a/.github/actions/build-docker/action.yml +++ b/.github/actions/build-docker/action.yml @@ -85,11 +85,6 @@ runs: - run: yarn build if: inputs.setup == 'true' shell: bash - - if: ${{ inputs.platform == 'alpine' }} - uses: actions/cache@v4 - with: - path: /tmp/build/matrix-sdk-crypto.linux-x64-musl.node - key: matrix-rust-sdk-crypto-nodejs-v0.2.0-beta.1 - name: Build Docker images shell: bash diff --git a/.github/actions/meteor-build/action.yml b/.github/actions/meteor-build/action.yml index bfd4ae7f5c204..f0a61915616f1 100644 --- a/.github/actions/meteor-build/action.yml +++ b/.github/actions/meteor-build/action.yml @@ -102,10 +102,6 @@ runs: - uses: rharkor/caching-for-turbo@v1.5 - - name: Translation check - shell: bash - run: yarn turbo run translation-check - - name: Reset Meteor shell: bash if: ${{ inputs.reset-meteor == 'true' }} @@ -126,6 +122,10 @@ runs: yarn build:ci + - name: Translation check + shell: bash + run: yarn turbo run translation-check + - name: Prepare build shell: bash run: | diff --git a/.github/actions/update-version-durability/action.yml b/.github/actions/update-version-durability/action.yml index 803158ae1a25b..84af3f8911e68 100644 --- a/.github/actions/update-version-durability/action.yml +++ b/.github/actions/update-version-durability/action.yml @@ -2,6 +2,10 @@ name: Update Version Durability description: Update Version Durability page on Document360 inputs: + LTS_VERSIONS: + required: true + description: Comma separated list of LTS versions + type: string GH_TOKEN: required: true description: GitHub API Token diff --git a/.github/actions/update-version-durability/index.js b/.github/actions/update-version-durability/index.js index b05b9e9ca7693..2065ac6660827 100644 --- a/.github/actions/update-version-durability/index.js +++ b/.github/actions/update-version-durability/index.js @@ -12,6 +12,7 @@ import { Octokit } from '@octokit/rest'; const D360_TOKEN = core.getInput('D360_TOKEN'); const D360_ARTICLE_ID = core.getInput('D360_ARTICLE_ID'); const PUBLISH = core.getInput('PUBLISH') === 'true'; +const LTS_VERSIONS = (core.getInput('LTS_VERSIONS') || '7.10').split(',').map((v) => v.trim()); const octokit = new Octokit({ auth: core.getInput('GH_TOKEN'), @@ -79,6 +80,11 @@ async function generateTable({ owner, repo } = {}) { continue; } + // Mark LTS + if (LTS_VERSIONS.includes(`${currentVersion.major}.${currentVersion.minor}`)) { + release.lts = true; + } + index++; } @@ -97,7 +103,7 @@ async function generateTable({ owner, repo } = {}) { minorDate.setDate(1); supportDateStart = minorDate; supportDate = new Date(minorDate); - supportDate.setMonth(supportDate.getMonth() + (lts ? 6 : 6)); + supportDate.setMonth(supportDate.getMonth() + (lts ? 9 : 6)); releaseData.push({ release: { @@ -145,7 +151,7 @@ async function generateTable({ owner, repo } = {}) { const endOfLife = !release.extendedSupport ? 'TBD' : release.extendedSupport.end.toLocaleString('en', { month: 'short', year: "numeric" }); - const link = `${release.version} (${latestPatch.version})`; + const link = `${release.version}${release.lts ? " LTS" : ""} (${latestPatch.version})`; text.push( '
1024,C&&(t.dump&&W2===t.dump.charCodeAt(0)?S+="?":S+="? "),S+=t.dump,C&&(S+=rU(t,e)),Qd(t,e+1,E,!0,C)&&(t.dump&&W2===t.dump.charCodeAt(0)?S+=":":S+=": ",S+=t.dump,a+=S));t.tag=n,t.dump=a||"{}"}function Cre(t,e,r){var s,a,n,c,f,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,c=a.length;n 1024,w&&(t.dump&&G2===t.dump.charCodeAt(0)?S+="?":S+="? "),S+=t.dump,w&&(S+=ZU(t,e)),Rd(t,e+1,E,!0,w)&&(t.dump&&G2===t.dump.charCodeAt(0)?S+=":":S+=": ",S+=t.dump,a+=S));t.tag=n,t.dump=a||"{}"}function _te(t,e,r){var s,a,n,c,f,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,c=a.length;n {var n,c;if(Object.getPrototypeOf(s).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f=[...s],p=[...s];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,C)=>E!==f[C])?new Set(p):s;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",Z2(a.coercion,s,h)]),!0}else{let f=!0;for(let p of s)if(f=t(p,Object.assign({},a))&&f,!f&&a?.errors==null)break;return f}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f={value:s};return r(s,Object.assign(Object.assign({},a),{coercion:Yf(f,"value")}))?(a.coercions.push([(c=a.p)!==null&&c!==void 0?c:".",Z2(a.coercion,s,()=>new Set(f.value))]),!0):!1}return mr(a,`Expected a set (got ${ti(s)})`)}})}function Jze(t,e){let r=Ux(Hx([t,e])),s=jx(e,{keys:t});return Wr({test:(a,n)=>{var c,f,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let C=()=>E.some((S,P)=>S[0]!==h[P][0]||S[1]!==h[P][1])?new Map(E):a;return n.coercions.push([(c=n.p)!==null&&c!==void 0?c:".",Z2(n.coercion,a,C)]),!0}else{let h=!0;for(let[E,C]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(C,Object.assign(Object.assign({},n),{p:a0(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(f=n.p)!==null&&f!==void 0?f:".",Z2(n.coercion,a,()=>new Map(h.value))]),!0):!1:s(a,Object.assign(Object.assign({},n),{coercion:Yf(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",Z2(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return mr(n,`Expected a map (got ${ti(a)})`)}})}function Hx(t,{delimiter:e}={}){let r=ane(t.length);return Wr({test:(s,a)=>{var n;if(typeof s=="string"&&typeof e<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");s=s.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)])}if(!Array.isArray(s))return mr(a,`Expected a tuple (got ${ti(s)})`);let c=r(s,Object.assign({},a));for(let f=0,p=s.length;f {var n;if(Array.isArray(s)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?mr(a,"Unbound coercion result"):r(s,Object.assign(Object.assign({},a),{coercion:void 0}))?(s=Object.fromEntries(s),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)]),!0):!1;if(typeof s!="object"||s===null)return mr(a,`Expected an object (got ${ti(s)})`);let c=Object.keys(s),f=!0;for(let p=0,h=c.length;p {var n,c;if(Object.getPrototypeOf(s).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f=[...s],p=[...s];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,w)=>E!==f[w])?new Set(p):s;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",K2(a.coercion,s,h)]),!0}else{let f=!0;for(let p of s)if(f=t(p,Object.assign({},a))&&f,!f&&a?.errors==null)break;return f}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f={value:s};return r(s,Object.assign(Object.assign({},a),{coercion:Wf(f,"value")}))?(a.coercions.push([(c=a.p)!==null&&c!==void 0?c:".",K2(a.coercion,s,()=>new Set(f.value))]),!0):!1}return mr(a,`Expected a set (got ${ti(s)})`)}})}function PWe(t,e){let r=xx(kx([t,e])),s=Qx(e,{keys:t});return Wr({test:(a,n)=>{var c,f,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let w=()=>E.some((S,x)=>S[0]!==h[x][0]||S[1]!==h[x][1])?new Map(E):a;return n.coercions.push([(c=n.p)!==null&&c!==void 0?c:".",K2(n.coercion,a,w)]),!0}else{let h=!0;for(let[E,w]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(w,Object.assign(Object.assign({},n),{p:s0(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(f=n.p)!==null&&f!==void 0?f:".",K2(n.coercion,a,()=>new Map(h.value))]),!0):!1:s(a,Object.assign(Object.assign({},n),{coercion:Wf(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",K2(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return mr(n,`Expected a map (got ${ti(a)})`)}})}function kx(t,{delimiter:e}={}){let r=Dre(t.length);return Wr({test:(s,a)=>{var n;if(typeof s=="string"&&typeof e<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");s=s.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)])}if(!Array.isArray(s))return mr(a,`Expected a tuple (got ${ti(s)})`);let c=r(s,Object.assign({},a));for(let f=0,p=s.length;f {var n;if(Array.isArray(s)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?mr(a,"Unbound coercion result"):r(s,Object.assign(Object.assign({},a),{coercion:void 0}))?(s=Object.fromEntries(s),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)]),!0):!1;if(typeof s!="object"||s===null)return mr(a,`Expected an object (got ${ti(s)})`);let c=Object.keys(s),f=!0;for(let p=0,h=c.length;p `:`[${P}]`)}s.push(...this.arity.leading.map(c=>`<${c}>`)),this.arity.extra===jl?s.push("..."):s.push(...this.arity.extra.map(c=>`[${c}]`)),s.push(...this.arity.trailing.map(c=>`<${c}>`))}return{usage:s.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=cne(),r=En.InitialNode,s=this.usage().usage,a=this.options.filter(f=>f.required).map(f=>f.nameSet);r=Mu(e,Hl()),Ca(e,En.InitialNode,ei.StartOfInput,r,["setCandidateState",{candidateUsage:s,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",c=this.paths.length>0?this.paths:[[]];for(let f of c){let p=r;if(f.length>0){let S=Mu(e,Hl());CE(e,p,S),this.registerOptions(e,S),p=S}for(let S=0;S `:`[${x}]`)}s.push(...this.arity.leading.map(c=>`<${c}>`)),this.arity.extra===Hl?s.push("..."):s.push(...this.arity.extra.map(c=>`[${c}]`)),s.push(...this.arity.trailing.map(c=>`<${c}>`))}return{usage:s.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=Pre(),r=En.InitialNode,s=this.usage().usage,a=this.options.filter(f=>f.required).map(f=>f.nameSet);r=Ou(e,_l()),Ea(e,En.InitialNode,ei.StartOfInput,r,["setCandidateState",{candidateUsage:s,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",c=this.paths.length>0?this.paths:[[]];for(let f of c){let p=r;if(f.length>0){let S=Ou(e,_l());wE(e,p,S),this.registerOptions(e,S),p=S}for(let S=0;S {var Fat=f0(),Nat=Pc(),Oat=Fat(Nat,"DataView");hue.exports=Oat});var mue=L((qVt,due)=>{var Lat=f0(),Mat=Pc(),_at=Lat(Mat,"Promise");due.exports=_at});var Eue=L((GVt,yue)=>{var Uat=f0(),Hat=Pc(),jat=Uat(Hat,"Set");yue.exports=jat});var Cue=L((WVt,Iue)=>{var qat=f0(),Gat=Pc(),Wat=qat(Gat,"WeakMap");Iue.exports=Wat});var FB=L((YVt,Pue)=>{var N4=gue(),O4=Dk(),L4=mue(),M4=Eue(),_4=Cue(),bue=Wd(),UE=S4(),wue="[object Map]",Yat="[object Object]",Bue="[object Promise]",vue="[object Set]",Sue="[object WeakMap]",Due="[object DataView]",Vat=UE(N4),Kat=UE(O4),Jat=UE(L4),zat=UE(M4),Zat=UE(_4),Yd=bue;(N4&&Yd(new N4(new ArrayBuffer(1)))!=Due||O4&&Yd(new O4)!=wue||L4&&Yd(L4.resolve())!=Bue||M4&&Yd(new M4)!=vue||_4&&Yd(new _4)!=Sue)&&(Yd=function(t){var e=bue(t),r=e==Yat?t.constructor:void 0,s=r?UE(r):"";if(s)switch(s){case Vat:return Due;case Kat:return wue;case Jat:return Bue;case zat:return vue;case Zat:return Sue}return e});Pue.exports=Yd});var Oue=L((VVt,Nue)=>{var U4=Pk(),Xat=D4(),$at=vce(),elt=pue(),xue=FB(),kue=xc(),Que=xB(),tlt=Nk(),rlt=1,Tue="[object Arguments]",Rue="[object Array]",Mk="[object Object]",nlt=Object.prototype,Fue=nlt.hasOwnProperty;function ilt(t,e,r,s,a,n){var c=kue(t),f=kue(e),p=c?Rue:xue(t),h=f?Rue:xue(e);p=p==Tue?Mk:p,h=h==Tue?Mk:h;var E=p==Mk,C=h==Mk,S=p==h;if(S&&Que(t)){if(!Que(e))return!1;c=!0,E=!1}if(S&&!E)return n||(n=new U4),c||tlt(t)?Xat(t,e,r,s,a,n):$at(t,e,p,r,s,a,n);if(!(r&rlt)){var P=E&&Fue.call(t,"__wrapped__"),I=C&&Fue.call(e,"__wrapped__");if(P||I){var R=P?t.value():t,N=I?e.value():e;return n||(n=new U4),a(R,N,r,s,n)}}return S?(n||(n=new U4),elt(t,e,r,s,a,n)):!1}Nue.exports=ilt});var Uue=L((KVt,_ue)=>{var slt=Oue(),Lue=zf();function Mue(t,e,r,s,a){return t===e?!0:t==null||e==null||!Lue(t)&&!Lue(e)?t!==t&&e!==e:slt(t,e,r,s,Mue,a)}_ue.exports=Mue});var jue=L((JVt,Hue)=>{var olt=Uue();function alt(t,e){return olt(t,e)}Hue.exports=alt});var H4=L((zVt,que)=>{var llt=f0(),clt=function(){try{var t=llt(Object,"defineProperty");return t({},"",{}),t}catch{}}();que.exports=clt});var _k=L((ZVt,Wue)=>{var Gue=H4();function ult(t,e,r){e=="__proto__"&&Gue?Gue(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}Wue.exports=ult});var j4=L((XVt,Yue)=>{var flt=_k(),Alt=RE();function plt(t,e,r){(r!==void 0&&!Alt(t[e],r)||r===void 0&&!(e in t))&&flt(t,e,r)}Yue.exports=plt});var Kue=L(($Vt,Vue)=>{function hlt(t){return function(e,r,s){for(var a=-1,n=Object(e),c=s(e),f=c.length;f--;){var p=c[t?f:++a];if(r(n[p],p,n)===!1)break}return e}}Vue.exports=hlt});var zue=L((e7t,Jue)=>{var glt=Kue(),dlt=glt();Jue.exports=dlt});var q4=L((NB,HE)=>{var mlt=Pc(),efe=typeof NB=="object"&&NB&&!NB.nodeType&&NB,Zue=efe&&typeof HE=="object"&&HE&&!HE.nodeType&&HE,ylt=Zue&&Zue.exports===efe,Xue=ylt?mlt.Buffer:void 0,$ue=Xue?Xue.allocUnsafe:void 0;function Elt(t,e){if(e)return t.slice();var r=t.length,s=$ue?$ue(r):new t.constructor(r);return t.copy(s),s}HE.exports=Elt});var Uk=L((t7t,rfe)=>{var tfe=b4();function Ilt(t){var e=new t.constructor(t.byteLength);return new tfe(e).set(new tfe(t)),e}rfe.exports=Ilt});var G4=L((r7t,nfe)=>{var Clt=Uk();function wlt(t,e){var r=e?Clt(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}nfe.exports=wlt});var Hk=L((n7t,ife)=>{function Blt(t,e){var r=-1,s=t.length;for(e||(e=Array(s));++r1)r=e;else if(this.head)s=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;s!==null;a++)r=t(r,s.value,a),s=s.next;return r};Fn.prototype.reduceReverse=function(t,e){var r,s=this.tail;if(arguments.length>1)r=e;else if(this.tail)s=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;s!==null;a--)r=t(r,s.value,a),s=s.prev;return r};Fn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Fn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Fn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Fn;if(e1)r=e;else if(this.head)s=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;s!==null;a++)r=t(r,s.value,a),s=s.next;return r};Fn.prototype.reduceReverse=function(t,e){var r,s=this.tail;if(arguments.length>1)r=e;else if(this.tail)s=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;s!==null;a--)r=t(r,s.value,a),s=s.prev;return r};Fn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Fn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Fn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Fn;if(e0&&(fe=p.slice(0,E),p=p.slice(E),C-=E),ye&&I===!0&&C>0?(ye=p.slice(0,C),se=p.slice(C)):I===!0?(ye="",se=p):ye=p,ye&&ye!==""&&ye!=="/"&&ye!==p&&hae(ye.charCodeAt(ye.length-1))&&(ye=ye.slice(0,-1)),r.unescape===!0&&(se&&(se=fae.removeBackslashes(se)),ye&&W===!0&&(ye=fae.removeBackslashes(ye)));let X={prefix:fe,input:t,start:E,base:ye,glob:se,isBrace:S,isBracket:P,isGlob:I,isExtglob:R,isGlobstar:N,negated:te,negatedExtglob:ie};if(r.tokens===!0&&(X.maxDepth=0,hae(pe)||c.push(Be),X.tokens=c),r.parts===!0||r.tokens===!0){let De;for(let Re=0;Re{function fst(t,e){return t.has(e)}Ace.exports=fst});var D4=L((AVt,hce)=>{var Ast=cce(),pst=fce(),hst=pce(),gst=1,dst=2;function mst(t,e,r,s,a,n){var c=r&gst,f=t.length,p=e.length;if(f!=p&&!(c&&p>f))return!1;var h=n.get(t),E=n.get(e);if(h&&E)return h==e&&E==t;var C=-1,S=!0,P=r&dst?new Ast:void 0;for(n.set(t,e),n.set(e,t);++C{var Hst=Array.isArray;Dce.exports=Hst});var x4=L((EVt,bce)=>{var jst=kk(),qst=xc();function Gst(t,e,r){var s=e(t);return qst(t)?s:jst(s,r(t))}bce.exports=Gst});var xce=L((IVt,Pce)=>{function Wst(t,e){for(var r=-1,s=t==null?0:t.length,a=0,n=[];++r{function Yst(){return[]}kce.exports=Yst});var Qk=L((wVt,Tce)=>{var Vst=xce(),Kst=k4(),Jst=Object.prototype,zst=Jst.propertyIsEnumerable,Qce=Object.getOwnPropertySymbols,Zst=Qce?function(t){return t==null?[]:(t=Object(t),Vst(Qce(t),function(e){return zst.call(t,e)}))}:Kst;Tce.exports=Zst});var Fce=L((BVt,Rce)=>{function Xst(t,e){for(var r=-1,s=Array(t);++r{var vlt=Wl(),sfe=Object.create,Slt=function(){function t(){}return function(e){if(!vlt(e))return{};if(sfe)return sfe(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();ofe.exports=Slt});var jk=L((s7t,lfe)=>{var Dlt=R4(),blt=Dlt(Object.getPrototypeOf,Object);lfe.exports=blt});var W4=L((o7t,cfe)=>{var Plt=afe(),xlt=jk(),klt=Ok();function Qlt(t){return typeof t.constructor=="function"&&!klt(t)?Plt(xlt(t)):{}}cfe.exports=Qlt});var ffe=L((a7t,ufe)=>{var Tlt=RB(),Rlt=zf();function Flt(t){return Rlt(t)&&Tlt(t)}ufe.exports=Flt});var Y4=L((l7t,pfe)=>{var Nlt=Wd(),Olt=jk(),Llt=zf(),Mlt="[object Object]",_lt=Function.prototype,Ult=Object.prototype,Afe=_lt.toString,Hlt=Ult.hasOwnProperty,jlt=Afe.call(Object);function qlt(t){if(!Llt(t)||Nlt(t)!=Mlt)return!1;var e=Olt(t);if(e===null)return!0;var r=Hlt.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&Afe.call(r)==jlt}pfe.exports=qlt});var V4=L((c7t,hfe)=>{function Glt(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}hfe.exports=Glt});var qk=L((u7t,gfe)=>{var Wlt=_k(),Ylt=RE(),Vlt=Object.prototype,Klt=Vlt.hasOwnProperty;function Jlt(t,e,r){var s=t[e];(!(Klt.call(t,e)&&Ylt(s,r))||r===void 0&&!(e in t))&&Wlt(t,e,r)}gfe.exports=Jlt});var Vd=L((f7t,dfe)=>{var zlt=qk(),Zlt=_k();function Xlt(t,e,r,s){var a=!r;r||(r={});for(var n=-1,c=e.length;++n("lookup"in r||(r.lookup=this.lookup),e[pI](r,s))}uninstall(e){if(Xhe(e),e[pI]){if(e[EH]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[pI],delete e[pI],delete e[EH]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=$he(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};IH.exports=_Q;IH.exports.default=_Q});var s0e=L((vJt,CH)=>{"use strict";var _ht=typeof URL>"u"?Ie("url").URL:URL,Uht="text/plain",Hht="us-ascii",n0e=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),jht=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let s=r[1].split(";"),a=r[2],n=e?"":r[3],c=!1;s[s.length-1]==="base64"&&(s.pop(),c=!0);let f=(s.shift()||"").toLowerCase(),h=[...s.map(E=>{let[C,S=""]=E.split("=").map(P=>P.trim());return C==="charset"&&(S=S.toLowerCase(),S===Hht)?"":`${C}${S?`=${S}`:""}`}).filter(Boolean)];return c&&h.push("base64"),(h.length!==0||f&&f!==Uht)&&h.unshift(f),`data:${h.join(";")},${c?a.trim():a}${n?`#${n}`:""}`},i0e=(t,e)=>{if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return jht(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new _ht(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash&&(a.hash=""),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\/{2,}/g,(n,c)=>/^(?!\/)/g.test(c)?`${c}/`:"/")),a.pathname&&(a.pathname=decodeURI(a.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let n=a.pathname.split("/"),c=n[n.length-1];n0e(c,e.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let n of[...a.searchParams.keys()])n0e(n,e.removeQueryParameters)&&a.searchParams.delete(n);return e.sortQueryParameters&&a.searchParams.sort(),e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,"")),t=a.toString(),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};CH.exports=i0e;CH.exports.default=i0e});var l0e=L((SJt,a0e)=>{a0e.exports=o0e;function o0e(t,e){if(t&&e)return o0e(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(s){r[s]=t[s]}),r;function r(){for(var s=new Array(arguments.length),a=0;a0&&(Ae=p.slice(0,E),p=p.slice(E),w-=E),ye&&I===!0&&w>0?(ye=p.slice(0,w),se=p.slice(w)):I===!0?(ye="",se=p):ye=p,ye&&ye!==""&&ye!=="/"&&ye!==p&&Toe(ye.charCodeAt(ye.length-1))&&(ye=ye.slice(0,-1)),r.unescape===!0&&(se&&(se=koe.removeBackslashes(se)),ye&&W===!0&&(ye=koe.removeBackslashes(ye)));let X={prefix:Ae,input:t,start:E,base:ye,glob:se,isBrace:S,isBracket:x,isGlob:I,isExtglob:T,isGlobstar:N,negated:ee,negatedExtglob:ie};if(r.tokens===!0&&(X.maxDepth=0,Toe(pe)||c.push(Be),X.tokens=c),r.parts===!0||r.tokens===!0){let De;for(let Te=0;Te