diff options
| author | Victor Borges <victor1882@outlook.com> | 2025-03-31 10:54:03 -0300 |
|---|---|---|
| committer | Victor Borges <victor1882@outlook.com> | 2025-03-31 10:54:03 -0300 |
| commit | 7e3b07d83aae6547ce121f904971e6491c0c2cdd (patch) | |
| tree | 11e169767a645f38fc906f32fe9e9eb11bfcf50a | |
| parent | fc242fa45d24477c028032dc2f0777da07a44153 (diff) | |
| download | decky-bazzite-buddy-7e3b07d83aae6547ce121f904971e6491c0c2cdd.tar.gz decky-bazzite-buddy-7e3b07d83aae6547ce121f904971e6491c0c2cdd.zip | |
patch steam release notes
| -rwxr-xr-x | .vscode/build.sh | 2 | ||||
| -rw-r--r-- | backend/Dockerfile | 9 | ||||
| -rw-r--r-- | backend/Makefile | 14 | ||||
| -rwxr-xr-x | backend/entrypoint.sh | 8 | ||||
| -rw-r--r-- | backend/src/main.c | 5 | ||||
| -rw-r--r-- | decky.pyi | 184 | ||||
| -rw-r--r-- | defaults/defaults.txt | 13 | ||||
| -rw-r--r-- | dist.zip | bin | 436983 -> 0 bytes | |||
| -rw-r--r-- | main.py | 57 | ||||
| -rw-r--r-- | package.json | 26 | ||||
| -rw-r--r-- | pnpm-lock.yaml | 1426 | ||||
| -rw-r--r-- | py_modules/.keep | 0 | ||||
| -rw-r--r-- | rollup.config.js | 16 | ||||
| -rw-r--r-- | src/PartnerEventStorePatch.tsx | 193 | ||||
| -rw-r--r-- | src/html2bbcode.js | 1214 | ||||
| -rwxr-xr-x | src/index.tsx | 39 | ||||
| -rw-r--r-- | tsconfig.json | 3 |
17 files changed, 2450 insertions, 759 deletions
diff --git a/.vscode/build.sh b/.vscode/build.sh index 2310ff0..a2f94da 100755 --- a/.vscode/build.sh +++ b/.vscode/build.sh @@ -7,4 +7,4 @@ printf "Please input sudo password to proceed.\n" # printf "\n" -echo $sudopass | sudo -E $CLI_LOCATION/decky plugin build $(pwd) +echo $sudopass | sudo -E $CLI_LOCATION/decky plugin build $(pwd) --engine podman diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100644 index f46e170..0000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -# we support images for building with a vanilla SteamOS base, -# or versions with ootb support for rust or go -# developers can also customize these images via this Dockerfile -#FROM ghcr.io/steamdeckhomebrew/holo-toolchain-rust:latest -#FROM ghcr.io/steamdeckhomebrew/holo-toolchain-go:latest -FROM ghcr.io/steamdeckhomebrew/holo-base:latest - -# entrypoint.sh should always be located in the backend folder -ENTRYPOINT [ "/backend/entrypoint.sh" ]
\ No newline at end of file diff --git a/backend/Makefile b/backend/Makefile deleted file mode 100644 index a1e5dc5..0000000 --- a/backend/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# This is the default target, which will be built when -# you invoke make -.PHONY: all -all: hello - -# This rule tells make how to build hello from hello.cpp -hello: - mkdir -p ./out - gcc -o ./out/hello ./src/main.c - -# This rule tells make to delete hello and hello.o -.PHONY: clean -clean: - rm -f hello
\ No newline at end of file diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh deleted file mode 100755 index af04d23..0000000 --- a/backend/entrypoint.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -set -e - -echo "Container's IP address: `awk 'END{print $1}' /etc/hosts`" - -cd /backend - -make
\ No newline at end of file diff --git a/backend/src/main.c b/backend/src/main.c deleted file mode 100644 index b3b8fed..0000000 --- a/backend/src/main.c +++ /dev/null @@ -1,5 +0,0 @@ -#include <stdio.h> -int main() { - printf("Hello World\n"); - return 0; -}
\ No newline at end of file diff --git a/decky.pyi b/decky.pyi deleted file mode 100644 index a72c74c..0000000 --- a/decky.pyi +++ /dev/null @@ -1,184 +0,0 @@ -""" -This module exposes various constants and helpers useful for decky plugins. - -* Plugin's settings and configurations should be stored under `DECKY_PLUGIN_SETTINGS_DIR`. -* Plugin's runtime data should be stored under `DECKY_PLUGIN_RUNTIME_DIR`. -* Plugin's persistent log files should be stored under `DECKY_PLUGIN_LOG_DIR`. - -Avoid writing outside of `DECKY_HOME`, storing under the suggested paths is strongly recommended. - -Some basic migration helpers are available: `migrate_any`, `migrate_settings`, `migrate_runtime`, `migrate_logs`. - -A logging facility `logger` is available which writes to the recommended location. -""" - -__version__ = '1.0.0' - -import logging - -from typing import Any - -""" -Constants -""" - -HOME: str -""" -The home directory of the effective user running the process. -Environment variable: `HOME`. -If `root` was specified in the plugin's flags it will be `/root` otherwise the user whose home decky resides in. -e.g.: `/home/deck` -""" - -USER: str -""" -The effective username running the process. -Environment variable: `USER`. -It would be `root` if `root` was specified in the plugin's flags otherwise the user whose home decky resides in. -e.g.: `deck` -""" - -DECKY_VERSION: str -""" -The version of the decky loader. -Environment variable: `DECKY_VERSION`. -e.g.: `v2.5.0-pre1` -""" - -DECKY_USER: str -""" -The user whose home decky resides in. -Environment variable: `DECKY_USER`. -e.g.: `deck` -""" - -DECKY_USER_HOME: str -""" -The home of the user where decky resides in. -Environment variable: `DECKY_USER_HOME`. -e.g.: `/home/deck` -""" - -DECKY_HOME: str -""" -The root of the decky folder. -Environment variable: `DECKY_HOME`. -e.g.: `/home/deck/homebrew` -""" - -DECKY_PLUGIN_SETTINGS_DIR: str -""" -The recommended path in which to store configuration files (created automatically). -Environment variable: `DECKY_PLUGIN_SETTINGS_DIR`. -e.g.: `/home/deck/homebrew/settings/decky-plugin-template` -""" - -DECKY_PLUGIN_RUNTIME_DIR: str -""" -The recommended path in which to store runtime data (created automatically). -Environment variable: `DECKY_PLUGIN_RUNTIME_DIR`. -e.g.: `/home/deck/homebrew/data/decky-plugin-template` -""" - -DECKY_PLUGIN_LOG_DIR: str -""" -The recommended path in which to store persistent logs (created automatically). -Environment variable: `DECKY_PLUGIN_LOG_DIR`. -e.g.: `/home/deck/homebrew/logs/decky-plugin-template` -""" - -DECKY_PLUGIN_DIR: str -""" -The root of the plugin's directory. -Environment variable: `DECKY_PLUGIN_DIR`. -e.g.: `/home/deck/homebrew/plugins/decky-plugin-template` -""" - -DECKY_PLUGIN_NAME: str -""" -The name of the plugin as specified in the 'plugin.json'. -Environment variable: `DECKY_PLUGIN_NAME`. -e.g.: `Example Plugin` -""" - -DECKY_PLUGIN_VERSION: str -""" -The version of the plugin as specified in the 'package.json'. -Environment variable: `DECKY_PLUGIN_VERSION`. -e.g.: `0.0.1` -""" - -DECKY_PLUGIN_AUTHOR: str -""" -The author of the plugin as specified in the 'plugin.json'. -Environment variable: `DECKY_PLUGIN_AUTHOR`. -e.g.: `John Doe` -""" - -DECKY_PLUGIN_LOG: str -""" -The path to the plugin's main logfile. -Environment variable: `DECKY_PLUGIN_LOG`. -e.g.: `/home/deck/homebrew/logs/decky-plugin-template/plugin.log` -""" - -""" -Migration helpers -""" - - -def migrate_any(target_dir: str, *files_or_directories: str) -> dict[str, str]: - """ - Migrate files and directories to a new location and remove old locations. - Specified files will be migrated to `target_dir`. - Specified directories will have their contents recursively migrated to `target_dir`. - - Returns the mapping of old -> new location. - """ - - -def migrate_settings(*files_or_directories: str) -> dict[str, str]: - """ - Migrate files and directories relating to plugin settings to the recommended location and remove old locations. - Specified files will be migrated to `DECKY_PLUGIN_SETTINGS_DIR`. - Specified directories will have their contents recursively migrated to `DECKY_PLUGIN_SETTINGS_DIR`. - - Returns the mapping of old -> new location. - """ - - -def migrate_runtime(*files_or_directories: str) -> dict[str, str]: - """ - Migrate files and directories relating to plugin runtime data to the recommended location and remove old locations - Specified files will be migrated to `DECKY_PLUGIN_RUNTIME_DIR`. - Specified directories will have their contents recursively migrated to `DECKY_PLUGIN_RUNTIME_DIR`. - - Returns the mapping of old -> new location. - """ - - -def migrate_logs(*files_or_directories: str) -> dict[str, str]: - """ - Migrate files and directories relating to plugin logs to the recommended location and remove old locations. - Specified files will be migrated to `DECKY_PLUGIN_LOG_DIR`. - Specified directories will have their contents recursively migrated to `DECKY_PLUGIN_LOG_DIR`. - - Returns the mapping of old -> new location. - """ - - -""" -Logging -""" - -logger: logging.Logger -"""The main plugin logger writing to `DECKY_PLUGIN_LOG`.""" - -""" -Event handling -""" -# TODO better docstring im lazy -async def emit(event: str, *args: Any) -> None: - """ - Send an event to the frontend. - """
\ No newline at end of file diff --git a/defaults/defaults.txt b/defaults/defaults.txt deleted file mode 100644 index ebf140b..0000000 --- a/defaults/defaults.txt +++ /dev/null @@ -1,13 +0,0 @@ -If you have plain-text json configs, theme templates, or templates for usage for your plugin of any description you should have those files be in here. -Those files will be pulled into the zip during the build process and included with the upload. Example: CssLoader with it's themes in "default/themes" would have the "themes" folder will be added alongside with the dist folder, main.py, LICENSE and README files in the subfolder of the zip containing the plugin. -Files can also be put in here such as a config, just keep in mind that they this directory cannot be utilized to put files in arbitrary locations, just within the extracted root folder of the plugin, ex: CssLoader has "defaults/themes/..." setup in it's repo, but when packaged to go to the store, the file structure will be: - -- LICENSE -- README -- dist - - index.js -- main.py -- package.json -- plugin.json -- themes - - exampletheme.css
\ No newline at end of file diff --git a/dist.zip b/dist.zip Binary files differdeleted file mode 100644 index 2dc797c..0000000 --- a/dist.zip +++ /dev/null diff --git a/main.py b/main.py deleted file mode 100644 index 65a10da..0000000 --- a/main.py +++ /dev/null @@ -1,57 +0,0 @@ -import os - -# The decky plugin module is located at decky-loader/plugin -# For easy intellisense checkout the decky-loader code repo -# and add the `decky-loader/plugin/imports` path to `python.analysis.extraPaths` in `.vscode/settings.json` -import decky -import asyncio - -class Plugin: - # A normal method. It can be called from the TypeScript side using @decky/api. - async def add(self, left: int, right: int) -> int: - return left + right - - async def long_running(self): - await asyncio.sleep(15) - # Passing through a bunch of random data, just as an example - await decky.emit("timer_event", "Hello from the backend!", True, 2) - - # Asyncio-compatible long-running code, executed in a task when the plugin is loaded - async def _main(self): - self.loop = asyncio.get_event_loop() - decky.logger.info("Hello World!") - - # Function called first during the unload process, utilize this to handle your plugin being stopped, but not - # completely removed - async def _unload(self): - decky.logger.info("Goodnight World!") - pass - - # Function called after `_unload` during uninstall, utilize this to clean up processes and other remnants of your - # plugin that may remain on the system - async def _uninstall(self): - decky.logger.info("Goodbye World!") - pass - - async def start_timer(self): - self.loop.create_task(self.long_running()) - - # Migrations that should be performed before entering `_main()`. - async def _migration(self): - decky.logger.info("Migrating") - # Here's a migration example for logs: - # - `~/.config/decky-template/template.log` will be migrated to `decky.decky_LOG_DIR/template.log` - decky.migrate_logs(os.path.join(decky.DECKY_USER_HOME, - ".config", "decky-template", "template.log")) - # Here's a migration example for settings: - # - `~/homebrew/settings/template.json` is migrated to `decky.decky_SETTINGS_DIR/template.json` - # - `~/.config/decky-template/` all files and directories under this root are migrated to `decky.decky_SETTINGS_DIR/` - decky.migrate_settings( - os.path.join(decky.DECKY_HOME, "settings", "template.json"), - os.path.join(decky.DECKY_USER_HOME, ".config", "decky-template")) - # Here's a migration example for runtime data: - # - `~/homebrew/template/` all files and directories under this root are migrated to `decky.decky_RUNTIME_DIR/` - # - `~/.local/share/decky-template/` all files and directories under this root are migrated to `decky.decky_RUNTIME_DIR/` - decky.migrate_runtime( - os.path.join(decky.DECKY_HOME, "template"), - os.path.join(decky.DECKY_USER_HOME, ".local", "share", "decky-template")) diff --git a/package.json b/package.json index 95b9f1b..ff3a36e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "bazzite-buddy", - "version": "0.0.1", - "description": "A plugin to easily view Bazzite changelog within game mode, primarily for handhelds.", + "version": "1.1.0", + "description": "A plugin to easily view Bazzite changelogs within game mode, primarily for handhelds.", "type": "module", "scripts": { "build": "rollup -c", @@ -13,6 +13,12 @@ "url": "git+https://github.com/xXJSONDeruloXx/bazzite-buddy.git" }, "keywords": [ + "bazzite", + "buddy", + "release-notes", + "release", + "changelogs", + "changes", "decky", "plugin", "plugin-template", @@ -28,27 +34,25 @@ "devDependencies": { "@decky/rollup": "^1.0.1", "@decky/ui": "^4.9.0", - "@rollup/plugin-commonjs": "^28.0.2", - "@rollup/plugin-node-resolve": "^16.0.0", - "@rollup/plugin-typescript": "^12.1.2", - "@types/dompurify": "^3.2.0", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", - "@types/react-router": "^5.1.20", "@types/webpack": "^5.28.5", - "rollup": "^4.30.1", + "rollup": "^4.22.5", "typescript": "^5.7.3" }, "dependencies": { "@decky/api": "^1.1.2", + "async-mutex": "^0.5.0", "decky-frontend-lib": "^3.25.0", - "dompurify": "^3.2.3", - "marked": "^15.0.6", "react": "^19.0.0", "react-dom": "^19.0.0", "react-icons": "^5.4.0", + "remark-gfm": "^4.0.1", + "remark-html": "^16.0.1", + "remark-parse": "^11.0.0", "react-router": "^7.1.1", - "tslib": "^2.8.1" + "tslib": "^2.8.1", + "unified": "^11.0.5" }, "pnpm": { "peerDependencyRules": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca1b3ce..7e4e9d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,67 +11,61 @@ importers: '@decky/api': specifier: ^1.1.2 version: 1.1.2 + async-mutex: + specifier: ^0.5.0 + version: 0.5.0 decky-frontend-lib: specifier: ^3.25.0 version: 3.25.0 - dompurify: - specifier: ^3.2.3 - version: 3.2.3 - marked: - specifier: ^15.0.6 - version: 15.0.6 react: specifier: ^19.0.0 - version: 19.0.0 + version: 19.1.0 react-dom: specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + version: 19.1.0(react@19.1.0) react-icons: specifier: ^5.4.0 - version: 5.4.0(react@19.0.0) + version: 5.5.0(react@19.1.0) react-router: specifier: ^7.1.1 - version: 7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 7.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + remark-html: + specifier: ^16.0.1 + version: 16.0.1 + remark-parse: + specifier: ^11.0.0 + version: 11.0.0 tslib: specifier: ^2.8.1 version: 2.8.1 + unified: + specifier: ^11.0.5 + version: 11.0.5 devDependencies: '@decky/rollup': specifier: ^1.0.1 version: 1.0.1 '@decky/ui': specifier: ^4.9.0 - version: 4.9.0 - '@rollup/plugin-commonjs': - specifier: ^28.0.2 - version: 28.0.2(rollup@4.30.1) - '@rollup/plugin-node-resolve': - specifier: ^16.0.0 - version: 16.0.0(rollup@4.30.1) - '@rollup/plugin-typescript': - specifier: ^12.1.2 - version: 12.1.2(rollup@4.30.1)(tslib@2.8.1)(typescript@5.7.3) - '@types/dompurify': - specifier: ^3.2.0 - version: 3.2.0 + version: 4.9.2 '@types/react': specifier: 18.3.3 version: 18.3.3 '@types/react-dom': specifier: 18.3.0 version: 18.3.0 - '@types/react-router': - specifier: ^5.1.20 - version: 5.1.20 '@types/webpack': specifier: ^5.28.5 version: 5.28.5 rollup: - specifier: ^4.30.1 - version: 4.30.1 + specifier: ^4.22.5 + version: 4.38.0 typescript: specifier: ^5.7.3 - version: 5.7.3 + version: 5.8.2 packages: @@ -81,8 +75,8 @@ packages: '@decky/rollup@1.0.1': resolution: {integrity: sha512-dx1VJwD7ul14PA/aZvOwAfY/GujHzqZJ+MFb4OIUVi63/z4KWMSuZrK6QWo0S4LrNW3RzB3ua6LT0WcJaNY9gw==} - '@decky/ui@4.9.0': - resolution: {integrity: sha512-5iN8UciEpL4WHPdUr4Nzl4/y3CBnLfUN+/1q+WeMUNOzPJICLiwlltfBbyZyMM/ST3nPrDYCLbZCYD9jKWFLXQ==} + '@decky/ui@4.9.2': + resolution: {integrity: sha512-3cBmBuyctdMhAyE4MtMgK6oEMrjiW2BiMLfSJ/m6qxukRnb2PpvTTyYurnT83vZGVDeygcmcmWjs2nFzGlyLvQ==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -134,15 +128,6 @@ packages: rollup: optional: true - '@rollup/plugin-commonjs@28.0.2': - resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} - engines: {node: '>=16.0.0 || 14 >= 14.17'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-json@6.1.0': resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} @@ -161,15 +146,6 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@16.0.0': - resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-replace@5.0.7': resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} engines: {node: '>=14.0.0'} @@ -192,19 +168,6 @@ packages: tslib: optional: true - '@rollup/plugin-typescript@12.1.2': - resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0||^4.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true - '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} @@ -214,107 +177,111 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.30.1': - resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} + '@rollup/rollup-android-arm-eabi@4.38.0': + resolution: {integrity: sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.30.1': - resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} + '@rollup/rollup-android-arm64@4.38.0': + resolution: {integrity: sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.30.1': - resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} + '@rollup/rollup-darwin-arm64@4.38.0': + resolution: {integrity: sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.30.1': - resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} + '@rollup/rollup-darwin-x64@4.38.0': + resolution: {integrity: sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.30.1': - resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} + '@rollup/rollup-freebsd-arm64@4.38.0': + resolution: {integrity: sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.30.1': - resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} + '@rollup/rollup-freebsd-x64@4.38.0': + resolution: {integrity: sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': - resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} + '@rollup/rollup-linux-arm-gnueabihf@4.38.0': + resolution: {integrity: sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.30.1': - resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} + '@rollup/rollup-linux-arm-musleabihf@4.38.0': + resolution: {integrity: sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.30.1': - resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} + '@rollup/rollup-linux-arm64-gnu@4.38.0': + resolution: {integrity: sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.30.1': - resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} + '@rollup/rollup-linux-arm64-musl@4.38.0': + resolution: {integrity: sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': - resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.38.0': + resolution: {integrity: sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': - resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.38.0': + resolution: {integrity: sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.30.1': - resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} + '@rollup/rollup-linux-riscv64-gnu@4.38.0': + resolution: {integrity: sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.38.0': + resolution: {integrity: sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.30.1': - resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} + '@rollup/rollup-linux-s390x-gnu@4.38.0': + resolution: {integrity: sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.30.1': - resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} + '@rollup/rollup-linux-x64-gnu@4.38.0': + resolution: {integrity: sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.30.1': - resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} + '@rollup/rollup-linux-x64-musl@4.38.0': + resolution: {integrity: sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.30.1': - resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} + '@rollup/rollup-win32-arm64-msvc@4.38.0': + resolution: {integrity: sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.30.1': - resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} + '@rollup/rollup-win32-ia32-msvc@4.38.0': + resolution: {integrity: sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.30.1': - resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} + '@rollup/rollup-win32-x64-msvc@4.38.0': + resolution: {integrity: sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==} cpu: [x64] os: [win32] '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/dompurify@3.2.0': - resolution: {integrity: sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==} - deprecated: This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed. + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -322,23 +289,23 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/history@4.7.11': - resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/node@22.10.5': - resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.13.14': + resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} @@ -346,21 +313,21 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react-router@5.1.20': - resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} - '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/webpack@5.28.5': resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -412,8 +379,8 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true @@ -429,19 +396,11 @@ packages: ajv: optional: true - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: ajv: ^8.8.2 - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -465,6 +424,12 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -486,8 +451,20 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - caniuse-lite@1.0.30001692: - resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} + caniuse-lite@1.0.30001707: + resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} @@ -504,6 +481,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -524,29 +504,45 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decky-frontend-lib@3.25.0: resolution: {integrity: sha512-2lBoHS2AIRmuluq/bGdHBz+uyToQE7k3K/vDq1MQbDZ4eC+8CGDuh2T8yZOj3D0yjGP2MdikNNAWPA9Z5l2qDg==} + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - del@5.1.0: - resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} - engines: {node: '>=8'} + del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dompurify@3.2.3: - resolution: {integrity: sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.80: - resolution: {integrity: sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==} + electron-to-chromium@1.5.128: + resolution: {integrity: sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -554,8 +550,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} es-module-lexer@1.6.0: @@ -565,6 +561,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -594,6 +594,9 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -601,29 +604,18 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-uri@3.0.5: - resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==} - - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} fs.realpath@1.0.0: @@ -652,9 +644,9 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -667,6 +659,18 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -713,14 +717,18 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-what@5.0.2: - resolution: {integrity: sha512-vI7Ui0qzNQ2ClDZd0bC7uqRk3T1imbX5cZODmVlqqdqiwmSIUX3CNSiRgFjFMJ987sVCMSa7xZeEDtpJduPg4A==} + is-what@5.2.1: + resolution: {integrity: sha512-FLNNgur29o+0/G6RcG3B6KRDCT6SvMfb7MlfjdydTZWPgBLfiemceChDhY0DHu50O35BDNbNp4rJLQXMt4fG0g==} engines: {node: '>=18'} isexe@2.0.0: @@ -736,9 +744,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -746,19 +751,56 @@ packages: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - marked@15.0.6: - resolution: {integrity: sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==} - engines: {node: '>= 18'} - hasBin: true + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - merge-anything@6.0.2: - resolution: {integrity: sha512-U8x6DL/YVudOcf82B6hd8GFg+6gF6hEHYwzqdo67GrH6vnDZ5YBq6BYX3hHWyCnG3CcqJDB1a9tj9fzMI3RL9Q==} + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge-anything@6.0.6: + resolution: {integrity: sha512-F3K1W45PvTjRZzbcYIhXntNr8cux00gUxR8IzNPPG+80gNlAHZGVBwFyN4x5yjw/7QkLPKDbRQBK4KrJKo69mw==} engines: {node: '>=18'} merge-stream@2.0.0: @@ -768,6 +810,90 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -791,6 +917,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -800,9 +929,9 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -837,9 +966,8 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -847,18 +975,18 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: - react: ^19.0.0 + react: ^19.1.0 - react-icons@5.4.0: - resolution: {integrity: sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==} + react-icons@5.5.0: + resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} peerDependencies: react: '*' - react-router@7.1.1: - resolution: {integrity: sha512-39sXJkftkKWRZ2oJtHhCxmoCrBCULr/HAH4IT5DHlgu/Q0FCPV0S4Lx+abjDTx/74xoZzNYDYbOZWlJjruyuDQ==} + react-router@7.4.1: + resolution: {integrity: sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -867,10 +995,22 @@ packages: react-dom: optional: true - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-html@16.0.1: + resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -880,8 +1020,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@3.0.2: @@ -889,8 +1029,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup-plugin-delete@2.1.0: - resolution: {integrity: sha512-TEbqJd7giLvzQDTu4jSPufwhTJs/iYVN2LfR/YIYkqjC/oZ0/h9Q0AeljifIhzBzJYZtHQTWKEbMms5fbh54pw==} + rollup-plugin-delete@2.2.0: + resolution: {integrity: sha512-REKtDKWvjZlbrWpPvM9X/fadCs3E9I9ge27AK8G0e4bXwSLeABAAwtjiI1u3ihqZxk6mJeB2IVeSbH4DtOcw7A==} engines: {node: '>=10'} peerDependencies: rollup: '*' @@ -908,8 +1048,8 @@ packages: rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - rollup@4.30.1: - resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} + rollup@4.38.0: + resolution: {integrity: sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -919,12 +1059,8 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} - - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} schema-utils@4.3.0: resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} @@ -959,6 +1095,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -967,6 +1106,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -987,8 +1129,8 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - terser-webpack-plugin@5.3.11: - resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -1003,8 +1145,8 @@ packages: uglify-js: optional: true - terser@5.37.0: - resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} engines: {node: '>=10'} hasBin: true @@ -1012,32 +1154,59 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} turbo-stream@2.4.0: resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - update-browserslist-db@1.1.2: - resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + watchpack@2.4.2: resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} @@ -1046,8 +1215,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.97.1: - resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} + webpack@5.98.0: + resolution: {integrity: sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -1072,26 +1241,29 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@decky/api@1.1.2': {} '@decky/rollup@1.0.1': dependencies: - '@rollup/plugin-commonjs': 26.0.3(rollup@4.30.1) - '@rollup/plugin-json': 6.1.0(rollup@4.30.1) - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.30.1) - '@rollup/plugin-replace': 5.0.7(rollup@4.30.1) - '@rollup/plugin-typescript': 11.1.6(rollup@4.30.1)(tslib@2.8.1)(typescript@5.7.3) - merge-anything: 6.0.2 - rollup: 4.30.1 - rollup-plugin-delete: 2.1.0(rollup@4.30.1) - rollup-plugin-external-globals: 0.11.0(rollup@4.30.1) - rollup-plugin-import-assets: 1.1.1(rollup@4.30.1) + '@rollup/plugin-commonjs': 26.0.3(rollup@4.38.0) + '@rollup/plugin-json': 6.1.0(rollup@4.38.0) + '@rollup/plugin-node-resolve': 15.3.1(rollup@4.38.0) + '@rollup/plugin-replace': 5.0.7(rollup@4.38.0) + '@rollup/plugin-typescript': 11.1.6(rollup@4.38.0)(tslib@2.8.1)(typescript@5.8.2) + merge-anything: 6.0.6 + rollup: 4.38.0 + rollup-plugin-delete: 2.2.0(rollup@4.38.0) + rollup-plugin-external-globals: 0.11.0(rollup@4.38.0) + rollup-plugin-import-assets: 1.1.1(rollup@4.38.0) tslib: 2.8.1 - typescript: 5.7.3 + typescript: 5.8.2 - '@decky/ui@4.9.0': {} + '@decky/ui@4.9.2': {} '@isaacs/cliui@8.0.2': dependencies: @@ -1134,180 +1306,153 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.1 '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/plugin-commonjs@26.0.3(rollup@4.30.1)': + '@rollup/plugin-commonjs@26.0.3(rollup@4.38.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + '@rollup/pluginutils': 5.1.4(rollup@4.38.0) commondir: 1.0.1 estree-walker: 2.0.2 glob: 10.4.5 is-reference: 1.2.1 magic-string: 0.30.17 optionalDependencies: - rollup: 4.30.1 - - '@rollup/plugin-commonjs@28.0.2(rollup@4.30.1)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) - commondir: 1.0.1 - estree-walker: 2.0.2 - fdir: 6.4.2(picomatch@4.0.2) - is-reference: 1.2.1 - magic-string: 0.30.17 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.30.1 - - '@rollup/plugin-json@6.1.0(rollup@4.30.1)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) - optionalDependencies: - rollup: 4.30.1 + rollup: 4.38.0 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.30.1)': + '@rollup/plugin-json@6.1.0(rollup@4.38.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.10 + '@rollup/pluginutils': 5.1.4(rollup@4.38.0) optionalDependencies: - rollup: 4.30.1 + rollup: 4.38.0 - '@rollup/plugin-node-resolve@16.0.0(rollup@4.30.1)': + '@rollup/plugin-node-resolve@15.3.1(rollup@4.38.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + '@rollup/pluginutils': 5.1.4(rollup@4.38.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.30.1 + rollup: 4.38.0 - '@rollup/plugin-replace@5.0.7(rollup@4.30.1)': + '@rollup/plugin-replace@5.0.7(rollup@4.38.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + '@rollup/pluginutils': 5.1.4(rollup@4.38.0) magic-string: 0.30.17 optionalDependencies: - rollup: 4.30.1 + rollup: 4.38.0 - '@rollup/plugin-typescript@11.1.6(rollup@4.30.1)(tslib@2.8.1)(typescript@5.7.3)': + '@rollup/plugin-typescript@11.1.6(rollup@4.38.0)(tslib@2.8.1)(typescript@5.8.2)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + '@rollup/pluginutils': 5.1.4(rollup@4.38.0) resolve: 1.22.10 - typescript: 5.7.3 + typescript: 5.8.2 optionalDependencies: - rollup: 4.30.1 + rollup: 4.38.0 tslib: 2.8.1 - '@rollup/plugin-typescript@12.1.2(rollup@4.30.1)(tslib@2.8.1)(typescript@5.7.3)': + '@rollup/pluginutils@5.1.4(rollup@4.38.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) - resolve: 1.22.10 - typescript: 5.7.3 - optionalDependencies: - rollup: 4.30.1 - tslib: 2.8.1 - - '@rollup/pluginutils@5.1.4(rollup@4.30.1)': - dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.30.1 + rollup: 4.38.0 - '@rollup/rollup-android-arm-eabi@4.30.1': + '@rollup/rollup-android-arm-eabi@4.38.0': optional: true - '@rollup/rollup-android-arm64@4.30.1': + '@rollup/rollup-android-arm64@4.38.0': optional: true - '@rollup/rollup-darwin-arm64@4.30.1': + '@rollup/rollup-darwin-arm64@4.38.0': optional: true - '@rollup/rollup-darwin-x64@4.30.1': + '@rollup/rollup-darwin-x64@4.38.0': optional: true - '@rollup/rollup-freebsd-arm64@4.30.1': + '@rollup/rollup-freebsd-arm64@4.38.0': optional: true - '@rollup/rollup-freebsd-x64@4.30.1': + '@rollup/rollup-freebsd-x64@4.38.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + '@rollup/rollup-linux-arm-gnueabihf@4.38.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.30.1': + '@rollup/rollup-linux-arm-musleabihf@4.38.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.30.1': + '@rollup/rollup-linux-arm64-gnu@4.38.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.30.1': + '@rollup/rollup-linux-arm64-musl@4.38.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + '@rollup/rollup-linux-loongarch64-gnu@4.38.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.38.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.30.1': + '@rollup/rollup-linux-riscv64-gnu@4.38.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.30.1': + '@rollup/rollup-linux-riscv64-musl@4.38.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.30.1': + '@rollup/rollup-linux-s390x-gnu@4.38.0': optional: true - '@rollup/rollup-linux-x64-musl@4.30.1': + '@rollup/rollup-linux-x64-gnu@4.38.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.30.1': + '@rollup/rollup-linux-x64-musl@4.38.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.30.1': + '@rollup/rollup-win32-arm64-msvc@4.38.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.30.1': + '@rollup/rollup-win32-ia32-msvc@4.38.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.38.0': optional: true '@types/cookie@0.6.0': {} - '@types/dompurify@3.2.0': + '@types/debug@4.1.12': dependencies: - dompurify: 3.2.3 + '@types/ms': 2.1.0 '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 - '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} - '@types/glob@7.2.0': + '@types/hast@3.0.4': dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 22.10.5 - - '@types/history@4.7.11': {} + '@types/unist': 3.0.3 '@types/json-schema@7.0.15': {} - '@types/minimatch@5.1.2': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} - '@types/node@22.10.5': + '@types/node@22.13.14': dependencies: undici-types: 6.20.0 @@ -1317,11 +1462,6 @@ snapshots: dependencies: '@types/react': 18.3.3 - '@types/react-router@5.1.20': - dependencies: - '@types/history': 4.7.11 - '@types/react': 18.3.3 - '@types/react@18.3.3': dependencies: '@types/prop-types': 15.7.14 @@ -1329,20 +1469,21 @@ snapshots: '@types/resolve@1.20.2': {} - '@types/trusted-types@2.0.7': - optional: true + '@types/unist@3.0.3': {} '@types/webpack@5.28.5': dependencies: - '@types/node': 22.10.5 + '@types/node': 22.13.14 tapable: 2.2.1 - webpack: 5.97.1 + webpack: 5.98.0 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack-cli + '@ungap/structured-clone@1.3.0': {} + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -1423,7 +1564,7 @@ snapshots: '@xtuc/long@4.2.2': {} - acorn@8.14.0: {} + acorn@8.14.1: {} aggregate-error@3.1.0: dependencies: @@ -1434,26 +1575,15 @@ snapshots: optionalDependencies: ajv: 8.17.1 - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - ajv-keywords@5.1.0(ajv@8.17.1): dependencies: ajv: 8.17.1 fast-deep-equal: 3.1.3 - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.5 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -1469,6 +1599,12 @@ snapshots: array-union@2.1.0: {} + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + bail@2.0.2: {} + balanced-match@1.0.2: {} brace-expansion@1.1.11: @@ -1486,14 +1622,22 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001692 - electron-to-chromium: 1.5.80 + caniuse-lite: 1.0.30001707 + electron-to-chromium: 1.5.128 node-releases: 2.0.19 - update-browserslist-db: 1.1.2(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.24.4) buffer-from@1.1.2: {} - caniuse-lite@1.0.30001692: {} + caniuse-lite@1.0.30001707: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} chrome-trace-event@1.0.4: {} @@ -1505,6 +1649,8 @@ snapshots: color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} + commander@2.20.3: {} commondir@1.0.1: {} @@ -1521,38 +1667,48 @@ snapshots: csstype@3.1.3: {} + debug@4.4.0: + dependencies: + ms: 2.1.3 + decky-frontend-lib@3.25.0: {} + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + deepmerge@4.3.1: {} - del@5.1.0: + del@6.1.1: dependencies: - globby: 10.0.2 + globby: 11.1.0 graceful-fs: 4.2.11 is-glob: 4.0.3 is-path-cwd: 2.2.0 is-path-inside: 3.0.3 - p-map: 3.0.0 + p-map: 4.0.0 rimraf: 3.0.2 slash: 3.0.0 + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dompurify@3.2.3: - optionalDependencies: - '@types/trusted-types': 2.0.7 - eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.80: {} + electron-to-chromium@1.5.128: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -1561,6 +1717,8 @@ snapshots: escalade@3.2.0: {} + escape-string-regexp@5.0.0: {} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -1580,10 +1738,12 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 events@3.3.0: {} + extend@3.0.2: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -1594,23 +1754,17 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} - - fast-uri@3.0.5: {} + fast-uri@3.0.6: {} - fastq@1.18.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 - - fdir@6.4.2(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 + reusify: 1.1.0 fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 @@ -1630,7 +1784,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -1646,13 +1800,11 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globby@10.0.2: + globby@11.1.0: dependencies: - '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.3 - glob: 7.2.3 ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -1665,6 +1817,32 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + html-void-elements@3.0.0: {} + ignore@5.3.2: {} indent-string@4.0.0: {} @@ -1696,15 +1874,17 @@ snapshots: is-path-inside@3.0.3: {} + is-plain-obj@4.1.0: {} + is-reference@1.2.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 is-reference@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 - is-what@5.0.2: {} + is-what@5.2.1: {} isexe@2.0.0: {} @@ -1716,34 +1896,339 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.10.5 + '@types/node': 22.13.14 merge-stream: 2.0.0 supports-color: 8.1.1 json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} loader-runner@4.3.0: {} + longest-streak@3.1.0: {} + lru-cache@10.4.3: {} magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - marked@15.0.6: {} + markdown-table@3.0.4: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 - merge-anything@6.0.2: + merge-anything@6.0.6: dependencies: - is-what: 5.0.2 + is-what: 5.2.1 merge-stream@2.0.0: {} merge2@1.4.1: {} + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -1765,6 +2250,8 @@ snapshots: minipass@7.1.2: {} + ms@2.1.3: {} + neo-async@2.6.2: {} node-releases@2.0.19: {} @@ -1773,7 +2260,7 @@ snapshots: dependencies: wrappy: 1.0.2 - p-map@3.0.0: + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 @@ -1798,7 +2285,7 @@ snapshots: picomatch@4.0.2: {} - punycode@2.3.1: {} + property-information@7.0.0: {} queue-microtask@1.2.3: {} @@ -1806,26 +2293,60 @@ snapshots: dependencies: safe-buffer: 5.2.1 - react-dom@19.0.0(react@19.0.0): + react-dom@19.1.0(react@19.1.0): dependencies: - react: 19.0.0 - scheduler: 0.25.0 + react: 19.1.0 + scheduler: 0.26.0 - react-icons@5.4.0(react@19.0.0): + react-icons@5.5.0(react@19.1.0): dependencies: - react: 19.0.0 + react: 19.1.0 - react-router@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-router@7.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@types/cookie': 0.6.0 cookie: 1.0.2 - react: 19.0.0 + react: 19.1.0 set-cookie-parser: 2.7.1 turbo-stream: 2.4.0 optionalDependencies: - react-dom: 19.0.0(react@19.0.0) + react-dom: 19.1.0(react@19.1.0) + + react@19.1.0: {} + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-html@16.0.1: + dependencies: + '@types/mdast': 4.0.4 + hast-util-sanitize: 5.0.2 + hast-util-to-html: 9.0.5 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 - react@19.0.0: {} + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 require-from-string@2.0.2: {} @@ -1835,28 +2356,28 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} rimraf@3.0.2: dependencies: glob: 7.2.3 - rollup-plugin-delete@2.1.0(rollup@4.30.1): + rollup-plugin-delete@2.2.0(rollup@4.38.0): dependencies: - del: 5.1.0 - rollup: 4.30.1 + del: 6.1.1 + rollup: 4.38.0 - rollup-plugin-external-globals@0.11.0(rollup@4.30.1): + rollup-plugin-external-globals@0.11.0(rollup@4.38.0): dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + '@rollup/pluginutils': 5.1.4(rollup@4.38.0) estree-walker: 3.0.3 is-reference: 3.0.3 magic-string: 0.30.17 - rollup: 4.30.1 + rollup: 4.38.0 - rollup-plugin-import-assets@1.1.1(rollup@4.30.1): + rollup-plugin-import-assets@1.1.1(rollup@4.38.0): dependencies: - rollup: 4.30.1 + rollup: 4.38.0 rollup-pluginutils: 2.8.2 url-join: 4.0.1 @@ -1864,29 +2385,30 @@ snapshots: dependencies: estree-walker: 0.6.1 - rollup@4.30.1: + rollup@4.38.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.30.1 - '@rollup/rollup-android-arm64': 4.30.1 - '@rollup/rollup-darwin-arm64': 4.30.1 - '@rollup/rollup-darwin-x64': 4.30.1 - '@rollup/rollup-freebsd-arm64': 4.30.1 - '@rollup/rollup-freebsd-x64': 4.30.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 - '@rollup/rollup-linux-arm-musleabihf': 4.30.1 - '@rollup/rollup-linux-arm64-gnu': 4.30.1 - '@rollup/rollup-linux-arm64-musl': 4.30.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 - '@rollup/rollup-linux-riscv64-gnu': 4.30.1 - '@rollup/rollup-linux-s390x-gnu': 4.30.1 - '@rollup/rollup-linux-x64-gnu': 4.30.1 - '@rollup/rollup-linux-x64-musl': 4.30.1 - '@rollup/rollup-win32-arm64-msvc': 4.30.1 - '@rollup/rollup-win32-ia32-msvc': 4.30.1 - '@rollup/rollup-win32-x64-msvc': 4.30.1 + '@rollup/rollup-android-arm-eabi': 4.38.0 + '@rollup/rollup-android-arm64': 4.38.0 + '@rollup/rollup-darwin-arm64': 4.38.0 + '@rollup/rollup-darwin-x64': 4.38.0 + '@rollup/rollup-freebsd-arm64': 4.38.0 + '@rollup/rollup-freebsd-x64': 4.38.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.38.0 + '@rollup/rollup-linux-arm-musleabihf': 4.38.0 + '@rollup/rollup-linux-arm64-gnu': 4.38.0 + '@rollup/rollup-linux-arm64-musl': 4.38.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.38.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.38.0 + '@rollup/rollup-linux-riscv64-gnu': 4.38.0 + '@rollup/rollup-linux-riscv64-musl': 4.38.0 + '@rollup/rollup-linux-s390x-gnu': 4.38.0 + '@rollup/rollup-linux-x64-gnu': 4.38.0 + '@rollup/rollup-linux-x64-musl': 4.38.0 + '@rollup/rollup-win32-arm64-msvc': 4.38.0 + '@rollup/rollup-win32-ia32-msvc': 4.38.0 + '@rollup/rollup-win32-x64-msvc': 4.38.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -1895,13 +2417,7 @@ snapshots: safe-buffer@5.2.1: {} - scheduler@0.25.0: {} - - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + scheduler@0.26.0: {} schema-utils@4.3.0: dependencies: @@ -1933,6 +2449,8 @@ snapshots: source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -1945,6 +2463,11 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -1961,19 +2484,19 @@ snapshots: tapable@2.2.1: {} - terser-webpack-plugin@5.3.11(webpack@5.97.1): + terser-webpack-plugin@5.3.14(webpack@5.98.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.0 serialize-javascript: 6.0.2 - terser: 5.37.0 - webpack: 5.97.1 + terser: 5.39.0 + webpack: 5.98.0 - terser@5.37.0: + terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.0 + acorn: 8.14.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -1981,25 +2504,68 @@ snapshots: dependencies: is-number: 7.0.0 + trim-lines@3.0.1: {} + + trough@2.2.0: {} + tslib@2.8.1: {} turbo-stream@2.4.0: {} - typescript@5.7.3: {} + typescript@5.8.2: {} undici-types@6.20.0: {} - update-browserslist-db@1.1.2(browserslist@4.24.4): + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 - uri-js@4.4.1: + url-join@4.0.1: {} + + vfile-message@4.0.2: dependencies: - punycode: 2.3.1 + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 - url-join@4.0.1: {} + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 watchpack@2.4.2: dependencies: @@ -2008,17 +2574,17 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.97.1: + webpack@5.98.0: dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.0 + acorn: 8.14.1 browserslist: 4.24.4 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.0 + enhanced-resolve: 5.18.1 es-module-lexer: 1.6.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -2028,9 +2594,9 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.3.0 + schema-utils: 4.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(webpack@5.97.1) + terser-webpack-plugin: 5.3.14(webpack@5.98.0) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -2055,3 +2621,5 @@ snapshots: strip-ansi: 7.1.0 wrappy@1.0.2: {} + + zwitch@2.0.4: {} diff --git a/py_modules/.keep b/py_modules/.keep deleted file mode 100644 index e69de29..0000000 --- a/py_modules/.keep +++ /dev/null diff --git a/rollup.config.js b/rollup.config.js index 0c20d4f..3af651b 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,17 +1,5 @@ import deckyPlugin from "@decky/rollup"; -import resolve from "@rollup/plugin-node-resolve"; -import typescript from "@rollup/plugin-typescript"; -import commonjs from "@rollup/plugin-commonjs"; export default deckyPlugin({ - input: "src/index.tsx", // Entry file for the plugin - output: { - dir: "dist", // Output directory for the built files - format: "cjs", // CommonJS format, required for Decky Loader plugins - }, - plugins: [ - resolve(), // Resolves `node_modules` imports - commonjs(), // Converts CommonJS modules to ES modules - typescript(), // Compiles TypeScript to JavaScript - ], -});
\ No newline at end of file + // Add your extra Rollup options here +}) diff --git a/src/PartnerEventStorePatch.tsx b/src/PartnerEventStorePatch.tsx new file mode 100644 index 0000000..2307283 --- /dev/null +++ b/src/PartnerEventStorePatch.tsx @@ -0,0 +1,193 @@ +import { findModuleExport } from "@decky/ui"; +import { afterPatch } from "decky-frontend-lib"; +import remarkHtml from "remark-html" +import remarkParse from "remark-parse" +import remarkGfm from "remark-gfm" +import {unified} from "unified" +import html2bbcode from "./html2bbcode"; +import {Mutex} from 'async-mutex'; + +const PartnerEventStore = findModuleExport( + (e) => e?.prototype?.InternalLoadAdjacentPartnerEvents +); + +const SteamID = findModuleExport( + (e) => e?.prototype?.BIsClanAccount + && e?.prototype?.BIsIndividualAccount + && e?.prototype?.BIsValid + && e?.prototype?.ConvertTo64BitString + && e?.prototype?.GetAccountID + && e?.prototype?.GetAccountType + && e?.prototype?.GetInstance + && e?.prototype?.GetUniverse + && e?.prototype?.Render + && e?.prototype?.SetAccountID + && e?.prototype?.SetAccountType + && e?.prototype?.SetFromComponents + && e?.prototype?.SetInstance + && e?.prototype?.SetUniverse +); + +const steamClanSteamID = "103582791470414830"; +const steamClanID = "40893422"; +const steamOSAppId = 1675200; +const githubReleasesURI = "https://api.github.com/repos/ublue-os/bazzite/releases"; + +enum SteamEventType { + SmallUpdate = 12, + Update = 13, + BigUpdate = 14, +} + +const mutex = new Mutex(); +let releases: any[]; +let channel: string; + +export function patchPartnerEventStore() { + return afterPatch( + PartnerEventStore.prototype, + "InternalLoadAdjacentPartnerEvents", + async function(args, ret) { + let [, , , appId, , , c, ] = args; + + if (appId !== steamOSAppId) { + return ret; + } + + ret = await Promise.resolve(ret); + + if (!Array.isArray(ret)) { + return ret; + } + + ret.length = 0; + + await mutex.runExclusive(async () => { + if (releases && releases.length > 0) + return; + + let response: Response; + let responseJson: any; + + try { + response = await fetch(githubReleasesURI); + + if (!response.ok) + return; + + responseJson = await response.json(); + } + catch { + responseJson = []; + } + + if (!Array.isArray(responseJson) || responseJson.length == 0) { + return; + } + + responseJson.sort((a, b) => (new Date(b.created_at)).getTime() - (new Date(a.created_at)).getTime()); + + if (c?.require_tags && c?.require_tags?.includes("stablechannel")) { + releases = responseJson.filter(r => !r.prerelease); + channel = "stablechannel"; + } else if (c?.require_tags && (c?.require_tags?.includes("betachannel") || c?.require_tags?.includes("previewchannel"))) { + releases = responseJson.filter(r => r.prerelease); + channel = "betachannel"; + } else { + releases = responseJson; + channel = "stablechannel"; + } + }); + + if (!releases || releases.length == 0) + return ret; + + for (const release of releases) { + const releaseCreatedAt = Math.floor((new Date(release.created_at)).getTime() / 1000); + + const html = await unified() + .use(remarkParse) + .use(remarkGfm) + .use(remarkHtml) + .process(release.body); + + const converter = new (html2bbcode.HTML2BBCode)(); + const bbcode = converter.feed(html.value); + + // @ts-ignore + const event = { + "gid": String(release.id), + "clan_steamid": steamClanSteamID, + "event_name": release.name, + "event_type": SteamEventType.Update, + "appid": steamOSAppId, + "server_address": "", + "server_password": "", + "rtime32_start_time": releaseCreatedAt, // only used for certain event_type, not used for updates, but anyway + "rtime32_end_time": releaseCreatedAt, // only used for certain event_type, not used for updates, but anyway + "comment_count": 0, + "creator_steamid": "0", + "last_update_steamid": "0", + "event_notes": "see announcement body", + "jsondata": "{\n\t\"localized_subtitle\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"localized_summary\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"localized_title_image\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"localized_capsule_image\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"bSaleEnabled\": false,\n\t\"sale_show_creator\": false,\n\t\"sale_sections\": [\n\n\t]\n\t,\n\t\"sale_browsemore_text\": \"\",\n\t\"sale_browsemore_url\": \"\",\n\t\"sale_browsemore_color\": \"\",\n\t\"sale_browsemore_bgcolor\": \"\",\n\t\"localized_sale_header\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"localized_sale_overlay\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"localized_sale_product_banner\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"localized_sale_product_mobile_banner\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"localized_sale_logo\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"sale_font\": \"\",\n\t\"sale_background_color\": \"\",\n\t\"sale_header_offset\": 150,\n\t\"referenced_appids\": [\n\n\t]\n\t,\n\t\"bBroadcastEnabled\": false,\n\t\"broadcastChatSetting\": \"hide\",\n\t\"default_broadcast_title\": \"#Broadcast_default_title_dev\",\n\t\"localized_broadcast_title\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"localized_broadcast_left_image\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"localized_broadcast_right_image\": [\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull,\n\t\tnull\n\t]\n\t,\n\t\"broadcast_whitelist\": [\n\n\t]\n\t,\n\t\"bScheduleEnabled\": false,\n\t\"scheduleEntries\": [\n\n\t]\n\t,\n\t\"valve_access_log\": [\n\t\t{\n\t\t\t\"strSteamID\": \"76561197979253178\",\n\t\t\t\"rtUpdated\": 1741648377\n\t\t},\n\t\t{\n\t\t\t\"strSteamID\": \"76561198840299494\",\n\t\t\t\"rtUpdated\": 1741740761\n\t\t}\n\t]\n\t,\n\t\"clone_from_event_gid\": \"519706073503894980\",\n\t\"clone_from_sale_enabled\": false,\n\t\"automatically_push_updated_source\": true\n}", + "announcement_body": { + "gid": String(release.id), + "clanid": steamClanID, + "posterid": "0", + "headline": `Bazzite ${release.name}`, + "posttime": releaseCreatedAt, + "updatetime": releaseCreatedAt, + "body": bbcode.toString(), + "commentcount": 0, + "tags": [ + "patchnotes", + channel, + ], + "language": 0, + "hidden": 0, + "forum_topic_id": "0", + "event_gid": "0", + "voteupcount": 0, + "votedowncount": 0, + "ban_check_result": 0, + "banned": 0 + }, + "published": 1, + "hidden": 0, + "rtime32_visibility_start": 0, + "rtime32_visibility_end": 0, + "broadcaster_accountid": 0, + "follower_count": 0, + "ignore_count": 0, + "forum_topic_id": "0", + "rtime32_last_modified": releaseCreatedAt, + "news_post_gid": "0", + "rtime_mod_reviewed": 0, + "featured_app_tagid": 0, + "referenced_appids": [], + "build_id": 0, + "build_branch": "", + "unlisted": 0, + "votes_up": 0, + "votes_down": 0, + "comment_type": "ForumTopic", // haven't found a way to hide likes and comments + "gidfeature": "0", + "gidfeature2": "0" + }; + + // @ts-ignore + if (!this.m_mapExistingEvents.has(event.gid)) { + let steamId = new SteamID(event.clan_steamid); + + // @ts-ignore + this.InsertEventModelFromClanEventData(steamId, event) + } + + // @ts-ignore + ret.push(this.m_mapExistingEvents.get(event.gid)); + } + + return ret; + } + ); +} diff --git a/src/html2bbcode.js b/src/html2bbcode.js new file mode 100644 index 0000000..7399d71 --- /dev/null +++ b/src/html2bbcode.js @@ -0,0 +1,1214 @@ + +(function (name, definition) { + if (typeof exports !== 'undefined' && typeof module !== 'undefined') { + module.exports = definition(); + } else if (typeof define === 'function' && typeof define.amd === 'object') { + define(definition); + } else { + this[name] = definition(); + } + })('html2bbcode', function (html2bbcode) { + + 'use strict'; + + html2bbcode = { version: '1.2.3' }; + + //function HTMLAttribute() + + function HTMLTag() { + this.name = ''; + this.length = 0; + //this.attr = null; + //this.content = null; + } + + HTMLTag.duptags = ['div', 'span']; + HTMLTag.headingtags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + HTMLTag.selfendtags = ['!doctype', 'meta', 'link','img', 'br']; + HTMLTag.newlinetags = ['div', 'p', 'br', 'li', 'tr'].concat(HTMLTag.headingtags); + HTMLTag.noemptytags = ['head', 'style', 'script', + 'span', 'a', 'font', 'color', 'size', 'face', + 'strong', 'b', 'em', 'i', 'del', 's', 'ins', 'u']; + HTMLTag.noemptyattrtags = ['img']; + + HTMLTag.prototype.findquoteend = function (script, start, multiline) { + var end = -1; + var i = start ? start : 0; + var len = script.length; + var d = script[i] === '\"'; + + i++; + while (i < len) { + if (script[i] === '\\') { + i++; + switch (script[i]) { + case 'u': + // \uXXXX + i += 5; + break; + case 'x': + // \xXX + i += 3; + break; + default: + // \n ... + i++; + break; + } + } else if ((d && script[i] === '\"') || (!d && script[i] === '\'')) { + end = i; + break; + } else if (script[i] === '\n' && !multiline) { + // not allow change line + break; + } else { + i++; + } + } + + return end; + }; + + HTMLTag.prototype.findscriptend = function (script, start) { + var end = -1; + var i = start ? start : 0; + var len = script.length; + var freg = /(['"]|<\s*?\/\s*?script\s*?>)/ig; + + while (i < len) { + if (script[i] === '\"' || script[i] === '\'') { + var qi = this.findquoteend(script, i, true); + if (qi === -1) { + break; + } + i = qi + 1; + } else { + freg.lastIndex = i; + var m = freg.exec(script); + if (!m || m.length <= 0) { + break; + } else if (m[0][0] === '<') { + //script here + end = freg.lastIndex - m[0].length; + break; + } + // quote + i = freg.lastIndex - 1; + //console.log(i, script.substr(i, 5)); + continue; + } + } + return end; + }; + + HTMLTag.prototype.quote = function (quotation) { + // convert string type + if (quotation[0] === '\'') { + var s = '"'; + var i = 1; + var len = quotation.length - 1; // last is \' + var start = i; + while (i < len) { + if (quotation[i] === '\\') { + i++; + switch (quotation[i]) { + case 'u': + // \uXXXX + i += 5; + break; + case 'x': + // \xXX + i += 3; + break; + default: + // \n ... + i++; + break; + } + } else if (quotation[i] === '\"') { + s += quotation.substr(start, i - start); + s += '\\"'; + i++; + start = i; + break; + } else { + i++; + } + } + if (start < len) { + s += quotation.substr(start, len - start); + } + s += '"'; + return s; + } else { + return quotation; + } + }; + + HTMLTag.prototype.parseStyle = function (style) { + var ss = style.split(';'); + var r_style = {}; + var count = 0; + for (var i = 0; i < ss.length; i++) { + var s = ss[i].split(':'); + if (s.length >= 2) { + count++; + var val; + if (s.length > 2) { + // eg. url(http://example.com) + val = s.slice(1).join(':').trim(); + } else { + val = s[1].trim(); + } + if (val[0] === '\'' && val[val.length - 1] === '\'') { + try { + val = JSON.parse(this.quote(val)); + } catch (err) { + } + } + r_style[s[0].trim().toLowerCase()] = val; + } + } + if (count > 0) { + return r_style; + } else { + return undefined; + } + }; + + HTMLTag.prototype.parseAttributes = function (attr) { + attr = attr.trim(); + var blank = /\s/; + var i = 0; + var len = attr.length; + var start = i; + var lastkey = null; + var invalue = false; + var r_attr = {}; + var add_attr = function (k, v) { + if (typeof v === 'undefined') { + v = null; + } + k = k.trim().toLowerCase(); + r_attr[k] = v; + }; + while (i < len) { + if (attr[i] === '=') { + // TODO: check lastkey, currently drop previous lastkey + lastkey = attr.substr(start, i - start); + invalue = false; + } else if (blank.test(attr[i])) { + if (lastkey && invalue) { + add_attr(lastkey, attr.substr(start, i - start)); + invalue = false; + lastkey = null; + } else if (i - start > 0) { + lastkey = attr.substr(start, i - start); + add_attr(lastkey); + lastkey = null; + } + start = i + 1; + } else if (lastkey && !invalue) { + start = i; + if (attr[i] === '"' || attr[i] === '\'') { + var b = attr[i] === '\''; + i = this.findquoteend(attr, i); + if (i === -1) { + break; + } + var v = attr.substr(start, i + 1 - start); + if (b) { + v = this.quote(v); + } + try { + v = JSON.parse(v); + } catch (e) { + } + add_attr(lastkey, v); + lastkey = null; + start = i + 1; + } else { + invalue = true; + } + } + i++; + } + if (start < len) { + var d = attr.substr(start); + if (lastkey) { + add_attr(lastkey, d); + } else { + add_attr(d); + } + lastkey = null; + } + var count = 0; + for (var k in r_attr) { + count++; + } + if (count > 0) { + if (r_attr.style) { + r_attr.style = this.parseStyle(r_attr.style); + } + this.attr = r_attr; + } + }; + + HTMLTag.prototype.parse = function (html) { + var i = 0; + if (html[i] !== '<') { + throw new Error('not a tag'); + } + var len = html.length; + var blank = /\s/; + //var htmltagq = /[<>]/; + // strip tagname head blank + while (i < len) { + if (html[i] === '<') { + i++; + } else if (html[i] === '>') { + // drop this empty tag + this.length = i + 1; + return this; + } else if (blank.test(html[i])) { + i++; + } else { + break; + } + } + if (i >= len) { + // drop this + this.length = len; + return this; + } + + // name + var start = i; + var tagheadend = false; + while (i < len && !blank.test(html[i])) { + if (html[i] === '>') { + tagheadend = true; + break; + } else if (html[i] === '/') { + break; + } + i++; + } + if (i >= len) { + // drop this + this.length = i; + return this; + } + this.name = html.substr(start, i - start).trim().toLowerCase(); + if (this.name.length > 0 && this.name[0] === '/') { + this.length = i; + this.name = this.name.substr(1); + this.selfend = true; + return this; + } + if (HTMLTag.selfendtags.indexOf(this.name) >= 0) { + this.selfend = true; + } + + // attr + if (!tagheadend) { + start = i; + while (i < len && html[i] !== '>') { + i++; + } + if (i >= len) { + // drop this + this.length = i; + return this; + } else if (i - start > 0) { + var sattr = html.substr(start, i - start).trim(); + var attrlen = sattr.length; + if (attrlen > 0 && sattr[attrlen - 1] === '/') { + this.selfend = true; + sattr = sattr.substr(0, attrlen - 1); + } + this.parseAttributes(sattr); + } + } + i++; // skip '>' + + if (this.selfend) { + this.length = i; + return this; + } + + // content + var that = this; + var add_content = function (html) { + var hstack = new HTMLStack().parse(html); + if (that.content) { + that.content.append(hstack); + } else { + that.content = hstack; + } + return hstack.length; + }; + + if (this.name === 'script') { + var script_len = this.findscriptend(html.substr(i)); + if (script_len < 0) { + this.length = len; + return this; + } + + this.content = new HTMLStack(); + var script = html.substr(i, script_len); + this.content.length = script_len; + this.content.stack = [ script ]; + + i += script_len; + // script tag end + start = html.indexOf('>', i); + if (start < 0) { + // no possible + this.length = len; + return this; + } + + this.length = start + 1; + return this; + } + + var j = 0; + while (i < len) { + // loop to tag end + j++; + start = i; + + while (i < len && blank.test(html[i])) { + i++; + } + + while (i < len && html[i] !== '<') { + i++; + } + + var i_tagend = i; + i++; + while (i < len && blank.test(html[i])) { + i++; + } + + if (i >= len) { + // drop this + this.content = new HTMLStack().parse(html.substr(start)); + this.length = len; + return this; + } else { + if (i < len && html[i] === '/') { + i++; + while (i < len && blank.test(html[i])) { + i++; + } + if (i >= len) { + // drop this + i += add_content(html.substr(start)); + this.length = len; + return this; + } else { + var t_start = i; + var t_tagheadend = false; + while (i < len && !blank.test(html[i])) { + if (html[i] === '>') { + t_tagheadend = true; + break; + } + i++; + } + if (i > t_start) { + if (!t_tagheadend) { + while (i < len && html[i] !== '>') { + i++; + } + } + var ename = html.substr(t_start, i - t_start).trim().toLowerCase(); + i++; //skip '>' + // force stop current tag + /*if (ename === this.name)*/ { + // end of tag + this.length = i; + if (i_tagend > start) { + // add content + add_content(html.substr(start, i_tagend - start)); + } + return this; + } + } + } + } + } + + i = start + add_content(html.substr(start)); + } + + this.length = i; + return this; + }; + + function HTMLStack() { + this.stack = []; + this.length = 0; + } + + HTMLStack.prototype.parse = function (html) { + // check first... + if (!html) { + return this; + } + + var i = 0; + var len = html.length; + var lasttagend = 0; + var blank = /\s/; + var that = this; + var push_plaintext = function (start, end) { + if (start < end) { + that.push(html.substr(start, end - start)); + } + }; + while (i < len) { + switch (html[i]) { + case '<': + push_plaintext(lasttagend, i); + + // check end & drop + var t_i = i + 1; + while (t_i < len && blank.test(html[t_i])) { + t_i++; + } + if (t_i < len && html[t_i] === '/') { + return this; + } + + var tag = new HTMLTag().parse(html.substr(i)); + this.push(tag); + i += tag.length; + lasttagend = i; + break; + case '>': + // TODO: drop the > + i++; + break; + default: + i++; + break; + } + } + push_plaintext(lasttagend, len); + return this; + }; + + HTMLStack.prototype.push = function (data) { + this.length += data.length; + this.stack.push(data); + }; + + HTMLStack.prototype.pop = function () { + return this.stack.pop(); + }; + + HTMLStack.prototype.append = function (hstack) { + this.stack = this.stack.concat(hstack.stack); + this.length += hstack.length; + }; + + (function () { + var dupRegex = new RegExp( + '<\\s*?(' + HTMLTag.duptags.join('|') + ')\\s*?>\\s*?' + + '<\\s*?\\1\\s*?>' + + '(((?!<\\s*?\\1\\s*?>)[\\S\\s])*?)' + + '<\\s*?/\\s*?\\1\\s*?>\\s*?' + + '<\\s*?/\\s*?\\1\\s*?>', 'ig'); + var nlsRegex = new RegExp( + '(<\\s*?(' + HTMLTag.newlinetags.join('|') + ')(\\s[^>]*?)?>)\\s+', 'ig'); + var nleRegex = new RegExp( + '\\s+(<\\s*?/\\s*?(' + HTMLTag.newlinetags.join('|') + ')\\s*?>)', 'ig'); + var empRegex = new RegExp( + '<\\s*?(' + HTMLTag.noemptytags.join('|') + ')(\\s[^>]*?)?>' + + '<\\s*?/\\s*?\\1\\s*?>', 'ig'); + HTMLStack.minify = function (html) { + var preRegex = /<pre(\s.*?)?>/ig; + var endPreRegex = /<\/pre>/ig; + var emptyRegex = /\s{2,}/g; + var m, newHtml = '', preMarkIndex = -1; + html = html.replace(empRegex, ''); + html = html.replace(nlsRegex, '$1'); + html = html.replace(nleRegex, '$1'); + while (m = preRegex.exec(html)) { + if (preMarkIndex < 0) { + preMarkIndex = 0; + } + newHtml += html.substr(preMarkIndex, preRegex.lastIndex - preMarkIndex).replace(emptyRegex, ' '); + preMarkIndex = preRegex.lastIndex; + endPreRegex.lastIndex = preRegex.lastIndex; + if (m = endPreRegex.exec(html)) { + preRegex.lastIndex = endPreRegex.lastIndex; + // no replace for pre content + newHtml += html.substr(preMarkIndex, m.index - preMarkIndex); + preMarkIndex = m.index; + } + } + if (preMarkIndex >= 0) { + html = newHtml + html.substr(preMarkIndex).replace(emptyRegex, ' '); + } else { + html = html.replace(emptyRegex, ' '); + } + while (dupRegex.test(html)) { + html = html.replace(dupRegex, '<$1>$2</$1>'); + } + return html; + }; + })(); + + var escapeMap = { + '&': 'amp', + '<': 'lt', + '>': 'gt', + '"': 'quot', + "'": '#x27', + '`': '#x60' + }; + var unescapeMap = { + 'nbsp': ' ', + 'amp': '&', + 'lt': '<', + 'gt': '>', + 'quot': '"' + }; + + HTMLStack.unescape = function (str, nonbsp) { + var src = '&([a-zA-Z]+?|#[xX][\\da-fA-F]+?|#\\d+?);'; + var testRegexp = new RegExp(src); + var escaper = function (match, m1) { + m1 = m1.toLowerCase(); + if (nonbsp && m1 === 'nbsp') { + return ' '; + } + var m = unescapeMap[m1]; + if (m) { + return m; + } else if (m1[0] === '#') { + var code = 0; + if (m1[1] == 'x') { + code = parseInt(m1.substr(2), 16); + } else { + code = parseInt(m1.substr(1)); + } + if (code) { + return String.fromCharCode(code); + } + } + return ''; + }; + if (testRegexp.test(str)) { + var replaceRegexp = new RegExp(src, 'g'); + str = str.replace(replaceRegexp, escaper); + } + return str; + }; + + HTMLStack.prototype.decode = function (nonbsp) { + for (var i = 0; i < this.stack.length; i++) { + var s = this.stack[i]; + if (typeof s === 'string') { + this.stack[i] = HTMLStack.unescape(s, nonbsp); + } else if (s instanceof HTMLTag && s.content) { + s.content.decode(nonbsp); + } + } + return this; + }; + + HTMLStack.prototype.dedup = function () { + for (var i = 0; i < this.stack.length; i++) { + var s = this.stack[i]; + if (s instanceof HTMLTag && s.content) { + if (HTMLTag.duptags.indexOf(s.name) >= 0 && !s.attr && s.content.stack.length === 1) { + var ts = s.content.stack[0]; + if (ts.name === s.name) { + this.stack[i] = ts; + i--; + continue; + } + } + s.content.dedup(); + } + } + return this; + }; + + HTMLStack.prototype.strip = function (parent, afternewline) { + + if (!afternewline) { + afternewline = (parent && !afternewline) ? (HTMLTag.newlinetags.indexOf(parent.name) >= 0) : true; + } + + var blanks = /^\s*$/; + var k = 0; + var stag = true; + // first recursive + for (var i = 0; i < this.stack.length; i++) { + var s = this.stack[i]; + if (s instanceof HTMLTag) { + stag = true; + if (s.content) { + //check if is after newline + var anl; + if (k <= 0) { + anl = afternewline; + } else { + anl = false; + // fine previous one + for (var j = i - 1; j >= 0; j--) { + var ts = this.stack[j]; + if (ts instanceof HTMLTag) { + anl = (HTMLTag.newlinetags.indexOf(ts.name) >= 0); + //anl = true; + break; + } else if (typeof ts === 'string' && blanks.test(ts)) { + //continue; + } else { + break; + } + } + } + s.content.strip(s, anl); + } + } else if (typeof s === 'string' && blanks.test(s)) { + if (stag) { + continue; + } + } + k++; + } + + stag = true; + var new_stack = []; + var new_len = 0; + for (var i = 0; i < this.stack.length; i++) { + var s = this.stack[i]; + if (typeof s === 'string' && blanks.test(s) && afternewline) { + if (stag) { + continue; + } + afternewline = false; + } else if (s instanceof HTMLTag) { + stag = true; + if (HTMLTag.noemptyattrtags.indexOf(s.name) >= 0) { + // strip like <img src="" /> + if (!s.attr) { + continue; + } + var exists = false; + for (var k1 in s.attr) { + if (s.attr[k1]) { + exists = true; + break; + } + } + if (!exists) { + continue; + } + } + if (HTMLTag.noemptytags.indexOf(s.name) >= 0 && !s.content) { + // null span + continue; + } else if (HTMLTag.newlinetags.indexOf(s.name) >= 0) { + afternewline = true; + /*} else if (s.name === 'span' && afternewline) {*/ + // keep newline flag + } else { + afternewline = false; + } + } else { + // not full empty string + if (afternewline) { + // removehead space after newline + s = s.replace(/^\s+/g, ''); + if (!s) { + // empty string + continue; + } + } + s = s.replace(/\s+/g, ' '); + stag = false; + afternewline = false; + } + new_len++; + new_stack.push(s); + } + + // check last one is empty string + var s = new_stack[new_len - 1]; + if (typeof s === 'string') { + if (new_len >= 2 && blanks.test(s)) { + // remove last empty string + new_stack.splice(new_len - 1, 1); + new_len--; + } else if (/\S\s+$/.test(s)) { + // space follow with a non-space string + new_stack[new_len - 1] = s.replace(/\s+$/, ''); + } + } + + if (new_len <= 0 && parent) { + delete parent.content; + return; + } + + this.stack = new_stack; + return this; + }; + + HTMLStack.prototype.showtree = function (tab, depth) { + if (!tab) tab = ''; + if (!depth) depth = 0; + + for (var i = 0; i < this.stack.length; i++) { + var d = this.stack[i]; + if (d instanceof HTMLTag) { + console.log(tab, d.name, d.attr ? JSON.stringify(d.attr) : ''); + if (d.content) { + d.content.showtree(tab + '--', depth + 1); + } + } else if (typeof d === 'string') { + console.log(tab, JSON.stringify(d)); + } + } + }; + + function BBCode() { + this.s = ''; + this.weaknewline = true; + this.stack = []; + } + + BBCode.maps = { + 'a': { section: 'url', attr: 'href' }, + 'img': { section: 'img', data: 'src', empty: true }, + 'em': { section: 'i' }, + 'i': { section: 'i' }, + 'strong': { section: 'b' }, + 'b': { section: 'b' }, + 'del': { section: 's' }, + 's': { section: 's' }, + 'ins': { section: 'u' }, + 'u': { section: 'u' }, + 'center': { section: 'center' }, + 'ul': { section: 'ul' }, // may need to treat as 'list' + 'ol': { section: 'ol' }, // may need to treat as 'list' + 'li': { section: 'li', newline: 1 }, + 'blockquote': { section: 'quote' }, + 'code': { section: 'b' }, + 'font': { extend: ['color', 'face', 'size'] }, + 'span': { extend: ['color', 'face', 'size'] }, + 'color': { section: 'color', attr: 'color' }, + 'size': { section: 'size', attr: 'size' }, + 'face': { section: 'font', attr: 'face' }, + // new line tags + 'h1': { section: 'h1', newline: 1 }, + 'h2': { section: 'h2', newline: 1 }, + 'h3': { section: 'h3', newline: 1 }, + 'h4': { section: 'h4', newline: 1 }, + 'h5': { section: 'h5', newline: 1 }, + 'h6': { section: 'h6', newline: 1 }, + 'p': { newline: 1 }, + 'br': { newline: 2, empty: true }, + 'table': { section: 'table', newline: 1 }, + 'tr': { section: 'tr', newline: 1 }, + 'th': { section: 'td', newline: 1 }, + 'td': { section: 'td', newline: 1 }, + 'pre': { section: 'code', newline: 1 }, + 'div': { newline: 0 }, + // ignore tags + '!doctype': { ignore: true }, + 'head': { ignore: true }, + 'style': { ignore: true }, + 'script': { ignore: true }, + 'meta': { ignore: true }, + 'link': { ignore: true }, + }; + + BBCode.prototype.open = function (section, attr, data) { + if (!section) { + return; + } + if (section instanceof Array) { + this.stack = this.stack.concat(section); + } else { + this.stack.push({ + section: section, + attr: attr, + data: data + }); + } + }; + + BBCode.prototype.append = function (str) { + this.solidify(); + this._append(str); + }; + + BBCode.prototype._append = function (str) { + if (str) { + this.s += str; + this.weaknewline = false; + } + }; + + BBCode.prototype.solidify = function () { + // write back stack + var i; + for (i = 0; i < this.stack.length; i++) { + var st = this.stack[i]; + var section = st.section; + var attr = st.attr; + var data = st.data; + + var s = '[' + section; + if (typeof attr === 'string') { + s += '=' + attr; + } else { + for (var k in attr) { + s += ' ' + k + '=' + attr[k]; + } + } + s += ']'; + if (data) { + s += data; + } + + this._append(s); + } + if (i > 0) { + this.stack = []; + } + }; + + BBCode.prototype.close = function (section) { + if (!section) { + return; + } + this.solidify(); + this._append('[/' + section + ']'); + }; + + BBCode.prototype.rollback = function () { + this.stack = []; + }; + + BBCode.prototype.newline = function (n) { + if (n === 2) { + // br + this.append('\n'); + this.weaknewline = true; + } else if (n === 1) { + // div, p + if (!this.weaknewline) { + this.append('\n'); + this.weaknewline = true; + } + } else if (!this.weaknewline) { + this.append('\n'); + this.weaknewline = true; + } + }; + + BBCode.prototype.toString = function () { + return this.s; + }; + + // opts: transsize, imagescale + function HTML2BBCode(opts) { + this.opts = opts ? opts : {}; + } + + HTML2BBCode.prototype.color = function (c) { + if (!c) return; + var c1Regex = /rgba?\s*?\(\s*?(\d{1,3})\s*?,\s*?(\d{1,3})\s*?,\s*?(\d{1,3})\s*?.*?\)/i; + if (c1Regex.test(c)) { + var pad2 = function (s) { + if (s.length < 2) { + s = '0' + s; + } + return s; + } + c = c.replace(c1Regex, function (match, r, g, b) { + r = pad2(parseInt(r).toString(16)); + g = pad2(parseInt(g).toString(16)); + b = pad2(parseInt(b).toString(16)); + return '#' + r + g + b; + }); + } + return c; + }; + + HTML2BBCode.prototype.size = function (size) { + if (!size) return; + + var px2size = [0, 12, 14, 16, 18, 24, 32, 48]; + var name2size = [null, 'smaller', 'small', 'medium', 'large', + 'x-large', 'xx-large', '-webkit-xxx-large']; + + if (/^\d+$/.test(size)) { + return size; + } else if (/^\d+?px$/.test(size)) { + size = parseInt(size); + if (!size || size < 0) { + return; + } + if (this.opts.transsize) { + for (var i = px2size.length; i >= 0; i--) { + if (i === 0) { + // smallest + return '1'; + } + if (size >= px2size[i]) { + return i.toString(); + } + } + } else { + return size.toString(); + } + } else { + var ns = name2size.indexOf(size); + if (ns > 0) { + if (this.opts.transsize) { + return ns.toString(); + } else { + return px2size[ns].toString(); + } + } + + // TODO: support other type + return; + } + + return size ? size.toString() : undefined; + }; + + HTML2BBCode.prototype.px = function (px) { + if (!px) return; + px = parseInt(px); + return px ? px.toString() : undefined; + }; + + HTML2BBCode.prototype.convertStyle = function (htag, sec) { + if (!sec) { + return; + } + var bbs = []; + var that = this; + var opts = this.opts; + var addbb = function (sec) { + if (!sec || sec.ignore || + !(sec.section || (sec.extend && sec.extend.length > 0))) { + return; + } + var tsec = { section: sec.section }; + if (sec.attr) { + if (htag.attr) { + switch (sec.section) { + case 'size': + tsec.attr = that.size(htag.attr[sec.attr]); + break; + case 'color': + tsec.attr = that.color(htag.attr[sec.attr]); + break; + default: + tsec.attr = htag.attr[sec.attr]; + break; + } + if (htag.attr.style) { + var ra; + switch (sec.section) { + case 'size': + ra = htag.attr.style['font-size']; + if (ra) ra = that.size(ra); + break; + case 'color': + ra = htag.attr.style['color']; + if (ra) ra = that.color(ra); + break; + case 'font': + ra = htag.attr.style['font-family']; + break; + } + if (ra) { + tsec.attr = ra; + } + } + if (!tsec.attr) { + return; + } + } else { + return; + } + } else if (sec.section === 'img' && opts.imagescale) { + // image attr + var w, h; + if (htag.attr) { + w = that.px(htag.attr['width']); + h = that.px(htag.attr['height']); + if (htag.attr.style) { + var w1, h1; + w1 = that.px(htag.attr.style['width']); + h1 = that.px(htag.attr.style['height']); + if (w1) w = w1; + if (h1) h = h1; + } + if (w && h) { + tsec.attr = w + 'x' + h; + } else if (w || h) { + if (w) { + tsec.attr = { width: w }; + } else { + tsec.attr = { height: h }; + } + } + } + } + if (sec.data) { + tsec.data = htag.attr[sec.data]; + } + bbs.push(tsec); + }; + // check font-weight & text-align + if (htag.attr && htag.attr.style) { + if (htag.name !== 'b' && htag.name !== 'strong') { + var att = htag.attr.style['font-weight']; + if (att === 'bold' || (/^\d+$/.test(att) && parseInt(att) >= 700)) { + addbb(BBCode.maps['b']); + } + } + if (htag.name !== 'center') { + var att = htag.attr.style['text-align']; + if (att === 'center' && !opts.noalign) { + addbb(BBCode.maps['center']); + } + } + if (htag.name !== 'em' && htag.name !== 'i') { + var att = htag.attr.style['font-style']; + if (att === 'italic' || att === 'oblique') { + // italic style + addbb(BBCode.maps['i']); + } + } + } + if (sec.section === 'list' + || sec.section === 'ul' || sec.section === 'ol' + || sec.section === 'li') { + if (opts.nolist) { + return []; + } + } else if (sec.section === 'center') { + if (opts.noalign) { + return []; + } + } else if (/^h\d+$/.test(sec.section)) { + // HTML Headings + if (opts.noheadings) { + // 18.5 -> 19 + var headings2size = [ null, '32px', '24px', '19px', '16px', '14px', '12px' ]; + var m = sec.section.match(/^h(\d+)$/); + var hi = parseInt(m[1]); + if (hi <= 0) { + return []; + } else if (hi >= headings2size.length) { + hi = headings2size.length; + } + bbs.push({ section: 'size', attr: that.size(headings2size[hi]) }); + return bbs; + } + } + + if ('extend' in sec) { + for (var i = 0; i < sec.extend.length; i++) { + var tag = sec.extend[i]; + addbb(BBCode.maps[tag]); + } + } else { + addbb(sec); + } + return bbs; + }; + + HTML2BBCode.prototype.convert = function (hstack) { + var bbcode = new BBCode(); + if (!hstack) { + return bbcode; + } + var that = this; + var recursive = function (hs, anl) { + for (var i = 0; i < hs.length; i++) { + var s = hs[i]; + if (s instanceof HTMLTag) { + if (s.name in BBCode.maps) { + var fnewline = 0; + var sec = BBCode.maps[s.name]; + if (sec.ignore) { + continue; + } + if ('newline' in sec) { + fnewline = sec.newline; + bbcode.newline(sec.newline); + } + if (!s.content && !sec.empty) { + // drop this + continue; + } + var bbs = that.convertStyle(s, sec); + bbcode.open(bbs); + + if (s.content) { + recursive(s.content.stack, fnewline); + } + for (var j = bbs.length - 1; j >= 0; j--) { + bbcode.close(bbs[j].section); + } + if (fnewline) { + // weak new line + bbcode.newline(); + } + } else if (s.content) { + // drop section + recursive(s.content.stack); + } + } else if (typeof s === 'string') { + // force space + //s = s.replace(/ /gi, ' '); + bbcode.append(s); + } + } + }; + recursive(hstack.stack); + return bbcode; + }; + + HTML2BBCode.prototype.parse = function (html) { + return new HTMLStack().parse(html) + .strip().dedup().decode(); + }; + + HTML2BBCode.prototype.feed = function (html) { + var hstack = this.parse(html); + if (this.opts.debug) { + hstack.showtree(); + } + var bbcode = this.convert(hstack); + return bbcode; + }; + + return { + HTMLTag: HTMLTag, + HTMLStack: HTMLStack, + BBCode: BBCode, + HTML2BBCode: HTML2BBCode + }; + + });
\ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx index 87f3f72..28ae219 100755 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,17 +1,20 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { FaClipboardList } from "react-icons/fa"; import { definePlugin } from "decky-frontend-lib"; -import { marked } from "marked"; -import DOMPurify from "dompurify"; +import remarkHtml from "remark-html" +import remarkParse from "remark-parse" +import remarkGfm from "remark-gfm" +import { unified } from "unified" +import { patchPartnerEventStore } from "./PartnerEventStorePatch"; +import {staticClasses} from "@decky/ui"; function Content() { - const [changelog, setChangelog] = useState<string | null>(null); + const [changelogHtml, setChangelogHtml] = useState<string | null>(null); const [error, setError] = useState<string | null>(null); const [isRefreshing, setIsRefreshing] = useState<boolean>(false); const fetchChangelog = async (signal?: AbortSignal) => { - const url = - "https://api.github.com/repos/ublue-os/bazzite/releases/tags/41.20250106.2"; + const url = "https://api.github.com/repos/ublue-os/bazzite/releases/latest"; try { const response = await fetch(url, { headers: { @@ -25,7 +28,13 @@ function Content() { } const data = await response.json(); - setChangelog(data.body); + const html = await unified() + .use(remarkParse) + .use(remarkGfm) + .use(remarkHtml) + .process(data.body) + + setChangelogHtml(html.value as string); setError(null); } catch (err) { if (err instanceof DOMException && err.name === "AbortError") return; @@ -48,7 +57,7 @@ function Content() { const refreshChangelog = async () => { setIsRefreshing(true); - setChangelog(null); + setChangelogHtml(null); setError(null); try { @@ -115,7 +124,7 @@ function Content() { <p style={{ color: "red" }} aria-live="polite"> {error} </p> - ) : changelog ? ( + ) : changelogHtml ? ( <div style={{ backgroundColor: "#1e1e1e", @@ -161,7 +170,7 @@ function Content() { </style> <div dangerouslySetInnerHTML={{ - __html: DOMPurify.sanitize(marked(changelog)), + __html: changelogHtml, }} ></div> </div> @@ -173,11 +182,15 @@ function Content() { } export default definePlugin(() => { + const patch = patchPartnerEventStore(); + return { name: "Bazzite Changelog Viewer", - title: <div>Bazzite Changelog</div>, + title: <div className={staticClasses.Title}>Bazzite Buddy</div>, icon: <FaClipboardList />, content: <Content />, - onDismount() {}, + onDismount() { + patch.unpatch(); + }, }; -});
\ No newline at end of file +}); diff --git a/tsconfig.json b/tsconfig.json index 626c60f..c7da3dd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,8 @@ "noImplicitThis": true, "noImplicitAny": true, "strict": true, - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "allowJs": true }, "include": ["src"], "exclude": ["node_modules"] |
