diff --git a/.vscode/dictionaries/non-english.txt b/.vscode/dictionaries/non-english.txt index b5b7b57a8d1eec0..34fc0df176ff51e 100644 --- a/.vscode/dictionaries/non-english.txt +++ b/.vscode/dictionaries/non-english.txt @@ -18,9 +18,11 @@ dezembro Donnerstag démonstration erkennst +español Esta Februar fers +français française Früh gangnam diff --git a/.vscode/dictionaries/terms-abbreviations.txt b/.vscode/dictionaries/terms-abbreviations.txt index defc2b74bdd8224..c1b55082d726f0f 100644 --- a/.vscode/dictionaries/terms-abbreviations.txt +++ b/.vscode/dictionaries/terms-abbreviations.txt @@ -284,6 +284,7 @@ iconset idents IERS IMSC +inferencing infobar infobox infoboxes diff --git a/files/en-us/_redirects.txt b/files/en-us/_redirects.txt index aef2f18b8ce81c7..3b696c435016589 100644 --- a/files/en-us/_redirects.txt +++ b/files/en-us/_redirects.txt @@ -1110,7 +1110,7 @@ /en-US/docs/Common_CSS_Questions /en-US/docs/Learn_web_development/Howto/Solve_CSS_problems/CSS_FAQ /en-US/docs/Common_XSLT_Errors /en-US/docs/Web/XSLT/Common_errors /en-US/docs/Configuring_Build_Options https://firefox-source-docs.mozilla.org/setup/configuring_build_options.html -/en-US/docs/Configuring_servers_for_Ogg_media /en-US/docs/Web/HTTP/Configuring_servers_for_Ogg_media +/en-US/docs/Configuring_servers_for_Ogg_media /en-US/docs/Web/Media/Formats/Configuring_servers_for_Ogg_media /en-US/docs/Consistent_List_Indentation /en-US/docs/Web/CSS/CSS_lists/Consistent_list_indentation /en-US/docs/Const_statement /en-US/docs/Web/JavaScript/Reference/Statements/const /en-US/docs/Content_negotiation /en-US/docs/Web/HTTP/Content_negotiation @@ -12674,6 +12674,7 @@ /en-US/docs/Web/HTTP/Basics_of_HTTP/Resource_URLs /en-US/docs/Web/URI/Schemes/resource /en-US/docs/Web/HTTP/CORS/Errors/Reason:_CORS_header_‘Origin’_cannot_be_added /en-US/docs/Web/HTTP/CORS/Errors/CORSOriginHeaderNotAdded /en-US/docs/Web/HTTP/Caching_FAQ /en-US/docs/Web/HTTP/Caching +/en-US/docs/Web/HTTP/Configuring_servers_for_Ogg_media /en-US/docs/Web/Media/Formats/Configuring_servers_for_Ogg_media /en-US/docs/Web/HTTP/Controlling_DNS_prefetching /en-US/docs/Web/HTTP/Headers/X-DNS-Prefetch-Control /en-US/docs/Web/HTTP/Cookies/Cookie_Prefixes /en-US/docs/Web/HTTP/Cookies#Cookie_prefixes /en-US/docs/Web/HTTP/Cross-Origin_Resource_Policy_(CORP) /en-US/docs/Web/HTTP/Cross-Origin_Resource_Policy diff --git a/files/en-us/_wikihistory.json b/files/en-us/_wikihistory.json index 4662ea8fb773c0e..5d333d6b210d824 100644 --- a/files/en-us/_wikihistory.json +++ b/files/en-us/_wikihistory.json @@ -98422,24 +98422,6 @@ "teoli" ] }, - "Web/HTTP/Configuring_servers_for_Ogg_media": { - "modified": "2019-09-10T19:10:12.290Z", - "contributors": [ - "Sheppy", - "fscholz", - "bholley", - "chrisdavidmills", - "teoli", - "kscarfone", - "Dikrib", - "Sephr", - "BenB", - "cpearce", - "Zcorpan", - "Varmaa", - "sorinelpusti" - ] - }, "Web/HTTP/Connection_management_in_HTTP_1.x": { "modified": "2019-11-27T11:05:48.174Z", "contributors": [ @@ -122255,6 +122237,24 @@ "modified": "2020-06-01T18:13:20.323Z", "contributors": ["atd30", "Sheppy"] }, + "Web/Media/Formats/Configuring_servers_for_Ogg_media": { + "modified": "2019-09-10T19:10:12.290Z", + "contributors": [ + "Sheppy", + "fscholz", + "bholley", + "chrisdavidmills", + "teoli", + "kscarfone", + "Dikrib", + "Sephr", + "BenB", + "cpearce", + "Zcorpan", + "Varmaa", + "sorinelpusti" + ] + }, "Web/Media/Formats/Containers": { "modified": "2020-04-18T23:02:19.945Z", "contributors": ["sideshowbarker", "FFV47", "Sheppy", "mukhtar-github"] diff --git a/files/en-us/games/publishing_games/game_distribution/index.md b/files/en-us/games/publishing_games/game_distribution/index.md index 4c4cf929a6b7782..5654bc8ce97455a 100644 --- a/files/en-us/games/publishing_games/game_distribution/index.md +++ b/files/en-us/games/publishing_games/game_distribution/index.md @@ -56,7 +56,7 @@ If you're working on a side project just for fun, then leaving the source open w As the name may suggest, publishers can handle the publishing of your game for you. Whether you should go that way or not depends on what your plan is for having your game distributed: Do you want to send it wherever possible, or do you want to restrict its presence to those who've bought an [exclusive license](/en-US/docs/Games/Publishing_games/Game_monetization)? It's up to you. Consider various options, experiment and conclude. Publishers will be explained in more detail in the [monetization](/en-US/docs/Games/Publishing_games/Game_monetization) article. -There are also independent portals collecting interesting games like [HTML5Games.com](https://html5games.com/), [GameArter.com](https://www.gamearter.com/), [MarketJS.com](https://www.marketjs.com/), [GameFlare](https://distribution.gameflare.com/), [GameDistribution.com](https://gamedistribution.com/), [GameSaturn.com](https://gamesaturn.com/), [Poki](https://developers.poki.com/), or [CrazyGames](https://developer.crazygames.com/) where you can send your game in and it will get some natural promotion because of the big traffic those sites attract. Some of these take your files and host them on their server, whereas others only link to your website or embed your game on their site. Such exposure may just provide [promotion](/en-US/docs/Games/Publishing_games/Game_promotion) for your game, or if you have adverts shown beside your game (or other money making options) it may also provide monetization. +There are also independent portals collecting interesting games like [HTML5Games.com](https://html5games.com/), [GameArter.com](https://www.gamearter.com/), [MarketJS.com](https://www.marketjs.com/), [GameFlare](https://distribution.gameflare.com/), [GameDistribution.com](https://gamedistribution.com/), [GameSaturn.com](https://gamesaturn.com/), [Playmox.com](https://www.playmox.com/), [Poki](https://developers.poki.com/), or [CrazyGames](https://developer.crazygames.com/) where you can send your game in and it will get some natural promotion because of the big traffic those sites attract. Some of these take your files and host them on their server, whereas others only link to your website or embed your game on their site. Such exposure may just provide [promotion](/en-US/docs/Games/Publishing_games/Game_promotion) for your game, or if you have adverts shown beside your game (or other money making options) it may also provide monetization. ### Web and native stores diff --git a/files/en-us/learn_web_development/core/styling_basics/values_tasks/index.md b/files/en-us/learn_web_development/core/styling_basics/values_tasks/index.md index 5e5ae54ace07886..bdabf7bad553513 100644 --- a/files/en-us/learn_web_development/core/styling_basics/values_tasks/index.md +++ b/files/en-us/learn_web_development/core/styling_basics/values_tasks/index.md @@ -196,7 +196,7 @@ Try to update the code below to recreate the finished example:
Click here to show the solution -Use `background-position` with ther `center` keyword and a percentage: +Use `background-position` with the `center` keyword and a percentage: ```css .box { diff --git a/files/en-us/learn_web_development/extensions/client-side_tools/introducing_complete_toolchain/index.md b/files/en-us/learn_web_development/extensions/client-side_tools/introducing_complete_toolchain/index.md index d5e7d43f633ce79..29b3c8204b5e4a0 100644 --- a/files/en-us/learn_web_development/extensions/client-side_tools/introducing_complete_toolchain/index.md +++ b/files/en-us/learn_web_development/extensions/client-side_tools/introducing_complete_toolchain/index.md @@ -64,7 +64,7 @@ For our sample project, we'll be using a toolchain specifically designed to aid ## Checking prerequisites -You should have most of the softwares already if you've been following along with the previous chapters. Here's what you should have before proceeding to the real setup steps. They only need to be done once and you don't need to repeat these again for future projects. +You should have most of the pieces of software already if you've been following along with the previous chapters. Here's what you should have before proceeding to the real setup steps. They only need to be done once and you don't need to repeat these again for future projects. ### Creating a GitHub account diff --git a/files/en-us/learn_web_development/extensions/server-side/django/development_environment/index.md b/files/en-us/learn_web_development/extensions/server-side/django/development_environment/index.md index 898e566a5c21d7f..94392fb9ee045e5 100644 --- a/files/en-us/learn_web_development/extensions/server-side/django/development_environment/index.md +++ b/files/en-us/learn_web_development/extensions/server-side/django/development_environment/index.md @@ -407,7 +407,7 @@ For this tutorial we'll hosting our code on [GitHub](https://github.com/), one o > [!NOTE] > Using SCM tools is good software development practice! -> Ths instructions provide a basic introduction to git and GitHub. +> These instructions provide a basic introduction to git and GitHub. > To learn more, see [Learning Git](https://docs.github.com/en/get-started/start-your-journey/git-and-github-learning-resources). ### Key concepts diff --git a/files/en-us/mozilla/add-ons/webextensions/api/identity/launchwebauthflow/index.md b/files/en-us/mozilla/add-ons/webextensions/api/identity/launchwebauthflow/index.md index 0acfd7afa1f2651..f6d6efbed5e13f2 100644 --- a/files/en-us/mozilla/add-ons/webextensions/api/identity/launchwebauthflow/index.md +++ b/files/en-us/mozilla/add-ons/webextensions/api/identity/launchwebauthflow/index.md @@ -44,7 +44,7 @@ let authorizing = browser.identity.launchWebAuthFlow( - : `object`. Options for the flow, containing the following properties: - `url` - - : `string`. The URL offered by the OAuth2 service provider to get an access token. The details of this URL should be given in the documentation for the service provider in question, but the URL parameters should always include: + - : `string`. The URL offered by the OAuth2 service provider to get an access token. The details of this URL should be given in the documentation for the service provider in question, but the URL parameters should always include: the [redirect URL](/en-US/docs/Mozilla/Add-ons/WebExtensions/API/identity#getting_the_redirect_url) and the extension's [client ID](/en-US/docs/Mozilla/Add-ons/WebExtensions/API/identity#registering_your_add-on). - `redirect_uri` {{optional_inline}} - : `string`. This represents the URI your extension is redirected to when the flow has finished. Not required for the flow to work on the browser side if it matches the generated redirect URL. See [Getting the redirect URL](/en-US/docs/Mozilla/Add-ons/WebExtensions/API/identity#getting_the_redirect_url). - `interactive` {{optional_inline}} diff --git a/files/en-us/mozilla/firefox/experimental_features/index.md b/files/en-us/mozilla/firefox/experimental_features/index.md index 1056394b2b8e2b4..9719d497926ea0e 100644 --- a/files/en-us/mozilla/firefox/experimental_features/index.md +++ b/files/en-us/mozilla/firefox/experimental_features/index.md @@ -22,7 +22,7 @@ Experimental features can be enabled or disabled using the [Firefox Configuratio ### Autocorrection of editable text elements -The HTML [`autocorrect`](/en-US/docs/Web/HTML/Global_attributes/autocorrect) attribute (and correspoinding {{domxref("HTMLElement.autocorrect")}} property) allow autocompletion in editable text elements including: most kinds of text {{htmlelement("input")}} elements, {{htmlelement("textarea")}} elements, and elements that have the [`contenteditable`](/en-US/docs/Web/HTML/Global_attributes/contenteditable) attribute set ([Firefox bug 1725806](https://bugzil.la/1725806)). +The HTML [`autocorrect`](/en-US/docs/Web/HTML/Global_attributes/autocorrect) attribute (and corresponding {{domxref("HTMLElement.autocorrect")}} property) allow autocompletion in editable text elements including: most kinds of text {{htmlelement("input")}} elements, {{htmlelement("textarea")}} elements, and elements that have the [`contenteditable`](/en-US/docs/Web/HTML/Global_attributes/contenteditable) attribute set ([Firefox bug 1725806](https://bugzil.la/1725806)). diff --git a/files/en-us/web/api/compositionevent/index.md b/files/en-us/web/api/compositionevent/index.md index 46347b9aa704326..4305ed350a3c41e 100644 --- a/files/en-us/web/api/compositionevent/index.md +++ b/files/en-us/web/api/compositionevent/index.md @@ -23,7 +23,7 @@ _This interface also inherits properties of its parent, {{domxref("UIEvent")}}, - {{domxref("CompositionEvent.data")}} {{ReadOnlyInline}} - : Returns the characters generated by the input method that raised the event; its varies depending on the type of event that generated the `CompositionEvent` object. - {{domxref("CompositionEvent.locale")}} {{ReadOnlyInline}} {{deprecated_inline}} {{Non-standard_Inline}} - - : Returns the locale of current input method (for example, the keyboard layout locale if the composition is associated with {{glossary("IME")}}). + - : Returns the locale of the current input method (for example, the keyboard layout locale if the composition is associated with an {{glossary("Input method editor")}}). ## Instance methods diff --git a/files/en-us/web/api/compositionevent/locale/index.md b/files/en-us/web/api/compositionevent/locale/index.md index b297d36fafe42fb..47c41ea757a8ded 100644 --- a/files/en-us/web/api/compositionevent/locale/index.md +++ b/files/en-us/web/api/compositionevent/locale/index.md @@ -13,7 +13,7 @@ browser-compat: api.CompositionEvent.locale The **`locale`** read-only property of the {{domxref("CompositionEvent")}} interface returns the locale of current input method -(for example, the keyboard layout locale if the composition is associated with {{glossary("IME")}}). +(for example, the keyboard layout locale if the composition is associated with an {{glossary("Input method editor")}}). > [!WARNING] > Even for browsers supporting it, don't trust the value contained in this property. diff --git a/files/en-us/web/api/domquad/index.md b/files/en-us/web/api/domquad/index.md index ea7c75691c91ebc..eb8cfe0312e5d8b 100644 --- a/files/en-us/web/api/domquad/index.md +++ b/files/en-us/web/api/domquad/index.md @@ -30,7 +30,7 @@ A `DOMQuad` is a collection of four `DOMPoint`s defining the corners of an arbit - {{domxref("DOMQuad.fromRect()")}} - : Returns a new `DOMQuad` object based on the passed set of coordinates. - {{domxref("DOMQuad.fromQuad()")}} - - : Returns a new `DOMQuad` object based on the passed set of coordinates. + - : Returns a new `DOMQuad` object or a set of quadrilateral coordinates based on the provided input. - {{domxref("DOMQuad.getBounds()")}} - : Returns a {{domxref("DOMRect")}} object with the coordinates and dimensions of the `DOMQuad` object. - {{domxref("DOMQuad.toJSON()")}} diff --git a/files/en-us/web/api/element/compositionend_event/index.md b/files/en-us/web/api/element/compositionend_event/index.md index b2a0e455c55e303..aa7f9aa7af5103b 100644 --- a/files/en-us/web/api/element/compositionend_event/index.md +++ b/files/en-us/web/api/element/compositionend_event/index.md @@ -10,7 +10,7 @@ browser-compat: api.Element.compositionend_event The **`compositionend`** event is fired when a text composition system such as an {{glossary("input method editor")}} completes or cancels the current composition session. -For example, this event could be fired after a user finishes entering a Chinese character using a [Pinyin](https://en.wikipedia.org/wiki/Pinyin) {{glossary("IME")}}. +For example, this event could be fired after a user finishes entering a Chinese character using a [Pinyin](https://en.wikipedia.org/wiki/Pinyin) {{glossary("Input method editor")}}. ## Syntax @@ -35,7 +35,7 @@ _This interface also inherits properties of its parent, {{domxref("UIEvent")}}, - {{domxref("CompositionEvent.data")}} {{ReadOnlyInline}} - : Returns the characters generated by the input method that raised the event; its varies depending on the type of event that generated the `CompositionEvent` object. - {{domxref("CompositionEvent.locale")}} {{ReadOnlyInline}} {{deprecated_inline}} - - : Returns the locale of current input method (for example, the keyboard layout locale if the composition is associated with {{glossary("IME")}}). + - : Returns the locale of the current input method (for example, the keyboard layout locale if the composition is associated with an {{glossary("Input method editor")}}). ## Examples diff --git a/files/en-us/web/api/element/compositionstart_event/index.md b/files/en-us/web/api/element/compositionstart_event/index.md index 287fd11d383aa44..c4411011451e4aa 100644 --- a/files/en-us/web/api/element/compositionstart_event/index.md +++ b/files/en-us/web/api/element/compositionstart_event/index.md @@ -10,7 +10,7 @@ browser-compat: api.Element.compositionstart_event The **`compositionstart`** event is fired when a text composition system such as an {{glossary("input method editor")}} starts a new composition session. -For example, this event could be fired after a user starts entering a Chinese character using a [Pinyin](https://en.wikipedia.org/wiki/Pinyin) {{glossary("IME")}}. +For example, this event could be fired after a user starts entering a Chinese character using a [Pinyin](https://en.wikipedia.org/wiki/Pinyin) {{glossary("Input method editor")}}. ## Syntax diff --git a/files/en-us/web/api/element/compositionupdate_event/index.md b/files/en-us/web/api/element/compositionupdate_event/index.md index 12335f986df0677..e5e05c08aacd5ed 100644 --- a/files/en-us/web/api/element/compositionupdate_event/index.md +++ b/files/en-us/web/api/element/compositionupdate_event/index.md @@ -10,7 +10,7 @@ browser-compat: api.Element.compositionupdate_event The **`compositionupdate`** event is fired when a new character is received in the context of a text composition session controlled by a text composition system such as an {{glossary("input method editor")}}. -For example, this event could be fired while a user enters a Chinese character using a [Pinyin](https://en.wikipedia.org/wiki/Pinyin) {{glossary("IME")}}. +For example, this event could be fired while a user enters a Chinese character using a [Pinyin](https://en.wikipedia.org/wiki/Pinyin) {{glossary("Input method editor")}}. ## Syntax diff --git a/files/en-us/web/api/element/keydown_event/index.md b/files/en-us/web/api/element/keydown_event/index.md index 96385e25a13db5e..4f5185612a64dec 100644 --- a/files/en-us/web/api/element/keydown_event/index.md +++ b/files/en-us/web/api/element/keydown_event/index.md @@ -95,7 +95,7 @@ function logKey(e) { ### keydown events with IME -Since Firefox 65, the `keydown` and [`keyup`](/en-US/docs/Web/API/Element/keyup_event) events are now fired during {{glossary("IME")}} composition, to improve cross-browser compatibility for CJKT users ([Firefox bug 354358](https://bugzil.la/354358)). To ignore all `keydown` events that are part of composition, do something like this (229 is a special value set for a `keyCode` relating to an event that has been processed by an IME): +Since Firefox 65, the `keydown` and [`keyup`](/en-US/docs/Web/API/Element/keyup_event) events are now fired during {{glossary("Input method editor")}} composition, to improve cross-browser compatibility for CJKT users ([Firefox bug 354358](https://bugzil.la/354358)). To ignore all `keydown` events that are part of composition, do something like this (229 is a special value set for a `keyCode` relating to an event that has been processed by an IME): ```js eventTarget.addEventListener("keydown", (event) => { diff --git a/files/en-us/web/api/element/keyup_event/index.md b/files/en-us/web/api/element/keyup_event/index.md index 3c7bdaf8c9f7ae3..93504d8a588710f 100644 --- a/files/en-us/web/api/element/keyup_event/index.md +++ b/files/en-us/web/api/element/keyup_event/index.md @@ -93,7 +93,7 @@ function logKey(e) { ### keyup events with IME -Since Firefox 65, the [`keydown`](/en-US/docs/Web/API/Element/keydown_event) and `keyup` events are now fired during {{glossary("IME")}} composition, to improve cross-browser compatibility for CJKT users ([Firefox bug 354358](https://bugzil.la/354358)). To ignore all `keyup` events that are part of composition, do something like this: +Since Firefox 65, the [`keydown`](/en-US/docs/Web/API/Element/keydown_event) and `keyup` events are now fired during {{glossary("Input method editor")}} composition, to improve cross-browser compatibility for CJKT users ([Firefox bug 354358](https://bugzil.la/354358)). To ignore all `keyup` events that are part of composition, do something like this: ```js eventTarget.addEventListener("keyup", (event) => { diff --git a/files/en-us/web/api/htmlelement/autocorrect/index.md b/files/en-us/web/api/htmlelement/autocorrect/index.md index 88b33b76f551e9e..fa599cdff60f462 100644 --- a/files/en-us/web/api/htmlelement/autocorrect/index.md +++ b/files/en-us/web/api/htmlelement/autocorrect/index.md @@ -10,7 +10,11 @@ browser-compat: api.HTMLElement.autocorrect {{APIRef("HTML DOM")}}{{SeeCompatTable}} -The **`autocorrect`** property of the {{domxref("HTMLElement")}} interface controls whether or not user text input is automatically corrected for spelling and/or punctuation errors. +The **`autocorrect`** property of the {{domxref("HTMLElement")}} interface controls whether or not autocorrection of editable text is enabled for spelling and/or punctuation errors. + +The specific autocorrection behavior, including which words are substituted, depends on the user agent and the services provided by the underlying device. +For example, on macOS a user agent might rely on [registered replacement text and punctuation](https://support.apple.com/en-vn/guide/mac-help/mh35735/mac). +Other devices and browsers may use a different approach. The property reflects the value of the [`autocorrect`](/en-US/docs/Web/HTML/Global_attributes/autocorrect) HTML global attribute. @@ -88,8 +92,9 @@ if (`autocorrect` in HTMLElement.prototype) { -Activate the button to toggle the autocorrect value. Enter invalid text into the text box, such as "Carot". -This should be corrected automatically when the feature is enabled. +Activate the button to toggle the autocorrect value. +Enter invalid text into the text box, such as "Carot". +When the autocorrect is enabled, and if the implementation has the appropriate substitute word "carrot", the text should automatically be corrected. {{EmbedLiveSample("Enable and disable autocorrection", "100%", "200")}} diff --git a/files/en-us/web/api/keyboardevent/charcode/index.md b/files/en-us/web/api/keyboardevent/charcode/index.md index b2d8fb708fc460a..df04bd98b4b67b8 100644 --- a/files/en-us/web/api/keyboardevent/charcode/index.md +++ b/files/en-us/web/api/keyboardevent/charcode/index.md @@ -67,7 +67,7 @@ input.addEventListener("keypress", (e) => { {{domxref("Element/keyup_event", "keyup")}} events. In these cases, `keyCode` is set instead. - To get the code of the key regardless of whether it was stored in `keyCode` or `charCode`, query the {{domxref("UIEvent/which", "which")}} property. -- Characters entered through an {{glossary("IME")}} do not register through `keyCode` or +- Characters entered through an {{glossary("Input method editor")}} do not register through `keyCode` or `charCode`. - For a list of the `charCode` values associated with particular keys, run [Example 7: Displaying Event Object Properties](/en-US/docs/Web/API/Document_Object_Model/Examples#example_7_displaying_event_object_properties) and view the resulting HTML table. diff --git a/files/en-us/web/api/pushmanager/supportedcontentencodings_static/index.md b/files/en-us/web/api/pushmanager/supportedcontentencodings_static/index.md index faa1e0d65876345..d9e7acaa86be818 100644 --- a/files/en-us/web/api/pushmanager/supportedcontentencodings_static/index.md +++ b/files/en-us/web/api/pushmanager/supportedcontentencodings_static/index.md @@ -8,13 +8,62 @@ browser-compat: api.PushManager.supportedContentEncodings_static {{APIRef("Push API")}}{{SecureContext_Header}}{{AvailableInWorkers}} -The **`supportedContentEncodings`** read-only static property of the -{{domxref("PushManager")}} interface returns an array of supported content codings that -can be used to encrypt the payload of a push message. +The **`supportedContentEncodings`** read-only static property of the {{domxref("PushManager")}} interface returns an array of supported content codings that can be used to encrypt the payload of a push message. + +User agents must support the `aes128gcm` content coding defined in {{rfc("8291")}}, and may also support content codings defined from previous versions of the specification. +The returned array is frozen, and may not be modified by the recipient. + +The application server requires this coding in order to encrypt push messages for sending to the push server. +The coding used for encryption is also included by the app server in the {{httpheader("Content-Encoding")}} HTTP header field of each push message. + +The specification does not define how the client code should send the application server the supported codings, or the information in the {{domxref("PushSubscription")}} that it also needs in order to encrypt and send a push message. +One approach is shown in the examples section below. ## Value An array of strings. +This usually contains just one value: `"aes128gcm"`. + +## Exceptions + +- `TypeError` + - : This is thrown when attempting to set a value in the returned array. + +## Examples + +### Sending coding information to the server + +Push messages are encrypted on the application server for sending to the push server, and decrypted by the browser before being passed to the application service worker. +The public and private keys used are generated by the browser, and only the public key and an associated secret are shared with the web app, and hence the application server. +This ensures that push messages remain private as they pass through the push server infrastructure. + +The [`p256dh`](/en-US/docs/Web/API/PushSubscription/getKey#p256dh) public key and [`auth`](/en-US/docs/Web/API/PushSubscription/getKey#auth) secret used for encrypting the message are provided to the service worker via its push subscription, using the {{domxref("PushSubscription.getKey()")}} method, along with the target endpoint for sending push messages in {{domxref("PushSubscription.endpoint")}}. +The coding that should be used for encryption is provided by `supportedContentEncodings`. + +This information may be sent to the application server using any mechanism. +One approach is to put the needed information from {{domxref("PushSubscription")}} and `supportedContentEncodings` into a JSON object, serialize it using [`JSON.stringify()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) and post the result to the application server. + +```js +// Get a PushSubscription object +const pushSubscription = await serviceWorkerRegistration.pushManager.subscribe(); + +// Create an object containing the information needed by the app server +const subscriptionObject = { + endpoint: pushSubscription.endpoint, + keys: { + p256dh: pushSubscription.getKeys('p256dh'), + auth: pushSubscription.getKeys('auth'), + }, + encoding: PushManager.supportedContentEncodings, + /* other app-specific data, such as user identity */ +}; + +// Stringify the object an post to the app server +fetch(`https://example.com/push/`, { + method: "post", + body: JSON.stringify(pushSubscription); +}); +``` ## Specifications diff --git a/files/en-us/web/api/pushsubscription/index.md b/files/en-us/web/api/pushsubscription/index.md index ddd64ed5fdf7c3d..7c1a2e486b64c94 100644 --- a/files/en-us/web/api/pushsubscription/index.md +++ b/files/en-us/web/api/pushsubscription/index.md @@ -7,9 +7,10 @@ browser-compat: api.PushSubscription {{ApiRef("Push API")}}{{SecureContext_Header}}{{AvailableInWorkers}} -The `PushSubscription` interface of the [Push API](/en-US/docs/Web/API/Push_API) provides a subscription's URL endpoint and allows unsubscribing from a push service. +The `PushSubscription` interface of the [Push API](/en-US/docs/Web/API/Push_API) provides a subscription's URL endpoint along with the public key and secrets that should be used for encrypting push messages to this subscription. +This information must be passed to the application server, using any desired application-specific method. -An instance of this interface can be serialized. +The interface also provides information about when the subscription will expire, and a method to unsubscribe from the subscription. ## Instance properties @@ -31,8 +32,51 @@ An instance of this interface can be serialized. - {{domxref("PushSubscription.unsubscribe()")}} - : Starts the asynchronous process of unsubscribing from the push service, returning a {{jsxref("Promise")}} that resolves to a boolean value when the current subscription is successfully unregistered. +## Description + +Each browser uses a particular push service. +A service worker can use {{domxref("PushManager.subscribe()")}} to subscribe to the supported service, and use the returned `PushSubscription` to discover the endpoint where push messages should be sent. + +The `PushSubscription` is also used to get the public key and secret that the application server must use to encrypt the messages that it sends to the push service. +Note that the private keys used to decrypt push messages are not shared by the browser, and are used to decrypt messages before they are passed to the service worker. +This ensures that push messages remain private as they pass through the push server infrastructure. + +The service worker doesn't need to know anything about the endpoints or encryption, other than to pass the relevant information onto the application server. +Any mechanism may be used to share the information with the application server. + ## Example +### Sending coding information to the server + +The [`p256dh`](/en-US/docs/Web/API/PushSubscription/getKey#p256dh) public key and [`auth`](/en-US/docs/Web/API/PushSubscription/getKey#auth) secret used for encrypting the message are provided to the service worker via its push subscription, using the {{domxref("PushSubscription.getKey()")}} method, along with the target endpoint for sending push messages in {{domxref("PushSubscription.endpoint")}}. +The coding that should be used for encryption is provided by the {{domxref("PushManager.supportedContentEncodings")}} static property. + +This example shows how you might put the needed information from `PushSubscription` and `supportedContentEncodings` into a JSON object, serialize it using [`JSON.stringify()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify), and post the result to the application server. + +```js +// Get a PushSubscription object +const pushSubscription = await serviceWorkerRegistration.pushManager.subscribe(); + +// Create an object containing the information needed by the app server +const subscriptionObject = { + endpoint: pushSubscription.endpoint, + keys: { + p256dh: pushSubscription.getKeys('p256dh'), + auth: pushSubscription.getKeys('auth'), + }, + encoding: PushManager.supportedContentEncodings, + /* other app-specific data, such as user identity */ +}; + +// Stringify the object an post to the app server +fetch(`https://example.com/push/`, { + method: "post", + body: JSON.stringify(pushSubscription); +}); +``` + +### Unsubscribing from a push manager + ```js navigator.serviceWorker.ready.then((reg) => { reg.pushManager.getSubscription().then((subscription) => { diff --git a/files/en-us/web/api/range/clonerange/index.md b/files/en-us/web/api/range/clonerange/index.md index fbc762a22b7423f..52f4a80c86231ce 100644 --- a/files/en-us/web/api/range/clonerange/index.md +++ b/files/en-us/web/api/range/clonerange/index.md @@ -32,9 +32,9 @@ A {{domxref("Range")}} object. ## Examples ```js -range = document.createRange(); +const range = document.createRange(); range.selectNode(document.getElementsByTagName("div").item(0)); -clone = range.cloneRange(); +const clone = range.cloneRange(); ``` ## Specifications diff --git a/files/en-us/web/api/serial/getports/index.md b/files/en-us/web/api/serial/getports/index.md index fcae0e2ed57c67a..3cd0d2f4a3f3b25 100644 --- a/files/en-us/web/api/serial/getports/index.md +++ b/files/en-us/web/api/serial/getports/index.md @@ -29,7 +29,9 @@ A {{jsxref("Promise")}} that resolves with an array of {{domxref("SerialPort")}} ### Exceptions - `SecurityError` {{domxref("DOMException")}} - - : The returned `Promise` rejects with this error if a [Permissions Policy](/en-US/docs/Web/HTTP/Permissions_Policy) blocks the use of this feature or a user permission prompt was denied. + - : The returned `Promise` rejects with this error in either of the following situations: + - A {{httpheader('Permissions-Policy/serial','serial')}} [Permissions Policy](/en-US/docs/Web/HTTP/Permissions_Policy) blocks the use of this feature. + - A user permission prompt was denied. ## Examples diff --git a/files/en-us/web/api/serial/index.md b/files/en-us/web/api/serial/index.md index 46448f4138ffc06..1a5f68bb3219438 100644 --- a/files/en-us/web/api/serial/index.md +++ b/files/en-us/web/api/serial/index.md @@ -17,9 +17,7 @@ The `Serial` interface of the [Web Serial API](/en-US/docs/Web/API/Web_Serial_AP - {{domxref("Serial.requestPort()")}} {{Experimental_Inline}} - - : Returns a {{jsxref("Promise")}} that resolves with an instance of {{domxref("SerialPort")}} representing the device chosen by the user or rejects if no device was selected. - - This method must be called with user activation. + - : Returns a {{jsxref("Promise")}} that resolves with an instance of {{domxref("SerialPort")}} representing the device chosen by the user. This method must be called via [transient activation](/en-US/docs/Glossary/Transient_activation). - {{domxref("Serial.getPorts()")}} {{Experimental_Inline}} - : Returns a {{jsxref("Promise")}} that resolves with an array of {{domxref("SerialPort")}} objects representing serial ports connected to diff --git a/files/en-us/web/api/serial/requestport/index.md b/files/en-us/web/api/serial/requestport/index.md index 2c3d47e483a15ca..59773fc8ad196b6 100644 --- a/files/en-us/web/api/serial/requestport/index.md +++ b/files/en-us/web/api/serial/requestport/index.md @@ -10,7 +10,13 @@ browser-compat: api.Serial.requestPort {{APIRef("Web Serial API")}}{{SecureContext_Header}}{{SeeCompatTable}} -The **`Serial.requestPort()`** method of the {{domxref("Serial")}} interface returns a {{jsxref("Promise")}} that resolves with an instance of {{domxref("SerialPort")}} representing the device chosen by the user or rejects if no device was selected. +The **`Serial.requestPort()`** method of the {{domxref("Serial")}} interface presents the user with a dialog asking them to select a serial device to connect to. It returns a {{jsxref("Promise")}} that resolves with an instance of {{domxref("SerialPort")}} representing the device chosen by the user. + +## Description + +When the user first visits a site it will not have permission to access any serial devices. A site must first call `requestPort()` to prompt the user to select which device the site should be allowed to control. + +This method must be called via [transient activation](/en-US/docs/Glossary/Transient_activation). The user has to interact with the page or a UI element in order for this feature to work. ## Syntax @@ -21,18 +27,20 @@ requestPort(options) ### Parameters -- `options` +- `options` {{optional_inline}} - : An object with the following properties: - - `filters` - - - : A list of objects containing vendor and product IDs used to search for attached devices. The [USB Implementors Forum](https://www.usb.org/) assigns IDs to specific companies. Each company assigns IDs to its products. Filters contain the following values: - - - `usbVendorId` - - : An unsigned short integer that identifies a USB device vendor. - - `usbProductId` - - : An unsigned short integer that identifies a USB device. + - `filters` {{optional_inline}} + - : A list of objects containing vendor, product, or Bluetooth service class IDs used to filter the specific device types made available for the user to request a connection to. If no filters are specified, the user is presented with a list of every available device to choose from. Filters can contain the following values: + - `bluetoothServiceClassId` {{optional_inline}} + - : An unsigned long integer or string representing a Bluetooth service class ID. This can be a 16- or 32-bit UUID alias, any valid UUID, or a valid name from a [GATT assigned services key](https://github.com/WebBluetoothCG/registries/blob/master/gatt_assigned_services.txt). + - `usbVendorId` {{optional_inline}} + - : An unsigned short integer that identifies a USB device vendor. The [USB Implementors Forum](https://www.usb.org/) assigns IDs to specific vendors. + - `usbProductId` {{optional_inline}} + - : An unsigned short integer that identifies a USB device. Each vendor assigns IDs to its products. + - `allowedBluetoothServiceClassIds` {{optional_inline}} + - : A list of unsigned long integers and/or strings representing Bluetooth service class IDs. Bluetooth ports with custom service class IDs are excluded from the list of ports presented to the user unless the service class ID is included in this list. This is true whether you filter the list or not. ### Return value @@ -41,29 +49,76 @@ A {{jsxref("Promise")}} that resolves with an instance of {{domxref("SerialPort" ### Exceptions - `SecurityError` {{domxref("DOMException")}} - - : The returned `Promise` rejects with this error if a [Permissions Policy](/en-US/docs/Web/HTTP/Permissions_Policy) blocks the use of this feature or a user permission prompt was denied. + - : The returned `Promise` rejects with this error in either of the following situations: + - A {{httpheader('Permissions-Policy/serial','serial')}} [Permissions Policy](/en-US/docs/Web/HTTP/Permissions_Policy) blocks the use of this feature. + - A user permission prompt was denied. - `NotFoundError` {{domxref("DOMException")}} - - : The returned `Promise` rejects with this if the user does not select a port when prompted. + - : The returned `Promise` rejects with this exception if the user does not select a port when prompted. -## Security +## Examples -{{Glossary("Transient activation")}} is required. The user has to interact with the page or a UI element in order for this feature to work. +### Allow the user to select any device -## Examples +This example prompts the user to select a device via `requestPort()` when a ` +``` + +```js +const connectBtn = document.getElementById("connect"); +connectBtn.addEventListener("click", () => { + try { + const port = await navigator.serial.requestPort(); + // Connect to port or add it to the list of available ports + } catch (e) { + // The user didn't select a device + } +}); +``` + +### Allow the user to select a specific vendor's device -The following example shows a filter being passed to `requestPort()` with a USB vendor ID in order to limit the set of devices shown to the user to only USB devices built by a particular manufacturer. If this filter was omitted the user would be able to select any available port. +In this case, a filter is passed to `requestPort()` with a USB vendor ID to limit the set of devices shown to the user to only USB devices built by a particular manufacturer. ```js -button.addEventListener("click", () => { +connectBtn.addEventListener("click", () => { const usbVendorId = 0xabcd; - navigator.serial - .requestPort({ filters: [{ usbVendorId }] }) - .then((port) => { - // Connect to `port` or add it to the list of available ports. - }) - .catch((e) => { - // The user didn't select a port. - }); + try { + const port = await navigator.serial.requestPort({ filters: [{ usbVendorId }] }); + // Connect to port or add it to the list of available ports + } catch (e) { + // The user didn't select a device + } +}); +``` + +### Allow the user to select custom RFCOMM-based services + +Although most devices expose SPP-based communication through the standardized Bluetooth Classic Serial Port Profile, some use custom RFCOMM-based services. These devices have a Service Class ID that is not in the standard Bluetooth UUID range. + +You need to pass the `allowedBluetoothServiceClassIds` list to `requestPort()` to access these custom RFCOMM-based services: + +```js +const myBluetoothServiceUuid = "01234567-89ab-cdef-0123-456789abcdef"; + +// Prompt user to select any serial port +// Access to the custom Bluetooth RFCOMM service above will be allowed +const port = await navigator.serial.requestPort({ + allowedBluetoothServiceClassIds: [myBluetoothServiceUuid], +}); +``` + +You can also use the `bluetoothServiceClassId` filter key when calling `requestPort()` to prompt the user with a list of filtered Bluetooth serial ports identified by Service Class IDs: + +```js +const myBluetoothServiceUuid = "01234567-89ab-cdef-0123-456789abcdef"; + +// Prompt the user to select Bluetooth serial ports with +// the custom Bluetooth RFCOMM service above. +const port = await navigator.serial.requestPort({ + allowedBluetoothServiceClassIds: [myBluetoothServiceUuid], + filters: [{ bluetoothServiceClassId: myBluetoothServiceUuid }], }); ``` diff --git a/files/en-us/web/api/serialport/close/index.md b/files/en-us/web/api/serialport/close/index.md index afad3908609c467..97fe9d24c6668a2 100644 --- a/files/en-us/web/api/serialport/close/index.md +++ b/files/en-us/web/api/serialport/close/index.md @@ -12,6 +12,56 @@ browser-compat: api.SerialPort.close The **`SerialPort.close()`** method of the {{domxref("SerialPort")}} interface returns a {{jsxref("Promise")}} that resolves when the port closes. +## Description + +`close()` closes the serial port if previously-locked {{domxref("SerialPort.readable")}} and {{domxref("SerialPort.writable")}} members are unlocked, meaning the `releaseLock()` methods have been called for their respective reader and writer. + +However, when continuously reading data from a serial device using a loop, the associated [readable stream](/en-US/docs/Web/API/ReadableStream) will always be locked until the [reader](/en-US/docs/Web/API/ReadableStreamDefaultReader) encounters an error. In this case, calling [`reader.cancel()`](/en-US/docs/Web/API/ReadableStreamDefaultReader/cancel) will force [`reader.read()`](/en-US/docs/Web/API/ReadableStreamDefaultReader/read) to resolve immediately with `{ value: undefined, done: true }` allowing the loop to call [`reader.releaseLock()`](/en-US/docs/Web/API/ReadableStreamDefaultReader/releaseLock). + +```js +// Without transform streams. + +let keepReading = true; +let reader; + +async function readUntilClosed() { + while (port.readable && keepReading) { + reader = port.readable.getReader(); + try { + while (true) { + const { value, done } = await reader.read(); + if (done) { + // reader.cancel() has been called. + break; + } + // value is a Uint8Array. + console.log(value); + } + } catch (error) { + // Handle error... + } finally { + // Allow the serial port to be closed later. + reader.releaseLock(); + } + } + + await port.close(); +} + +const closedPromise = readUntilClosed(); + +document.querySelector("button").addEventListener("click", async () => { + // User clicked a button to close the serial port. + keepReading = false; + // Force reader.read() to resolve immediately and subsequently + // call reader.releaseLock() in the loop example above. + reader.cancel(); + await closedPromise; +}); +``` + +Closing a serial port is more complicated when using [transform streams](/en-US/docs/Web/API/TransformStream). See [Close a serial port](https://developer.chrome.com/docs/capabilities/serial#close-port) for guidance. + ## Syntax ```js-nolint diff --git a/files/en-us/web/api/serialport/connect_event/index.md b/files/en-us/web/api/serialport/connect_event/index.md index 4a3c6329d0cb956..795824c24aee906 100644 --- a/files/en-us/web/api/serialport/connect_event/index.md +++ b/files/en-us/web/api/serialport/connect_event/index.md @@ -10,9 +10,20 @@ browser-compat: api.SerialPort.connect_event {{APIRef("Web Serial API")}}{{SecureContext_Header}}{{SeeCompatTable}}{{AvailableInWorkers("window_and_dedicated")}} -The **`connect`** event of the {{domxref("SerialPort")}} interface is fired when a port has connected to the device. This event is only fired for ports associated with removable devices such as those connected via USB. +The **`connect`** event of the {{domxref("SerialPort")}} interface is fired when the port connects to the device. -This event bubbles to the instance of {{domxref("Serial")}} that returned this interface. +## Description + +More specifically, the `connect` event fires when the port becomes **logically connected** to the device after a user grants permission for a site to access the port following a {{domxref("Serial.requestPort()")}} call: + +- In the case of a wired serial port, this occurs when the port is physically connected to the device, for example via USB. +- In the case of a wireless serial port (for example, Bluetooth RFCOMM), this occurs when the port makes one or more active connections to the device (for example via Bluetooth L2CAP channels). + +### Bubbling + +This event bubbles to the instance of {{domxref("Serial")}} that returned this interface. The `event.target` property refers to the {{domxref('SerialPort')}} object that bubbles up. + +For more information, see [Event bubbling](/en-US/docs/Learn_web_development/Core/Scripting/Event_bubbling). ## Syntax @@ -28,12 +39,6 @@ onconnect = (event) => {}; A generic {{domxref("Event")}}. -## Bubbling - -This event bubbles to {{domxref("Serial")}}. The `event.target` property refers to the {{domxref('SerialPort')}} object that bubbles up. - -For more information, see [Event bubbling](/en-US/docs/Learn_web_development/Core/Scripting/Event_bubbling). - ## Examples ### Notify when a specific port connects diff --git a/files/en-us/web/api/serialport/connected/index.md b/files/en-us/web/api/serialport/connected/index.md new file mode 100644 index 000000000000000..333d9799ab25b22 --- /dev/null +++ b/files/en-us/web/api/serialport/connected/index.md @@ -0,0 +1,75 @@ +--- +title: "SerialPort: connected property" +short-title: connected +slug: Web/API/SerialPort/connected +page-type: web-api-instance-property +status: + - experimental +browser-compat: api.SerialPort.connected +--- + +{{SecureContext_Header}}{{APIRef("Web Serial API")}}{{SeeCompatTable}}{{AvailableInWorkers("window_and_dedicated")}} + +The **`connected`** read-only property of the {{domxref("SerialPort")}} interface returns a boolean value that indicates whether the port is [logically connected](/en-US/docs/Web/API/SerialPort/connect_event#description) to the device. + +## Description + +When a wireless device goes out of range of the host, any wireless serial port opened by a web app automatically closes, even though it stays logically connected. In such cases, the web app could attempt to reopen the port using {{domxref("SerialPort.open()")}}. + +However, if the wireless device was intentionally disconnected (for example, if the user chose to disconnect it using the operating system control panel), the web app should refrain from reopening the port to prevent reconnecting to the wireless device. + +The following snippet shows how the `connected` property can be used to distinguish between these two cases: + +```js +const ports = await navigator.serial.getPorts(); +for (const port of ports) { + if (port.connected) { + // The port is logically connected + // automatically try to reopen the port + await port.open({ baudRate: 9600 }); + } else { + // The port is not logically connected; at this point you could + // prompt the user to make sure the Bluetooth device is available, and + // Show a "connect" button to allow them to try opening the port if desired + } +} +``` + +## Value + +A boolean — `true` if the port is logically connected, and `false` if not. + +## Examples + +### Logging when a port is connected + +The following snippet invokes {{domxref("Serial.requestPort()")}} when the user presses a {{htmlelement("button")}}, prompting them to choose a serial port to connect to, then logs a message to the console reporting the connection status: + +```js +requestPortButton.addEventListener("click", async () => { + const port = await navigator.serial.requestPort(); + console.log(`Requested serial port. Connected: ${port.connected}`); +}); +``` + +### Logging connection status on connect and disconnect + +You can use the following snippet to log the connection status when the {{domxref("SerialPort.connect_event", "connect")}} and {{domxref("SerialPort.disconnect_event", "disconnect")}} events fire: + +```js +navigator.serial.addEventListener("connect", ({ target: port }) => { + console.log(`Connect event fired. Connected: ${port.connected}`); +}); + +navigator.serial.addEventListener("disconnect", ({ target: port }) => { + console.log(`Disconnect event fired. Connected: ${port.connected}`); +}); +``` + +## Specifications + +{{Specifications}} + +## Browser compatibility + +{{Compat}} diff --git a/files/en-us/web/api/serialport/disconnect_event/index.md b/files/en-us/web/api/serialport/disconnect_event/index.md index ba702c7a197913c..1029f813fa48ceb 100644 --- a/files/en-us/web/api/serialport/disconnect_event/index.md +++ b/files/en-us/web/api/serialport/disconnect_event/index.md @@ -10,9 +10,17 @@ browser-compat: api.SerialPort.disconnect_event {{SecureContext_Header}}{{APIRef("Web Serial API")}}{{SeeCompatTable}}{{AvailableInWorkers("window_and_dedicated")}} -The **`disconnect`** event of the {{domxref("SerialPort")}} interface is fired when the port has disconnected from the device. This event is only fired for ports associated with removable devices such as those connected via USB. +The **`disconnect`** event of the {{domxref("SerialPort")}} interface is fired when the port disconnects from the device. -This event bubbles to the instance of {{domxref("Serial")}} that returned this interface. +## Description + +More specifically, the `disconnect` event fires when a port that was previously [logically connected](/en-US/docs/Web/API/SerialPort/connect_event#description) after a user granted permission for a site to access it (following a {{domxref("Serial.requestPort()")}} call) is no longer connected. + +### Bubbling + +This event bubbles to the instance of {{domxref("Serial")}} that returned this interface. The `event.target` property refers to the {{domxref('SerialPort')}} object that bubbles up. + +For more information, see [Event bubbling](/en-US/docs/Learn_web_development/Core/Scripting/Event_bubbling). ## Syntax @@ -28,12 +36,6 @@ ondisconnect = (event) => {}; A generic {{domxref("Event")}}. -## Bubbling - -This event bubbles to {{domxref("Serial")}}. The `event.target` property refers to the {{domxref('SerialPort')}} object that bubbles up. - -For more information, see [Event bubbling](/en-US/docs/Learn_web_development/Core/Scripting/Event_bubbling). - ## Examples ### Notify when a specific port disconnects diff --git a/files/en-us/web/api/serialport/forget/index.md b/files/en-us/web/api/serialport/forget/index.md index 2c0dae3d704a02d..a253073cd683d92 100644 --- a/files/en-us/web/api/serialport/forget/index.md +++ b/files/en-us/web/api/serialport/forget/index.md @@ -10,7 +10,13 @@ browser-compat: api.SerialPort.forget {{securecontext_header}}{{APIRef("Web Serial API")}}{{SeeCompatTable}}{{AvailableInWorkers("window_and_dedicated")}} -The **`SerialPort.forget()`** method of the {{domxref("SerialPort")}} interface returns a {{jsxref("Promise")}} that resolves when the serial port is closed and is forgotten. +The **`SerialPort.forget()`** method of the {{domxref("SerialPort")}} interface returns a {{jsxref("Promise")}} that resolves when access to the serial port is revoked. + +## Description + +A website can clean up permissions to access a serial port it is no longer interested in retaining by calling `SerialPort.forget()`. Calling this "forgets" the device, resetting any previously-set permissions so the calling site can no longer communicate with the port. + +For example, for an educational web application used on a shared computer with many devices, a large number of accumulated user-generated permissions creates a poor user experience. ## Syntax @@ -24,7 +30,7 @@ None. ### Return value -A {{jsxref("Promise")}} that resolves with `undefined` once the connection is closed, the device is forgotten, and the permission is reset. +A {{jsxref("Promise")}} that resolves with `undefined` once the connection is revoked. ## Specifications diff --git a/files/en-us/web/api/serialport/getinfo/index.md b/files/en-us/web/api/serialport/getinfo/index.md index 978321fb3c2c4c8..fe7114da9ca008f 100644 --- a/files/en-us/web/api/serialport/getinfo/index.md +++ b/files/en-us/web/api/serialport/getinfo/index.md @@ -10,7 +10,7 @@ browser-compat: api.SerialPort.getInfo {{SecureContext_Header}}{{APIRef("Web Serial API")}}{{SeeCompatTable}}{{AvailableInWorkers("window_and_dedicated")}} -The **`getInfo()`** method of the {{domxref("SerialPort")}} interface returns an object whose properties are the vendor ID and product ID of the device. +The **`getInfo()`** method of the {{domxref("SerialPort")}} interface returns an object containing identifying information for the device available via the port. ## Syntax @@ -24,12 +24,44 @@ None. ### Return value -An object containing the following values. +An object containing the following properties: - `usbVendorId` - - : If the port is part of a USB device, an unsigned short integer that identifies a USB device vendor, otherwise `undefined`. + - : If the port is part of a USB device, this property is an unsigned short integer that identifies the device's vendor. If not, it is `undefined`. - `usbProductId` - - : If the port is part of a USB device, an unsigned short integer that identifies a USB device, otherwise `undefined`. + - : If the port is part of a USB device, this property is an unsigned short integer that identifies the USB device. If not, it is `undefined`. +- `bluetoothServiceClassId` + - : If the port is a Bluetooth RFCOMM service, this property is an unsigned long integer or string representing the device's Bluetooth service class ID. If not, it is `undefined`. + +## Example + +This snippet calls the {{domxref("Serial.requestPort()")}} method when a ` +``` + +```js +const connectBtn = document.getElementById("connect"); + +// Filter for devices with the Arduino Uno USB Vendor/Product IDs +const filters = [ + { usbVendorId: 0x2341, usbProductId: 0x0043 }, + { usbVendorId: 0x2341, usbProductId: 0x0001 } +]; + +connectBtn.addEventListener("click", () => { + try { + // Prompt the user to select an Arduino Uno device + const port = await navigator.serial.requestPort({ filters }); + + // Return the device's identifying info + const { usbProductId, usbVendorId } = port.getInfo(); + } catch (e) { + // The user didn't select a device + } +}); +``` ## Specifications diff --git a/files/en-us/web/api/serialport/index.md b/files/en-us/web/api/serialport/index.md index 898f57717df3ddb..b6406f5683c1a62 100644 --- a/files/en-us/web/api/serialport/index.md +++ b/files/en-us/web/api/serialport/index.md @@ -19,6 +19,8 @@ Instances of this interface may be obtained by calling methods of the {{domxref( ## Instance properties +- {{domxref("SerialPort.connected")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : Returns a boolean value that indicates whether the port is logically connected to the device. - {{domxref("SerialPort.readable")}} {{ReadOnlyInline}} {{Experimental_Inline}} - : Returns a {{domxref("ReadableStream")}} for receiving data from the device connected to the port. - {{domxref("SerialPort.writable")}} {{ReadOnlyInline}} {{Experimental_Inline}} @@ -27,9 +29,9 @@ Instances of this interface may be obtained by calling methods of the {{domxref( ## Instance methods - {{domxref("SerialPort.forget()")}} {{Experimental_Inline}} - - : Returns a {{jsxref("Promise")}} that resolves when the port closes and is forgotten. + - : Returns a {{jsxref("Promise")}} that resolves when access to the serial port is revoked. Calling this "forgets" the device, resetting any previously-set permissions so the calling site can no longer communicate with the port. - {{domxref("SerialPort.getInfo()")}} {{Experimental_Inline}} - - : Returns an object containing properties of the port. + - : Returns an object containing identifying information for the device available via the port. - {{domxref("SerialPort.open()")}} {{Experimental_Inline}} - : Returns a {{jsxref("Promise")}} that resolves when the port is opened. By default the port is opened with 8 data bits, 1 stop bit and no parity checking. - {{domxref("SerialPort.setSignals()")}} {{Experimental_Inline}} @@ -42,9 +44,9 @@ Instances of this interface may be obtained by calling methods of the {{domxref( ## Events - {{domxref("SerialPort.connect_event", "connect")}} {{Experimental_Inline}} - - : An event fired when the port has connected to the device. + - : Fired when the port connects to the device. - {{domxref("SerialPort.disconnect_event", "disconnect")}} {{Experimental_Inline}} - - : An event fired when the port has disconnected from the device. + - : Fired when the port disconnects from the device. ## Examples diff --git a/files/en-us/web/api/svgaelement/href/index.md b/files/en-us/web/api/svgaelement/href/index.md new file mode 100644 index 000000000000000..87c97baeaab2f43 --- /dev/null +++ b/files/en-us/web/api/svgaelement/href/index.md @@ -0,0 +1,44 @@ +--- +title: "SVGAElement: href property" +short-title: href +slug: Web/API/SVGAElement/href +page-type: web-api-instance-property +browser-compat: api.SVGAElement.href +--- + +{{APIRef("SVG")}} + +The **`href`** read-only property of the {{domxref("SVGAElement")}} returns an {{domxref("SVGAnimatedString")}} object reflecting the value of the href attribute, and, in certain cases, the {{SVGAttr("xlink:href")}} {{deprecated_inline}} attribute. It specifies the target URI associated with the link. + +This property enables access to the URI set for a link within an SVG document. + +## Value + +A {{domxref("SVGAnimatedString")}} indicating the value of the href attribute. Additionally, for elements defined to support it, it reflects the value of the {{SVGAttr("xlink:href")}} {{deprecated_inline}} attribute when the href attribute is not set. + +## Examples + +```js +// Select an SVG element +const svgLink = document.querySelector("a"); + +// Access the href property +console.log(svgLink.href.baseVal); // Logs the base URI +console.log(svgLink.href.animVal); // Logs the animated URI if applicable + +// Example: Reflecting xlink:href +const deprecatedLink = document.querySelector("a"); +console.log(deprecatedLink.href.baseVal); // Reflects 'xlink:href' if 'href' is not set +``` + +## Specifications + +{{Specifications}} + +## Browser compatibility + +{{Compat}} + +## See also + +- {{ SVGAttr("href") }} diff --git a/files/en-us/web/api/web_serial_api/index.md b/files/en-us/web/api/web_serial_api/index.md index e6125ec3184be50..673760b42e9ba9c 100644 --- a/files/en-us/web/api/web_serial_api/index.md +++ b/files/en-us/web/api/web_serial_api/index.md @@ -31,6 +31,11 @@ Examples of serial devices include 3D printers, and microcontrollers such as the - {{domxref("WorkerNavigator.serial")}} {{ReadOnlyInline}} {{Experimental_Inline}} - : Returns a {{domxref("Serial")}} object, which represents the entry point into the Web Serial API to enable the control of serial ports. +## HTTP headers + +- {{httpheader("Permissions-Policy")}} {{httpheader('Permissions-Policy/serial','serial')}} directive + - : Controls whether the current document is allowed to use the Web Serial API to communicate with serial devices, either directly connected via a serial port, or via USB or Bluetooth devices emulating a serial port. + ## Examples The following examples demonstrate some of the functionality provided by the Web Serial API. diff --git a/files/en-us/web/api/window/index.md b/files/en-us/web/api/window/index.md index 7c770d2bd543452..dfd55c7c60d173d 100644 --- a/files/en-us/web/api/window/index.md +++ b/files/en-us/web/api/window/index.md @@ -257,8 +257,6 @@ _This interface inherits methods from the {{domxref("EventTarget")}} interface._ - : This method stops window loading. - {{domxref("Window.structuredClone()")}} - : Creates a [deep clone](/en-US/docs/Glossary/Deep_copy) of a given value using the [structured clone algorithm](/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm). -- {{domxref("Window.updateCommands()")}} {{Non-standard_Inline}} - - : Updates the state of commands of the current chrome window (UI). ### Deprecated methods diff --git a/files/en-us/web/css/@font-face/font-weight/index.md b/files/en-us/web/css/@font-face/font-weight/index.md index b9f0c43481ecd7b..af82b6348a19a39 100644 --- a/files/en-us/web/css/@font-face/font-weight/index.md +++ b/files/en-us/web/css/@font-face/font-weight/index.md @@ -7,11 +7,16 @@ browser-compat: css.at-rules.font-face.font-weight {{CSSRef}} -The **`font-weight`** CSS descriptor allows authors to specify font weights for the fonts specified in the {{cssxref("@font-face")}} at-rule. The {{cssxref("font-weight")}} property can separately be used to set how thick or thin characters in text should be displayed. +The **`font-weight`** CSS {{cssxref("@font-face")}} descriptor enables authors to specify a single font weight, or a range of font weights, for the font specified in a {{cssxref("@font-face")}} at-rule. This is then used by the browser to select the appropriate font when a CSS rule sets a desired {{cssxref("font-weight", "font weight")}}. -For a particular font family, authors can download various font faces which correspond to the different styles of the same font family, and then use the `font-weight` descriptor to explicitly specify the font face's weights. The values for the CSS descriptor is same as that of its corresponding font property. +Typically, a developer will want to use fonts from a single font family in a range of different weights. With traditional, or _static_ fonts, a single font file contains characters from a font family in a specific weight and style: for example, "Helvetica bold italic". To enable displaying light, regular, bold, or extra-bold fonts when the `font-weight` property calls a specific weight, you can define multiple {{cssxref("@font-face")}} at-rules for the same family (all with the same {{cssxref("@font-face/font-family", "font-family")}} descriptor value), one for each weight or range of weights. -There are generally limited weights available for a particular font family. When a specified weight doesn't exist, a nearby weight is used. Fonts lacking bold typeface are often synthesized by the user agent. To prevent this, use the {{cssxref('font-synthesis')}} shorthand property. +To declare the font to be used for a range of font weights, declare a space-separated pair of font-weight values as the value for the `font-weight` descriptor. When CSS rules set a font weight by setting the {{cssxref("font-weight")}} property or the {{cssxref("font")}} shorthand property, the appropriate font will then be used. + +For example, if the descriptor is `font-weight: 400 600;`, when the property is `font-weight: 450` or `font-weight: 550`, that font will be use for that font-family. +Whether the font is a static or a [variable font](/en-US/docs/Web/CSS/CSS_fonts/Variable_fonts_guide), the font matching the range will be used. In this case, if the font is a static font, `450` and `550` will appear the same. If the font is a variable font, the latter will be bolder. + +The descriptor is the same for all fonts, but the range you'll set for a variable font will generally be greater, possibly even `1 1000` to use the same font for all font weight property values. ## Syntax @@ -21,15 +26,21 @@ font-weight: normal; font-weight: bold; font-weight: 400; -/* Multiple Values */ +/* Defining a range */ font-weight: normal bold; font-weight: 300 500; ``` -The `font-weight` property is described using any one of the values listed below. - ### Values +The `font-weight` descriptor takes one of the following forms: + +- The keyword `auto`. +- A single `` value. +- A pair of `` values, separated by a space. + +Each `` may be any one of the following: + - `normal` - : Normal font weight. Same as `400`. - `bold` @@ -37,10 +48,6 @@ The `font-weight` property is described using any one of the values listed below - `` - : A {{cssxref("<number>")}} value between 1 and 1000, inclusive. Higher numbers represent weights that are bolder than (or as bold as) lower numbers. Certain commonly used values correspond to common weight names, as described in the [Common weight name mapping](#common_weight_name_mapping) section below. -In earlier versions of the `font-weight` specification, the property accepts only keyword values and the numeric values 100, 200, 300, 400, 500, 600, 700, 800, and 900; non-variable fonts can only really make use of these set values, although fine-grained values (e.g. 451) will be translated to one of these values for non-variable fonts. - -CSS Fonts Level 4 extends the syntax to accept any number between 1 and 1000, inclusive, and introduces [Variable fonts](#variable_fonts), which can make use of this much finer-grained range of font weights. - ### Common weight name mapping The numerical values `100` to `900` roughly correspond to the following common weight names: @@ -80,20 +87,214 @@ People experiencing low vision conditions may have difficulty reading text set w ## Examples -### Setting normal font weight in a @font-face rule +### Selecting normal and bold fonts + +In this example we include two fonts, one normal weight, one bold weight, from the ["Fira Sans"](https://fonts.google.com/specimen/Fira+Sans) font family using two `@font-face` at rules. We set `font-weight` descriptors to match the weight of the fonts. + +After this, CSS rules can select the normal or the bold font for the "Fira Sans" family just by setting the {{cssxref("font-weight")}} property. Note that the {{htmlelement("strong")}} HTML element also selects the bold font, because by default `` elements have a CSS `font-weight` property value of `bold`. + +#### HTML + +```html +

Fira Sans, `normal` weight paragraph

+

Fira Sans, `bold` weight paragraph

+

Fira Sans, <strong> element (`bold`)

+``` + +#### CSS + +```css +@font-face { + font-family: "Fira Sans"; + font-weight: normal; + src: url("https://mdn.github.io/shared-assets/fonts/FiraSans-Regular.woff2"); +} + +@font-face { + font-family: "Fira Sans"; + font-weight: bold; + src: url("https://mdn.github.io/shared-assets/fonts/FiraSans-Bold.woff2"); +} + +body { + font-family: "Fira Sans", serif; + font-size: 2rem; +} + +p.one { + font-weight: normal; +} + +p.two { + font-weight: bold; +} +``` + +#### Result + +{{embedlivesample("Selecting normal and bold fonts", "", 300)}} + +### Setting font-weight ranges + +This example demonstrates how authors can include multiple fonts for multiple font-weights (and font-styles), by including multiple `@font-face` declarations with the same `font-family` value. By setting the `font-weight` descriptors using ranges from 1 to 1000, in the rest of your stylesheets, you can declare a `font-weight` (or `font-style`), and know the appropriate font will be used. + +#### HTML + +```html +

This has a font weight of 100

+

This has a font weight of 300

+

This has a font weight of 400

+

This has a font weight of 500

+

This has a font weight of 700

+

This has a font weight of 900

+``` + +#### CSS -The following finds a local Open Sans font or imports it, and allows using the font for normal font weights. +We include four `@font-face` declarations for four different fonts from the `FireSans` font family, as seen in the previous example. Each declaration is set to a different range of font-weight values, but all use the same font name. + +The first declaration uses `FiraSans-Regular` and its associated `font-weight` range includes the entire possible range of font weight values. + +The other three declarations use the light, bold, and extra-bold versions of the font, and their associated `font-weight` ranges define subsets of the range as follows: + +- the light font is associated with the range 1-300 +- the bold font is associated with the range 500-700 +- the extra-bold font is associated with the range 700-1000 + +The CSS [cascade](/en-US/docs/Web/CSS/Cascade) ensures that the three latter declarations override parts of the the range that was set in the `FiraSans-Regular` declaration. ```css @font-face { - font-family: "Open Sans"; - src: - local("Open Sans") format("woff2"), - url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); + font-family: "Fira Sans"; + font-weight: 1 1000; + src: url("https://mdn.github.io/shared-assets/fonts/FiraSans-Regular.woff2"); +} + +@font-face { + font-family: "Fira Sans"; + font-weight: 1 300; + src: url("https://mdn.github.io/shared-assets/fonts/FiraSans-Light.woff2"); +} + +@font-face { + font-family: "Fira Sans"; + font-weight: 500 700; + src: url("https://mdn.github.io/shared-assets/fonts/FiraSans-Bold.woff2"); +} + +@font-face { + font-family: "Fira Sans"; + font-weight: 700 1000; + src: url("https://mdn.github.io/shared-assets/fonts/FiraSans-ExtraBold.woff2"); +} + +body { + font-family: "Fira Sans", serif; + font-size: 2rem; +} + +p.one { + font-weight: 100; +} + +p.three { + font-weight: 300; +} + +p.four { font-weight: 400; } + +p.five { + font-weight: 500; +} + +p.seven { + font-weight: 700; +} + +p.nine { + font-weight: 900; +} +``` + +#### Result + +{{embedlivesample("Setting font-weight ranges", "", 500)}} + +The `seven` paragraph uses the extra bold font. While `font-weight: 700` matches both the `FiraSans-Bold` and `FiraSans-ExtraBold` declarations, as the FiraSans-ExtraBold is declared later, it overrides the `FiraSans-Bold` for that value. + +Similarly, the `100` and `300` both use the light font; although `FiraSans-Regular` and `FiraSans-Light` both include `300` in their ranges, `FiraSans-Light` is declared later. Alternatively, we could have declared `FiraSans-Regular` after `FiraSans-Light`, but we would need to change the `font-weight` descriptor range if we do so. + +### Setting a range for a variable font + +In this example we're using the `font-weight` descriptor to restrict the range of weights that can be set when using a variable font. + +We include a variable font, ["League Mono"](https://www.theleagueofmoveabletype.com/league-mono), using a single `@font-face` at-rule. We use a `font-weight: 300 700` value to effectively limit the range of weights that are available. If a CSS rule uses our "League Mono" font, then if it specifies a weight outside this range the weight it gets is clamped to the range. + +#### HTML + +We include a paragraph with `` initially set to `400`, as that is the the default font-weight for unstyled paragraph text. This paragraph is nestled between two other paragraphs, so you can compare rendered versus declared font weight values. + +We include an {{htmlelement("input/range")}} of type `range`, nested in a {{htmlelement("label")}}, setting the `step` to `50`. + +```html +

LeagueMono, font-weight: 300 (comparison)

+

LeagueMono, font-weight: 400 (example)

+

LeagueMono, font-weight: 700 (comparison)

+ +``` + +#### CSS + +We set the `font-weight` descriptor range to `300 700`, clamping the variable font to that range. + +```css +@font-face { + font-family: LeagueMono; + src: url("https://mdn.github.io/shared-assets/fonts/LeagueMono-VF.ttf"); + font-weight: 300 700; +} + +p { + font-family: LeagueMono, serif; + font-size: 1.5rem; +} + +p:first-of-type { + font-weight: 300; +} + +p:last-of-type { + font-weight: 700; +} +``` + +#### JavaScript + +We include an event handler that updates the paragraph's `font-weight` property value, and updates the text to reflect the change: + +```js +const text = document.querySelector("#example"); +const log = document.querySelector("output"); +const range = document.querySelector("input"); + +range.addEventListener("change", () => { + text.style.fontWeight = range.value; + log.innerText = range.value; +}); ``` +#### Result + +{{embedlivesample("Setting a range for a variable font", "", "400")}} + +Change the font weight of the paragraph via the range. +Note that the example paragraph does not get lighter than the `300` paragraph above it or bolder than the `700` paragraph below it; the font weight is clamped to the range defined by the `font-weight` descriptor. + ## Specifications {{Specifications}} diff --git a/files/en-us/web/css/flood-color/index.md b/files/en-us/web/css/flood-color/index.md index 474e62012b37017..6fe13b5ab84b870 100644 --- a/files/en-us/web/css/flood-color/index.md +++ b/files/en-us/web/css/flood-color/index.md @@ -82,7 +82,7 @@ rect { } ``` -We then apply different flood color values to the `` elements using the CSS `flood-color` property. We use a named color and a 3-digit hexidecimal color, but we can use any valid CSS color syntax: +We then apply different flood color values to the `` elements using the CSS `flood-color` property. We use a named color and a 3-digit hexadecimal color, but we can use any valid CSS color syntax: ```css #flood1 feFlood { diff --git a/files/en-us/web/css/gradient/conic-gradient/index.md b/files/en-us/web/css/gradient/conic-gradient/index.md index 2f2b7ecb5fb3f9e..67b6c411fabd7fa 100644 --- a/files/en-us/web/css/gradient/conic-gradient/index.md +++ b/files/en-us/web/css/gradient/conic-gradient/index.md @@ -2,7 +2,7 @@ title: conic-gradient() slug: Web/CSS/gradient/conic-gradient page-type: css-function -browser-compat: css.types.image.gradient.conic-gradient +browser-compat: css.types.gradient.conic-gradient --- {{CSSRef}} diff --git a/files/en-us/web/css/gradient/linear-gradient/index.md b/files/en-us/web/css/gradient/linear-gradient/index.md index cdf84d89ce2e798..e3fbd6d076a64a8 100644 --- a/files/en-us/web/css/gradient/linear-gradient/index.md +++ b/files/en-us/web/css/gradient/linear-gradient/index.md @@ -2,7 +2,7 @@ title: linear-gradient() slug: Web/CSS/gradient/linear-gradient page-type: css-function -browser-compat: css.types.image.gradient.linear-gradient +browser-compat: css.types.gradient.linear-gradient --- {{CSSRef}} diff --git a/files/en-us/web/css/gradient/radial-gradient/index.md b/files/en-us/web/css/gradient/radial-gradient/index.md index 5d93e593c02ec0c..f46f61a5216b271 100644 --- a/files/en-us/web/css/gradient/radial-gradient/index.md +++ b/files/en-us/web/css/gradient/radial-gradient/index.md @@ -2,7 +2,7 @@ title: radial-gradient() slug: Web/CSS/gradient/radial-gradient page-type: css-function -browser-compat: css.types.image.gradient.radial-gradient +browser-compat: css.types.gradient.radial-gradient --- {{CSSRef}} diff --git a/files/en-us/web/css/gradient/repeating-conic-gradient/index.md b/files/en-us/web/css/gradient/repeating-conic-gradient/index.md index a737920c6420cd6..4d1d1ea85c99a9c 100644 --- a/files/en-us/web/css/gradient/repeating-conic-gradient/index.md +++ b/files/en-us/web/css/gradient/repeating-conic-gradient/index.md @@ -2,7 +2,7 @@ title: repeating-conic-gradient() slug: Web/CSS/gradient/repeating-conic-gradient page-type: css-function -browser-compat: css.types.image.gradient.repeating-conic-gradient +browser-compat: css.types.gradient.repeating-conic-gradient --- {{CSSRef}} diff --git a/files/en-us/web/css/gradient/repeating-linear-gradient/index.md b/files/en-us/web/css/gradient/repeating-linear-gradient/index.md index 11c70ecbce614df..5a0c0e417517e79 100644 --- a/files/en-us/web/css/gradient/repeating-linear-gradient/index.md +++ b/files/en-us/web/css/gradient/repeating-linear-gradient/index.md @@ -2,7 +2,7 @@ title: repeating-linear-gradient() slug: Web/CSS/gradient/repeating-linear-gradient page-type: css-function -browser-compat: css.types.image.gradient.repeating-linear-gradient +browser-compat: css.types.gradient.repeating-linear-gradient --- {{CSSRef}} diff --git a/files/en-us/web/css/gradient/repeating-radial-gradient/index.md b/files/en-us/web/css/gradient/repeating-radial-gradient/index.md index 99eb338e262621e..1bc5324ad886a8c 100644 --- a/files/en-us/web/css/gradient/repeating-radial-gradient/index.md +++ b/files/en-us/web/css/gradient/repeating-radial-gradient/index.md @@ -2,7 +2,7 @@ title: repeating-radial-gradient() slug: Web/CSS/gradient/repeating-radial-gradient page-type: css-function -browser-compat: css.types.image.gradient.repeating-radial-gradient +browser-compat: css.types.gradient.repeating-radial-gradient --- {{CSSRef}} diff --git a/files/en-us/web/css/layout_cookbook/sticky_footers/index.md b/files/en-us/web/css/layout_cookbook/sticky_footers/index.md index 5136bbca37a8b80..3a20554cb72ec3d 100644 --- a/files/en-us/web/css/layout_cookbook/sticky_footers/index.md +++ b/files/en-us/web/css/layout_cookbook/sticky_footers/index.md @@ -71,7 +71,7 @@ body { } ``` -{{EmbedLiveSample("stiky-footer-example", "", "400px")}} +{{EmbedLiveSample("sticky-footer-example", "", "400px")}} > [!NOTE] > In this example and the following one we are using a wrapper set to `min-height: 100%`. You can also achieve this for a full page by setting a {{cssxref("min-height")}} of `100vh` on the {{htmlelement("body")}} and then using it as your grid container. @@ -142,7 +142,7 @@ body { } ``` -{{EmbedLiveSample("stiky-footer-flexbox-example", "", "400px")}} +{{EmbedLiveSample("sticky-footer-flexbox-example", "", "400px")}} The flexbox example starts out in the same way, but we use `display:flex` rather than `display:grid` on the `.wrapper`; we also set `flex-direction` to `column`. Then we set our main content to `flex-grow: 1` and the other two elements to `flex-shrink: 0` — this prevents them from shrinking smaller when content fills the main area. diff --git a/files/en-us/web/css/lighting-color/index.md b/files/en-us/web/css/lighting-color/index.md index 796cd25365cd5f2..a71a4c9817ac308 100644 --- a/files/en-us/web/css/lighting-color/index.md +++ b/files/en-us/web/css/lighting-color/index.md @@ -95,7 +95,7 @@ rect { } ``` -We then apply different lighting color values to the filter's child elements using the CSS `lighting-color` property. We use a named color and a 3-digit hexidecimal color, but we can use any valid CSS color syntax: +We then apply different lighting color values to the filter's child elements using the CSS `lighting-color` property. We use a named color and a 3-digit hexadecimal color, but we can use any valid CSS color syntax: ```css feDiffuseLighting { diff --git a/files/en-us/web/css/mod/index.md b/files/en-us/web/css/mod/index.md index ed08de3d19fcbee..6b4fa6bc7863d96 100644 --- a/files/en-us/web/css/mod/index.md +++ b/files/en-us/web/css/mod/index.md @@ -9,7 +9,7 @@ browser-compat: css.types.mod The **`mod()`** [CSS](/en-US/docs/Web/CSS) [function](/en-US/docs/Web/CSS/CSS_Functions) returns a modulus left over when the first parameter is divided by the second parameter, similar to the JavaScript [remainder operator (`%`)](/en-US/docs/Web/JavaScript/Reference/Operators/Remainder). The modulus is the value left over when one operand, the dividend, is divided by a second operand, the divisor. It always takes the sign of the divisor. -> For example, the CSS `mod(21, -4)` function returns the remainder of `-1`. When dividing 21 by -4, the result is 5 with a remainder of -1. The full calculation is `21 / -4 = -4 * 5 - 1`. +The calculation is `a - (Math.floor(a / b) * b)`. For example, the CSS `mod(21, -4)` function returns the remainder of `-3`. The full calculation is `21 - (Math.floor(21 / -4) * -4)`. When dividing `21` by `-4`, the result is `-5.25`. This is floored to `-6`. Multiplying `-6` by `-4` is `24`. Subtracting this `24` from the original `21`, the remainder is -3. ## Syntax diff --git a/files/en-us/web/html/element/video/index.md b/files/en-us/web/html/element/video/index.md index d10fed88ee0f745..88504e19ce2867f 100644 --- a/files/en-us/web/html/element/video/index.md +++ b/files/en-us/web/html/element/video/index.md @@ -540,4 +540,4 @@ Some media file types let you provide more specific information using the [`code - {{htmlelement("audio")}} - [HTML video and audio](/en-US/docs/Learn_web_development/Core/Structuring_content/HTML_video_and_audio) - [Manipulating video using canvas](/en-US/docs/Web/API/Canvas_API/Manipulating_video_using_canvas) -- [Configuring servers for Ogg media](/en-US/docs/Web/HTTP/Configuring_servers_for_Ogg_media) +- [Configuring servers for Ogg media](/en-US/docs/Web/Media/Formats/Configuring_servers_for_Ogg_media) diff --git a/files/en-us/web/html/global_attributes/autocorrect/index.md b/files/en-us/web/html/global_attributes/autocorrect/index.md index 92649984dd65106..1635258a12f174c 100644 --- a/files/en-us/web/html/global_attributes/autocorrect/index.md +++ b/files/en-us/web/html/global_attributes/autocorrect/index.md @@ -9,7 +9,11 @@ browser-compat: html.global_attributes.autocorrect {{HTMLSidebar("Global_attributes")}}{{SeeCompatTable}} -The **`autocorrect`** [global attribute](/en-US/docs/Web/HTML/Global_attributes) is an [enumerated](/en-US/docs/Glossary/Enumerated) attribute that controls whether editable text is automatically corrected for spelling and/or punctuation errors. +The **`autocorrect`** [global attribute](/en-US/docs/Web/HTML/Global_attributes) is an [enumerated](/en-US/docs/Glossary/Enumerated) attribute that controls whether autocorrection of editable text is enabled for spelling and/or punctuation errors. + +The specific autocorrection behavior, including which words are substituted, depends on the user agent and the services provided by the underlying device. +For example, on macOS a user agent might rely on [registered replacement text and punctuation](https://support.apple.com/en-vn/guide/mac-help/mh35735/mac). +Other devices and browsers may use a different approach. Autocorrection is relevant to editable text elements: @@ -62,7 +66,8 @@ We include two text `` elements with different values for their `autocorr {{EmbedLiveSample("Basic example", "100%", "75")}} Enter invalid text into the fruit and vegetable text entry boxes above. -If auto-correction is enabled on your browser, a typo in a vegetable name should be auto-corrected, but not in a fruit name. +If auto-correction is supported on your browser, and there is an appropriate substitution provided by the underlying device, a typo in a vegetable name input should be auto-corrected. +Typos should not be corrected in the fruit name field. ### Enabling and disabling autocorrection @@ -138,11 +143,13 @@ resetButton.addEventListener("click", (e) => { #### Results -Enter invalid text into the name and biography text entry boxes below. -If auto-correction is enabled on your browser (see the log below) the text in the "Biography" should be auto-corrected, but not in the "Name" box. +If auto-correction is supported by your browser, the log area below the "Biography" and "Name" inputs should show that it is enabled for "Biography" inputs but not "Name" inputs. {{EmbedLiveSample("Enabling and disabling autocorrection", "100%", "250")}} +Enter invalid text into the name and biography text entry boxes. +If the device has a substitute for the entered word, this will be used to autocorrect text in the "Biography" input (only). + ## Specifications {{Specifications}} diff --git a/files/en-us/web/http/cookies/index.md b/files/en-us/web/http/cookies/index.md index abc3a7e5bcccf6e..9b69ed7b5dfb592 100644 --- a/files/en-us/web/http/cookies/index.md +++ b/files/en-us/web/http/cookies/index.md @@ -59,7 +59,7 @@ Set-Cookie: tasty_cookie=strawberry ``` > [!NOTE] -> Find out how to use the `Set-Cookie` header in various server-side languages/frameworks: [PHP](https://www.php.net/manual/en/function.setcookie.php), [Node.js](https://nodejs.org/dist/latest-v14.x/docs/api/http.html#http_response_setheader_name_value), [Python](https://docs.python.org/3/library/http.cookies.html), [Ruby on Rails](https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html). +> Find out how to use the `Set-Cookie` header in various server-side languages/frameworks: [PHP](https://www.php.net/manual/en/function.setcookie.php), [Node.js](https://nodejs.org/docs/latest-v19.x/api/http.html#responsesetheadername-value), [Python](https://docs.python.org/3/library/http.cookies.html), [Ruby on Rails](https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html). When a new request is made, the browser usually sends previously stored cookies for the current domain back to the server within a {{HTTPHeader("Cookie")}} HTTP header: diff --git a/files/en-us/web/http/csp/index.md b/files/en-us/web/http/csp/index.md index 63765f82f167b44..738174fe2efc3e6 100644 --- a/files/en-us/web/http/csp/index.md +++ b/files/en-us/web/http/csp/index.md @@ -581,7 +581,7 @@ The server handling these requests can then store or process the incoming report ## See also -- [Mitigate cross-site scripting with a strict Content Security Policy](https://web.dev/strict-csp) on web.dev (2024) +- [Mitigate cross-site scripting with a strict Content Security Policy](https://web.dev/articles/strict-csp) on web.dev (2024) - [Content Security Policy: A successful mess between hardening and mitigation](https://infocondb.org/con/locomocosec/locomocosec-2019/content-security-policy-a-successful-mess-between-hardening-and-mitigation) - [Content Security Policy Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html) on owasp.org - [CSP Evaluator](https://csp-evaluator.withgoogle.com/) diff --git a/files/en-us/web/http/index.md b/files/en-us/web/http/index.md index a4b226900163107..db6bf240bfd6be4 100644 --- a/files/en-us/web/http/index.md +++ b/files/en-us/web/http/index.md @@ -93,7 +93,7 @@ Beginners are encouraged to start with the foundational guides before exploring - [Browser detection using the user agent](/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent) - : It's very rarely a good idea to use user agent sniffing to detect a browser, but there are edge cases that require it. This document will guide you in doing this as correctly as possible when this is necessary, with an emphasis on considerations to make before embarking on this route. -- [Configuring servers for Ogg media](/en-US/docs/Web/HTTP/Configuring_servers_for_Ogg_media) +- [Configuring servers for Ogg media](/en-US/docs/Web/Media/Formats/Configuring_servers_for_Ogg_media) - : This guide covers a few server configuration changes that may be necessary for your web server to correctly serve Ogg media files. This information may also be useful if you encounter other media types your server isn't already configured to recognize. diff --git a/files/en-us/web/http/methods/delete/index.md b/files/en-us/web/http/methods/delete/index.md index ac1e95ffc3d786c..4bc80832cd40655 100644 --- a/files/en-us/web/http/methods/delete/index.md +++ b/files/en-us/web/http/methods/delete/index.md @@ -2,7 +2,7 @@ title: DELETE slug: Web/HTTP/Methods/DELETE page-type: http-method -browser-compat: http.methods.DELETE +spec-urls: https://www.rfc-editor.org/rfc/rfc9110.html#name-delete --- {{HTTPSidebar}} @@ -111,7 +111,8 @@ Content-Length: 1234 ## Browser compatibility -{{Compat}} +The browser doesn't use the `DELETE` method for user-initiated actions, so "browser compatibility" doesn't apply. +Developers can set this request method using [`fetch()`](/en-US/docs/Web/API/Window/fetch). ## See also diff --git a/files/en-us/web/http/methods/patch/index.md b/files/en-us/web/http/methods/patch/index.md index 92bdade6a56dd04..c022e38b97a8dc2 100644 --- a/files/en-us/web/http/methods/patch/index.md +++ b/files/en-us/web/http/methods/patch/index.md @@ -117,6 +117,11 @@ ETag: "e0023aa4f" {{Specifications}} +## Browser compatibility + +The browser doesn't use the `PATCH` method for user-initiated actions, so "browser compatibility" doesn't apply. +Developers can set this request method using [`fetch()`](/en-US/docs/Web/API/Window/fetch). + ## See also - [HTTP request methods](/en-US/docs/Web/HTTP/Methods) diff --git a/files/en-us/web/http/methods/put/index.md b/files/en-us/web/http/methods/put/index.md index f7ea8c45900ca6c..967ebfd57a292e7 100644 --- a/files/en-us/web/http/methods/put/index.md +++ b/files/en-us/web/http/methods/put/index.md @@ -90,7 +90,8 @@ Content-Location: /existing.html ## Browser compatibility -{{Compat}} +The browser doesn't use the `PUT` method for user-initiated actions, so "browser compatibility" doesn't apply. +Developers can set this request method using [`fetch()`](/en-US/docs/Web/API/Window/fetch). ## See also diff --git a/files/en-us/web/http/methods/trace/index.md b/files/en-us/web/http/methods/trace/index.md index a416004354bfdb9..8ce31e75b8eee01 100644 --- a/files/en-us/web/http/methods/trace/index.md +++ b/files/en-us/web/http/methods/trace/index.md @@ -96,6 +96,11 @@ Accept: */* {{Specifications}} +## Browser compatibility + +The browser doesn't use the `TRACE` method for user-initiated actions, so "browser compatibility" doesn't apply. +Developers can set this request method using [`fetch()`](/en-US/docs/Web/API/Window/fetch). + ## See also - [HTTP request methods](/en-US/docs/Web/HTTP/Methods) diff --git a/files/en-us/web/javascript/guide/regular_expressions/index.md b/files/en-us/web/javascript/guide/regular_expressions/index.md index 251f3b65844efcc..07ab0d0913ab478 100644 --- a/files/en-us/web/javascript/guide/regular_expressions/index.md +++ b/files/en-us/web/javascript/guide/regular_expressions/index.md @@ -157,18 +157,7 @@ For instance, to match the string "C:\\" where "C" can be any letter, you'd use If using the `RegExp` constructor with a string literal, remember that the backslash is an escape in string literals, so to use it in the regular expression, you need to escape it at the string literal level. `/a\*b/` and `new RegExp("a\\*b")` create the same expression, which searches for "a" followed by a literal "\*" followed by "b". -If escape strings are not already part of your pattern you can add them using {{jsxref("String.prototype.replace()")}}: - -```js -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -} -``` - -The "g" after the regular expression is an option or flag that performs a global search, looking in the whole string and returning all matches. -It is explained in detail below in [Advanced Searching With Flags](#advanced_searching_with_flags). - -_Why isn't this built into JavaScript?_ There is a [proposal](https://github.com/tc39/proposal-regex-escaping) to add such a function to RegExp. +The {{jsxref("RegExp.escape()")}} function returns a new string where all special characters in regex syntax are escaped. This allows you to do `new RegExp(RegExp.escape("a*b"))` to create a regular expression that matches only the string `"a*b"`. ### Using parentheses diff --git a/files/en-us/web/javascript/reference/global_objects/regexp/escape/index.md b/files/en-us/web/javascript/reference/global_objects/regexp/escape/index.md new file mode 100644 index 000000000000000..f7a3b0a04c8022b --- /dev/null +++ b/files/en-us/web/javascript/reference/global_objects/regexp/escape/index.md @@ -0,0 +1,108 @@ +--- +title: RegExp.escape() +slug: Web/JavaScript/Reference/Global_Objects/RegExp/escape +page-type: javascript-static-method +browser-compat: javascript.builtins.RegExp.escape +--- + +{{JSRef}} + +The **`RegExp.escape()`** static method [escapes](/en-US/docs/Web/JavaScript/Reference/Regular_expressions#escape_sequences) any potential regex syntax characters in a string, and returns a new string that can be safely used as a [literal](/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Literal_character) pattern for the {{jsxref("RegExp/RegExp", "RegExp()")}} constructor. + +When dynamically creating a {{jsxref("RegExp")}} with user-provided content, consider using this function to sanitize the input (unless the input is actually intended to contain regex syntax). In addition, don't try to re-implement its functionality by, for example, using {{jsxref("String.prototype.replaceAll()")}} to insert a `\` before all syntax characters. `RegExp.escape()` is designed to use escape sequences that work in many more edge cases/contexts than hand-crafted code is likely to achieve. + +## Syntax + +```js-nolint +RegExp.escape(string) +``` + +### Parameters + +- `string` + - : The string to escape. + +### Return value + +A new string that can be safely used as a literal pattern for the {{jsxref("RegExp/RegExp", "RegExp()")}} constructor. Namely, the following things in the input string are replaced: + +- The first character of the string, if it's either a decimal digit (0–9) or ASCII letter (a–z, A–Z), is escaped using the `\x` [character escape](/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Character_escape) syntax. For example, `RegExp.escape("foo")` returns `"\\x66oo"` (here and after, the two backslashes in a string literal denote a single backslash character). This step ensures that if this escaped string is embedded into a bigger pattern where it's immediately preceded by `\1`, `\x0`, `\u000`, etc., the leading character doesn't get interpreted as part of the escape sequence. +- Regex [syntax characters](/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Literal_character#description), including `^`, `$`, `\`, `.`, `*`, `+`, `?`, `(`, `)`, `[`, `]`, `{`, `}`, and `|`, as well as the `/` delimiter, are escaped by inserting a `\` character before them. For example, `RegExp.escape("foo.bar")` returns `"\\x66oo\\.bar"`, and `RegExp.escape("(foo)")` returns `"\\(foo\\)"`. +- Other punctuators, including `,`, `-`, `=`, `<`, `>`, `#`, `&`, `!`, `%`, `:`, `;`, `@`, `~`, `'`, `` ` ``, and `"`, are escaped using the `\x` syntax. For example, `RegExp.escape("foo-bar")` returns `"\\x66oo\\x2dbar"`. These characters cannot be escaped by prefixing with `\` because, for example, `/foo\-bar/u` is a syntax error. +- The characters with their own [character escape](/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Character_escape) sequences: `\f` (U+000C FORM FEED), `\n` (U+000A LINE FEED), `\r` (U+000D CARRIAGE RETURN), `\t` (U+0009 CHARACTER TABULATION), and `\v` (U+000B LINE TABULATION), are replaced with their escape sequences. For example, `RegExp.escape("foo\nbar")` returns `"\\x66oo\\nbar"`. +- The space character is escaped as `"\\x20"`. +- Other non-ASCII [line break and white space characters](/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#white_space) are replaced with one or two `\uXXXX` escape sequences representing their UTF-16 code units. For example, `RegExp.escape("foo\u2028bar")` returns `"\\x66oo\\u2028bar"`. +- [Lone surrogates](/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#utf-16_characters_unicode_code_points_and_grapheme_clusters) are replaced with their `\uXXXX` escape sequences. For example, `RegExp.escape("foo\uD800bar")` returns `"\\x66oo\\ud800bar"`. + +### Exceptions + +- {{jsxref("TypeError")}} + - : Thrown if `string` is not a string. + +## Examples + +### Using RegExp.escape() + +The following examples demonstrate various inputs and outputs for the `RegExp.escape()` method. + +```js +RegExp.escape("Buy it. use it. break it. fix it."); +// "\\x42uy\\x20it\\.\\x20use\\x20it\\.\\x20break\\x20it\\.\\x20fix\\x20it\\." +RegExp.escape("foo.bar"); // "\\x66oo\\.bar" +RegExp.escape("foo-bar"); // "\\x66oo\\x2dbar" +RegExp.escape("foo\nbar"); // "\\x66oo\\nbar" +RegExp.escape("foo\uD800bar"); // "\\x66oo\\ud800bar" +RegExp.escape("foo\u2028bar"); // "\\x66oo\\u2028bar" +``` + +### Using RegExp.escape() with the RegExp constructor + +The primary use case of `RegExp.escape()` is when you want to embed a string into a bigger regex pattern, and you want to ensure that the string is treated as a literal pattern, not as a regex syntax. Consider the following naïve example that replaces URLs: + +```js +function removeDomain(text, domain) { + return text.replace(new RegExp(`https?://${domain}(?=/)`, "g"), ""); +} + +const input = + "Consider using [RegExp.escape()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape) to escape special characters in a string."; +const domain = "developer.mozilla.org"; +console.log(removeDomain(input, domain)); +// Consider using [RegExp.escape()](/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape) to escape special characters in a string. +``` + +Inserting the `domain` above results in the regular expression literal `https?://developer.mozilla.org(?=/)`, where the "." character is a regex [wildcard](/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Wildcard) character. This means the string will match the string with any character in place of the ".", such as `developer-mozilla-org`. Therefore, it would incorrectly also change the following text: + +```js +const input = + "This is not an MDN link: https://developer-mozilla.org/, be careful!"; +const domain = "developer.mozilla.org"; +console.log(removeDomain(input, domain)); +// This is not an MDN link: /, be careful! +``` + +To fix this, we can use `RegExp.escape()` to ensure that any user input is treated as a literal pattern: + +```js +function removeDomain(text, domain) { + return text.replace( + new RegExp(`https?://${RegExp.escape(domain)}(?=/)`, "g"), + "", + ); +} +``` + +Now this function will do exactly what we intend to, and will not transform `developer-mozilla.org` URLs. + +## Specifications + +{{Specifications}} + +## Browser compatibility + +{{Compat}} + +## See also + +- [Polyfill of `RegExp.escape` in `core-js`](https://github.com/zloirock/core-js#regexp-escaping) +- {{jsxref("RegExp")}} diff --git a/files/en-us/web/javascript/reference/global_objects/regexp/index.md b/files/en-us/web/javascript/reference/global_objects/regexp/index.md index cfc700508d36262..1866385e0c892cb 100644 --- a/files/en-us/web/javascript/reference/global_objects/regexp/index.md +++ b/files/en-us/web/javascript/reference/global_objects/regexp/index.md @@ -115,6 +115,11 @@ Note that several of the `RegExp` properties have both long and short (Perl-like - [`RegExp[Symbol.species]`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/Symbol.species) - : The constructor function that is used to create derived objects. +## Static methods + +- {{jsxref("RegExp.escape()")}} + - : [Escapes](/en-US/docs/Web/JavaScript/Reference/Regular_expressions#escape_sequences) any potential regex syntax characters in a string, and returns a new string that can be safely used as a [literal](/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Literal_character) pattern for the {{jsxref("RegExp/RegExp", "RegExp()")}} constructor. + ## Instance properties These properties are defined on `RegExp.prototype` and shared by all `RegExp` instances. diff --git a/files/en-us/web/javascript/reference/global_objects/string/replaceall/index.md b/files/en-us/web/javascript/reference/global_objects/string/replaceall/index.md index 92406649d173bfc..4b9aa7795b4e49e 100644 --- a/files/en-us/web/javascript/reference/global_objects/string/replaceall/index.md +++ b/files/en-us/web/javascript/reference/global_objects/string/replaceall/index.md @@ -41,7 +41,7 @@ A new string, with all matches of a pattern replaced by a replacement. This method does not mutate the string value it's called on. It returns a new string. -Unlike [`replace()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace), this method would replace all occurrences of a string, not just the first one. This is especially useful if the string is not statically known, as calling the [`RegExp()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp) constructor without escaping special characters may unintentionally change its semantics. +Unlike [`replace()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace), this method replaces all occurrences of a string, not just the first one. While it is also possible to use `replace()` with a global regex dynamically constructed with [`RegExp()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp) to replace all instances of a string, this can have unintended consequences if the string contains special characters that have meaning in regular expressions (which might happen if the replacement string comes from user input). While you can mitigate this case using {{jsxref("RegExp.escape()")}} to make the regular expression string into a literal pattern, it is better to just use `replaceAll()` and pass the string without converting it to a regex. ```js function unsafeRedactName(text, name) { diff --git a/files/en-us/web/javascript/reference/regular_expressions/index.md b/files/en-us/web/javascript/reference/regular_expressions/index.md index f57391d0cef144c..fddd05c6ea4cf6e 100644 --- a/files/en-us/web/javascript/reference/regular_expressions/index.md +++ b/files/en-us/web/javascript/reference/regular_expressions/index.md @@ -147,7 +147,7 @@ _Escape sequences_ in regexes refer to any kind of syntax formed by `\` followed [VCC]: /en-US/docs/Web/JavaScript/Reference/Regular_expressions/Character_class#v-mode_character_class [WBA]: /en-US/docs/Web/JavaScript/Reference/Regular_expressions/Word_boundary_assertion -`\` followed by any other digit character becomes a [legacy octal escape sequence](/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features#escape_sequences), which is forbidden in [Unicode-aware mode](/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/unicode#unicode-aware_mode). +`\` followed by `0` and another digit becomes a [legacy octal escape sequence](/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features#escape_sequences), which is forbidden in [Unicode-aware mode](/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/unicode#unicode-aware_mode). `\` followed by any other digit sequence becomes a [backreference](/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Backreference). In addition, `\` can be followed by some non-letter-or-digit characters, in which case the escape sequence is always a [character escape](/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Character_escape) representing the escaped character itself: diff --git a/files/en-us/web/http/configuring_servers_for_ogg_media/index.md b/files/en-us/web/media/formats/configuring_servers_for_ogg_media/index.md similarity index 52% rename from files/en-us/web/http/configuring_servers_for_ogg_media/index.md rename to files/en-us/web/media/formats/configuring_servers_for_ogg_media/index.md index 65262ca0ec09aa5..b81af4e7b7a9775 100644 --- a/files/en-us/web/http/configuring_servers_for_ogg_media/index.md +++ b/files/en-us/web/media/formats/configuring_servers_for_ogg_media/index.md @@ -1,42 +1,44 @@ --- title: Configuring servers for Ogg media -slug: Web/HTTP/Configuring_servers_for_Ogg_media +slug: Web/Media/Formats/Configuring_servers_for_Ogg_media page-type: guide --- -{{HTTPSidebar}} +{{QuickLinksWithSubpages("/en-US/docs/Web/Media")}} -HTML {{HTMLElement("audio")}} and {{HTMLElement("video")}} elements allow media presentation without the need for the user to install any plug-ins or other software to do so. -This guide covers a few server configuration changes that may be necessary for your web server to correctly serve Ogg media files. +HTML {{HTMLElement("audio")}} and {{HTMLElement("video")}} elements allow media presentation without the need for the user to install extensions or other software. +This guide covers server configuration that may be necessary to correctly serve Ogg media files. This information may also be useful if you encounter other media types your server isn't already configured to recognize. ## Serve media with the correct MIME type -`*.ogg` and `*.ogv` files containing video (possibly with an audio track as well, of course), should be served with the `video/ogg` MIME type. `*.oga` and `*.ogg` files containing only audio should be served with the `audio/ogg` MIME type. - If you don't know whether the Ogg file contains audio or video, you can serve it with the MIME type `application/ogg`, and the browser will treat it as a video file. -Most servers don't by default serve Ogg media with the correct MIME types, so you'll likely need to add the appropriate configuration for this. +- `*.ogg` and `*.ogv` files containing video (possibly with an audio track as well, of course), should be served with the `video/ogg` MIME type. +- `*.oga` and `*.ogg` files containing only audio should be served with the `audio/ogg` MIME type. + +Most servers don't serve Ogg media with the correct MIME types by default, so you'll likely need to add the appropriate configuration for this. For Apache, you can add the following to your configuration: -```plain +```apacheconf AddType audio/ogg .oga AddType video/ogg .ogv AddType application/ogg .ogg ``` -You can find specific information about possible media file types and the codecs used within them in our comprehensive [guide to media types and formats on the web](/en-US/docs/Web/Media/Formats). In particular, the article on [media container formats](/en-US/docs/Web/Media/Formats/Containers) will be especially helpful when configuring servers to host media properly. +The article on [media container formats](/en-US/docs/Web/Media/Formats/Containers) is especially helpful when configuring servers to host media properly. -## Handle HTTP 1.1 byte range requests correctly +## Handle range requests correctly -In order to support seeking and playing back regions of the media that aren't yet downloaded, Firefox uses HTTP 1.1 byte-range requests to retrieve the media from the seek target position. +In order to support seeking and playing back regions of the media that aren't yet downloaded, you can uses [range requests](/en-US/docs/Web/HTTP/Range_requests) to retrieve the media from the seek target position. In addition, it uses byte-range requests to seek to the end of the media (assuming you serve the {{HTTPHeader("Content-Length")}} header) in order to determine the duration of the media. -Your server should accept the {{HTTPHeader("Accept-Ranges")}}`: bytes` HTTP header if it can accept byte-range requests. It must return {{HTTPStatus("206")}}`: Partial content` to all byte range requests; otherwise, browsers can't be sure you actually support byte range requests. +Your server should accept the {{HTTPHeader("Accept-Ranges")}} header if it can accept range requests. +It must return {{HTTPStatus("206", "206 Partial Content")}} to all range requests, otherwise browsers can't determine if the server supports range requests. Your server must also return `206: Partial Content` for the request `Range: bytes=0-` as well. -For more information, see [HTTP range requests](/en-US/docs/Web/HTTP/Range_requests). +See [range requests](/en-US/docs/Web/HTTP/Range_requests) for more information. ## Include regular key frames @@ -49,32 +51,12 @@ By default, [`ffmpeg2theora`](https://gitlab.xiph.org/xiph/ffmpeg2theora) uses o ## Consider using the preload attribute -The HTML {{HTMLElement("audio")}} and {{HTMLElement("video")}} elements provide the `preload` attribute, which tells the browser to attempt to download the entire media when the page loads. Without `preload`, the browser only downloads enough of the media to display the first video frame, and to determine the media's duration. - -`preload` is off by default, so if getting to video is the point of your web page, your users may appreciate it if you include `preload` in your video elements. Using `preload="metadata"` will preload the media file's metadata and possibly the first few frames of video. Setting `payload` to `auto` tells the browser to automatically begin downloading the media as soon as the page is loaded, under the assumption that the user will play it. - -## Configuration for older Firefox versions - -### Serve X-Content-Duration headers - -> [!NOTE] -> As of [Firefox 41](/en-US/docs/Mozilla/Firefox/Releases/41), the `X-Content-Duration` header is no longer supported. See [Firefox bug 1160695](https://bugzil.la/1160695) for more details. - -The Ogg format doesn't encapsulate the duration of media, so for the progress bar on the video controls to display the duration of the video, Gecko needs to determine the length of the media using other means. - -There are two ways Gecko can do this. The best way is to offer an `X-Content-Duration` header when serving Ogg media files. This header provides the duration of the video in seconds (**not** in HH:MM:SS format) as a floating-point value. - -For example, if the video is 1 minute and 32.6 seconds long, this header would be: - -```http -X-Content-Duration: 92.6 -``` - -If your server provides the `X-Content-Duration` header when serving Ogg media, Gecko doesn't have to do any extra HTTP requests to seek to the end of the file to calculate its duration. This makes the entire process much more efficient as well as more accurate. +The HTML {{HTMLElement("audio")}} and {{HTMLElement("video")}} elements provide the `preload` attribute, which tells the browser to attempt to download the entire media when the page loads. Without `preload`, the browser downloads enough of the media to display the first video frame, and to determine the media's duration. -As an inferior alternative, Gecko can estimate the video length based on the Content-Length. See next point. +- `preload` is off by default, so if getting to video is the point of your web page, your users may appreciate it if you include `preload` in your video elements. +- Using `preload="metadata"` will preload the media file's metadata and possibly the first few frames of video. Setting `payload` to `auto` tells the browser to automatically begin downloading the media as soon as the page is loaded, under the assumption that the user will play it. -### Don't use HTTP compression for media files +## Don't use HTTP compression for Ogg media One common way to reduce the load on a web server is to use [gzip or deflate compression](https://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/) when serving to a supporting web browser. @@ -82,11 +64,11 @@ Although it's unlikely, it's possible the browser may advertise that it supports Another problem with allowing HTTP compression for media streaming: Apache servers don't send the {{HTTPHeader("Content-Length")}} response header if gzip encoding is used. -### Getting the duration of Ogg media +## Getting the duration of Ogg media You can use the `oggz-info` tool to get the media duration; this tool is included with the [`oggz-tools`](https://www.xiph.org/oggz/) package. The output from `oggz-info` looks like this: -```plain +```bash $ oggz-info /g/media/bruce_vs_ironman.ogv Content-Duration: 00:01:00.046 @@ -107,7 +89,9 @@ Vorbis: serialno 0708996688 Audio-Channels: 2 ``` -Note that you can't serve up the reported Content-Duration line reported by `oggz-info`, because it's reported in HH:MM:SS format. You'll need to convert it to seconds only, then serve that as your `X-Content-Duration` value. Just parse out the HH, MM, and SS into numbers, then do (HH\*3600)+(MM\*60)+SS to get the value you should report. +Note that you can't serve up the reported Content-Duration line reported by `oggz-info`, because it's reported in `HH:MM:SS` format. +You'll need to convert it to seconds, then serve that as your `X-Content-Duration` value. +You can do this by parsing the `HH`, `MM`, and `SS` segments, then convert to `(HH * 3600) + (MM * 60) + SS` as the value you should report. It's important to note that it appears that `oggz-info` makes a read pass of the media in order to calculate its duration, so it's a good idea to store the duration value in order to avoid lengthy delays while the value is calculated for every HTTP request of your Ogg media. @@ -115,4 +99,3 @@ It's important to note that it appears that `oggz-info` makes a read pass of the - [Guide to media types and formats on the web](/en-US/docs/Web/Media/Formats) - [HTML video and audio](/en-US/docs/Learn_web_development/Core/Structuring_content/HTML_video_and_audio) -- [Codecs in common media types](/en-US/docs/Web/Media/Formats/codecs_parameter) diff --git a/files/en-us/web/svg/attribute/zoomandpan/index.md b/files/en-us/web/svg/attribute/zoomandpan/index.md index 22ae9f4b8c89d74..ec42c310af09124 100644 --- a/files/en-us/web/svg/attribute/zoomandpan/index.md +++ b/files/en-us/web/svg/attribute/zoomandpan/index.md @@ -4,7 +4,9 @@ slug: Web/SVG/Attribute/zoomAndPan page-type: svg-attribute status: - deprecated -browser-compat: svg.elements.svg.zoomAndPan +browser-compat: + - svg.elements.svg.zoomAndPan + - svg.elements.view.zoomAndPan --- {{SVGRef}}{{Deprecated_Header}} diff --git a/files/en-us/web/svg/element/a/index.md b/files/en-us/web/svg/element/a/index.md index 35a94048e22e626..50099ba9a6f5b14 100644 --- a/files/en-us/web/svg/element/a/index.md +++ b/files/en-us/web/svg/element/a/index.md @@ -76,7 +76,7 @@ svg|a:active { _Value type_: **[\](/en-US/docs/Web/SVG/Content_type#url)** ; _Default value_: _none_; _Animatable_: **yes** - [`hreflang`](/en-US/docs/Web/HTML/Element/a#hreflang) - : The human language of the URL or URL fragment that the hyperlink points to. - _Value type_: **\** ; _Default value_: _none_; _Animatable_: **yes** + _Value type_: **\** ; _Default value_: _none_; _Animatable_: **no** - [`ping`](/en-US/docs/Web/HTML/Element/a#ping) {{experimental_inline}} - : A space-separated list of URLs to which, when the hyperlink is followed, {{HTTPMethod("POST")}} requests with the body `PING` will be sent by the browser (in the background). Typically used for tracking. For a more widely-supported feature addressing the same use cases, see {{domxref("Navigator.sendBeacon()")}}. _Value type_: **[\](/en-US/docs/Web/SVG/Content_type#list-of-ts)** ; _Default value_: _none_; _Animatable_: **no** @@ -85,13 +85,13 @@ svg|a:active { _Value type_: `no-referrer`|`no-referrer-when-downgrade`|`same-origin`|`origin`|`strict-origin`|`origin-when-cross-origin`|`strict-origin-when-cross-origin`|`unsafe-url` ; _Default value_: _none_; _Animatable_: **no** - [`rel`](/en-US/docs/Web/HTML/Element/a#rel) - : The relationship of the target object to the link object. - _Value type_: **[\](/en-US/docs/Web/HTML/Attributes/rel)** ; _Default value_: _none_; _Animatable_: **yes** + _Value type_: **[\](/en-US/docs/Web/HTML/Attributes/rel)** ; _Default value_: _none_; _Animatable_: **no** - {{SVGAttr("target")}} - : Where to display the linked {{Glossary("URL")}}. - _Value type_: `_self`|`_parent`|`_top`|`_blank`|**\** ; _Default value_: `_self`; _Animatable_: **yes** + _Value type_: `_self`|`_parent`|`_top`|`_blank`|**\** ; _Default value_: `_self`; _Animatable_: **yes** - [`type`](/en-US/docs/Web/HTML/Element/a#type) - : A {{Glossary("MIME type")}} for the linked URL. - _Value type_: **\** ; _Default value_: _none_; _Animatable_: **yes** + _Value type_: **\** ; _Default value_: _none_; _Animatable_: **no** - {{SVGAttr("xlink:href")}} {{deprecated_inline}} - : The URL or URL fragment that the hyperlink points to. May be required for backwards compatibility for older browsers. _Value type_: **[\](/en-US/docs/Web/SVG/Content_type#url)** ; _Default value_: _none_; _Animatable_: **yes** diff --git a/files/en-us/web/svg/element/view/index.md b/files/en-us/web/svg/element/view/index.md index 607a2ec46aa4a53..7d8738696d11b92 100644 --- a/files/en-us/web/svg/element/view/index.md +++ b/files/en-us/web/svg/element/view/index.md @@ -15,9 +15,15 @@ The **``** [SVG](/en-US/docs/Web/SVG) element defines a particular view of ## Attributes -- {{SVGAttr("viewBox")}} - {{SVGAttr("preserveAspectRatio")}} + - : This attribute defines how the SVG fragment must be deformed if it is embedded in a container with a different {{glossary("aspect ratio")}}. + _Value type_: (`none`| `xMinYMin`| `xMidYMin`| `xMaxYMin`| `xMinYMid`| `xMidYMid`| `xMaxYMid`| `xMinYMax`| `xMidYMax`| `xMaxYMax`) (`meet`|`slice`)? ; _Default value_: `xMidYMid meet`; _Animatable_: **yes** +- {{SVGAttr("viewBox")}} + - : This attribute defines the bound of the SVG viewport for the pattern fragment. + _Value type_: **[\](/en-US/docs/Web/SVG/Content_type#list-of-ts)** ; _Default value_: none; _Animatable_: **yes** - {{SVGAttr("zoomAndPan")}} {{Deprecated_Inline}} {{Non-standard_Inline}} + - : This attribute specifies whether the SVG document can be magnified and panned. + _Value type_: **disable | magnify** ; _Default value_: magnify; _Animatable_: **no** ## Example @@ -50,10 +56,6 @@ The **``** [SVG](/en-US/docs/Web/SVG) element defines a particular view of {{EmbedLiveSample("Example", "85ch", "240px")}} -## DOM Interface - -This element implements the {{domxref("SVGViewElement")}} interface. - ## Specifications {{Specifications}} diff --git a/files/jsondata/InterfaceData.json b/files/jsondata/InterfaceData.json index 252c1d71b5676f5..f14933242f584c0 100644 --- a/files/jsondata/InterfaceData.json +++ b/files/jsondata/InterfaceData.json @@ -2252,6 +2252,10 @@ "inh": "", "impl": [] }, + "MLTensor": { + "inh": "", + "impl": [] + }, "Module": { "inh": "", "impl": [] diff --git a/files/jsondata/SVGData.json b/files/jsondata/SVGData.json index d72439d48b53884..dad3a9f05bbdf8c 100644 --- a/files/jsondata/SVGData.json +++ b/files/jsondata/SVGData.json @@ -29,19 +29,19 @@ ] }, "attributes": [ + "ariaAttributes", "conditionalProcessingAttributes", "coreAttributes", - "graphicalEventAttributes", "presentationAttributes", "xLinkAttributes", - "'class'", - "'style'", - "'externalResourcesRequired'", - "'transform'", - "'xlink:show'", - "'xlink:actuate'", - "'xlink:href'", - "'target'" + "'href'", + "'target'", + "'download'", + "'ping'", + "'rel'", + "'hreflang'", + "'type'", + "'referrerpolicy'" ], "interfaces": ["SVGAElement"] }, diff --git a/files/sidebars/httpsidebar.yaml b/files/sidebars/httpsidebar.yaml index 0fcf158711bd206..82f26486005abd7 100644 --- a/files/sidebars/httpsidebar.yaml +++ b/files/sidebars/httpsidebar.yaml @@ -17,7 +17,7 @@ sidebar: - /Web/HTTP/Conditional_requests - /Web/HTTP/Range_requests - /Web/HTTP/Content_negotiation - - /Web/HTTP/Connection_management_in_HTTP_1 + - /Web/HTTP/Connection_management_in_HTTP_1.x - /Web/HTTP/Evolution_of_HTTP - /Web/HTTP/Protocol_upgrade_mechanism - /Web/HTTP/Proxy_servers_and_tunneling @@ -31,7 +31,7 @@ sidebar: - /Web/HTTP/Permissions_Policy - /Web/HTTP/CSP - /Web/HTTP/CORS - - /Web/HTTP/Cross + - /Web/HTTP/Cross-Origin_Resource_Policy - /Web/HTTP/Headers - type: section title: Reference diff --git a/package.json b/package.json index d04d4029a6f9026..c95466c28cf574a 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "lint:yml": "prettier -c \"**/*.yml\"", "prepare": "husky || true", "start": "yarn up-to-date-check && env-cmd --silent cross-env CONTENT_ROOT=files REACT_APP_DISABLE_AUTH=true BUILD_OUT_ROOT=build yari-server", + "start:rari": "yarn up-to-date-check && env-cmd --silent cross-env CONTENT_ROOT=files REACT_APP_DISABLE_AUTH=true BUILD_OUT_ROOT=build rari-server", "up-to-date-check": "node scripts/up-to-date-check.js", "jest": "cross-env NODE_OPTIONS=--experimental-vm-modules jest", "test:front-matter-linter": "yarn jest tests" @@ -41,7 +42,7 @@ "dependencies": { "@apideck/better-ajv-errors": "^0.3.6", "@caporal/core": "^2.0.7", - "@mdn/yari": "2.65.1", + "@mdn/yari": "3.0.1", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "async": "^3.2.6", diff --git a/yarn.lock b/yarn.lock index 2e19cf4b11fc2df..b5327dbf7cc480f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,6 +19,15 @@ jsonpointer "^5.0.0" leven "^3.1.0" +"@apidevtools/json-schema-ref-parser@^11.5.5": + version "11.7.2" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz#cdf3e0aded21492364a70e193b45b7cf4177f031" + integrity sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA== + dependencies: + "@jsdevtools/ono" "^7.1.3" + "@types/json-schema" "^7.0.15" + js-yaml "^4.1.0" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" @@ -339,10 +348,10 @@ "@codemirror/view" "^6.27.0" "@lezer/common" "^1.1.0" -"@codemirror/lang-css@^6.0.0", "@codemirror/lang-css@^6.3.0": - version "6.3.0" - resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.3.0.tgz#607628559f2471b385c6070ec795072a55cffc0b" - integrity sha512-CyR4rUNG9OYcXDZwMPvJdtb6PHbBDKUc/6Na2BIwZ6dKab1JQqKa4di+RNRY9Myn7JB81vayKwJeQ7jEdmNVDA== +"@codemirror/lang-css@^6.0.0", "@codemirror/lang-css@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.3.1.tgz#763ca41aee81bb2431be55e3cfcc7cc8e91421a3" + integrity sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg== dependencies: "@codemirror/autocomplete" "^6.0.0" "@codemirror/language" "^6.0.0" @@ -458,32 +467,32 @@ lodash.isundefined "^3.0.1" lodash.uniq "^4.5.0" -"@inquirer/checkbox@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.0.1.tgz#adf127d4fe161a939a1d8cafee25e50d878d1184" - integrity sha512-ehJjmNPdguajc1hStvjN7DJNVjwG5LC1mgGMGFjCmdkn2fxB2GtULftMnlaqNmvMdPpqdaSoOFpl86VkLtG4pQ== +"@inquirer/checkbox@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.0.2.tgz#e45e0ad2611f2cb2d337ba36c7d955b53f195914" + integrity sha512-+gznPl8ip8P8HYHYecDtUtdsh1t2jvb+sWCD72GAiZ9m45RqwrLmReDaqdC0umQfamtFXVRoMVJ2/qINKGm9Tg== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/figures" "^1.0.7" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/figures" "^1.0.8" + "@inquirer/type" "^3.0.1" ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" -"@inquirer/confirm@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.0.1.tgz#35e0aa0f9fdaadee3acb1c42024e707af308fced" - integrity sha512-6ycMm7k7NUApiMGfVc32yIPp28iPKxhGRMqoNDiUjq2RyTAkbs5Fx0TdzBqhabcKvniDdAAvHCmsRjnNfTsogw== +"@inquirer/confirm@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.0.2.tgz#2b9dcf6b7da5f518c74abe4aeaf3173253d83c93" + integrity sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/type" "^3.0.1" -"@inquirer/core@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.0.1.tgz#22068da87d8f6317452172dfd521e811ccbcb90e" - integrity sha512-KKTgjViBQUi3AAssqjUFMnMO3CM3qwCHvePV9EW+zTKGKafFGFF01sc1yOIYjLJ7QU52G/FbzKc+c01WLzXmVQ== +"@inquirer/core@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.0.tgz#c5fdc34c4cafd7248da29a3c3b3120fe6e1c45be" + integrity sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ== dependencies: - "@inquirer/figures" "^1.0.7" - "@inquirer/type" "^3.0.0" + "@inquirer/figures" "^1.0.8" + "@inquirer/type" "^3.0.1" ansi-escapes "^4.3.2" cli-width "^4.1.0" mute-stream "^2.0.0" @@ -492,104 +501,123 @@ wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" -"@inquirer/editor@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.0.1.tgz#5db61ad3f1ce1b468b4b353d661787dcfa52a3a3" - integrity sha512-qAHHJ6hs343eNtCKgV2wV5CImFxYG8J1pl/YCeI5w9VoW7QpulRUU26+4NsMhjR6zDRjKBsH/rRjCIcaAOHsrg== +"@inquirer/editor@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.1.0.tgz#bc1a8bebe5897d4b44b0bfab1aeb1b5172f8d812" + integrity sha512-K1gGWsxEqO23tVdp5MT3H799OZ4ER1za7Dlc8F4um0W7lwSv0KGR/YyrUEyimj0g7dXZd8XknM/5QA2/Uy+TbA== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/type" "^3.0.1" external-editor "^3.1.0" -"@inquirer/expand@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.1.tgz#e699d53c62312f097333208bb6ad777036438536" - integrity sha512-9anjpdc802YInXekwePsa5LWySzVMHbhVS6v6n5IJxrl8w09mODOeP69wZ1d0WrOvot2buQSmYp4lW/pq8y+zQ== +"@inquirer/expand@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.2.tgz#7b5c332ad604d7d076e7052b8e5006a3b61c3274" + integrity sha512-WdgCX1cUtinz+syKyZdJomovULYlKUWZbVYZzhf+ZeeYf4htAQ3jLymoNs3koIAKfZZl3HUBb819ClCBfyznaw== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/type" "^3.0.1" yoctocolors-cjs "^2.1.2" -"@inquirer/figures@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.7.tgz#d050ccc0eabfacc0248c4ff647a9dfba1b01594b" - integrity sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw== +"@inquirer/figures@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.8.tgz#d9e414a1376a331a0e71b151fea27c48845788b0" + integrity sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg== -"@inquirer/input@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.0.1.tgz#7b676aad726e8a3baf3793cf1e9cec665a815a2b" - integrity sha512-m+SliZ2m43cDRIpAdQxfv5QOeAQCuhS8TGLvtzEP1An4IH1kBES4RLMRgE/fC+z29aN8qYG8Tq/eXQQKTYwqAg== +"@inquirer/input@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.0.2.tgz#be77b79a1ed182444a6eef2d850309639aa9df22" + integrity sha512-yCLCraigU085EcdpIVEDgyfGv4vBiE4I+k1qRkc9C5dMjWF42ADMGy1RFU94+eZlz4YlkmFsiyHZy0W1wdhaNg== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/type" "^3.0.1" -"@inquirer/number@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.1.tgz#21666eff686c9f97396d23ae58f62d244d6338d6" - integrity sha512-gF3erqfm0snpwBjbyKXUUe17QJ7ebm49btXApajrM0rgCCoYX0o9W5NCuYNae87iPxaIJVjtuoQ42DX32IdbMA== +"@inquirer/number@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.2.tgz#7e8315b41601d377cc09802b66f32b481e14fd68" + integrity sha512-MKQhYofdUNk7eqJtz52KvM1dH6R93OMrqHduXCvuefKrsiMjHiMwjc3NZw5Imm2nqY7gWd9xdhYrtcHMJQZUxA== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/type" "^3.0.1" -"@inquirer/password@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.1.tgz#22f47e9a40255c2244eb57aeeeee76b6642759c5" - integrity sha512-D7zUuX4l4ZpL3D7/SWu9ibijP09jigwHi/gfUHLx5GMS5oXzuMfPV2xPMG1tskco4enTx70HA0VtMXecerpvbg== +"@inquirer/password@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.2.tgz#5913e2818b3de1ee6f63ec1b0891a43c1d4bdca9" + integrity sha512-tQXGSu7IO07gsYlGy3VgXRVsbOWqFBMbqAUrJSc1PDTQQ5Qdm+QVwkP0OC0jnUZ62D19iPgXOMO+tnWG+HhjNQ== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/type" "^3.0.1" ansi-escapes "^4.3.2" -"@inquirer/prompts@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.0.1.tgz#089dbb83b34a6f68a515d77ad7f9f0a42b4ba758" - integrity sha512-cu2CpGC2hz7WTt2VBvdkzahDvYice6vYA/8Dm7Fy3tRNzKuQTF2EY3CV4H2GamveWE6tA2XzyXtbWX8+t4WMQg== - dependencies: - "@inquirer/checkbox" "^4.0.1" - "@inquirer/confirm" "^5.0.1" - "@inquirer/editor" "^4.0.1" - "@inquirer/expand" "^4.0.1" - "@inquirer/input" "^4.0.1" - "@inquirer/number" "^3.0.1" - "@inquirer/password" "^4.0.1" - "@inquirer/rawlist" "^4.0.1" - "@inquirer/search" "^3.0.1" - "@inquirer/select" "^4.0.1" - -"@inquirer/rawlist@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.1.tgz#3f3a46881c0b50dc8361ec9add14b38568bc34c8" - integrity sha512-0LuMOgaWs7W8JNcbiKkoFwyWFDEeCmLqDCygF0hidQUVa6J5grFVRZxrpompiWDFM49Km2rf7WoZwRo1uf1yWQ== +"@inquirer/prompts@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.1.0.tgz#a55ee589c0eed0ca2ee0fbc7fc63f42f4c31a24e" + integrity sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA== + dependencies: + "@inquirer/checkbox" "^4.0.2" + "@inquirer/confirm" "^5.0.2" + "@inquirer/editor" "^4.1.0" + "@inquirer/expand" "^4.0.2" + "@inquirer/input" "^4.0.2" + "@inquirer/number" "^3.0.2" + "@inquirer/password" "^4.0.2" + "@inquirer/rawlist" "^4.0.2" + "@inquirer/search" "^3.0.2" + "@inquirer/select" "^4.0.2" + +"@inquirer/rawlist@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.2.tgz#78a58294505bed2a5e133153340f187967916702" + integrity sha512-3XGcskMoVF8H0Dl1S5TSZ3rMPPBWXRcM0VeNVsS4ByWeWjSeb0lPqfnBg6N7T0608I1B2bSVnbi2cwCrmOD1Yw== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/type" "^3.0.1" yoctocolors-cjs "^2.1.2" -"@inquirer/search@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.1.tgz#68a4d23f6fca5a8eb99a61a72f74dc6b193be20a" - integrity sha512-ehMqjiO0pAf+KtdONKeCLVy4i3fy3feyRRhDrvzWhiwB8JccgKn7eHFr39l+Nx/FaZAhr0YxIJvkK5NuNvG+Ww== +"@inquirer/search@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.2.tgz#71fccc766045f2ec37afc402d72ce31838768281" + integrity sha512-Zv4FC7w4dJ13BOJfKRQCICQfShinGjb1bCEIHxTSnjj2telu3+3RHwHubPG9HyD4aix5s+lyAMEK/wSFD75HLA== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/figures" "^1.0.7" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/figures" "^1.0.8" + "@inquirer/type" "^3.0.1" yoctocolors-cjs "^2.1.2" -"@inquirer/select@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.1.tgz#fb651f0e0fb7da1256cc75a399dc2ac72a7f7df4" - integrity sha512-tVRatFRGU49bxFCKi/3P+C0E13KZduNFbWuHWRx0L2+jbiyKRpXgHp9qiRHWRk/KarhYBXzH/di6w3VQ5aJd5w== +"@inquirer/select@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.2.tgz#c38ef154524a6859de4a1af11a90ad3f9638c9f2" + integrity sha512-uSWUzaSYAEj0hlzxa1mUB6VqrKaYx0QxGBLZzU4xWFxaSyGaXxsSE4OSOwdU24j0xl8OajgayqFXW0l2bkl2kg== dependencies: - "@inquirer/core" "^10.0.1" - "@inquirer/figures" "^1.0.7" - "@inquirer/type" "^3.0.0" + "@inquirer/core" "^10.1.0" + "@inquirer/figures" "^1.0.8" + "@inquirer/type" "^3.0.1" ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" -"@inquirer/type@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.0.tgz#1762ebe667ec1d838012b20bf0cf90b841ba68bc" - integrity sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog== +"@inquirer/type@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.1.tgz#619ce9f65c3e114d8e39c41822bed3440d20b478" + integrity sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== + dependencies: + minipass "^7.0.4" "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -839,6 +867,11 @@ jsbi "^4.3.0" tslib "^2.4.1" +"@jsdevtools/ono@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" + integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== + "@lezer/common@^1.0.0", "@lezer/common@^1.0.2", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.1.tgz#198b278b7869668e1bebbe687586e12a42731049" @@ -907,46 +940,59 @@ resolved "https://registry.yarnpkg.com/@mdn/bcd-utils-api/-/bcd-utils-api-0.0.7.tgz#555e80c33df520df068943e6b18ebc07f0e24d19" integrity sha512-IHkkypEjlIkBkx4mJ2//Xbzog9M/Lzne1Sl8db2cIHJ/5pe3NCqSLwSchmqzcUN+/WJr/U+V3tNAbWunk2xZcA== -"@mdn/browser-compat-data@^5.6.11": - version "5.6.11" - resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.6.11.tgz#2beda3664297a3083b7c84a7e6eadc8bf843b90e" - integrity sha512-kJUu7JcRSOf3uEs0jK0RZCckaBfjhtWpgKyJUyAk8LRlQl9Yj/R/ddwfjo37dfzkvNYtHvH4Eg+NFkTDzd08Eg== +"@mdn/browser-compat-data@^5.6.20": + version "5.6.20" + resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.6.20.tgz#7ead33170b82fbdd6d0967182b9e7da6b9e8ef14" + integrity sha512-TOxHxwNNtZ+HWnmhBgBCKYwevIqxi5HOshnBg7Fac3R95EFGm3ir0HDUG1ujBG3i8zjXimp3GZK1lfsjkbmydg== -"@mdn/yari@2.65.1": - version "2.65.1" - resolved "https://registry.yarnpkg.com/@mdn/yari/-/yari-2.65.1.tgz#06231ff50a7983a5c1f94e3af36d535fe72e7bde" - integrity sha512-Juj9zMSUxC+NVah0SI/10ESN1SfFVIVvs0/djVajq9gX2nKQAoVJSs2uisJV0U/gaoobfWXPHFp3xlCOFmEhvg== +"@mdn/rari@^0.0.26": + version "0.0.26" + resolved "https://registry.yarnpkg.com/@mdn/rari/-/rari-0.0.26.tgz#dd2814f246aeab3d874ad971dd22257200612629" + integrity sha512-B2GuJOmuv+MapB7O0xoh8fzrkWI3Lo0Yq7M5S8bfNVU5NunSIZwzJsYFZ0VeRTBuAkWxYb6BO1l5Rq31HWu9gQ== + dependencies: + extract-zip "^2.0.1" + https-proxy-agent "^7.0.2" + json-schema-to-typescript "^15.0.0" + proxy-from-env "^1.1.0" + tar "^7.4.3" + +"@mdn/yari@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@mdn/yari/-/yari-3.0.1.tgz#ee958fcefc28acc4bffacb708a19ecb277d98143" + integrity sha512-4HM0z3Q+a//WzOt08GuehYX88TPcfJ7tTB0eAQ0hA1YG321XfOLijopFGOCp6vly0K3AngqDnsxy7m1OiiL21w== dependencies: "@caporal/core" "^2.0.7" - "@codemirror/lang-css" "^6.3.0" + "@codemirror/lang-css" "^6.3.1" "@codemirror/lang-html" "^6.4.9" "@codemirror/lang-javascript" "^6.2.2" "@codemirror/state" "^6.4.1" "@codemirror/theme-one-dark" "^6.1.2" "@fast-csv/parse" "^5.0.2" - "@inquirer/prompts" "^7.0.1" + "@inquirer/prompts" "^7.1.0" "@lit/react" "^1.0.6" "@mdn/bcd-utils-api" "^0.0.7" - "@mdn/browser-compat-data" "^5.6.11" + "@mdn/browser-compat-data" "^5.6.20" + "@mdn/rari" "^0.0.26" "@mozilla/glean" "5.0.3" - "@sentry/node" "^8.35.0" - "@stripe/stripe-js" "^4.9.0" + "@sentry/node" "^8.41.0" + "@stripe/stripe-js" "^4.10.0" "@use-it/interval" "^1.0.0" "@vscode/ripgrep" "^1.15.9" - "@webref/css" "^6.17.0" + "@webref/css" "^6.17.4" accept-language-parser "^1.5.0" async "^3.2.6" chalk "^5.3.0" cheerio "1.0.0-rc.12" cli-progress "^3.12.0" codemirror "^6.0.1" - compression "^1.7.4" + compression "^1.7.5" compute-baseline "^0.1.1" + concurrently "^9.1.0" cookie "^0.7.2" cookie-parser "^1.4.7" css-tree "^2.3.1" dayjs "^1.11.13" - dexie "^4.0.9" + dexie "^4.0.10" dotenv "^16.4.5" ejs "^3.1.10" express "^4.21.1" @@ -972,10 +1018,10 @@ md5-file "^5.0.0" mdast-util-from-markdown "^2.0.2" mdast-util-phrasing "^4.1.0" - mdn-data "^2.12.1" + mdn-data "^2.12.2" open "^10.1.0" open-editor "^5.0.0" - openai "^4.68.4" + openai "^4.73.1" pg "^8.13.1" pgvector "^0.2.0" prism-svelte "^0.5.0" @@ -1001,8 +1047,8 @@ unified "^11.0.5" unist-builder "^4.0.0" unist-util-visit "^5.0.0" - web-features "^2.3.0" - web-specs "^3.23.0" + web-features "^2.8.0" + web-specs "^3.28.0" "@mozilla/glean@5.0.3": version "5.0.3" @@ -1072,13 +1118,13 @@ dependencies: "@opentelemetry/semantic-conventions" "1.27.0" -"@opentelemetry/instrumentation-amqplib@^0.42.0": - version "0.42.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.42.0.tgz#b3cab5a7207736a30d769962eed3af3838f986c4" - integrity sha512-fiuU6OKsqHJiydHWgTRQ7MnIrJ2lEqsdgFtNIH4LbAUJl/5XmrIeoDzDnox+hfkgWK65jsleFuQDtYb5hW1koQ== +"@opentelemetry/instrumentation-amqplib@^0.43.0": + version "0.43.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.43.0.tgz#e18b7d763b69c605a7abf9869e1c278f9bfdc1eb" + integrity sha512-ALjfQC+0dnIEcvNYsbZl/VLh7D2P1HhFF4vicRKHhHFIUV3Shpg4kXgiek5PLhmeKSIPiUB25IYH5RIneclL4A== dependencies: "@opentelemetry/core" "^1.8.0" - "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@opentelemetry/instrumentation-connect@0.40.0": @@ -1107,13 +1153,13 @@ "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/semantic-conventions" "^1.27.0" -"@opentelemetry/instrumentation-fastify@0.40.0": - version "0.40.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.40.0.tgz#0c57608ac202337d56b53338f1fc9369d224306b" - integrity sha512-74qj4nG3zPtU7g2x4sm2T4R3/pBMyrYstTsqSZwdlhQk1SD4l8OSY9sPRX1qkhfxOuW3U4KZQAV/Cymb3fB6hg== +"@opentelemetry/instrumentation-fastify@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.41.0.tgz#5e1d00383756f3a8cc2ea4a9d15f9f7510cec571" + integrity sha512-pNRjFvf0mvqfJueaeL/qEkuGJwgtE5pgjIHGYwjc2rMViNCrtY9/Sf+Nu8ww6dDd/Oyk2fwZZP7i0XZfCnETrA== dependencies: "@opentelemetry/core" "^1.8.0" - "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@opentelemetry/instrumentation-fs@0.16.0": @@ -1131,12 +1177,12 @@ dependencies: "@opentelemetry/instrumentation" "^0.53.0" -"@opentelemetry/instrumentation-graphql@0.43.0": - version "0.43.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.43.0.tgz#71bb94ea775c70dbd388c739b397ec1418f3f170" - integrity sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA== +"@opentelemetry/instrumentation-graphql@0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.44.0.tgz#6fce8e2f303d16810bf8a03148cad6e8e6119de1" + integrity sha512-FYXTe3Bv96aNpYktqm86BFUTpjglKD0kWI5T5bxYkLUPEPvFn38vWGMJTGrDMVou/i55E4jlWvcm6hFIqLsMbg== dependencies: - "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/instrumentation-hapi@0.41.0": version "0.41.0" @@ -1174,6 +1220,14 @@ "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/semantic-conventions" "^1.27.0" +"@opentelemetry/instrumentation-knex@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.41.0.tgz#74d611489e823003a825097bac019c6c2ad061a5" + integrity sha512-OhI1SlLv5qnsnm2dOVrian/x3431P75GngSpnR7c4fcVFv7prXGYu29Z6ILRWJf/NJt6fkbySmwdfUUnFnHCTg== + dependencies: + "@opentelemetry/instrumentation" "^0.54.0" + "@opentelemetry/semantic-conventions" "^1.27.0" + "@opentelemetry/instrumentation-koa@0.43.0": version "0.43.0" resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.43.0.tgz#963fd192a1b5f6cbae5dabf4ec82e3105cbb23b1" @@ -1190,13 +1244,12 @@ dependencies: "@opentelemetry/instrumentation" "^0.53.0" -"@opentelemetry/instrumentation-mongodb@0.47.0": - version "0.47.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.47.0.tgz#f8107d878281433905e717f223fb4c0f10356a7b" - integrity sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ== +"@opentelemetry/instrumentation-mongodb@0.48.0": + version "0.48.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.48.0.tgz#40fb8c705cb4bf8d8c5bf8752c60c5a0aaaaf617" + integrity sha512-9YWvaGvrrcrydMsYGLu0w+RgmosLMKe3kv/UNlsPy8RLnCkN2z+bhhbjjjuxtUmvEuKZMCoXFluABVuBr1yhjw== dependencies: - "@opentelemetry/instrumentation" "^0.53.0" - "@opentelemetry/sdk-metrics" "^1.9.1" + "@opentelemetry/instrumentation" "^0.54.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@opentelemetry/instrumentation-mongoose@0.42.0": @@ -1254,6 +1307,15 @@ "@opentelemetry/redis-common" "^0.36.2" "@opentelemetry/semantic-conventions" "^1.27.0" +"@opentelemetry/instrumentation-tedious@0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.15.0.tgz#da82f4d153fb6ff7d1f85d39872ac40bf9db12ea" + integrity sha512-Kb7yo8Zsq2TUwBbmwYgTAMPK0VbhoS8ikJ6Bup9KrDtCx2JC01nCb+M0VJWXt7tl0+5jARUbKWh5jRSoImxdCw== + dependencies: + "@opentelemetry/instrumentation" "^0.54.0" + "@opentelemetry/semantic-conventions" "^1.27.0" + "@types/tedious" "^4.0.14" + "@opentelemetry/instrumentation-undici@0.6.0": version "0.6.0" resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.6.0.tgz#9436ee155c8dcb0b760b66947c0e0f347688a5ef" @@ -1311,14 +1373,6 @@ "@opentelemetry/core" "1.26.0" "@opentelemetry/semantic-conventions" "1.27.0" -"@opentelemetry/sdk-metrics@^1.9.1": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.26.0.tgz#37bb0afb1d4447f50aab9cdd05db6f2d8b86103e" - integrity sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ== - dependencies: - "@opentelemetry/core" "1.26.0" - "@opentelemetry/resources" "1.26.0" - "@opentelemetry/sdk-trace-base@^1.22", "@opentelemetry/sdk-trace-base@^1.26.0": version "1.26.0" resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz#0c913bc6d2cfafd901de330e4540952269ae579c" @@ -1340,6 +1394,11 @@ dependencies: "@opentelemetry/core" "^1.1.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@prisma/instrumentation@5.19.1": version "5.19.1" resolved "https://registry.yarnpkg.com/@prisma/instrumentation/-/instrumentation-5.19.1.tgz#146319cf85f22b7a43296f0f40cfeac55516e66e" @@ -1354,75 +1413,67 @@ resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c" integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== -"@sentry/core@8.36.0": - version "8.36.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.36.0.tgz#34276354f0cd2298803c2f8d86ba571473435ff1" - integrity sha512-cbq1WQyRqc/+YpPhjwQxfniUM3ZxmO3Pm1oisTB8dw6mlbgQfGD6aznEIjXWWJY6k6acewJlMUx09N7DnprtBw== +"@sentry/core@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.41.0.tgz#e8a25cacd25fe4358f3179e85f3c2697427fe5a6" + integrity sha512-3v7u3t4LozCA5SpZY4yqUN2U3jSrkXNoLgz6L2SUUiydyCuSwXZIFEwpLJfgQyidpNDifeQbBI5E1O910XkPsA== dependencies: - "@sentry/types" "8.36.0" - "@sentry/utils" "8.36.0" + "@sentry/types" "8.41.0" -"@sentry/node@^8.35.0": - version "8.36.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-8.36.0.tgz#6b4b6714c6c925e353e7c7eff0e45f8675bb530e" - integrity sha512-2RRbSck90TGpVz8F3OaNbq5Q9RXgeRlq5leGWHU7NfQOl3LmkG+vkzTbOqPDPZLtiYcw5KQ3G5G+vybrDS6AGg== +"@sentry/node@^8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-8.41.0.tgz#52f970648d961f6e82a1b23a88c0000aa72ba21a" + integrity sha512-eYD5S8Lti9efBHFSIhZ/0C5uI1DQtGqjuNWQ62CKC47G2qgJddBtb2HgqRFAnMajYL9FXEtiDT6uqQhKQnmLcQ== dependencies: "@opentelemetry/api" "^1.9.0" "@opentelemetry/context-async-hooks" "^1.25.1" "@opentelemetry/core" "^1.25.1" - "@opentelemetry/instrumentation" "^0.53.0" - "@opentelemetry/instrumentation-amqplib" "^0.42.0" + "@opentelemetry/instrumentation" "^0.54.0" + "@opentelemetry/instrumentation-amqplib" "^0.43.0" "@opentelemetry/instrumentation-connect" "0.40.0" "@opentelemetry/instrumentation-dataloader" "0.12.0" "@opentelemetry/instrumentation-express" "0.44.0" - "@opentelemetry/instrumentation-fastify" "0.40.0" + "@opentelemetry/instrumentation-fastify" "0.41.0" "@opentelemetry/instrumentation-fs" "0.16.0" "@opentelemetry/instrumentation-generic-pool" "0.39.0" - "@opentelemetry/instrumentation-graphql" "0.43.0" + "@opentelemetry/instrumentation-graphql" "0.44.0" "@opentelemetry/instrumentation-hapi" "0.41.0" "@opentelemetry/instrumentation-http" "0.53.0" "@opentelemetry/instrumentation-ioredis" "0.43.0" "@opentelemetry/instrumentation-kafkajs" "0.4.0" + "@opentelemetry/instrumentation-knex" "0.41.0" "@opentelemetry/instrumentation-koa" "0.43.0" "@opentelemetry/instrumentation-lru-memoizer" "0.40.0" - "@opentelemetry/instrumentation-mongodb" "0.47.0" + "@opentelemetry/instrumentation-mongodb" "0.48.0" "@opentelemetry/instrumentation-mongoose" "0.42.0" "@opentelemetry/instrumentation-mysql" "0.41.0" "@opentelemetry/instrumentation-mysql2" "0.41.0" "@opentelemetry/instrumentation-nestjs-core" "0.40.0" "@opentelemetry/instrumentation-pg" "0.44.0" "@opentelemetry/instrumentation-redis-4" "0.42.0" + "@opentelemetry/instrumentation-tedious" "0.15.0" "@opentelemetry/instrumentation-undici" "0.6.0" "@opentelemetry/resources" "^1.26.0" "@opentelemetry/sdk-trace-base" "^1.26.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@prisma/instrumentation" "5.19.1" - "@sentry/core" "8.36.0" - "@sentry/opentelemetry" "8.36.0" - "@sentry/types" "8.36.0" - "@sentry/utils" "8.36.0" + "@sentry/core" "8.41.0" + "@sentry/opentelemetry" "8.41.0" + "@sentry/types" "8.41.0" import-in-the-middle "^1.11.2" -"@sentry/opentelemetry@8.36.0": - version "8.36.0" - resolved "https://registry.yarnpkg.com/@sentry/opentelemetry/-/opentelemetry-8.36.0.tgz#4e4330fa67cfeb7f2e23d4e078659ac61806b3b0" - integrity sha512-pMKMphH0j1Mh8zknLWEEUaaaxeYn76rniGOxKLoQVk1pCUhhzkFEJdxKC41aR8yin/uN8X3CGWQb9vp/przwSg== +"@sentry/opentelemetry@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@sentry/opentelemetry/-/opentelemetry-8.41.0.tgz#0e5c4bb8d5b58f07eb80e312fc66b8709a688c61" + integrity sha512-Ld6KdBQsmSk2IfFSoZ7CMpmuQbfb3viV6nTDCz6+11wL9S+1b+hadCN+38yBW4CmI4/hEpYfwwWQPseQQTvBCg== dependencies: - "@sentry/core" "8.36.0" - "@sentry/types" "8.36.0" - "@sentry/utils" "8.36.0" - -"@sentry/types@8.36.0": - version "8.36.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-8.36.0.tgz#b58397eb672d896b65b06103feb59dba74da9d39" - integrity sha512-K1pVFfdGHw115RzGHpwSOqoEPeayn4N1F9IfM0kxrYpQSbFT1X29eak88GBfC8gPiLEF0iFGlSaQ4ERmF7oRcA== + "@sentry/core" "8.41.0" + "@sentry/types" "8.41.0" -"@sentry/utils@8.36.0": - version "8.36.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-8.36.0.tgz#e733042ae231fdeeafe6970e49283dcd9ac9700f" - integrity sha512-oJ3EDPj0I00z+AwC3EWBpSidXYUoKW0Id8MfMQP5Hflniz3gif7UEReblT+FJgPEVo6+6uNzAncY0MuNMxmDKQ== - dependencies: - "@sentry/types" "8.36.0" +"@sentry/types@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-8.41.0.tgz#db40c93bcedad26569c5dfe10a4b31253c349a10" + integrity sha512-eqdnGr9k9H++b9CjVUoTNUVahPVWeNnMy0YGkqS5+cjWWC+x43p56202oidGFmWo6702ub/xwUNH6M5PC4kq6A== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -1468,10 +1519,10 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@stripe/stripe-js@^4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-4.9.0.tgz#95dc000b2f90aeb4db2f2bab82a2fc574f26d1fd" - integrity sha512-tMPZQZZXGWyNX7hbgenq+1xEj2oigJ54XddbtSX36VedoKsPBq7dxwRXu4Xd5FdpT3JDyyDtnmvYkaSnH1yHTQ== +"@stripe/stripe-js@^4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-4.10.0.tgz#5c785f9a5a500113d69d98c16061e0addd1c0305" + integrity sha512-KrMOL+sH69htCIXCaZ4JluJ35bchuCCznyPyrbN8JXSGQfwBI1SuIEMZNwvy8L8ykj29t6sa5BAAiL7fNoLZ8A== "@szmarczak/http-timer@^5.0.1": version "5.0.1" @@ -1602,11 +1653,21 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/lodash@^4.14.149": version "4.17.7" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== +"@types/lodash@^4.17.7": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" + integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== + "@types/mdast@^4.0.0": version "4.0.4" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" @@ -1705,6 +1766,13 @@ dependencies: "@types/node" "*" +"@types/tedious@^4.0.14": + version "4.0.14" + resolved "https://registry.yarnpkg.com/@types/tedious/-/tedious-4.0.14.tgz#868118e7a67808258c05158e9cad89ca58a2aec1" + integrity sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw== + dependencies: + "@types/node" "*" + "@types/triple-beam@^1.3.2": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" @@ -1742,6 +1810,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + "@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -1761,10 +1836,10 @@ proxy-from-env "^1.1.0" yauzl "^2.9.2" -"@webref/css@^6.17.0": - version "6.17.0" - resolved "https://registry.yarnpkg.com/@webref/css/-/css-6.17.0.tgz#1b7e7bb2c75f610c8ae11c8d1e063494b1e522ea" - integrity sha512-5flhd3Wuokf9gNKhFmJ+SlG4tb2+qCXXBB3jo0RG7i9LuigYaZxJd0FqyNsVtTqJwSEXHt9AshTjN82ESr5k6g== +"@webref/css@^6.17.4": + version "6.17.4" + resolved "https://registry.yarnpkg.com/@webref/css/-/css-6.17.4.tgz#1722ced57468d44ea7ee230dd458657534710206" + integrity sha512-c7HoBCO3RCIOeeM0aBxCXhfljwwnDCjZAYKxHsmvymu5/nmk4uQDTM4uecIu/SUiAmYCb7a1DGKN6mCKg489kA== abort-controller@^3.0.0: version "3.0.0" @@ -1778,7 +1853,7 @@ accept-language-parser@^1.5.0: resolved "https://registry.yarnpkg.com/accept-language-parser/-/accept-language-parser-1.5.0.tgz#8877c54040a8dcb59e0a07d9c1fde42298334791" integrity sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw== -accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -1910,7 +1985,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0, ansi-styles@^6.2.1: +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -2231,11 +2306,6 @@ bundle-name@^4.1.0: dependencies: run-applescript "^7.0.0" -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -2366,7 +2436,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2439,6 +2509,11 @@ cheerio@1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -2654,24 +2729,24 @@ compare-versions@^6.1.0: resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== -compressible@~2.0.16: +compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== +compression@^1.7.5: + version "1.7.5" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" + integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" + negotiator "~0.6.4" on-headers "~1.0.2" - safe-buffer "5.1.2" + safe-buffer "5.2.1" vary "~1.1.2" compute-baseline@^0.1.1: @@ -2697,6 +2772,19 @@ concat-stream@^1.4.7: readable-stream "^2.2.2" typedarray "^0.0.6" +concurrently@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.0.tgz#8da6d609f4321752912dab9be8710232ac496aa0" + integrity sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg== + dependencies: + chalk "^4.1.2" + lodash "^4.17.21" + rxjs "^7.8.1" + shell-quote "^1.8.1" + supports-color "^8.1.1" + tree-kill "^1.2.2" + yargs "^17.7.2" + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -3037,10 +3125,10 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" -dexie@^4.0.9: - version "4.0.9" - resolved "https://registry.yarnpkg.com/dexie/-/dexie-4.0.9.tgz#8c4e827815a84ef4fdc6aa7923f89ea2cda87610" - integrity sha512-VQG1huEVSAdDZssb9Bb9mFy+d3jAE0PT4d1nIRYlT46ip1fzbs1tXi0SlUayRDgV3tTbJG8ZRqAo2um49gtynA== +dexie@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-4.0.10.tgz#979e3ee75993b44eea3852f97ceb198019d5b287" + integrity sha512-eM2RzuR3i+M046r2Q0Optl3pS31qTWf8aFuA7H9wnsHTwl8EPvroVLwvQene/6paAs39Tbk6fWZcn2aZaHkc/w== diff-sequences@^29.6.3: version "29.6.3" @@ -3129,6 +3217,11 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3166,6 +3259,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + enabled@2.0.x: version "2.0.0" resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" @@ -3494,6 +3592,17 @@ external-editor@^3.0.3, external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + eyes@0.1.x: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -3713,6 +3822,14 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data-encoder@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" @@ -3868,6 +3985,13 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -3902,6 +4026,18 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" +glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -4709,7 +4845,7 @@ is-gif@^3.0.0: dependencies: file-type "^10.4.0" -is-glob@^4.0.1: +is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -4896,6 +5032,15 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: version "10.9.2" resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" @@ -5309,6 +5454,21 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-schema-to-typescript@^15.0.0: + version "15.0.3" + resolved "https://registry.yarnpkg.com/json-schema-to-typescript/-/json-schema-to-typescript-15.0.3.tgz#a58bc3e00e4480e76a8ee79471c01233494913be" + integrity sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA== + dependencies: + "@apidevtools/json-schema-ref-parser" "^11.5.5" + "@types/json-schema" "^7.0.15" + "@types/lodash" "^4.17.7" + is-glob "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + minimist "^1.2.8" + prettier "^3.2.5" + tinyglobby "^0.2.9" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -5586,7 +5746,7 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== -lru-cache@^10.4.3: +lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -5887,10 +6047,10 @@ mdn-data@2.0.30: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== -mdn-data@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.1.tgz#10cb462215c13d95c92ff60d0fb3becac1bbb924" - integrity sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q== +mdn-data@^2.12.2: + version "2.12.2" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.2.tgz#9ae6c41a9e65adf61318b32bff7b64fbfb13f8cf" + integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== mdurl@^2.0.0: version "2.0.0" @@ -6281,11 +6441,31 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +minizlib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.1.tgz#46d5329d1eb3c83924eff1d3b858ca0a31581012" + integrity sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg== + dependencies: + minipass "^7.0.4" + rimraf "^5.0.5" + mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -6293,6 +6473,11 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" +mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + module-details-from-path@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" @@ -6341,6 +6526,11 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -6531,10 +6721,10 @@ open@^10.1.0: is-inside-container "^1.0.0" is-wsl "^3.1.0" -openai@^4.68.4: - version "4.69.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.69.0.tgz#ac2463719280987e506e4bd62dd477337e2406a1" - integrity sha512-S3hOHSkk609KqwgH+7dwFrSvO3Gm3Nk0YWGyPHNscoMH/Y2tH1qunMi7gtZnLbUv4/N1elqCp6bDior2401kCQ== +openai@^4.73.1: + version "4.73.1" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.73.1.tgz#532bd000d5f1a558e4fff1119da6749992ac41e4" + integrity sha512-nWImDJBcUsqrhy7yJScXB4+iqjzbUEgzfA3un/6UnHFdwWhjX24oztj69Ped/njABfOdLcO/F7CeWTI5dt8Xmg== dependencies: "@types/node" "^18.11.18" "@types/node-fetch" "^2.6.4" @@ -6669,6 +6859,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + parse-entities@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" @@ -6748,6 +6943,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" @@ -6862,6 +7065,11 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pidtree@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" @@ -6974,7 +7182,7 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== -prettier@3.4.1: +prettier@3.4.1, prettier@^3.2.5: version "3.4.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.1.tgz#e211d451d6452db0a291672ca9154bc8c2579f7b" integrity sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg== @@ -7417,6 +7625,13 @@ rfdc@^1.4.1: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== +rimraf@^5.0.5: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + run-applescript@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" @@ -7446,16 +7661,23 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-stable-stringify@^2.3.1: version "2.5.0" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" @@ -7590,6 +7812,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + shimmer@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" @@ -7610,7 +7837,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.1.0: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -7772,6 +7999,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -7807,6 +8043,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string-width@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" @@ -7838,6 +8083,13 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -7866,7 +8118,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.1.0: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -7974,7 +8226,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -8048,6 +8300,18 @@ tar-stream@^1.5.2: to-buffer "^1.1.1" xtend "^4.0.0" +tar@^7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571" + integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== + dependencies: + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.2" + minizlib "^3.0.1" + mkdirp "^3.0.1" + yallist "^5.0.0" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -8107,6 +8371,14 @@ timed-out@^4.0.0, timed-out@^4.0.1: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== +tinyglobby@^0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" @@ -8161,6 +8433,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" @@ -8200,6 +8477,11 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.1.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tslib@^2.3.1, tslib@^2.4.1: version "2.7.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" @@ -8487,20 +8769,20 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" -web-features@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/web-features/-/web-features-2.4.0.tgz#f7526ed890d96c8fbdd82e92247a396b16f119a5" - integrity sha512-DFmvcroc3T+oFP6cOvYQ7QWh0QBwd8oX1ktt/987GkKqzdNQniyvy9jFDZ+5IutP/BLYi42W+kwydm5bGsdNAg== +web-features@^2.8.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/web-features/-/web-features-2.9.0.tgz#719b5dd0456f9a7fbe7a73be5dc06a5c5653e8fb" + integrity sha512-zWafkYZ87WR6SiD97OhNM758BJYh40HFH/0rzDE6Q5Q76sFSuIJhPyknjZsC4jG/94eJqS1AJNa5b9qzbCzetw== web-namespaces@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== -web-specs@^3.23.0: - version "3.23.0" - resolved "https://registry.yarnpkg.com/web-specs/-/web-specs-3.23.0.tgz#96bafd7ab1eb90faf521e81e1707a688fcd3c85e" - integrity sha512-90theeC0B4FPGc0dugJzYL8RIoMf+y/lpQqWcsjE39KmMqy0c/f1xmx1CorCCNqBBF7VvRMh376tb7qHgh1Q6A== +web-specs@^3.28.0: + version "3.28.0" + resolved "https://registry.yarnpkg.com/web-specs/-/web-specs-3.28.0.tgz#ed3d3dca0fd0d006f7c9ec9deec38f177dc641fa" + integrity sha512-haQUHO54+bbRD6BBtsJN1yHJFuq3Ug7+jiJYX7VxaI8ECGByAXvasampzvgXmotufjg61Q9avly5zcPDH3ucLQ== web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" @@ -8572,6 +8854,15 @@ winston@^3.2.1: triple-beam "^1.3.0" winston-transport "^4.7.0" +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -8590,6 +8881,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrap-ansi@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" @@ -8639,6 +8939,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== + yaml@~2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" @@ -8649,7 +8954,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.3.1: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -8662,7 +8967,7 @@ yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yauzl@^2.4.2, yauzl@^2.9.2: +yauzl@^2.10.0, yauzl@^2.4.2, yauzl@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==