summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJSON Derulo <136133082+xXJSONDeruloXx@users.noreply.github.com>2025-04-02 15:36:02 -0400
committerGitHub <noreply@github.com>2025-04-02 15:36:02 -0400
commitc226e87f77375ec5682834aaf9049a0076f3e9c2 (patch)
tree78110de676f1b6ae601ac6aaeab0e8d55ee82704
parentfc242fa45d24477c028032dc2f0777da07a44153 (diff)
parent0e8fa29ac63933d3c4b5f9071c174cc2f26d99db (diff)
downloaddecky-bazzite-buddy-c226e87f77375ec5682834aaf9049a0076f3e9c2.tar.gz
decky-bazzite-buddy-c226e87f77375ec5682834aaf9049a0076f3e9c2.zip
Merge pull request #2 from victor-borges/main
Add Steam release notes support
-rwxr-xr-x.vscode/build.sh2
-rw-r--r--backend/Dockerfile9
-rw-r--r--backend/Makefile14
-rwxr-xr-xbackend/entrypoint.sh8
-rw-r--r--backend/src/main.c5
-rw-r--r--decky.pyi184
-rw-r--r--defaults/defaults.txt13
-rw-r--r--dist.zipbin436983 -> 0 bytes
-rw-r--r--main.py57
-rw-r--r--package.json38
-rw-r--r--pnpm-lock.yaml1438
-rw-r--r--py_modules/.keep0
-rw-r--r--rollup.config.js16
-rw-r--r--src/PartnerEventStorePatch.tsx193
-rw-r--r--src/html2bbcode.js1214
-rwxr-xr-xsrc/index.tsx39
-rw-r--r--tsconfig.json3
17 files changed, 2462 insertions, 771 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
deleted file mode 100644
index 2dc797c..0000000
--- a/dist.zip
+++ /dev/null
Binary files differ
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..e631f15 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",
@@ -27,28 +33,26 @@
"homepage": "https://github.com/xXJSONDeruloXx/bazzite-buddy",
"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",
+ "@decky/ui": "^4.9.2",
"@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",
- "typescript": "^5.7.3"
+ "rollup": "^4.38.0",
+ "typescript": "^5.8.2"
},
"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",
- "react-router": "^7.1.1",
- "tslib": "^2.8.1"
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0",
+ "react-icons": "^5.5.0",
+ "react-router": "^7.4.1",
+ "remark-gfm": "^4.0.1",
+ "remark-html": "^16.0.1",
+ "remark-parse": "^11.0.0",
+ "tslib": "^2.8.1",
+ "unified": "^11.0.5"
},
"pnpm": {
"peerDependencyRules": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ca1b3ce..93389cd 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
+ specifier: ^19.1.0
+ version: 19.1.0
react-dom:
- specifier: ^19.0.0
- version: 19.0.0(react@19.0.0)
+ specifier: ^19.1.0
+ version: 19.1.0(react@19.1.0)
react-icons:
- specifier: ^5.4.0
- version: 5.4.0(react@19.0.0)
+ specifier: ^5.5.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)
+ specifier: ^7.4.1
+ 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
+ specifier: ^4.9.2
+ 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.38.0
+ version: 4.38.0
typescript:
- specifier: ^5.7.3
- version: 5.7.3
+ specifier: ^5.8.2
+ 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 '&nbsp;';
+ }
+ 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(/&nbsp;/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"]