Merge branch 'master' into snyk-upgrade-3851baf7186c338443617aeaab267e82

This commit is contained in:
Fabio Manganiello 2024-11-22 10:46:44 +01:00 committed by GitHub
commit 21c0787138
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
53 changed files with 304 additions and 216 deletions

View file

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
echo "Installing required build dependencies" echo "Installing required build dependencies"
apk add --update --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/ git make py3-sphinx py3-myst-parser py3-pip $(cat platypush/install/requirements/alpine.txt) apk add --update --no-cache git make py3-sphinx py3-myst-parser py3-pip $(cat platypush/install/requirements/alpine.txt)
pip install -U sphinx-rtd-theme sphinx-book-theme --break-system-packages pip install -U sphinx-rtd-theme sphinx-book-theme --break-system-packages
pip install . --break-system-packages pip install . --break-system-packages
mkdir -p /docs/current mkdir -p /docs/current

View file

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
apk add --update --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/ $(cat platypush/install/requirements/alpine.txt) apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
pip install . --break-system-packages pip install . --break-system-packages
pip install -r requirements-tests.txt --break-system-packages pip install -r requirements-tests.txt --break-system-packages
pytest tests pytest tests

View file

@ -23,7 +23,7 @@ fi
. .drone/macros/configure-gpg.sh . .drone/macros/configure-gpg.sh
echo 'Updating components cache' echo 'Updating components cache'
apk add --update --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/ $(cat platypush/install/requirements/alpine.txt) apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
pip install . --break-system-packages pip install . --break-system-packages
python - <<EOF python - <<EOF

View file

@ -1,11 +1,26 @@
#!/bin/sh #!/bin/sh
[ -z "$DOCKER_USER" ] && echo "Please set the DOCKER_USER environment variable" && exit 1
[ -z "$DOCKER_PASS" ] && echo "Please set the DOCKER_PASS environment variable" && exit 1
export VERSION=$(grep current_version pyproject.toml | sed -r -e "s/.*=\s*['\"]?([^'\"]+)['\"]?\s*$/\1/") export VERSION=$(grep current_version pyproject.toml | sed -r -e "s/.*=\s*['\"]?([^'\"]+)['\"]?\s*$/\1/")
export REGISTRY_ENDPOINT="${REGISTRY_ENDPOINT:-quay.io}"
export IMAGE_NAME="$REGISTRY_ENDPOINT/$DOCKER_USER/platypush" export IMAGE_NAME="$REGISTRY_ENDPOINT/$DOCKER_USER/platypush"
# Log in to the registry
docker login "$REGISTRY_ENDPOINT" -u "$DOCKER_USER" -p "$DOCKER_PASS" docker login "$REGISTRY_ENDPOINT" -u "$DOCKER_USER" -p "$DOCKER_PASS"
docker build -f Dockerfile.alpine -t "$IMAGE_NAME:$VERSION" .
docker tag "$IMAGE_NAME:$VERSION" "$IMAGE_NAME:latest"
docker push "$IMAGE_NAME:$VERSION" # Required for multi-platform builds
docker push "$IMAGE_NAME:latest" docker buildx create --name=multiarch --driver=docker-container
# Build and publish the images
docker buildx build \
-f Dockerfile.alpine \
-t "$IMAGE_NAME:$VERSION" \
-t "$IMAGE_NAME:latest" \
--platform linux/amd64,linux/arm64,linux/arm/v7 \
--builder multiarch \
--push .
# Clean up
docker buildx rm multiarch

View file

@ -1,5 +1,15 @@
# Changelog # Changelog
## [1.3.4]
- [Bug]: Fixed installation bug in `pip install platypush` introduced by the
`pyproject.toml` migration.
## [1.3.3]
- [`3e02304a`](https://git.platypush.tech/platypush/platypush/commit/3e02304ac203625650ab4b03f9d4146a40839f2f)
[Auth]: Fixed generation of API tokens when 2FA is enabled.
## [1.3.2] ## [1.3.2]
- [[#414](https://git.platypush.tech/platypush/platypush/issues/414)]: added - [[#414](https://git.platypush.tech/platypush/platypush/issues/414)]: added

View file

@ -656,12 +656,20 @@ $ pip install git+https://github.com/blacklight/platypush
```bash ```bash
$ docker run -it --name platypush \ $ docker run -it --name platypush \
-p 8008:8008 \ -p 8008:8008 \
-e "PLATYPUSH_DEVICE_ID=my-device" -e "PLATYPUSH_DEVICE_ID=my-device" \
-v /path/to/your/platypush/config:/etc/platypush \ -v /path/to/your/platypush/config:/etc/platypush \
-v /path/to/your/platypush/share:/var/lib/platypush \ -v /path/to/your/platypush/share:/var/lib/platypush \
quay.io/platypush/platypush quay.io/platypush/platypush
``` ```
The following architectures are currently supported:
- `amd64`/`x86_64` (standard Intel-based architectures)
- `arm64`/`aarch64` (ARM64, such as modern ARM-based MacBooks, most of the
Android devices or RaspberryPi 4 and 5)
- `armv7l` (older ARM-based devices, such as RaspberryPi 2 and 3 or older
Android devices)
The Web service will be available on `http://localhost:8008`, and a default The Web service will be available on `http://localhost:8008`, and a default
configuration file will be initialized under configuration file will be initialized under
`/path/to/your/platypush/config/config.yaml` if not available. The next `/path/to/your/platypush/config/config.yaml` if not available. The next

View file

@ -21,7 +21,7 @@ from .utils import run
# see https://git.platypush.tech/platypush/platypush/issues/399 # see https://git.platypush.tech/platypush/platypush/issues/399
when = hook when = hook
__version__ = '1.3.2' __version__ = '1.3.4'
__author__ = 'Fabio Manganiello <fabio@manganiello.tech>' __author__ = 'Fabio Manganiello <fabio@manganiello.tech>'
__all__ = [ __all__ = [
'Application', 'Application',

View file

@ -107,7 +107,6 @@ def _create_token():
user = None user = None
username = payload.get('username') username = payload.get('username')
password = payload.get('password') password = payload.get('password')
code = payload.get('code')
name = payload.get('name') name = payload.get('name')
expiry_days = payload.get('expiry_days') expiry_days = payload.get('expiry_days')
user_manager = UserManager() user_manager = UserManager()
@ -115,7 +114,7 @@ def _create_token():
# Try and authenticate with the credentials passed in the JSON payload # Try and authenticate with the credentials passed in the JSON payload
if username and password: if username and password:
user = user_manager.authenticate_user(username, password, code=code) user = user_manager.authenticate_user(username, password, skip_2fa=True)
if not isinstance(user, User): if not isinstance(user, User):
return UserAuthStatus.INVALID_CREDENTIALS.to_response() return UserAuthStatus.INVALID_CREDENTIALS.to_response()

View file

@ -31,6 +31,7 @@ class StreamingRoute(RequestHandler, PubSubMixin, ABC):
auth_status = get_auth_status(self.request) auth_status = get_auth_status(self.request)
if auth_status != UserAuthStatus.OK: if auth_status != UserAuthStatus.OK:
self.send_error(auth_status.value.code, error=auth_status.value.message) self.send_error(auth_status.value.code, error=auth_status.value.message)
self.finish()
return return
self.logger.info( self.logger.info(

View file

@ -27,7 +27,7 @@ class WSRoute(WebSocketHandler, Thread, PubSubMixin, ABC):
auth_status = get_auth_status(self.request) auth_status = get_auth_status(self.request)
if auth_status != UserAuthStatus.OK: if auth_status != UserAuthStatus.OK:
self.close(code=1008, reason=auth_status.value.message) # Policy Violation self.close(code=1008, reason=auth_status.value.message) # Policy Violation
return raise ValueError(f'Unauthorized connection: {auth_status.value.message}')
logger.info( logger.info(
'Client %s connected to %s', self.request.remote_ip, self.request.path 'Client %s connected to %s', self.request.remote_ip, self.request.path

View file

@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/fonts/poppins.css"><title>platypush</title><script defer="defer" src="/static/js/chunk-vendors.c55c495e.js"></script><script defer="defer" src="/static/js/app.61d039e6.js"></script><link href="/static/css/chunk-vendors.d510eff2.css" rel="stylesheet"><link href="/static/css/app.70fb1f4a.css" rel="stylesheet"><link rel="icon" type="image/svg+xml" href="/img/icons/favicon.svg"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#ffffff"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="Platypush"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#ffffff"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but platypush doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html> <!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/fonts/poppins.css"><title>platypush</title><script defer="defer" src="/static/js/chunk-vendors.c55c495e.js"></script><script defer="defer" src="/static/js/app.4c67dc8c.js"></script><link href="/static/css/chunk-vendors.d510eff2.css" rel="stylesheet"><link href="/static/css/app.70fb1f4a.css" rel="stylesheet"><link rel="icon" type="image/svg+xml" href="/img/icons/favicon.svg"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#ffffff"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="Platypush"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#ffffff"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but platypush doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[7896],{7896:function(e,n,i){"use strict";i.r(n),i.d(n,{default:function(){return I}});var t=i(641);const d={class:"plugin"};function o(e,n,i,o,a,r){const s=(0,t.g2)("Loading");return(0,t.uX)(),(0,t.CE)("div",d,[a.loading?((0,t.uX)(),(0,t.Wv)(s,{key:0})):a.component?((0,t.uX)(),(0,t.Wv)((0,t.$y)(a.component),{key:1,config:a.config},null,8,["config"])):(0,t.Q3)("",!0)])}var a=i(2002),r=i(9828),s=i(953),c={name:"Plugin",components:{Loading:r.A},mixins:[a.A],props:{pluginName:{type:String,required:!0}},data(){return{loading:!1,component:null,config:{}}},computed:{componentName(){return this.pluginName.split(".").map((e=>e[0].toUpperCase()+e.slice(1))).join("")}},methods:{refresh:async function(){this.loading=!0;try{this.component=(0,s.IJ)((0,t.$V)((()=>i(7672)(`./${this.componentName}/Index`)))),this.$options.components[this.componentName]=this.component,this.config=(await this.request("config.get_plugins"))?.[this.pluginName]||{}}finally{this.loading=!1}}},mounted:function(){this.refresh()}},u=i(6262);const x=(0,u.A)(c,[["render",o],["__scopeId","data-v-69b17daa"]]);var I=x},7672:function(e,n,i){var t={"./Alarm/Index":[8597,9769,5184,3841,1146,1861,3162,9878,4280,1367,2561,2716,648,572,6027,5928,7329,7594,343,3045,6360],"./Camera/Index":[9284,6903],"./CameraAndroidIpcam/Index":[2981,2981],"./CameraCv/Index":[2908,6903,2908],"./CameraFfmpeg/Index":[6973,6903,6973],"./CameraGstreamer/Index":[5783,6903,5783],"./CameraIrMlx90640/Index":[8636,6903,8636],"./CameraPi/Index":[3671,6903,3671],"./CameraPiLegacy/Index":[8357,6903,8357],"./Entities/Index":[1131,3841,1146,1861,5799,2486,343,1131,2256],"./Execute/Index":[8567,1146,9878,2561,5928,1381],"./Extensions/Index":[2720,1146,9878,2561,572,6027,6592,2720,6730],"./File/Index":[2061,1146,1861,3162,9878,1367,2716,648,1562],"./Light/Index":[6298,9769,5184,6298],"./LightHue/Index":[9318,9769,5184,6298,9318],"./Media/Index":[4277,5184,1146,1861,3162,9878,4280,1367,2716,648,6157,4787,3149,6777,4277],"./Media/Providers/Jellyfin/views/Media/Index":[6975,3841,1146,1861,3162,4280,2353,3149,1433,7619,1616],"./Media/Providers/Jellyfin/views/Movies/Index":[2436,3841,1146,1861,3162,4280,3149,1008,6556,4267],"./Media/Providers/Jellyfin/views/Music/Index":[1433,3841,1146,1861,3162,4280,2353,3149,1433,28],"./Media/Providers/YouTube/Index":[9476,9476],"./MediaChromecast/Index":[1684,5184,1146,1861,3162,9878,4280,1367,2716,648,6157,4787,3149,6777,4277,1684],"./MediaGstreamer/Index":[9145,5184,1146,1861,3162,9878,4280,1367,2716,648,6157,4787,3149,6777,4277,9145],"./MediaMplayer/Index":[7839,5184,1146,1861,3162,9878,4280,1367,2716,648,6157,4787,3149,6777,4277,7839],"./MediaMpv/Index":[9388,5184,1146,1861,3162,9878,4280,1367,2716,648,6157,4787,3149,6777,4277,9388],"./MediaVlc/Index":[6372,5184,1146,1861,3162,9878,4280,1367,2716,648,6157,4787,3149,6777,4277,6372],"./Music/Index":[4834,5184,1146,1861,6157,4787,4834],"./MusicMopidy/Index":[7533,5184,1146,1861,6157,4787,4834,7533],"./MusicMpd/Index":[560,5184,1146,1861,6157,4787,4834,560],"./MusicSnapcast/Index":[6564,9769,5184,6564],"./MusicSpotify/Index":[7299,5184,1146,1861,6157,4787,4834,7299],"./Procedures/Index":[9636,3841,1146,3162,9878,4280,1367,2561,572,6027,5928,7329,6923,343,9636],"./Rtorrent/Index":[8499,1146,1861,6777,9142,8499],"./Settings/Index":[4050,9769,3841,1146,1861,3162,2561,806,6592,4050],"./Settings/Tokens/Index":[806,3841,1146,1861,2561,806],"./Sound/Index":[7158,7158],"./Torrent/Index":[7098,1146,1861,6777,9142,7098],"./Tts/Index":[2392,8946,2392],"./TtsGoogle/Index":[1526,8946,1526],"./TtsPicovoice/Index":[8191,8946,8191],"./TvSamsungWs/Index":[4387,4387],"./ZigbeeMqtt/Index":[7630,9769,5184,1146,1861,7630],"./Zwave/Index":[9313,9769,5184,1146,1861,3290,9313],"./ZwaveMqtt/Index":[5145,9769,5184,1146,1861,3290,5145]};function d(e){if(!i.o(t,e))return Promise.resolve().then((function(){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}));var n=t[e],d=n[0];return Promise.all(n.slice(1).map(i.e)).then((function(){return i(d)}))}d.keys=function(){return Object.keys(t)},d.id=7672,e.exports=d}}]);
//# sourceMappingURL=7896.8f57ebbc.js.map

File diff suppressed because one or more lines are too long

View file

@ -1,2 +0,0 @@
(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[7896],{7896:function(e,n,i){"use strict";i.r(n),i.d(n,{default:function(){return I}});var t=i(641);const d={class:"plugin"};function o(e,n,i,o,a,r){const s=(0,t.g2)("Loading");return(0,t.uX)(),(0,t.CE)("div",d,[a.loading?((0,t.uX)(),(0,t.Wv)(s,{key:0})):a.component?((0,t.uX)(),(0,t.Wv)((0,t.$y)(a.component),{key:1,config:a.config},null,8,["config"])):(0,t.Q3)("",!0)])}var a=i(2002),r=i(9828),s=i(953),c={name:"Plugin",components:{Loading:r.A},mixins:[a.A],props:{pluginName:{type:String,required:!0}},data(){return{loading:!1,component:null,config:{}}},computed:{componentName(){return this.pluginName.split(".").map((e=>e[0].toUpperCase()+e.slice(1))).join("")}},methods:{refresh:async function(){this.loading=!0;try{this.component=(0,s.IJ)((0,t.$V)((()=>i(7672)(`./${this.componentName}/Index`)))),this.$options.components[this.componentName]=this.component,this.config=(await this.request("config.get_plugins"))?.[this.pluginName]||{}}finally{this.loading=!1}}},mounted:function(){this.refresh()}},u=i(6262);const x=(0,u.A)(c,[["render",o],["__scopeId","data-v-69b17daa"]]);var I=x},7672:function(e,n,i){var t={"./Alarm/Index":[8597,9769,5184,3841,1146,1861,3162,9878,4280,933,2561,2716,648,572,6027,5928,7329,7594,343,3045,6360],"./Camera/Index":[9284,6903],"./CameraAndroidIpcam/Index":[2981,2981],"./CameraCv/Index":[2908,6903,2908],"./CameraFfmpeg/Index":[6973,6903,6973],"./CameraGstreamer/Index":[5783,6903,5783],"./CameraIrMlx90640/Index":[8636,6903,8636],"./CameraPi/Index":[3671,6903,3671],"./CameraPiLegacy/Index":[8357,6903,8357],"./Entities/Index":[1131,3841,1146,1861,5799,2486,343,1131,2256],"./Execute/Index":[8567,1146,9878,2561,5928,1381],"./Extensions/Index":[7908,1146,9878,2561,572,6027,6592,7908,6730],"./File/Index":[2061,1146,1861,3162,9878,933,2716,648,1562],"./Light/Index":[6298,9769,5184,6298],"./LightHue/Index":[9318,9769,5184,6298,9318],"./Media/Index":[4277,5184,1146,1861,3162,9878,4280,933,2716,648,6157,4787,3149,6777,4277],"./Media/Providers/Jellyfin/views/Media/Index":[6975,3841,1146,1861,3162,4280,2353,3149,1433,7619,1616],"./Media/Providers/Jellyfin/views/Movies/Index":[2436,3841,1146,1861,3162,4280,3149,1008,6556,4267],"./Media/Providers/Jellyfin/views/Music/Index":[1433,3841,1146,1861,3162,4280,2353,3149,1433,28],"./Media/Providers/YouTube/Index":[9476,9476],"./MediaChromecast/Index":[1684,5184,1146,1861,3162,9878,4280,933,2716,648,6157,4787,3149,6777,4277,1684],"./MediaGstreamer/Index":[9145,5184,1146,1861,3162,9878,4280,933,2716,648,6157,4787,3149,6777,4277,9145],"./MediaMplayer/Index":[7839,5184,1146,1861,3162,9878,4280,933,2716,648,6157,4787,3149,6777,4277,7839],"./MediaMpv/Index":[9388,5184,1146,1861,3162,9878,4280,933,2716,648,6157,4787,3149,6777,4277,9388],"./MediaVlc/Index":[6372,5184,1146,1861,3162,9878,4280,933,2716,648,6157,4787,3149,6777,4277,6372],"./Music/Index":[4834,5184,1146,1861,6157,4787,4834],"./MusicMopidy/Index":[7533,5184,1146,1861,6157,4787,4834,7533],"./MusicMpd/Index":[560,5184,1146,1861,6157,4787,4834,560],"./MusicSnapcast/Index":[6564,9769,5184,6564],"./MusicSpotify/Index":[7299,5184,1146,1861,6157,4787,4834,7299],"./Procedures/Index":[9636,3841,1146,3162,9878,4280,933,2561,572,6027,5928,7329,6923,343,9636],"./Rtorrent/Index":[8499,1146,1861,6777,9142,8499],"./Settings/Index":[4050,9769,3841,1146,1861,3162,2561,806,6592,4050],"./Settings/Tokens/Index":[806,3841,1146,1861,2561,806],"./Sound/Index":[7158,7158],"./Torrent/Index":[7098,1146,1861,6777,9142,7098],"./Tts/Index":[2392,8946,2392],"./TtsGoogle/Index":[1526,8946,1526],"./TtsPicovoice/Index":[8191,8946,8191],"./TvSamsungWs/Index":[4387,4387],"./ZigbeeMqtt/Index":[7630,9769,5184,1146,1861,7630],"./Zwave/Index":[9313,9769,5184,1146,1861,3290,9313],"./ZwaveMqtt/Index":[5145,9769,5184,1146,1861,3290,5145]};function d(e){if(!i.o(t,e))return Promise.resolve().then((function(){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}));var n=t[e],d=n[0];return Promise.all(n.slice(1).map(i.e)).then((function(){return i(d)}))}d.keys=function(){return Object.keys(t)},d.id=7672,e.exports=d}}]);
//# sourceMappingURL=7896.b116b065.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -9,8 +9,8 @@
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^6.6.0", "@fortawesome/fontawesome-free": "^6.6.0",
"axios": "^1.7.4", "axios": "^1.7.7",
"core-js": "^3.37.1", "core-js": "^3.38.1",
"cronstrue": "^2.50.0", "cronstrue": "^2.50.0",
"highlight.js": "^11.10.0", "highlight.js": "^11.10.0",
"lato-font": "^3.0.0", "lato-font": "^3.0.0",
@ -18,8 +18,8 @@
"register-service-worker": "^1.7.2", "register-service-worker": "^1.7.2",
"sass": "^1.77.6", "sass": "^1.77.6",
"sass-loader": "^10.5.2", "sass-loader": "^10.5.2",
"vue": "^3.4.31", "vue": "^3.5.12",
"vue-router": "^4.4.0", "vue-router": "^4.4.5",
"vue-skycons": "^4.3.4", "vue-skycons": "^4.3.4",
"w3css": "^2.7.0" "w3css": "^2.7.0"
}, },
@ -423,19 +423,19 @@
} }
}, },
"node_modules/@babel/helper-string-parser": { "node_modules/@babel/helper-string-parser": {
"version": "7.22.5", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
"integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"dev": true, "license": "MIT",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-validator-identifier": { "node_modules/@babel/helper-validator-identifier": {
"version": "7.22.20", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"dev": true, "license": "MIT",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
@ -492,10 +492,13 @@
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.24.7", "version": "7.26.2",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
"integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
"license": "MIT", "license": "MIT",
"dependencies": {
"@babel/types": "^7.26.0"
},
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
}, },
@ -1819,14 +1822,13 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.23.0", "version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
"integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
"dev": true, "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-string-parser": "^7.22.5", "@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.22.20", "@babel/helper-validator-identifier": "^7.25.9"
"to-fast-properties": "^2.0.0"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@ -1971,9 +1973,10 @@
} }
}, },
"node_modules/@jridgewell/sourcemap-codec": { "node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.15", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"license": "MIT"
}, },
"node_modules/@jridgewell/trace-mapping": { "node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25", "version": "0.3.25",
@ -3068,13 +3071,13 @@
"dev": true "dev": true
}, },
"node_modules/@vue/compiler-core": { "node_modules/@vue/compiler-core": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz",
"integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/parser": "^7.24.7", "@babel/parser": "^7.25.3",
"@vue/shared": "3.4.31", "@vue/shared": "3.5.12",
"entities": "^4.5.0", "entities": "^4.5.0",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"source-map-js": "^1.2.0" "source-map-js": "^1.2.0"
@ -3093,40 +3096,40 @@
} }
}, },
"node_modules/@vue/compiler-dom": { "node_modules/@vue/compiler-dom": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz",
"integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/compiler-core": "3.4.31", "@vue/compiler-core": "3.5.12",
"@vue/shared": "3.4.31" "@vue/shared": "3.5.12"
} }
}, },
"node_modules/@vue/compiler-sfc": { "node_modules/@vue/compiler-sfc": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz",
"integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/parser": "^7.24.7", "@babel/parser": "^7.25.3",
"@vue/compiler-core": "3.4.31", "@vue/compiler-core": "3.5.12",
"@vue/compiler-dom": "3.4.31", "@vue/compiler-dom": "3.5.12",
"@vue/compiler-ssr": "3.4.31", "@vue/compiler-ssr": "3.5.12",
"@vue/shared": "3.4.31", "@vue/shared": "3.5.12",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"magic-string": "^0.30.10", "magic-string": "^0.30.11",
"postcss": "^8.4.38", "postcss": "^8.4.47",
"source-map-js": "^1.2.0" "source-map-js": "^1.2.0"
} }
}, },
"node_modules/@vue/compiler-ssr": { "node_modules/@vue/compiler-ssr": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz",
"integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/compiler-dom": "3.4.31", "@vue/compiler-dom": "3.5.12",
"@vue/shared": "3.4.31" "@vue/shared": "3.5.12"
} }
}, },
"node_modules/@vue/component-compiler-utils": { "node_modules/@vue/component-compiler-utils": {
@ -3194,58 +3197,59 @@
"dev": true "dev": true
}, },
"node_modules/@vue/devtools-api": { "node_modules/@vue/devtools-api": {
"version": "6.6.1", "version": "6.6.4",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
}, },
"node_modules/@vue/reactivity": { "node_modules/@vue/reactivity": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz",
"integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/shared": "3.4.31" "@vue/shared": "3.5.12"
} }
}, },
"node_modules/@vue/runtime-core": { "node_modules/@vue/runtime-core": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz",
"integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/reactivity": "3.4.31", "@vue/reactivity": "3.5.12",
"@vue/shared": "3.4.31" "@vue/shared": "3.5.12"
} }
}, },
"node_modules/@vue/runtime-dom": { "node_modules/@vue/runtime-dom": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz",
"integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/reactivity": "3.4.31", "@vue/reactivity": "3.5.12",
"@vue/runtime-core": "3.4.31", "@vue/runtime-core": "3.5.12",
"@vue/shared": "3.4.31", "@vue/shared": "3.5.12",
"csstype": "^3.1.3" "csstype": "^3.1.3"
} }
}, },
"node_modules/@vue/server-renderer": { "node_modules/@vue/server-renderer": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz",
"integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/compiler-ssr": "3.4.31", "@vue/compiler-ssr": "3.5.12",
"@vue/shared": "3.4.31" "@vue/shared": "3.5.12"
}, },
"peerDependencies": { "peerDependencies": {
"vue": "3.4.31" "vue": "3.5.12"
} }
}, },
"node_modules/@vue/shared": { "node_modules/@vue/shared": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
"integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==", "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@vue/vue-loader-v15": { "node_modules/@vue/vue-loader-v15": {
@ -3772,9 +3776,9 @@
} }
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.7.4", "version": "1.7.7",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
"integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.6",
@ -4662,9 +4666,9 @@
} }
}, },
"node_modules/core-js": { "node_modules/core-js": {
"version": "3.37.1", "version": "3.38.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz",
"integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"funding": { "funding": {
@ -8445,12 +8449,12 @@
} }
}, },
"node_modules/magic-string": { "node_modules/magic-string": {
"version": "0.30.10", "version": "0.30.12",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
"integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15" "@jridgewell/sourcemap-codec": "^1.5.0"
} }
}, },
"node_modules/make-dir": { "node_modules/make-dir": {
@ -9360,9 +9364,10 @@
} }
}, },
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.0.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
}, },
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.1",
@ -9411,9 +9416,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.4.38", "version": "8.4.48",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.48.tgz",
"integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "integrity": "sha512-GCRK8F6+Dl7xYniR5a4FYbpBzU8XnZVeowqsQFYdcXuSbChgiks7qybSkbvnaeqv0G0B+dd9/jJgH8kkLDQeEA==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -9428,10 +9433,11 @@
"url": "https://github.com/sponsors/ai" "url": "https://github.com/sponsors/ai"
} }
], ],
"license": "MIT",
"dependencies": { "dependencies": {
"nanoid": "^3.3.7", "nanoid": "^3.3.7",
"picocolors": "^1.0.0", "picocolors": "^1.1.1",
"source-map-js": "^1.2.0" "source-map-js": "^1.2.1"
}, },
"engines": { "engines": {
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
@ -11127,9 +11133,10 @@
} }
}, },
"node_modules/source-map-js": { "node_modules/source-map-js": {
"version": "1.2.0", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@ -11746,15 +11753,6 @@
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
"dev": true "dev": true
}, },
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/to-regex-range": { "node_modules/to-regex-range": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@ -12083,16 +12081,16 @@
} }
}, },
"node_modules/vue": { "node_modules/vue": {
"version": "3.4.31", "version": "3.5.12",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz",
"integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/compiler-dom": "3.4.31", "@vue/compiler-dom": "3.5.12",
"@vue/compiler-sfc": "3.4.31", "@vue/compiler-sfc": "3.5.12",
"@vue/runtime-dom": "3.4.31", "@vue/runtime-dom": "3.5.12",
"@vue/server-renderer": "3.4.31", "@vue/server-renderer": "3.5.12",
"@vue/shared": "3.4.31" "@vue/shared": "3.5.12"
}, },
"peerDependencies": { "peerDependencies": {
"typescript": "*" "typescript": "*"
@ -12313,12 +12311,12 @@
} }
}, },
"node_modules/vue-router": { "node_modules/vue-router": {
"version": "4.4.0", "version": "4.4.5",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.0.tgz", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz",
"integrity": "sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==", "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/devtools-api": "^6.5.1" "@vue/devtools-api": "^6.6.4"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/posva" "url": "https://github.com/sponsors/posva"

View file

@ -9,8 +9,8 @@
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^6.6.0", "@fortawesome/fontawesome-free": "^6.6.0",
"axios": "^1.7.4", "axios": "^1.7.7",
"core-js": "^3.37.1", "core-js": "^3.38.1",
"cronstrue": "^2.50.0", "cronstrue": "^2.50.0",
"highlight.js": "^11.10.0", "highlight.js": "^11.10.0",
"lato-font": "^3.0.0", "lato-font": "^3.0.0",
@ -18,8 +18,8 @@
"register-service-worker": "^1.7.2", "register-service-worker": "^1.7.2",
"sass": "^1.77.6", "sass": "^1.77.6",
"sass-loader": "^10.5.2", "sass-loader": "^10.5.2",
"vue": "^3.4.31", "vue": "^3.5.12",
"vue-router": "^4.4.0", "vue-router": "^4.4.5",
"vue-skycons": "^4.3.4", "vue-skycons": "^4.3.4",
"w3css": "^2.7.0" "w3css": "^2.7.0"
}, },

View file

@ -33,7 +33,7 @@
<script> <script>
import axios from 'axios'; import axios from 'axios';
import hljs from 'highlight.js'; import hljs from 'highlight.js';
import 'highlight.js/styles/intellij-light.css'; import 'highlight.js/styles/night-owl.min.css'
import FloatingButton from "@/components/elements/FloatingButton"; import FloatingButton from "@/components/elements/FloatingButton";
import Highlighter from "./Highlighter"; import Highlighter from "./Highlighter";
@ -51,7 +51,16 @@ export default {
props: { props: {
file: { file: {
type: String, type: String,
required: true, },
text: {
type: String,
default: '',
},
contentType: {
type: String,
default: 'plaintext',
}, },
isNew: { isNew: {
@ -114,41 +123,43 @@ export default {
methods: { methods: {
async loadFile() { async loadFile() {
this.setUrlArgs({file: this.file}) if (!this.text?.length) {
if (this.isNew) { this.setUrlArgs({file: this.file})
this.content = '' if (this.isNew) {
this.initialContentHash = 0 this.content = ''
this.highlightedContent = '' this.initialContentHash = 0
this.info = {} this.highlightedContent = ''
this.type = this.getLanguageType({path: this.file}) this.info = {}
return this.type = this.getLanguageType({path: this.file})
} return
this.loading = true
try {
this.info = (
await this.request('file.info', {files: [this.file]})
)[this.file] || {}
this.type = this.getLanguageType(this.info)
this.content = (
await axios.get(`/file?path=${encodeURIComponent(this.file)}`)
).data
if (typeof this.content === 'object') {
this.content = JSON.stringify(this.content, null, 2)
} }
this.initialContentHash = this.content.hashCode() this.loading = true
} catch (e) {
this.notify({ try {
error: true, this.info = (
text: e.message, await this.request('file.info', {files: [this.file]})
title: 'Failed to load file', )[this.file] || {}
})
} finally { this.type = this.getLanguageType(this.info)
this.loading = false this.content = (
await axios.get(`/file?path=${encodeURIComponent(this.file)}`)
).data
if (typeof this.content === 'object') {
this.content = JSON.stringify(this.content, null, 2)
}
this.initialContentHash = this.content.hashCode()
} catch (e) {
this.notify({
error: true,
text: e.message,
title: 'Failed to load file',
})
} finally {
this.loading = false
}
} }
if (this.selectedLine) { if (this.selectedLine) {
@ -270,6 +281,11 @@ export default {
window.removeEventListener('beforeunload', this.beforeUnload) window.removeEventListener('beforeunload', this.beforeUnload)
}, },
convertType(type) {
const parts = type.split('/')
return parts[parts.length - 1]
},
reset() { reset() {
this.setUrlArgs({file: null, line: null}) this.setUrlArgs({file: null, line: null})
this.removeBeforeUnload() this.removeBeforeUnload()
@ -278,6 +294,14 @@ export default {
}, },
watch: { watch: {
contentType() {
if (!this.contentType?.length) {
return
}
this.type = this.convertType(this.contentType)
},
file() { file() {
this.loadFile() this.loadFile()
}, },
@ -323,6 +347,10 @@ export default {
this.$refs.selectedLine.style.top = `${offset}px` this.$refs.selectedLine.style.top = `${offset}px`
}) })
}, },
text() {
this.content = this.text
},
}, },
mounted() { mounted() {
@ -334,6 +362,8 @@ export default {
} }
} }
this.content = this.text
this.type = this.convertType(this.contentType)
this.loadFile() this.loadFile()
this.addBeforeUnload() this.addBeforeUnload()
this.addKeyListener() this.addKeyListener()
@ -354,6 +384,11 @@ export default {
$line-numbers-width: 2.5em; $line-numbers-width: 2.5em;
.file-editor { .file-editor {
--body-bg: #080808;
--body-fg: #f8f8f2;
--line-numbers-bg: #282a36;
--line-numbers-fg: #6272a4;
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex; display: flex;
@ -366,6 +401,8 @@ $line-numbers-width: 2.5em;
position: relative; position: relative;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background: var(--body-bg);
color: var(--body-fg);
} }
.editor-highlight-loading { .editor-highlight-loading {
@ -412,6 +449,8 @@ $line-numbers-width: 2.5em;
align-items: flex-end; align-items: flex-end;
overflow: hidden; overflow: hidden;
z-index: 2; z-index: 2;
background: var(--line-numbers-bg);
color: var(--line-numbers-fg);
.line-number { .line-number {
width: 100%; width: 100%;
@ -444,7 +483,7 @@ $line-numbers-width: 2.5em;
overflow-x: scroll; overflow-x: scroll;
z-index: 2; z-index: 2;
color: rgba(0, 0, 0, 0); color: rgba(0, 0, 0, 0);
caret-color: black; caret-color: var(--body-fg);
border: none; border: none;
outline: none; outline: none;
} }

View file

@ -9,6 +9,9 @@
:file="file" :file="file"
:is-new="isNew" :is-new="isNew"
:line="line" :line="line"
:text="text"
:content-type="contentType"
:with-save="withSave"
@save="$emit('save', $event)" @save="$emit('save', $event)"
v-if="file" /> v-if="file" />
</div> </div>
@ -41,7 +44,16 @@ export default {
props: { props: {
file: { file: {
type: String, type: String,
required: true, },
text: {
type: String,
default: '',
},
contentType: {
type: String,
default: 'text/plain',
}, },
isNew: { isNew: {

Binary file not shown.

View file

@ -18,7 +18,7 @@ RUN --mount=type=bind,source=.,target=/curdir \
RUN /install/platypush/install/scripts/alpine/install.sh && \ RUN /install/platypush/install/scripts/alpine/install.sh && \
cd /install && \ cd /install && \
pip install -U --no-input --no-cache-dir --no-deps --ignore-installed --break-system-packages . croniter && \ pip install -U --no-input --no-cache-dir --no-deps --ignore-installed --break-system-packages . croniter marshmallow && \
rm -rf /install && \ rm -rf /install && \
rm -rf /root/.cache && \ rm -rf /root/.cache && \
apk del gcc git && \ apk del gcc git && \

View file

@ -6,7 +6,6 @@ py3-docutils
py3-flask py3-flask
py3-greenlet py3-greenlet
py3-magic py3-magic
py3-marshmallow
py3-mypy-extensions py3-mypy-extensions
py3-otp py3-otp
py3-psutil py3-psutil
@ -16,11 +15,13 @@ py3-qrcode
py3-redis py3-redis
py3-requests py3-requests
py3-rsa py3-rsa
py3-simplejson
py3-sqlalchemy py3-sqlalchemy
py3-tornado py3-tornado
py3-tz py3-tz
py3-websocket-client py3-websocket-client
py3-websockets py3-websockets
py3-wheel
py3-yaml py3-yaml
py3-zeroconf py3-zeroconf
redis redis

View file

@ -1 +1 @@
apk add --update --no-interactive --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/ apk add --update --no-interactive --no-cache

View file

@ -70,8 +70,13 @@ class IRCBot(irc.bot.SingleServerIRCBot):
dcc_max_connections: Optional[int] = None, dcc_max_connections: Optional[int] = None,
): ):
connection_factory = ConnectionFactory() connection_factory = ConnectionFactory()
self._ssl_ctx = None
if ssl: if ssl:
connection_factory.wrapper = _ssl.wrap_socket self._ssl_ctx = _ssl.create_default_context()
# Temporary workaround for check_hostname issues on Python >= 3.12
self._ssl_ctx.check_hostname = False
connection_factory.wrapper = self._ssl_ctx.wrap_socket
if ipv6: if ipv6:
connection_factory.family = socket.AF_INET6 connection_factory.family = socket.AF_INET6
@ -86,7 +91,7 @@ class IRCBot(irc.bot.SingleServerIRCBot):
self.port = port self.port = port
self.alias = alias self.alias = alias
self._password = password self._password = password
self.channels.update({channel: None for channel in channels}) self.channels.update(dict.fromkeys(channels))
self._stop_message = stop_message self._stop_message = stop_message
self.dcc_ip_whitelist = set(dcc_ip_whitelist or []) self.dcc_ip_whitelist = set(dcc_ip_whitelist or [])
self.dcc_ip_blacklist = set(dcc_ip_blacklist or []) self.dcc_ip_blacklist = set(dcc_ip_blacklist or [])
@ -455,7 +460,7 @@ class IRCBot(irc.bot.SingleServerIRCBot):
def on_disconnect(self, connection: Connection, event: _IRCEvent): def on_disconnect(self, connection: Connection, event: _IRCEvent):
self._post_event(connection, IRCDisconnectEvent) self._post_event(connection, IRCDisconnectEvent)
# Cache channels for reconnect logic # Cache channels for reconnect logic
channels = {ch: None for ch in self.channels.keys()} channels = dict.fromkeys(self.channels)
super()._on_disconnect(connection, event) super()._on_disconnect(connection, event)
self.channels.update(channels) self.channels.update(channels)

View file

@ -1,7 +1,7 @@
[project] [project]
name = "platypush" name = "platypush"
description = "A general-purpose framework for automation" description = "A general-purpose framework for automation"
dynamic = ["version", "dependencies", "optional-dependencies"] dynamic = ["version", "dependencies", "optional-dependencies", "entry-points"]
authors = [ authors = [
{name = "Fabio Manganiello", email = "fabio@manganiello.tech"}, {name = "Fabio Manganiello", email = "fabio@manganiello.tech"},
] ]
@ -19,7 +19,7 @@ keywords = [
] ]
[tool.setuptools.dynamic] [tool.setuptools.dynamic]
version = {attr = "version.__version__"} version = {attr = "platypush.__version__"}
dependencies = {file = "requirements.txt"} dependencies = {file = "requirements.txt"}
[project.urls] [project.urls]
@ -50,7 +50,7 @@ include = [
] ]
[tool.bumpversion] [tool.bumpversion]
current_version = "1.3.2" current_version = "1.3.4"
commit = true commit = true
tag = true tag = true

View file

@ -1 +1 @@
__version__ = "1.3.2" __version__ = "1.3.4"