From 1a0a2401763b4e0f849cccd5c273651c64c906c5 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Mon, 19 Dec 2022 02:05:12 +0100 Subject: [PATCH 01/28] Updated dependencies --- go.mod | 45 +++++++++++++++++++---------------- go.sum | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 2104c90..9310f0b 100644 --- a/go.mod +++ b/go.mod @@ -2,37 +2,42 @@ module github.com/gotest go 1.19 +require ( + github.com/appleboy/gin-jwt/v2 v2.9.1 + github.com/gin-gonic/gin v1.8.1 + github.com/joho/godotenv v1.4.0 + go.mongodb.org/mongo-driver v1.11.1 +) + require ( github.com/gin-contrib/sse v0.1.0 // indirect - github.com/gin-gonic/gin v1.8.1 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-playground/validator/v10 v10.10.0 // indirect + github.com/go-playground/validator/v10 v10.11.1 // indirect github.com/go-sql-driver/mysql v1.6.0 // indirect - github.com/goccy/go-json v0.9.7 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/joho/godotenv v1.4.0 // indirect + github.com/goccy/go-json v0.10.0 // indirect + github.com/golang-jwt/jwt/v4 v4.4.3 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.13.6 // indirect + github.com/klauspost/compress v1.15.13 // indirect github.com/leodido/go-urn v1.2.1 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect github.com/mattn/go-sqlite3 v1.14.15 // indirect - github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect - github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/montanaflynn/stats v0.6.6 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/ugorji/go/codec v1.2.7 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.1 // indirect - github.com/xdg-go/stringprep v1.0.3 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.mongodb.org/mongo-driver v1.10.3 // indirect - golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect - golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect - golang.org/x/text v0.3.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect + golang.org/x/crypto v0.4.0 // indirect + golang.org/x/net v0.4.0 // indirect + golang.org/x/sync v0.1.0 // indirect + golang.org/x/sys v0.3.0 // indirect + golang.org/x/text v0.5.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 9f4ede7..fe94b9d 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,6 @@ +github.com/appleboy/gin-jwt/v2 v2.9.1 h1:l29et8iLW6omcHltsOP6LLk4s3v4g2FbFs0koxGWVZs= +github.com/appleboy/gin-jwt/v2 v2.9.1/go.mod h1:jwcPZJ92uoC9nOUTOKWoN/f6JZOgMSKlFSHw5/FrRUk= +github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -12,13 +15,21 @@ github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/j github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= +github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -28,6 +39,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.13 h1:NFn1Wr8cfnenSJSA46lLq4wHCcBzKTSjnBIexDMMOV0= +github.com/klauspost/compress v1.15.13/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -38,16 +51,24 @@ github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -55,11 +76,19 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= @@ -67,39 +96,84 @@ github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.10.3 h1:XDQEvmh6z1EUsXuIkXE9TaVeqHw6SwS1uf93jFs0HBA= go.mongodb.org/mongo-driver v1.10.3/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8= +go.mongodb.org/mongo-driver v1.11.1 h1:QP0znIRTuL0jf1oBQoAoM0C6ZJfBK4kx0Uumtv1A7w8= +go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 h1:siQdpVirKtzPhKl3lZWozZraCFObP8S1v6PRp0bLrtU= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 511ace07d63ea97126fcde7dc4caef6132743977 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Mon, 19 Dec 2022 02:05:28 +0100 Subject: [PATCH 02/28] Added JWT_SECRET into .env vars --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index aecda18..c282474 100644 --- a/README.md +++ b/README.md @@ -14,5 +14,6 @@ TODO - ./env - API_PORT - FRONT_PORT + - JWT_SECRET ## Demo TODO \ No newline at end of file From f13f4b3c2007c5dd670ac95b89bde389478b760f Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Mon, 19 Dec 2022 02:05:56 +0100 Subject: [PATCH 03/28] Renamed some variables to match Go name convention --- internal/articles.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/internal/articles.go b/internal/articles.go index fd0f957..2841c2d 100644 --- a/internal/articles.go +++ b/internal/articles.go @@ -9,21 +9,21 @@ import ( ) type Article struct { - Id_name string `json:"id_name" bson:"id_name"` + IdName string `json:"id_name" bson:"id_name"` Date int64 `json:"date" bson:"date"` Content interface{} `json:"content" bson:"content"` } type DelArticle struct { - Id_name string `json:"id_name" bson:"id_name"` + IdName string `json:"id_name" bson:"id_name"` } -var ARTICLES_LOCATION = Location{Database: "gohcms", Collection: "articles"} +var articlesLocation = Location{Database: "gohcms", Collection: "articles"} -// TODO Change to GetArticleList that will find filter json context func GetAllArticles(c *gin.Context) { + // TODO Change to GetArticleList that will find filter json context var articles []Article - documents, err := getDocuments(ARTICLES_LOCATION, bson.D{}) + documents, err := getDocuments(articlesLocation, bson.D{}) if err != nil { SendBadRequest(c, err.Error()) return @@ -40,7 +40,7 @@ func GetAllArticles(c *gin.Context) { func GetArticle(c *gin.Context) { articleID := c.Params.ByName("id") - articles, err := getDocuments(ARTICLES_LOCATION, + articles, err := getDocuments(articlesLocation, bson.D{{Key: "id_name", Value: articleID}}) if err != nil { SendBadRequest(c, err.Error()) @@ -56,11 +56,11 @@ func GetArticle(c *gin.Context) { } func IsArticleIdAlreadyUsed(id string) bool { - documents, _ := getDocuments(ARTICLES_LOCATION, bson.D{}) + documents, _ := getDocuments(articlesLocation, bson.D{}) for i := 0; i < len(documents); i++ { var newArticle Article bson.Unmarshal(documents[i], &newArticle) - if newArticle.Id_name == id { + if newArticle.IdName == id { return true } } @@ -69,7 +69,7 @@ func IsArticleIdAlreadyUsed(id string) bool { func AddArticle(c *gin.Context) { var article Article - article.Id_name = c.Params.ByName("id") + article.IdName = c.Params.ByName("id") if c.BindJSON(&article) != nil { SendBadRequest(c, "Could not correctly parse the article.") return @@ -81,12 +81,12 @@ func AddArticle(c *gin.Context) { return } - if IsArticleIdAlreadyUsed(article.Id_name) { + if IsArticleIdAlreadyUsed(article.IdName) { SendBadRequest(c, "Article ID already used.") return } - err = pushDocument(ARTICLES_LOCATION, document) + err = pushDocument(articlesLocation, document) if err != nil { SendBadRequest(c, "Could not insert document into DB.") return @@ -97,7 +97,7 @@ func AddArticle(c *gin.Context) { func DeleteArticle(c *gin.Context) { var delArticle DelArticle - delArticle.Id_name = c.Params.ByName("id") + delArticle.IdName = c.Params.ByName("id") if c.BindJSON(&delArticle) != nil { SendBadRequest(c, "Could not correctly parse the article ID.") return @@ -109,7 +109,7 @@ func DeleteArticle(c *gin.Context) { return } - deleteCount, err := deleteDocument(ARTICLES_LOCATION, document) + deleteCount, err := deleteDocument(articlesLocation, document) if err != nil { SendBadRequest(c, "Could not insert document into DB.") return From 4247066de6881e514ee17d0229b01f987f0a19b4 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Mon, 19 Dec 2022 02:06:07 +0100 Subject: [PATCH 04/28] JWT test implementation --- cmd/main.go | 22 +++++++--- internal/auth.go | 106 ++++++++--------------------------------------- 2 files changed, 34 insertions(+), 94 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 88dae0f..9055f09 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "os" "github.com/gin-gonic/gin" @@ -14,24 +15,33 @@ func initEnvVariables() { } } +func initJWT() { + errInit := internal.AuthMiddleware.MiddlewareInit() + if errInit != nil { + fmt.Printf(errInit.Error()) + } +} + func initGin() { r := gin.Default() r.SetTrustedProxies([]string{"localhost"}) + r.POST("/login", internal.AuthMiddleware.LoginHandler) r.GET("/ping", internal.Ping) - r.GET("/articles/", internal.AuthCheck, internal.GetAllArticles) - r.GET("/articles/:id", internal.AuthCheck, internal.GetArticle) - r.POST("/articles/:id", internal.AuthCheck, internal.AddArticle) - r.DELETE("/articles/:id", internal.AuthCheck, internal.DeleteArticle) + articlesRouter := r.Group("/articles/") + articlesRouter.Use(internal.AuthMiddleware.MiddlewareFunc()) - r.POST("/login", internal.LoginUser) - r.POST("/logout", internal.LogoutUser) + articlesRouter.GET("/", internal.GetAllArticles) + articlesRouter.GET("/:id", internal.GetArticle) + articlesRouter.POST("/:id", internal.AddArticle) + articlesRouter.DELETE("/:id", internal.DeleteArticle) r.Run(":" + os.Getenv("API_PORT")) } func main() { initEnvVariables() + initJWT() initGin() } diff --git a/internal/auth.go b/internal/auth.go index b004b72..eb8178a 100644 --- a/internal/auth.go +++ b/internal/auth.go @@ -1,10 +1,11 @@ package internal import ( - "crypto/sha256" "errors" - "fmt" + "os" + "time" + jwt "github.com/appleboy/gin-jwt/v2" "github.com/gin-gonic/gin" ) @@ -15,90 +16,19 @@ type User struct { var USERS_LOCATION = Location{Database: "gohcms", Collection: "users"} -func getUserHashedPassword(user User) string { - password := sha256.New() - password.Write([]byte(user.Password)) - return fmt.Sprintf("%x", password.Sum(nil)) -} - -func isUserLoggedIn(user User) bool { - for i := 0; i < len(SESSIONS); i++ { - hash1 := fmt.Sprint(SESSIONS[i].Token.Sum(nil)) - hash2 := fmt.Sprint(generateSessionToken(user).Sum(nil)) - if hash1 != hash2 { - continue - } - sessionExpired := isSessionExpired(SESSIONS[i]) - if sessionExpired { - removeSession(user) - } - return !sessionExpired - } - return false -} - -func isUserReal(user User) bool { - docUsers, _ := getDocuments(USERS_LOCATION, user) - return len(docUsers) == 1 -} - -func parseUserFromContext(c *gin.Context) (User, error) { - var user User - if c.BindJSON(&user) != nil { - return User{}, errors.New("could not correctly parse user crendentials") - } - user.Password = getUserHashedPassword(user) - return user, nil -} - -func LoginUser(c *gin.Context) { - user, err := parseUserFromContext(c) - if err != nil { - SendBadRequest(c, err.Error()) - return - } - if isUserLoggedIn(user) { - SendBadRequest(c, "User is already logged in!") - return - } - if !isUserReal(user) { - SendBadRequest(c, "Unknown email or wrong password.") - return - } - addSession(user) - SendOk(c, "User successfully logged in.") -} - -func LogoutUser(c *gin.Context) { - user, err := parseUserFromContext(c) - if err != nil { - SendBadRequest(c, err.Error()) - return - } - if !isUserLoggedIn(user) { - SendBadRequest(c, "User is not logged in!") - return - } - removeSession(user) - SendOk(c, "User successfully logged out.") -} - -func AuthCheck(c *gin.Context) { - var user User - username, password, isOk := c.Request.BasicAuth() - if !isOk { - SendBadRequest(c, "Incorrect or missing user credentials.") - c.Abort() - return - } - - user.Email = username - user.Password = password - user.Password = getUserHashedPassword(user) - - if !isUserLoggedIn(user) { - SendForbidden(c, "Authentification failed, credentials could be wrong, user may not be logged in, session may have expired.") - c.Abort() - return - } +var AuthMiddleware, _ = jwt.New(&jwt.GinJWTMiddleware{ + Realm: "GohCMS", + Key: []byte(os.Getenv("JWT_SECRET")), + Timeout: time.Hour, + MaxRefresh: time.Hour, + Authenticator: JWTAuthenticator, +}) + +func JWTAuthenticator(c *gin.Context) (interface{}, error) { + var user = User{} + c.BindJSON(&user) + if user.Email == "dddeschamps2022" && user.Password == "1234" { + return gin.H{"email": "dddeschamps2022"}, nil + } + return nil, errors.New("can't verify credentials.") } From 82c6433b51f516d77903318fbf3e245fd5ac688f Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Mon, 19 Dec 2022 19:03:29 +0100 Subject: [PATCH 05/28] Removed useless (since JWT impl) session feature --- internal/sessions.go | 49 -------------------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 internal/sessions.go diff --git a/internal/sessions.go b/internal/sessions.go deleted file mode 100644 index 7c12a64..0000000 --- a/internal/sessions.go +++ /dev/null @@ -1,49 +0,0 @@ -package internal - -import ( - "crypto" - "fmt" - "hash" - "time" -) - -type Session struct { - Token hash.Hash `json:"token"` - ExpirationTimestamp int64 `json:"expirationTimestamp"` -} - -var SESSIONS []Session - -const SESSION_DURATION int64 = 3600 - -func generateSessionToken(user User) hash.Hash { - token := crypto.SHA256.New() - stringToHash := fmt.Sprintf(user.Email + user.Password) - token.Write([]byte(stringToHash)) - return token -} - -func isSessionExpired(session Session) bool { - return session.ExpirationTimestamp < time.Now().Unix() -} - -func addSession(user User) { - SESSIONS = append(SESSIONS, Session{ - Token: generateSessionToken(user), - ExpirationTimestamp: time.Now().Unix() + SESSION_DURATION, - }) -} - -func removeSession(user User) { - index := 0 - sessLen := len(SESSIONS) - for i := 0; i < sessLen; i++ { - if SESSIONS[i].Token == generateSessionToken(user) { - index = i - break - } - } - SESSIONS[index] = SESSIONS[sessLen-1] - SESSIONS[sessLen-1] = Session{} - SESSIONS = SESSIONS[:sessLen-1] -} From e4e1b2e4fd169de6f4265d752f9306a51155e7bf Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Mon, 19 Dec 2022 19:08:56 +0100 Subject: [PATCH 06/28] Split main func into multiples subfunctions --- cmd/main.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 9055f09..71b43d9 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -22,13 +22,12 @@ func initJWT() { } } -func initGin() { - r := gin.Default() - r.SetTrustedProxies([]string{"localhost"}) - +func initBasicRoutes(r *gin.Engine) { r.POST("/login", internal.AuthMiddleware.LoginHandler) r.GET("/ping", internal.Ping) +} +func initArticlesRoutes(r *gin.Engine) { articlesRouter := r.Group("/articles/") articlesRouter.Use(internal.AuthMiddleware.MiddlewareFunc()) @@ -36,6 +35,19 @@ func initGin() { articlesRouter.GET("/:id", internal.GetArticle) articlesRouter.POST("/:id", internal.AddArticle) articlesRouter.DELETE("/:id", internal.DeleteArticle) +} + +func initGin() { + ginMode := os.Getenv("GIN_MODE") + if ginMode == "release" { + gin.SetMode(ginMode) + } + + r := gin.Default() + r.SetTrustedProxies([]string{"localhost"}) + + initBasicRoutes(r) + initArticlesRoutes(r) r.Run(":" + os.Getenv("API_PORT")) } From 907f53a721ee27bb7a67fde718655daa50b1e8b9 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Mon, 19 Dec 2022 19:15:23 +0100 Subject: [PATCH 07/28] Implemented first test --- internal/ping_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 internal/ping_test.go diff --git a/internal/ping_test.go b/internal/ping_test.go new file mode 100644 index 0000000..a205140 --- /dev/null +++ b/internal/ping_test.go @@ -0,0 +1,39 @@ +package internal + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "testing" + + "github.com/gin-gonic/gin" + "github.com/joho/godotenv" +) + +type pingFormat struct { + Message string `json:"message"` +} + +func TestPing(t *testing.T) { + godotenv.Load("../.env") + + r := gin.Default() + r.GET("/ping/", Ping) + go r.Run(":" + os.Getenv("API_PORT")) + + req, err := http.Get(fmt.Sprintf("http://localhost:%v/ping/", os.Getenv("API_PORT"))) + if err != nil { + t.Fatal(err.Error()) + } + defer req.Body.Close() + + var exceptedResp = pingFormat{} + body, _ := io.ReadAll(req.Body) + json.Unmarshal(body, &exceptedResp) + + if exceptedResp.Message != "pong" { + t.Fatalf(`/ping/ resulted in "%v" instead of "pong"`, exceptedResp.Message) + } +} From 9ec29372b9a34817f65a7ca1b77d5e0c550f163c Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Mon, 19 Dec 2022 23:42:09 +0100 Subject: [PATCH 08/28] Split business logic from routes handler logic --- cmd/main.go | 8 ++-- internal/articlesBusiness.go | 40 +++++++++++++++++ internal/articlesHandlers.go | 87 ++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 internal/articlesBusiness.go create mode 100644 internal/articlesHandlers.go diff --git a/cmd/main.go b/cmd/main.go index 71b43d9..d0acbd9 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -31,10 +31,10 @@ func initArticlesRoutes(r *gin.Engine) { articlesRouter := r.Group("/articles/") articlesRouter.Use(internal.AuthMiddleware.MiddlewareFunc()) - articlesRouter.GET("/", internal.GetAllArticles) - articlesRouter.GET("/:id", internal.GetArticle) - articlesRouter.POST("/:id", internal.AddArticle) - articlesRouter.DELETE("/:id", internal.DeleteArticle) + articlesRouter.GET("/", internal.GetAllArticlesHandler) + articlesRouter.GET("/:id", internal.GetArticleHandler) + articlesRouter.POST("/:id", internal.AddArticleHandler) + articlesRouter.DELETE("/:id", internal.DeleteArticleHandler) } func initGin() { diff --git a/internal/articlesBusiness.go b/internal/articlesBusiness.go new file mode 100644 index 0000000..54c22db --- /dev/null +++ b/internal/articlesBusiness.go @@ -0,0 +1,40 @@ +package internal + +import ( + "go.mongodb.org/mongo-driver/bson" +) + +type Article struct { + IdName string `json:"id_name" bson:"id_name"` + Date int64 `json:"date" bson:"date"` + Content interface{} `json:"content" bson:"content"` +} + +type DelArticle struct { + IdName string `json:"id_name" bson:"id_name"` +} + +var articlesLocation = Location{Database: "gohcms", Collection: "articles"} + +func GetAllArticlesBusiness(documents [][]byte) []Article { + var articles = []Article{} + + for i := 0; i < len(documents); i++ { + var newArticle Article + bson.Unmarshal(documents[i], &newArticle) + articles = append(articles, newArticle) + } + + return articles +} + +func IsArticleIdAlreadyUsed(id string, documents [][]byte) bool { + for i := 0; i < len(documents); i++ { + var newArticle Article + bson.Unmarshal(documents[i], &newArticle) + if newArticle.IdName == id { + return true + } + } + return false +} diff --git a/internal/articlesHandlers.go b/internal/articlesHandlers.go new file mode 100644 index 0000000..cc5988b --- /dev/null +++ b/internal/articlesHandlers.go @@ -0,0 +1,87 @@ +package internal + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson" +) + +func GetAllArticlesHandler(c *gin.Context) { + documents, err := getDocuments(articlesLocation, bson.D{}) + if err != nil { + SendBadRequest(c, err.Error()) + return + } + c.JSON(http.StatusOK, GetAllArticlesBusiness(documents)) +} + +func GetArticleHandler(c *gin.Context) { + articleID := c.Params.ByName("id") + articles, err := getDocuments(articlesLocation, + bson.D{{Key: "id_name", Value: articleID}}) + if err != nil { + SendBadRequest(c, err.Error()) + return + } + if len(articles) == 0 { + SendBadRequest(c, "The ID provided doesn't match any article.") + return + } + var parsedArticle Article + bson.Unmarshal(articles[0], &parsedArticle) + c.JSON(http.StatusOK, parsedArticle) +} + +func AddArticleHandler(c *gin.Context) { + var article Article + article.IdName = c.Params.ByName("id") + if c.BindJSON(&article) != nil { + SendBadRequest(c, "Could not correctly parse the article.") + return + } + + document, err := bson.Marshal(article) + if err != nil { + SendBadRequest(c, "Could not correctly marshal the article.") + return + } + + documents, _ := getDocuments(articlesLocation, gin.H{}) + if IsArticleIdAlreadyUsed(article.IdName, documents) { + SendBadRequest(c, "Article ID already used.") + return + } + + err = pushDocument(articlesLocation, document) + if err != nil { + SendBadRequest(c, "Could not insert document into DB.") + return + } + + SendOk(c, "Article successfully added!") +} + +func DeleteArticleHandler(c *gin.Context) { + var delArticle DelArticle + delArticle.IdName = c.Params.ByName("id") + if c.BindJSON(&delArticle) != nil { + SendBadRequest(c, "Could not correctly parse the article ID.") + return + } + + document, err := bson.Marshal(delArticle) + if err != nil { + SendBadRequest(c, "Could not correctly marshal the article ID.") + return + } + + deleteCount, err := deleteDocument(articlesLocation, document) + if err != nil { + SendBadRequest(c, "Could not insert document into DB.") + return + } + + SendOk(c, fmt.Sprintf("%d articles were successfully deleted!", deleteCount)) +} From 22b25c0a4abfb73eef57a2f44052c6d74b219140 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Mon, 19 Dec 2022 23:48:25 +0100 Subject: [PATCH 09/28] Added tests for ArticlesBusiness --- internal/articles.go | 119 -------------------------------------- internal/articles_test.go | 42 ++++++++++++++ internal/ping_test.go | 39 ------------- 3 files changed, 42 insertions(+), 158 deletions(-) delete mode 100644 internal/articles.go create mode 100644 internal/articles_test.go delete mode 100644 internal/ping_test.go diff --git a/internal/articles.go b/internal/articles.go deleted file mode 100644 index 2841c2d..0000000 --- a/internal/articles.go +++ /dev/null @@ -1,119 +0,0 @@ -package internal - -import ( - "fmt" - "net/http" - - "github.com/gin-gonic/gin" - "go.mongodb.org/mongo-driver/bson" -) - -type Article struct { - IdName string `json:"id_name" bson:"id_name"` - Date int64 `json:"date" bson:"date"` - Content interface{} `json:"content" bson:"content"` -} - -type DelArticle struct { - IdName string `json:"id_name" bson:"id_name"` -} - -var articlesLocation = Location{Database: "gohcms", Collection: "articles"} - -func GetAllArticles(c *gin.Context) { - // TODO Change to GetArticleList that will find filter json context - var articles []Article - documents, err := getDocuments(articlesLocation, bson.D{}) - if err != nil { - SendBadRequest(c, err.Error()) - return - } - - for i := 0; i < len(documents); i++ { - var newArticle Article - bson.Unmarshal(documents[i], &newArticle) - articles = append(articles, newArticle) - } - - c.JSON(http.StatusOK, articles) -} - -func GetArticle(c *gin.Context) { - articleID := c.Params.ByName("id") - articles, err := getDocuments(articlesLocation, - bson.D{{Key: "id_name", Value: articleID}}) - if err != nil { - SendBadRequest(c, err.Error()) - return - } - if len(articles) == 0 { - SendBadRequest(c, "The ID provided doesn't match any article.") - return - } - var parsedArticle Article - bson.Unmarshal(articles[0], &parsedArticle) - c.JSON(http.StatusOK, parsedArticle) -} - -func IsArticleIdAlreadyUsed(id string) bool { - documents, _ := getDocuments(articlesLocation, bson.D{}) - for i := 0; i < len(documents); i++ { - var newArticle Article - bson.Unmarshal(documents[i], &newArticle) - if newArticle.IdName == id { - return true - } - } - return false -} - -func AddArticle(c *gin.Context) { - var article Article - article.IdName = c.Params.ByName("id") - if c.BindJSON(&article) != nil { - SendBadRequest(c, "Could not correctly parse the article.") - return - } - - document, err := bson.Marshal(article) - if err != nil { - SendBadRequest(c, "Could not correctly marshal the article.") - return - } - - if IsArticleIdAlreadyUsed(article.IdName) { - SendBadRequest(c, "Article ID already used.") - return - } - - err = pushDocument(articlesLocation, document) - if err != nil { - SendBadRequest(c, "Could not insert document into DB.") - return - } - - SendOk(c, "Article successfully added!") -} - -func DeleteArticle(c *gin.Context) { - var delArticle DelArticle - delArticle.IdName = c.Params.ByName("id") - if c.BindJSON(&delArticle) != nil { - SendBadRequest(c, "Could not correctly parse the article ID.") - return - } - - document, err := bson.Marshal(delArticle) - if err != nil { - SendBadRequest(c, "Could not correctly marshal the article ID.") - return - } - - deleteCount, err := deleteDocument(articlesLocation, document) - if err != nil { - SendBadRequest(c, "Could not insert document into DB.") - return - } - - SendOk(c, fmt.Sprintf("%d articles were successfully deleted!", deleteCount)) -} diff --git a/internal/articles_test.go b/internal/articles_test.go new file mode 100644 index 0000000..2bcb9f5 --- /dev/null +++ b/internal/articles_test.go @@ -0,0 +1,42 @@ +package internal + +import ( + "log" + "testing" + + "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson" +) + +var Article1, _ = bson.Marshal(Article{ + IdName: "test_article_1", + Date: 1671482492, + Content: gin.H{}, +}) + +var Article2, _ = bson.Marshal(Article{ + IdName: "test_article_2", + Date: 1671899112, + Content: gin.H{}, +}) + +var BSONConvertedArticles = [][]byte{Article1, Article2} + +func TestGetAllArticlesBusiness(t *testing.T) { + documents := GetAllArticlesBusiness(BSONConvertedArticles) + article := documents[0] + + if article.IdName != "test_article_1" { + log.Fatalf(`Excepted "test_article_1" as IdName, found "%v"`, article.IdName) + } else if article.Date != 1671482492 { + log.Fatalf(`Excepted 1671482492 as Date, found "%v"`, article.Date) + } +} + +func TestIsArticleIdAlreadyUsed(t *testing.T) { + if IsArticleIdAlreadyUsed("test_article_1", BSONConvertedArticles) == false { + log.Fatalf(`Excepted true, found false`) + } else if IsArticleIdAlreadyUsed("test_article_3", BSONConvertedArticles) == true { + log.Fatalf(`Excepted false, found true`) + } +} diff --git a/internal/ping_test.go b/internal/ping_test.go deleted file mode 100644 index a205140..0000000 --- a/internal/ping_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package internal - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "testing" - - "github.com/gin-gonic/gin" - "github.com/joho/godotenv" -) - -type pingFormat struct { - Message string `json:"message"` -} - -func TestPing(t *testing.T) { - godotenv.Load("../.env") - - r := gin.Default() - r.GET("/ping/", Ping) - go r.Run(":" + os.Getenv("API_PORT")) - - req, err := http.Get(fmt.Sprintf("http://localhost:%v/ping/", os.Getenv("API_PORT"))) - if err != nil { - t.Fatal(err.Error()) - } - defer req.Body.Close() - - var exceptedResp = pingFormat{} - body, _ := io.ReadAll(req.Body) - json.Unmarshal(body, &exceptedResp) - - if exceptedResp.Message != "pong" { - t.Fatalf(`/ping/ resulted in "%v" instead of "pong"`, exceptedResp.Message) - } -} From d03427d29ddd69c1411ec437a004a3e58fc6214f Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Tue, 20 Dec 2022 00:05:29 +0100 Subject: [PATCH 10/28] Improved validation error message --- internal/articlesHandlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/articlesHandlers.go b/internal/articlesHandlers.go index cc5988b..94f7b8f 100644 --- a/internal/articlesHandlers.go +++ b/internal/articlesHandlers.go @@ -56,7 +56,7 @@ func AddArticleHandler(c *gin.Context) { err = pushDocument(articlesLocation, document) if err != nil { - SendBadRequest(c, "Could not insert document into DB.") + SendBadRequest(c, fmt.Sprintf(`Could not insert document into DB: %v`, err.Error())) return } From 154e2d20fbd3c2583c1c8c6d7bfa609e59b86c5f Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Tue, 20 Dec 2022 02:31:10 +0100 Subject: [PATCH 11/28] getUniqueDocument implementation --- internal/articlesHandlers.go | 8 ++------ internal/database.go | 12 ++++++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/internal/articlesHandlers.go b/internal/articlesHandlers.go index 94f7b8f..c870aff 100644 --- a/internal/articlesHandlers.go +++ b/internal/articlesHandlers.go @@ -19,18 +19,14 @@ func GetAllArticlesHandler(c *gin.Context) { func GetArticleHandler(c *gin.Context) { articleID := c.Params.ByName("id") - articles, err := getDocuments(articlesLocation, + article, err := getUniqueDocument(articlesLocation, bson.D{{Key: "id_name", Value: articleID}}) if err != nil { - SendBadRequest(c, err.Error()) - return - } - if len(articles) == 0 { SendBadRequest(c, "The ID provided doesn't match any article.") return } var parsedArticle Article - bson.Unmarshal(articles[0], &parsedArticle) + bson.Unmarshal(article, &parsedArticle) c.JSON(http.StatusOK, parsedArticle) } diff --git a/internal/database.go b/internal/database.go index b05be88..da6e592 100644 --- a/internal/database.go +++ b/internal/database.go @@ -52,6 +52,18 @@ func getDocuments(location Location, filter interface{}) ([][]byte, error) { return results, nil } +func getUniqueDocument(location Location, filter interface{}) ([]byte, error) { + client := getNewClient() + collection := client.Database(location.Database).Collection(location.Collection) + defer client.Disconnect(context.TODO()) + + singleResult := collection.FindOne(context.TODO(), filter) + if singleResult.Err() != nil { + return nil, errors.New("no document was found, check the filter or the location.") + } + return singleResult.DecodeBytes() +} + func deleteDocument(location Location, filter interface{}) (int64, error) { client := getNewClient() collection := client.Database(location.Database).Collection(location.Collection) From 9d29eff2fbdb12eb9face7c9bac72ab839df45be Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Tue, 20 Dec 2022 02:31:41 +0100 Subject: [PATCH 12/28] Real JWT login implementation --- internal/auth.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/internal/auth.go b/internal/auth.go index eb8178a..7fe9996 100644 --- a/internal/auth.go +++ b/internal/auth.go @@ -7,6 +7,7 @@ import ( jwt "github.com/appleboy/gin-jwt/v2" "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson" ) type User struct { @@ -14,7 +15,7 @@ type User struct { Password string `json:"password" bson:"password"` } -var USERS_LOCATION = Location{Database: "gohcms", Collection: "users"} +var UsersLocation = Location{Database: "gohcms", Collection: "users"} var AuthMiddleware, _ = jwt.New(&jwt.GinJWTMiddleware{ Realm: "GohCMS", @@ -26,9 +27,18 @@ var AuthMiddleware, _ = jwt.New(&jwt.GinJWTMiddleware{ func JWTAuthenticator(c *gin.Context) (interface{}, error) { var user = User{} - c.BindJSON(&user) - if user.Email == "dddeschamps2022" && user.Password == "1234" { - return gin.H{"email": "dddeschamps2022"}, nil + err := c.BindJSON(&user) + if err != nil { + return nil, errors.New("wrong credentials json format.") } - return nil, errors.New("can't verify credentials.") + + _, err = getUniqueDocument(UsersLocation, bson.D{ + {Key: "email", Value: user.Email}, + {Key: "password", Value: user.Password}, + }) + if err != nil { + return nil, errors.New("wrong email or password.") + } + + return gin.H{"email": user.Email}, nil } From 3d85de6dd5f18326ae2a0b2c896f9de0dc29b571 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Tue, 20 Dec 2022 16:23:49 +0100 Subject: [PATCH 13/28] Added default user --- mongo-init.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mongo-init.js b/mongo-init.js index b8d150b..4fdf5de 100644 --- a/mongo-init.js +++ b/mongo-init.js @@ -42,3 +42,8 @@ db.createCollection('users', { } } }) + +db.users.insertOne({ + email: "root", + password: "root" +}) \ No newline at end of file From 961fb7a4e07f4e121df960ee4b25df3114abed52 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Tue, 20 Dec 2022 18:19:30 +0100 Subject: [PATCH 14/28] Added CORS middleware in debug mode --- cmd/main.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index d0acbd9..f0b164f 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -37,15 +37,29 @@ func initArticlesRoutes(r *gin.Engine) { articlesRouter.DELETE("/:id", internal.DeleteArticleHandler) } +func corsMiddleware(c *gin.Context) { + c.Writer.Header().Set("Access-Control-Allow-Origin", "*") + c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") + c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") + c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT") + if c.Request.Method == "OPTIONS" { + c.AbortWithStatus(204) + return + } + c.Next() +} + func initGin() { + r := gin.Default() + r.SetTrustedProxies([]string{"localhost"}) + ginMode := os.Getenv("GIN_MODE") if ginMode == "release" { gin.SetMode(ginMode) + } else { + r.Use(corsMiddleware) } - r := gin.Default() - r.SetTrustedProxies([]string{"localhost"}) - initBasicRoutes(r) initArticlesRoutes(r) From 4f5e4ad71cb795c3f7b4eea03cbb3776c7959d88 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Tue, 20 Dec 2022 22:09:19 +0100 Subject: [PATCH 15/28] Extended CORS middleware usage to Articles --- cmd/main.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index f0b164f..92057ee 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -9,6 +9,8 @@ import ( "github.com/joho/godotenv" ) +var ginMode = os.Getenv("GIN_MODE") + func initEnvVariables() { if godotenv.Load() != nil { panic("Error loading .env file.") @@ -27,16 +29,6 @@ func initBasicRoutes(r *gin.Engine) { r.GET("/ping", internal.Ping) } -func initArticlesRoutes(r *gin.Engine) { - articlesRouter := r.Group("/articles/") - articlesRouter.Use(internal.AuthMiddleware.MiddlewareFunc()) - - articlesRouter.GET("/", internal.GetAllArticlesHandler) - articlesRouter.GET("/:id", internal.GetArticleHandler) - articlesRouter.POST("/:id", internal.AddArticleHandler) - articlesRouter.DELETE("/:id", internal.DeleteArticleHandler) -} - func corsMiddleware(c *gin.Context) { c.Writer.Header().Set("Access-Control-Allow-Origin", "*") c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") @@ -49,11 +41,23 @@ func corsMiddleware(c *gin.Context) { c.Next() } +func initArticlesRoutes(r *gin.Engine) { + articlesRouter := r.Group("/articles/") + articlesRouter.Use(internal.AuthMiddleware.MiddlewareFunc()) + if ginMode != "release" { + articlesRouter.Use(corsMiddleware) + } + + articlesRouter.GET("/", internal.GetAllArticlesHandler) + articlesRouter.GET("/:id", internal.GetArticleHandler) + articlesRouter.POST("/:id", internal.AddArticleHandler) + articlesRouter.DELETE("/:id", internal.DeleteArticleHandler) +} + func initGin() { r := gin.Default() r.SetTrustedProxies([]string{"localhost"}) - ginMode := os.Getenv("GIN_MODE") if ginMode == "release" { gin.SetMode(ginMode) } else { From b47cffbec5509e0945cc0c9b934e6edae4412b68 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Wed, 21 Dec 2022 04:01:13 +0100 Subject: [PATCH 16/28] Fixed weird routes access behavior --- cmd/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 92057ee..f0cb3b0 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -25,8 +25,8 @@ func initJWT() { } func initBasicRoutes(r *gin.Engine) { - r.POST("/login", internal.AuthMiddleware.LoginHandler) - r.GET("/ping", internal.Ping) + r.POST("/login/", internal.AuthMiddleware.LoginHandler) + r.GET("/ping/", internal.Ping) } func corsMiddleware(c *gin.Context) { @@ -42,7 +42,7 @@ func corsMiddleware(c *gin.Context) { } func initArticlesRoutes(r *gin.Engine) { - articlesRouter := r.Group("/articles/") + articlesRouter := r.Group("/articles") articlesRouter.Use(internal.AuthMiddleware.MiddlewareFunc()) if ginMode != "release" { articlesRouter.Use(corsMiddleware) From 5d1ad603b87db8e0b0cd7dd70d911e2ea42ecbeb Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Wed, 21 Dec 2022 04:18:51 +0100 Subject: [PATCH 17/28] Added Pinia to dependencies --- web/admin-gui/package-lock.json | 1074 ++++++++++++++++--------------- web/admin-gui/package.json | 2 +- 2 files changed, 566 insertions(+), 510 deletions(-) diff --git a/web/admin-gui/package-lock.json b/web/admin-gui/package-lock.json index f9e9b29..21d4675 100644 --- a/web/admin-gui/package-lock.json +++ b/web/admin-gui/package-lock.json @@ -8,7 +8,7 @@ "name": "admin-gui", "version": "0.0.0", "dependencies": { - "pinia": "^2.0.21", + "pinia": "^2.0.28", "vue": "^3.2.38", "vue-editor-js": "^2.0.2", "vue-router": "^4.1.5" @@ -24,9 +24,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", - "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -34,20 +34,27 @@ "node": ">=6.0.0" } }, + "node_modules/@codexteam/icons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@codexteam/icons/-/icons-0.1.0.tgz", + "integrity": "sha512-jW1fWnwtWzcP4FBGsaodbJY3s1ZaRU+IJy1pvJ7ygNQxkQinybJcwXoyt0a5mWwu/4w30A42EWhCrZn8lp4fdw==" + }, "node_modules/@editorjs/editorjs": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@editorjs/editorjs/-/editorjs-2.25.0.tgz", - "integrity": "sha512-TEu7h7EPh6Lx2VGIM1jVn2dky23TbpVJBd3AGvXcam1lyHuJwZ1iydbsQGF9pFkHSCiaQptTfIjZ8Y24v47Wag==", + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/@editorjs/editorjs/-/editorjs-2.26.4.tgz", + "integrity": "sha512-yuJ2NM1Y5+8DDNWr4C00tHMVHKy0uCqK1HS4pwFPVcXUawgJnU2Li2vKGvPLuf0Jj2ir7MVgADO6oC1TbYBOYQ==", "dependencies": { + "@codexteam/icons": "0.1.0", "codex-notifier": "^1.1.2", "codex-tooltip": "^1.0.5", + "html-janitor": "^2.0.4", "nanoid": "^3.1.22" } }, "node_modules/@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", "cpu": [ "arm" ], @@ -61,9 +68,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", "cpu": [ "loong64" ], @@ -77,15 +84,15 @@ } }, "node_modules/@types/node": { - "version": "16.11.65", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.65.tgz", - "integrity": "sha512-Vfz7wGMOr4jbQGiQHVJm8VjeQwM9Ya7mHe9LtQ264/Epf5n1KiZShOFqk++nBzw6a/ubgYdB9Od7P+MH/LjoWw==", + "version": "16.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.10.tgz", + "integrity": "sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w==", "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.1.2.tgz", - "integrity": "sha512-3zxKNlvA3oNaKDYX0NBclgxTQ1xaFdL7PzwF6zj9tGFziKwmBa3Q/6XcJQxudlT81WxDjEhHmevvIC4Orc1LhQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", + "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", "dev": true, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -96,48 +103,48 @@ } }, "node_modules/@volar/language-core": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.7.tgz", - "integrity": "sha512-T3iJ7Ej5Ywrsn1nEfvOQ98LdFZu3TtoXD8UELHto/u5QyQk4U2GfPl+0ZjuS39ZPocU9l/5CMhrxHsgv/hFWVA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.16.tgz", + "integrity": "sha512-IGnOxWTs4DZ81TDcmxBAkCBxs97hUblwcjpBsTx/pOGGaSSDQRJPn0wL8NYTybEObU0i7lhEpKZ+0vJfdIy1Kg==", "dev": true, "dependencies": { - "@volar/source-map": "1.0.7", - "@vue/reactivity": "^3.2.40", + "@volar/source-map": "1.0.16", + "@vue/reactivity": "^3.2.45", "muggle-string": "^0.1.0" } }, "node_modules/@volar/source-map": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.7.tgz", - "integrity": "sha512-58xtTXbriaBoGHl5epE5kYI0Pk81yGmM3Mb/5TEUEzA16dGovXiwtEGce2xCgo0ps42OInFvFuaRv3SvM0k6mg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.16.tgz", + "integrity": "sha512-PKjzmQcg8QOGC/1V9tmGh2jcy6bKLhkW5bGidElSr83iDbCzLvldt2/La/QlDxaRCHYLT0MeyuGJBZIChB1dYQ==", "dev": true, "dependencies": { "muggle-string": "^0.1.0" } }, "node_modules/@volar/typescript": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.7.tgz", - "integrity": "sha512-VH3dMxTqkdUqjmdVwIytBjppH5iy18qK9peb3E9CNbvzf/+b3TpdX0zoyglaKmC5IeHG68KHXK2yps734yZ4nQ==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.16.tgz", + "integrity": "sha512-Yov+n4oO3iYnuMt9QJAFpJabfTRCzc7KvjlAwBaSuZy+Gc/f9611MgtqAh5/SIGmltFN8dXn1Ijno8ro8I4lyw==", "dev": true, "dependencies": { - "@volar/language-core": "1.0.7" + "@volar/language-core": "1.0.16" } }, "node_modules/@volar/vue-language-core": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.7.tgz", - "integrity": "sha512-5InGpRLu5FGeUkVNr1LvQfvThdSsyzIwvsYqYSGLj6VNmS7rzLacoKjZlTwz68/976aU3zjdgx94PoNl5n/SqA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.16.tgz", + "integrity": "sha512-sQ/aW1Vuiyy4OQuh2lthyYicruM3qh9VSk/aDh8/bFvM8GoohHZqVpMN3LYldEJ9eT/rN6u4xmYP54vc/EjX4Q==", "dev": true, "dependencies": { - "@volar/language-core": "1.0.7", - "@volar/source-map": "1.0.7", - "@vue/compiler-dom": "^3.2.40", - "@vue/compiler-sfc": "^3.2.40", - "@vue/reactivity": "^3.2.40", - "@vue/shared": "^3.2.40", - "minimatch": "^5.1.0", - "vue-template-compiler": "^2.7.10" + "@volar/language-core": "1.0.16", + "@volar/source-map": "1.0.16", + "@vue/compiler-dom": "^3.2.45", + "@vue/compiler-sfc": "^3.2.45", + "@vue/reactivity": "^3.2.45", + "@vue/shared": "^3.2.45", + "minimatch": "^5.1.1", + "vue-template-compiler": "^2.7.14" } }, "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { @@ -150,9 +157,9 @@ } }, "node_modules/@volar/vue-language-core/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -162,46 +169,46 @@ } }, "node_modules/@volar/vue-typescript": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.7.tgz", - "integrity": "sha512-SZlUJfMh/9NOIfpYtSVcIAbJVEzEiH2qWBIYHPooMXC02qey56Tg6J2eMhIoKWIuZH0VRRbX8IgFHevSQzzGOw==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.16.tgz", + "integrity": "sha512-M018Ulg/o2FVktAdlr5b/z4K69bYzekxNUA1o39y5Ur6CObc/o+5eDCCS7gIYijWnx9iNKkSQpWWWblJFv7kHQ==", "dev": true, "dependencies": { - "@volar/typescript": "1.0.7", - "@volar/vue-language-core": "1.0.7" + "@volar/typescript": "1.0.16", + "@volar/vue-language-core": "1.0.16" } }, "node_modules/@vue/compiler-core": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.40.tgz", - "integrity": "sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.40", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz", - "integrity": "sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", "dependencies": { - "@vue/compiler-core": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz", - "integrity": "sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.40", - "@vue/compiler-dom": "3.2.40", - "@vue/compiler-ssr": "3.2.40", - "@vue/reactivity-transform": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/compiler-core": "3.2.45", + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-ssr": "3.2.45", + "@vue/reactivity-transform": "3.2.45", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -209,74 +216,74 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz", - "integrity": "sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", "dependencies": { - "@vue/compiler-dom": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-dom": "3.2.45", + "@vue/shared": "3.2.45" } }, "node_modules/@vue/devtools-api": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.4.tgz", - "integrity": "sha512-Ku31WzpOV/8cruFaXaEZKF81WkNnvCSlBY4eOGtz5WMSdJvX1v1WWlSMGZeqUwPtQ27ZZz7B62erEMq8JDjcXw==" + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz", + "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==" }, "node_modules/@vue/reactivity": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.40.tgz", - "integrity": "sha512-N9qgGLlZmtUBMHF9xDT4EkD9RdXde1Xbveb+niWMXuHVWQP5BzgRmE3SFyUBBcyayG4y1lhoz+lphGRRxxK4RA==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", + "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", "dependencies": { - "@vue/shared": "3.2.40" + "@vue/shared": "3.2.45" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz", - "integrity": "sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.40.tgz", - "integrity": "sha512-U1+rWf0H8xK8aBUZhnrN97yoZfHbjgw/bGUzfgKPJl69/mXDuSg8CbdBYBn6VVQdR947vWneQBFzdhasyzMUKg==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", + "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", "dependencies": { - "@vue/reactivity": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/reactivity": "3.2.45", + "@vue/shared": "3.2.45" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.40.tgz", - "integrity": "sha512-AO2HMQ+0s2+MCec8hXAhxMgWhFhOPJ/CyRXnmTJ6XIOnJFLrH5Iq3TNwvVcODGR295jy77I6dWPj+wvFoSYaww==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", + "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", "dependencies": { - "@vue/runtime-core": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/runtime-core": "3.2.45", + "@vue/shared": "3.2.45", "csstype": "^2.6.8" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.40.tgz", - "integrity": "sha512-gtUcpRwrXOJPJ4qyBpU3EyxQa4EkV8I4f8VrDePcGCPe4O/hd0BPS7v9OgjIQob6Ap8VDz9G+mGTKazE45/95w==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", + "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", "dependencies": { - "@vue/compiler-ssr": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-ssr": "3.2.45", + "@vue/shared": "3.2.45" }, "peerDependencies": { - "vue": "3.2.40" + "vue": "3.2.45" } }, "node_modules/@vue/shared": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.40.tgz", - "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ==" + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" }, "node_modules/@vue/tsconfig": { "version": "0.1.3", @@ -431,9 +438,9 @@ } }, "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -442,6 +449,7 @@ "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", @@ -457,8 +465,8 @@ "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", "unbox-primitive": "^1.0.2" }, "engines": { @@ -486,9 +494,9 @@ } }, "node_modules/esbuild": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", - "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", "dev": true, "hasInstallScript": true, "bin": { @@ -498,34 +506,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.15.10", - "@esbuild/linux-loong64": "0.15.10", - "esbuild-android-64": "0.15.10", - "esbuild-android-arm64": "0.15.10", - "esbuild-darwin-64": "0.15.10", - "esbuild-darwin-arm64": "0.15.10", - "esbuild-freebsd-64": "0.15.10", - "esbuild-freebsd-arm64": "0.15.10", - "esbuild-linux-32": "0.15.10", - "esbuild-linux-64": "0.15.10", - "esbuild-linux-arm": "0.15.10", - "esbuild-linux-arm64": "0.15.10", - "esbuild-linux-mips64le": "0.15.10", - "esbuild-linux-ppc64le": "0.15.10", - "esbuild-linux-riscv64": "0.15.10", - "esbuild-linux-s390x": "0.15.10", - "esbuild-netbsd-64": "0.15.10", - "esbuild-openbsd-64": "0.15.10", - "esbuild-sunos-64": "0.15.10", - "esbuild-windows-32": "0.15.10", - "esbuild-windows-64": "0.15.10", - "esbuild-windows-arm64": "0.15.10" + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" } }, "node_modules/esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", "cpu": [ "x64" ], @@ -539,9 +547,9 @@ } }, "node_modules/esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", "cpu": [ "arm64" ], @@ -555,9 +563,9 @@ } }, "node_modules/esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", "cpu": [ "x64" ], @@ -571,9 +579,9 @@ } }, "node_modules/esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", "cpu": [ "arm64" ], @@ -587,9 +595,9 @@ } }, "node_modules/esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", "cpu": [ "x64" ], @@ -603,9 +611,9 @@ } }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", "cpu": [ "arm64" ], @@ -619,9 +627,9 @@ } }, "node_modules/esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", "cpu": [ "ia32" ], @@ -635,9 +643,9 @@ } }, "node_modules/esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", "cpu": [ "x64" ], @@ -651,9 +659,9 @@ } }, "node_modules/esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", "cpu": [ "arm" ], @@ -667,9 +675,9 @@ } }, "node_modules/esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", "cpu": [ "arm64" ], @@ -683,9 +691,9 @@ } }, "node_modules/esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", "cpu": [ "mips64el" ], @@ -699,9 +707,9 @@ } }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", "cpu": [ "ppc64" ], @@ -715,9 +723,9 @@ } }, "node_modules/esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", "cpu": [ "riscv64" ], @@ -731,9 +739,9 @@ } }, "node_modules/esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", "cpu": [ "s390x" ], @@ -747,9 +755,9 @@ } }, "node_modules/esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", "cpu": [ "x64" ], @@ -763,9 +771,9 @@ } }, "node_modules/esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", "cpu": [ "x64" ], @@ -779,9 +787,9 @@ } }, "node_modules/esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", "cpu": [ "x64" ], @@ -795,9 +803,9 @@ } }, "node_modules/esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", "cpu": [ "ia32" ], @@ -811,9 +819,9 @@ } }, "node_modules/esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", "cpu": [ "x64" ], @@ -827,9 +835,9 @@ } }, "node_modules/esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", "cpu": [ "arm64" ], @@ -933,6 +941,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -1023,13 +1043,18 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, + "node_modules/html-janitor": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/html-janitor/-/html-janitor-2.0.4.tgz", + "integrity": "sha512-92J5h9jNZRk30PMHapjHEJfkrBWKCOy0bq3oW2pBungky6lzYSoboBGPMvxl1XRKB2q+kniQmsLsPbdpY7RM2g==" + }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -1084,9 +1109,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -1426,11 +1451,11 @@ } }, "node_modules/pinia": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.23.tgz", - "integrity": "sha512-N15hFf4o5STrxpNrib1IEb1GOArvPYf1zPvQVRGOO1G1d74Ak0J0lVyalX/SmrzdT4Q0nlEFjbURsmBmIGUR5Q==", + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.28.tgz", + "integrity": "sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw==", "dependencies": { - "@vue/devtools-api": "^6.4.4", + "@vue/devtools-api": "^6.4.5", "vue-demi": "*" }, "funding": { @@ -1476,9 +1501,9 @@ } }, "node_modules/postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", "funding": [ { "type": "opencollective", @@ -1547,9 +1572,9 @@ } }, "node_modules/rollup": { - "version": "2.78.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", - "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -1647,7 +1672,8 @@ "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, "node_modules/spdx-correct": { "version": "3.1.1", @@ -1682,14 +1708,14 @@ "dev": true }, "node_modules/string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -1699,28 +1725,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1803,15 +1829,15 @@ } }, "node_modules/vite": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.8.tgz", - "integrity": "sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz", + "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", "dev": true, "dependencies": { "esbuild": "^0.15.9", - "postcss": "^8.4.16", + "postcss": "^8.4.18", "resolve": "^1.22.1", - "rollup": "~2.78.0" + "rollup": "^2.79.1" }, "bin": { "vite": "bin/vite.js" @@ -1823,12 +1849,17 @@ "fsevents": "~2.3.2" }, "peerDependencies": { + "@types/node": ">= 14", "less": "*", "sass": "*", "stylus": "*", + "sugarss": "*", "terser": "^5.4.0" }, "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, "less": { "optional": true }, @@ -1838,21 +1869,24 @@ "stylus": { "optional": true }, + "sugarss": { + "optional": true + }, "terser": { "optional": true } } }, "node_modules/vue": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.40.tgz", - "integrity": "sha512-1mGHulzUbl2Nk3pfvI5aXYYyJUs1nm4kyvuz38u4xlQkLUn1i2R7nDbI4TufECmY8v1qNBHYy62bCaM+3cHP2A==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", + "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", "dependencies": { - "@vue/compiler-dom": "3.2.40", - "@vue/compiler-sfc": "3.2.40", - "@vue/runtime-dom": "3.2.40", - "@vue/server-renderer": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-sfc": "3.2.45", + "@vue/runtime-dom": "3.2.45", + "@vue/server-renderer": "3.2.45", + "@vue/shared": "3.2.45" } }, "node_modules/vue-editor-js": { @@ -1865,9 +1899,9 @@ } }, "node_modules/vue-editor-js/node_modules/@vue/compiler-sfc": { - "version": "2.7.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.13.tgz", - "integrity": "sha512-zzu2rLRZlgIU+OT3Atbr7Y6PG+LW4wVQpPfNRrGDH3dM9PsrcVfa+1pKb8bW467bGM3aDOvAnsYLWVpYIv3GRg==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", "peer": true, "dependencies": { "@babel/parser": "^7.18.4", @@ -1893,21 +1927,21 @@ "peer": true }, "node_modules/vue-editor-js/node_modules/vue": { - "version": "2.7.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.13.tgz", - "integrity": "sha512-QnM6ULTNnPmn71eUO+4hdjfBIA3H0GLsBnchnI/kS678tjI45GOUZhXd0oP/gX9isikXz1PAzSnkPspp9EUNfQ==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", "peer": true, "dependencies": { - "@vue/compiler-sfc": "2.7.13", + "@vue/compiler-sfc": "2.7.14", "csstype": "^3.1.0" } }, "node_modules/vue-router": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.5.tgz", - "integrity": "sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", "dependencies": { - "@vue/devtools-api": "^6.1.4" + "@vue/devtools-api": "^6.4.5" }, "funding": { "url": "https://github.com/sponsors/posva" @@ -1917,9 +1951,9 @@ } }, "node_modules/vue-template-compiler": { - "version": "2.7.13", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.13.tgz", - "integrity": "sha512-jYM6TClwDS9YqP48gYrtAtaOhRKkbYmbzE+Q51gX5YDr777n7tNI/IZk4QV4l/PjQPNh/FVa/E92sh/RqKMrog==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, "dependencies": { "de-indent": "^1.0.2", @@ -1927,13 +1961,13 @@ } }, "node_modules/vue-tsc": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.7.tgz", - "integrity": "sha512-PaeWgISdXsPnV3a1NKfiAZb0iyvgLroxKzjPj1itoR5ZH0UOeVZBbDxpH7VPxAt6tCxiAoAIIisDs1QQrsSu3w==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.16.tgz", + "integrity": "sha512-yZaiJBbcKR1rSLhiF9KryAFH7R63po+N/invr2EAHGXxMzZksE5j1zyQKvrYiqK47ZHLAlCR+re/PHqWp/UzTg==", "dev": true, "dependencies": { - "@volar/vue-language-core": "1.0.7", - "@volar/vue-typescript": "1.0.7" + "@volar/vue-language-core": "1.0.16", + "@volar/vue-typescript": "1.0.16" }, "bin": { "vue-tsc": "bin/vue-tsc.js" @@ -1973,90 +2007,97 @@ }, "dependencies": { "@babel/parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", - "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==" + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==" + }, + "@codexteam/icons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@codexteam/icons/-/icons-0.1.0.tgz", + "integrity": "sha512-jW1fWnwtWzcP4FBGsaodbJY3s1ZaRU+IJy1pvJ7ygNQxkQinybJcwXoyt0a5mWwu/4w30A42EWhCrZn8lp4fdw==" }, "@editorjs/editorjs": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@editorjs/editorjs/-/editorjs-2.25.0.tgz", - "integrity": "sha512-TEu7h7EPh6Lx2VGIM1jVn2dky23TbpVJBd3AGvXcam1lyHuJwZ1iydbsQGF9pFkHSCiaQptTfIjZ8Y24v47Wag==", + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/@editorjs/editorjs/-/editorjs-2.26.4.tgz", + "integrity": "sha512-yuJ2NM1Y5+8DDNWr4C00tHMVHKy0uCqK1HS4pwFPVcXUawgJnU2Li2vKGvPLuf0Jj2ir7MVgADO6oC1TbYBOYQ==", "requires": { + "@codexteam/icons": "0.1.0", "codex-notifier": "^1.1.2", "codex-tooltip": "^1.0.5", + "html-janitor": "^2.0.4", "nanoid": "^3.1.22" } }, "@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", "dev": true, "optional": true }, "@types/node": { - "version": "16.11.65", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.65.tgz", - "integrity": "sha512-Vfz7wGMOr4jbQGiQHVJm8VjeQwM9Ya7mHe9LtQ264/Epf5n1KiZShOFqk++nBzw6a/ubgYdB9Od7P+MH/LjoWw==", + "version": "16.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.10.tgz", + "integrity": "sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w==", "dev": true }, "@vitejs/plugin-vue": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.1.2.tgz", - "integrity": "sha512-3zxKNlvA3oNaKDYX0NBclgxTQ1xaFdL7PzwF6zj9tGFziKwmBa3Q/6XcJQxudlT81WxDjEhHmevvIC4Orc1LhQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", + "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", "dev": true, "requires": {} }, "@volar/language-core": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.7.tgz", - "integrity": "sha512-T3iJ7Ej5Ywrsn1nEfvOQ98LdFZu3TtoXD8UELHto/u5QyQk4U2GfPl+0ZjuS39ZPocU9l/5CMhrxHsgv/hFWVA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.16.tgz", + "integrity": "sha512-IGnOxWTs4DZ81TDcmxBAkCBxs97hUblwcjpBsTx/pOGGaSSDQRJPn0wL8NYTybEObU0i7lhEpKZ+0vJfdIy1Kg==", "dev": true, "requires": { - "@volar/source-map": "1.0.7", - "@vue/reactivity": "^3.2.40", + "@volar/source-map": "1.0.16", + "@vue/reactivity": "^3.2.45", "muggle-string": "^0.1.0" } }, "@volar/source-map": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.7.tgz", - "integrity": "sha512-58xtTXbriaBoGHl5epE5kYI0Pk81yGmM3Mb/5TEUEzA16dGovXiwtEGce2xCgo0ps42OInFvFuaRv3SvM0k6mg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.16.tgz", + "integrity": "sha512-PKjzmQcg8QOGC/1V9tmGh2jcy6bKLhkW5bGidElSr83iDbCzLvldt2/La/QlDxaRCHYLT0MeyuGJBZIChB1dYQ==", "dev": true, "requires": { "muggle-string": "^0.1.0" } }, "@volar/typescript": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.7.tgz", - "integrity": "sha512-VH3dMxTqkdUqjmdVwIytBjppH5iy18qK9peb3E9CNbvzf/+b3TpdX0zoyglaKmC5IeHG68KHXK2yps734yZ4nQ==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.16.tgz", + "integrity": "sha512-Yov+n4oO3iYnuMt9QJAFpJabfTRCzc7KvjlAwBaSuZy+Gc/f9611MgtqAh5/SIGmltFN8dXn1Ijno8ro8I4lyw==", "dev": true, "requires": { - "@volar/language-core": "1.0.7" + "@volar/language-core": "1.0.16" } }, "@volar/vue-language-core": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.7.tgz", - "integrity": "sha512-5InGpRLu5FGeUkVNr1LvQfvThdSsyzIwvsYqYSGLj6VNmS7rzLacoKjZlTwz68/976aU3zjdgx94PoNl5n/SqA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.16.tgz", + "integrity": "sha512-sQ/aW1Vuiyy4OQuh2lthyYicruM3qh9VSk/aDh8/bFvM8GoohHZqVpMN3LYldEJ9eT/rN6u4xmYP54vc/EjX4Q==", "dev": true, "requires": { - "@volar/language-core": "1.0.7", - "@volar/source-map": "1.0.7", - "@vue/compiler-dom": "^3.2.40", - "@vue/compiler-sfc": "^3.2.40", - "@vue/reactivity": "^3.2.40", - "@vue/shared": "^3.2.40", - "minimatch": "^5.1.0", - "vue-template-compiler": "^2.7.10" + "@volar/language-core": "1.0.16", + "@volar/source-map": "1.0.16", + "@vue/compiler-dom": "^3.2.45", + "@vue/compiler-sfc": "^3.2.45", + "@vue/reactivity": "^3.2.45", + "@vue/shared": "^3.2.45", + "minimatch": "^5.1.1", + "vue-template-compiler": "^2.7.14" }, "dependencies": { "brace-expansion": { @@ -2069,9 +2110,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -2080,46 +2121,46 @@ } }, "@volar/vue-typescript": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.7.tgz", - "integrity": "sha512-SZlUJfMh/9NOIfpYtSVcIAbJVEzEiH2qWBIYHPooMXC02qey56Tg6J2eMhIoKWIuZH0VRRbX8IgFHevSQzzGOw==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.16.tgz", + "integrity": "sha512-M018Ulg/o2FVktAdlr5b/z4K69bYzekxNUA1o39y5Ur6CObc/o+5eDCCS7gIYijWnx9iNKkSQpWWWblJFv7kHQ==", "dev": true, "requires": { - "@volar/typescript": "1.0.7", - "@volar/vue-language-core": "1.0.7" + "@volar/typescript": "1.0.16", + "@volar/vue-language-core": "1.0.16" } }, "@vue/compiler-core": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.40.tgz", - "integrity": "sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.40", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz", - "integrity": "sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", "requires": { - "@vue/compiler-core": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45" } }, "@vue/compiler-sfc": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz", - "integrity": "sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.40", - "@vue/compiler-dom": "3.2.40", - "@vue/compiler-ssr": "3.2.40", - "@vue/reactivity-transform": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/compiler-core": "3.2.45", + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-ssr": "3.2.45", + "@vue/reactivity-transform": "3.2.45", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -2127,71 +2168,71 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz", - "integrity": "sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", "requires": { - "@vue/compiler-dom": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-dom": "3.2.45", + "@vue/shared": "3.2.45" } }, "@vue/devtools-api": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.4.tgz", - "integrity": "sha512-Ku31WzpOV/8cruFaXaEZKF81WkNnvCSlBY4eOGtz5WMSdJvX1v1WWlSMGZeqUwPtQ27ZZz7B62erEMq8JDjcXw==" + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz", + "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==" }, "@vue/reactivity": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.40.tgz", - "integrity": "sha512-N9qgGLlZmtUBMHF9xDT4EkD9RdXde1Xbveb+niWMXuHVWQP5BzgRmE3SFyUBBcyayG4y1lhoz+lphGRRxxK4RA==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", + "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", "requires": { - "@vue/shared": "3.2.40" + "@vue/shared": "3.2.45" } }, "@vue/reactivity-transform": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz", - "integrity": "sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "@vue/runtime-core": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.40.tgz", - "integrity": "sha512-U1+rWf0H8xK8aBUZhnrN97yoZfHbjgw/bGUzfgKPJl69/mXDuSg8CbdBYBn6VVQdR947vWneQBFzdhasyzMUKg==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", + "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", "requires": { - "@vue/reactivity": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/reactivity": "3.2.45", + "@vue/shared": "3.2.45" } }, "@vue/runtime-dom": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.40.tgz", - "integrity": "sha512-AO2HMQ+0s2+MCec8hXAhxMgWhFhOPJ/CyRXnmTJ6XIOnJFLrH5Iq3TNwvVcODGR295jy77I6dWPj+wvFoSYaww==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", + "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", "requires": { - "@vue/runtime-core": "3.2.40", - "@vue/shared": "3.2.40", + "@vue/runtime-core": "3.2.45", + "@vue/shared": "3.2.45", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.40.tgz", - "integrity": "sha512-gtUcpRwrXOJPJ4qyBpU3EyxQa4EkV8I4f8VrDePcGCPe4O/hd0BPS7v9OgjIQob6Ap8VDz9G+mGTKazE45/95w==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", + "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", "requires": { - "@vue/compiler-ssr": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-ssr": "3.2.45", + "@vue/shared": "3.2.45" } }, "@vue/shared": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.40.tgz", - "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ==" + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" }, "@vue/tsconfig": { "version": "0.1.3", @@ -2321,9 +2362,9 @@ } }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -2332,6 +2373,7 @@ "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", @@ -2347,8 +2389,8 @@ "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", "unbox-primitive": "^1.0.2" } }, @@ -2364,172 +2406,172 @@ } }, "esbuild": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", - "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", "dev": true, "requires": { - "@esbuild/android-arm": "0.15.10", - "@esbuild/linux-loong64": "0.15.10", - "esbuild-android-64": "0.15.10", - "esbuild-android-arm64": "0.15.10", - "esbuild-darwin-64": "0.15.10", - "esbuild-darwin-arm64": "0.15.10", - "esbuild-freebsd-64": "0.15.10", - "esbuild-freebsd-arm64": "0.15.10", - "esbuild-linux-32": "0.15.10", - "esbuild-linux-64": "0.15.10", - "esbuild-linux-arm": "0.15.10", - "esbuild-linux-arm64": "0.15.10", - "esbuild-linux-mips64le": "0.15.10", - "esbuild-linux-ppc64le": "0.15.10", - "esbuild-linux-riscv64": "0.15.10", - "esbuild-linux-s390x": "0.15.10", - "esbuild-netbsd-64": "0.15.10", - "esbuild-openbsd-64": "0.15.10", - "esbuild-sunos-64": "0.15.10", - "esbuild-windows-32": "0.15.10", - "esbuild-windows-64": "0.15.10", - "esbuild-windows-arm64": "0.15.10" + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" } }, "esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", "dev": true, "optional": true }, "esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", - "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", "dev": true, "optional": true }, "esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", "dev": true, "optional": true }, "esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", "dev": true, "optional": true }, "esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", "dev": true, "optional": true }, @@ -2596,6 +2638,15 @@ "get-intrinsic": "^1.1.1" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -2659,13 +2710,18 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, + "html-janitor": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/html-janitor/-/html-janitor-2.0.4.tgz", + "integrity": "sha512-92J5h9jNZRk30PMHapjHEJfkrBWKCOy0bq3oW2pBungky6lzYSoboBGPMvxl1XRKB2q+kniQmsLsPbdpY7RM2g==" + }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -2702,9 +2758,9 @@ "dev": true }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -2946,11 +3002,11 @@ "dev": true }, "pinia": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.23.tgz", - "integrity": "sha512-N15hFf4o5STrxpNrib1IEb1GOArvPYf1zPvQVRGOO1G1d74Ak0J0lVyalX/SmrzdT4Q0nlEFjbURsmBmIGUR5Q==", + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.28.tgz", + "integrity": "sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw==", "requires": { - "@vue/devtools-api": "^6.4.4", + "@vue/devtools-api": "^6.4.5", "vue-demi": "*" }, "dependencies": { @@ -2963,9 +3019,9 @@ } }, "postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -3006,9 +3062,9 @@ } }, "rollup": { - "version": "2.78.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", - "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -3111,36 +3167,36 @@ "dev": true }, "string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "strip-bom": { @@ -3198,28 +3254,28 @@ } }, "vite": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.8.tgz", - "integrity": "sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz", + "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", "dev": true, "requires": { "esbuild": "^0.15.9", "fsevents": "~2.3.2", - "postcss": "^8.4.16", + "postcss": "^8.4.18", "resolve": "^1.22.1", - "rollup": "~2.78.0" + "rollup": "^2.79.1" } }, "vue": { - "version": "3.2.40", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.40.tgz", - "integrity": "sha512-1mGHulzUbl2Nk3pfvI5aXYYyJUs1nm4kyvuz38u4xlQkLUn1i2R7nDbI4TufECmY8v1qNBHYy62bCaM+3cHP2A==", + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", + "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", "requires": { - "@vue/compiler-dom": "3.2.40", - "@vue/compiler-sfc": "3.2.40", - "@vue/runtime-dom": "3.2.40", - "@vue/server-renderer": "3.2.40", - "@vue/shared": "3.2.40" + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-sfc": "3.2.45", + "@vue/runtime-dom": "3.2.45", + "@vue/server-renderer": "3.2.45", + "@vue/shared": "3.2.45" } }, "vue-editor-js": { @@ -3232,9 +3288,9 @@ }, "dependencies": { "@vue/compiler-sfc": { - "version": "2.7.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.13.tgz", - "integrity": "sha512-zzu2rLRZlgIU+OT3Atbr7Y6PG+LW4wVQpPfNRrGDH3dM9PsrcVfa+1pKb8bW467bGM3aDOvAnsYLWVpYIv3GRg==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", "peer": true, "requires": { "@babel/parser": "^7.18.4", @@ -3257,29 +3313,29 @@ "peer": true }, "vue": { - "version": "2.7.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.13.tgz", - "integrity": "sha512-QnM6ULTNnPmn71eUO+4hdjfBIA3H0GLsBnchnI/kS678tjI45GOUZhXd0oP/gX9isikXz1PAzSnkPspp9EUNfQ==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", "peer": true, "requires": { - "@vue/compiler-sfc": "2.7.13", + "@vue/compiler-sfc": "2.7.14", "csstype": "^3.1.0" } } } }, "vue-router": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.5.tgz", - "integrity": "sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", "requires": { - "@vue/devtools-api": "^6.1.4" + "@vue/devtools-api": "^6.4.5" } }, "vue-template-compiler": { - "version": "2.7.13", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.13.tgz", - "integrity": "sha512-jYM6TClwDS9YqP48gYrtAtaOhRKkbYmbzE+Q51gX5YDr777n7tNI/IZk4QV4l/PjQPNh/FVa/E92sh/RqKMrog==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, "requires": { "de-indent": "^1.0.2", @@ -3287,13 +3343,13 @@ } }, "vue-tsc": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.7.tgz", - "integrity": "sha512-PaeWgISdXsPnV3a1NKfiAZb0iyvgLroxKzjPj1itoR5ZH0UOeVZBbDxpH7VPxAt6tCxiAoAIIisDs1QQrsSu3w==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.16.tgz", + "integrity": "sha512-yZaiJBbcKR1rSLhiF9KryAFH7R63po+N/invr2EAHGXxMzZksE5j1zyQKvrYiqK47ZHLAlCR+re/PHqWp/UzTg==", "dev": true, "requires": { - "@volar/vue-language-core": "1.0.7", - "@volar/vue-typescript": "1.0.7" + "@volar/vue-language-core": "1.0.16", + "@volar/vue-typescript": "1.0.16" } }, "which": { diff --git a/web/admin-gui/package.json b/web/admin-gui/package.json index 589bd10..6e26990 100644 --- a/web/admin-gui/package.json +++ b/web/admin-gui/package.json @@ -9,7 +9,7 @@ "type-check": "vue-tsc --noEmit" }, "dependencies": { - "pinia": "^2.0.21", + "pinia": "^2.0.28", "vue": "^3.2.38", "vue-editor-js": "^2.0.2", "vue-router": "^4.1.5" From 4d4116ae9846c2b758bc7800191329a6cdf49bb7 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Wed, 21 Dec 2022 04:19:19 +0100 Subject: [PATCH 18/28] Login page implementation --- web/admin-gui/src/App.vue | 2 +- web/admin-gui/src/assets/base.css | 76 ++++++++++++++++++++++ web/admin-gui/src/assets/main.css | 0 web/admin-gui/src/main.ts | 3 +- web/admin-gui/src/router/index.ts | 12 ++++ web/admin-gui/src/stores/AuthStore.ts | 15 +++++ web/admin-gui/src/views/Debug.vue | 63 ++++++++++++++++++ web/admin-gui/src/views/Home.vue | 68 -------------------- web/admin-gui/src/views/Login.vue | 92 +++++++++++++++++++++++++++ 9 files changed, 260 insertions(+), 71 deletions(-) create mode 100644 web/admin-gui/src/assets/base.css delete mode 100644 web/admin-gui/src/assets/main.css create mode 100644 web/admin-gui/src/stores/AuthStore.ts create mode 100644 web/admin-gui/src/views/Debug.vue create mode 100644 web/admin-gui/src/views/Login.vue diff --git a/web/admin-gui/src/App.vue b/web/admin-gui/src/App.vue index a78fb6f..873260d 100644 --- a/web/admin-gui/src/App.vue +++ b/web/admin-gui/src/App.vue @@ -3,5 +3,5 @@ import { RouterView } from 'vue-router' diff --git a/web/admin-gui/src/assets/base.css b/web/admin-gui/src/assets/base.css new file mode 100644 index 0000000..dcce1a6 --- /dev/null +++ b/web/admin-gui/src/assets/base.css @@ -0,0 +1,76 @@ +@import url('https://fonts.googleapis.com/css2?family=Frank+Ruhl+Libre:wght@500&family=Hind:wght@400;500;600;700&family=Nunito:wght@500;600;700&display=swap'); + +:root { + --regular-weight: 400; + --medium-weight: 500; + --semibold-weight: 600; + --bold-weight: 700; + + --radius: 10px; + + --primary: #2CD358; + --primary-dark: #00BA2A; + --primary-light: #97E6A2; + --secondary: #D32CA6; + --secondary-dark: #BA0094; + --secondary-light: #E88DCA; + --neutral-dark: #121212; + --neutral-light: #aaaaaa; +} + +body { + margin: 0; +} + +h1 { + font-family: 'Frank Ruhl Libre', serif; +} + +h2, h3, h4, h5, h6 { + font-family: 'Nunito', sans-serif; +} + +* { + font-family: 'Hind', sans-serif; + box-sizing: border-box; + + color: var(--neutral-dark); +} + +.label-input { + display: flex; + flex-direction: column; +} + +.label-input label { + font-weight: var(--medium-weight); +} + +.label-input input { + height: 32px; + padding: 0 8px; + + border: solid 1.25px var(--neutral-light); + border-radius: var(--radius); +} + +.button-primary { + border-radius: var(--radius); + border: none; + + height: 32px; + + background-color: var(--primary); + + font-weight: var(--medium-weight); + + cursor: pointer; +} + +.button-primary:hover { + background-color: var(--primary-light); +} + +.button-primary:active { + background-color: var(--primary-dark); +} \ No newline at end of file diff --git a/web/admin-gui/src/assets/main.css b/web/admin-gui/src/assets/main.css deleted file mode 100644 index e69de29..0000000 diff --git a/web/admin-gui/src/main.ts b/web/admin-gui/src/main.ts index 04c759b..3fc43b4 100644 --- a/web/admin-gui/src/main.ts +++ b/web/admin-gui/src/main.ts @@ -1,11 +1,10 @@ import { createApp } from 'vue' import { createPinia } from 'pinia' - import App from './App.vue' import router from './router' -import './assets/main.css' +import '@/assets/base.css' const app = createApp(App) diff --git a/web/admin-gui/src/router/index.ts b/web/admin-gui/src/router/index.ts index 174e21a..c7b76d2 100644 --- a/web/admin-gui/src/router/index.ts +++ b/web/admin-gui/src/router/index.ts @@ -1,5 +1,7 @@ import { createRouter, createWebHistory } from 'vue-router' import Home from '@/views/Home.vue' +import Debug from '@/views/Debug.vue' +import Login from '@/views/Login.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -9,6 +11,16 @@ const router = createRouter({ name: 'home', component: Home }, + { + path: '/debug', + name: 'debug', + component: Debug + }, + { + path: '/login', + name: 'login', + component: Login + }, ] }) diff --git a/web/admin-gui/src/stores/AuthStore.ts b/web/admin-gui/src/stores/AuthStore.ts new file mode 100644 index 0000000..387723d --- /dev/null +++ b/web/admin-gui/src/stores/AuthStore.ts @@ -0,0 +1,15 @@ +import { defineStore } from "pinia"; +import { ref } from "vue"; + +export interface jwtFormat { + code: number, + expire: string, + token: string +} + +export const useAuthStore = defineStore("AuthStore", () => { + const expire = ref("") + const token = ref("") + + return { expire, token } +}) \ No newline at end of file diff --git a/web/admin-gui/src/views/Debug.vue b/web/admin-gui/src/views/Debug.vue new file mode 100644 index 0000000..d4bb27b --- /dev/null +++ b/web/admin-gui/src/views/Debug.vue @@ -0,0 +1,63 @@ + + + diff --git a/web/admin-gui/src/views/Home.vue b/web/admin-gui/src/views/Home.vue index 591a6e5..96c0baf 100644 --- a/web/admin-gui/src/views/Home.vue +++ b/web/admin-gui/src/views/Home.vue @@ -1,77 +1,9 @@ \ No newline at end of file From 2047b3f7a45b2b2129c4758539bcabdf3ac03b4e Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Wed, 21 Dec 2022 22:37:47 +0100 Subject: [PATCH 19/28] Added .env access to frontend (+ while dockerized) --- Dockerfile => Dockerfile.backend | 0 .../Dockerfile => Dockerfile.frontend | 7 +++--- docker-compose.yml | 8 ++++-- web/admin-gui/env.d.ts | 1 + web/admin-gui/src/router/index.ts | 10 ++++---- web/admin-gui/src/views/Debug.vue | 4 +-- web/admin-gui/src/views/Login.vue | 5 ++-- web/admin-gui/vite.config.ts | 25 ++++++++++++------- 8 files changed, 37 insertions(+), 23 deletions(-) rename Dockerfile => Dockerfile.backend (100%) rename web/admin-gui/Dockerfile => Dockerfile.frontend (55%) diff --git a/Dockerfile b/Dockerfile.backend similarity index 100% rename from Dockerfile rename to Dockerfile.backend diff --git a/web/admin-gui/Dockerfile b/Dockerfile.frontend similarity index 55% rename from web/admin-gui/Dockerfile rename to Dockerfile.frontend index c805f4a..9cdfcb5 100644 --- a/web/admin-gui/Dockerfile +++ b/Dockerfile.frontend @@ -1,11 +1,12 @@ FROM node:latest as build-stage WORKDIR /app -COPY package*.json ./ +COPY ./web/admin-gui/package*.json ./ +COPY ./.env ./ RUN npm install -COPY ./ . +COPY ./web/admin-gui/ . RUN npm run build FROM nginx as production-stage RUN mkdir /app COPY --from=build-stage /app/dist /app -COPY nginx.conf /etc/nginx/nginx.conf +COPY ./web/admin-gui/nginx.conf /etc/nginx/nginx.conf diff --git a/docker-compose.yml b/docker-compose.yml index d0e2744..aa6090d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,8 @@ services: backend: - build: . + build: + context: ./ + dockerfile: ./Dockerfile.backend image: gohcms-backend env_file: - .env @@ -9,7 +11,9 @@ services: networks: - back-net frontend: - build: web/admin-gui/. + build: + context: ./ + dockerfile: ./Dockerfile.frontend image: gohcms-frontend env_file: - .env diff --git a/web/admin-gui/env.d.ts b/web/admin-gui/env.d.ts index 11f02fe..0171920 100644 --- a/web/admin-gui/env.d.ts +++ b/web/admin-gui/env.d.ts @@ -1 +1,2 @@ /// +declare const __APP_ENV__: Record \ No newline at end of file diff --git a/web/admin-gui/src/router/index.ts b/web/admin-gui/src/router/index.ts index c7b76d2..3feda3c 100644 --- a/web/admin-gui/src/router/index.ts +++ b/web/admin-gui/src/router/index.ts @@ -8,8 +8,8 @@ const router = createRouter({ routes: [ { path: '/', - name: 'home', - component: Home + name: 'login', + component: Login }, { path: '/debug', @@ -17,9 +17,9 @@ const router = createRouter({ component: Debug }, { - path: '/login', - name: 'login', - component: Login + path: '/home', + name: 'home', + component: Home }, ] }) diff --git a/web/admin-gui/src/views/Debug.vue b/web/admin-gui/src/views/Debug.vue index d4bb27b..d41bc76 100644 --- a/web/admin-gui/src/views/Debug.vue +++ b/web/admin-gui/src/views/Debug.vue @@ -7,7 +7,7 @@ const email = ref('') const password = ref('') function getArticles() { - fetch(`http://localhost:8080/articles/`, { + fetch(`http://localhost:${__APP_ENV__.API_PORT}/articles/`, { headers: { "Authorization": `Bearer ${useAuthStore().token}` } }) .then(response => response.json()) @@ -25,7 +25,7 @@ function jwtHandler(apiResponse: jwtFormat): void { } function login(email: string, password: string): void { - fetch(`http://localhost:8080/login/`, { + fetch(`http://localhost:${__APP_ENV__.API_PORT}/login/`, { method: "POST", body: JSON.stringify({ email: email, diff --git a/web/admin-gui/src/views/Login.vue b/web/admin-gui/src/views/Login.vue index d6b8709..b2f82c1 100644 --- a/web/admin-gui/src/views/Login.vue +++ b/web/admin-gui/src/views/Login.vue @@ -16,8 +16,9 @@ function jwtHandler(apiResponse: jwtFormat): void { isTokenOK.value = true } +//TODO rempalcer tous les :8080 par la var d'env du port de l'API (sinon c un peu dommage) function login(email: string, password: string): void { - fetch(`http://localhost:8080/login/`, { + fetch(`http://localhost:${__APP_ENV__.API_PORT}/login/`, { method: "POST", body: JSON.stringify({ email: email, @@ -28,7 +29,7 @@ function login(email: string, password: string): void { .then(result => { jwtHandler(result) if (isTokenOK.value === true) { - router.push('/') + router.push('/home') } }) } diff --git a/web/admin-gui/vite.config.ts b/web/admin-gui/vite.config.ts index de5cb31..56e8c42 100644 --- a/web/admin-gui/vite.config.ts +++ b/web/admin-gui/vite.config.ts @@ -1,14 +1,21 @@ import { fileURLToPath, URL } from 'node:url' - -import { defineConfig } from 'vite' +import { defineConfig, loadEnv } from 'vite' import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ -export default defineConfig({ - plugins: [vue()], - resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)) - } - } +export default defineConfig(({command, mode}) => { + return { + plugins: [vue()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + }, + define: { + __APP_ENV__: { + ...loadEnv(mode, "./../../", ""), // when running directly | access .env from ./web/admin-gui/ + ...loadEnv(mode, process.cwd(), ""), // when running from docker + } + } + } }) From 659554c2a92461920531fc3e176f3c8f492d1f29 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Wed, 21 Dec 2022 23:52:02 +0100 Subject: [PATCH 20/28] Hotfix API_PORT not being bind to the right port --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index aa6090d..02886e1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: env_file: - .env ports: - - "${API_PORT}:8080" + - "${API_PORT}:${API_PORT}" networks: - back-net frontend: From d3c68d6c893eb16d4143eed0838a6871225ed1b0 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Thu, 22 Dec 2022 02:52:50 +0100 Subject: [PATCH 21/28] Added host address to .env --- README.md | 7 ++++--- cmd/main.go | 4 ++-- docker-compose.yml | 4 ++-- internal/auth.go | 2 +- web/admin-gui/src/utils/ping.ts | 11 ----------- web/admin-gui/src/views/Debug.vue | 20 ++++++++++++++------ web/admin-gui/src/views/Login.vue | 2 +- 7 files changed, 24 insertions(+), 26 deletions(-) delete mode 100644 web/admin-gui/src/utils/ping.ts diff --git a/README.md b/README.md index c282474..5a659a8 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,9 @@ docker-compose up TODO ## Environment variables - ./env - - API_PORT - - FRONT_PORT - - JWT_SECRET + - APP_HOST_ADDRESS + - APP_API_PORT + - APP_FRONT_PORT + - APP_JWT_SECRET ## Demo TODO \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go index f0cb3b0..10a73fc 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -9,7 +9,7 @@ import ( "github.com/joho/godotenv" ) -var ginMode = os.Getenv("GIN_MODE") +var ginMode = os.Getenv("APP_GIN_MODE") func initEnvVariables() { if godotenv.Load() != nil { @@ -67,7 +67,7 @@ func initGin() { initBasicRoutes(r) initArticlesRoutes(r) - r.Run(":" + os.Getenv("API_PORT")) + r.Run(":" + os.Getenv("APP_API_PORT")) } func main() { diff --git a/docker-compose.yml b/docker-compose.yml index 02886e1..c8b630d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: env_file: - .env ports: - - "${API_PORT}:${API_PORT}" + - "${APP_API_PORT}:${APP_API_PORT}" networks: - back-net frontend: @@ -18,7 +18,7 @@ services: env_file: - .env ports: - - "${FRONT_PORT}:80" + - "${APP_FRONT_PORT}:80" networks: - front-net db: diff --git a/internal/auth.go b/internal/auth.go index 7fe9996..934d0ee 100644 --- a/internal/auth.go +++ b/internal/auth.go @@ -19,7 +19,7 @@ var UsersLocation = Location{Database: "gohcms", Collection: "users"} var AuthMiddleware, _ = jwt.New(&jwt.GinJWTMiddleware{ Realm: "GohCMS", - Key: []byte(os.Getenv("JWT_SECRET")), + Key: []byte(os.Getenv("APP_JWT_SECRET")), Timeout: time.Hour, MaxRefresh: time.Hour, Authenticator: JWTAuthenticator, diff --git a/web/admin-gui/src/utils/ping.ts b/web/admin-gui/src/utils/ping.ts deleted file mode 100644 index 976a84b..0000000 --- a/web/admin-gui/src/utils/ping.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface Pong { - message: string; -} - -export async function pingApi(): Promise { - let result: String = '' - await fetch('http://localhost:8080/ping') - .then(response => response.json()) - .then(jsonResponse => result = jsonResponse.message) - return result -} \ No newline at end of file diff --git a/web/admin-gui/src/views/Debug.vue b/web/admin-gui/src/views/Debug.vue index d41bc76..a53c4c3 100644 --- a/web/admin-gui/src/views/Debug.vue +++ b/web/admin-gui/src/views/Debug.vue @@ -6,8 +6,18 @@ import { ref } from 'vue'; const email = ref('') const password = ref('') +const baseURL = `http://${__APP_ENV__.APP_HOST_ADDRESS}:${__APP_ENV__.APP_API_PORT}` + function getArticles() { - fetch(`http://localhost:${__APP_ENV__.API_PORT}/articles/`, { + fetch(`${baseURL}/articles/`, { + headers: { "Authorization": `Bearer ${useAuthStore().token}` } + }) + .then(response => response.json()) + .then(result => console.log(result)) +} + +function ping() { + fetch(`${baseURL}/ping/`, { headers: { "Authorization": `Bearer ${useAuthStore().token}` } }) .then(response => response.json()) @@ -25,7 +35,7 @@ function jwtHandler(apiResponse: jwtFormat): void { } function login(email: string, password: string): void { - fetch(`http://localhost:${__APP_ENV__.API_PORT}/login/`, { + fetch(`${baseURL}/login/`, { method: "POST", body: JSON.stringify({ email: email, @@ -54,10 +64,8 @@ function login(email: string, password: string): void {
- - - - + +
diff --git a/web/admin-gui/src/views/Login.vue b/web/admin-gui/src/views/Login.vue index b2f82c1..b9f0929 100644 --- a/web/admin-gui/src/views/Login.vue +++ b/web/admin-gui/src/views/Login.vue @@ -18,7 +18,7 @@ function jwtHandler(apiResponse: jwtFormat): void { //TODO rempalcer tous les :8080 par la var d'env du port de l'API (sinon c un peu dommage) function login(email: string, password: string): void { - fetch(`http://localhost:${__APP_ENV__.API_PORT}/login/`, { + fetch(`http://${__APP_ENV__.APP_HOST_ADDRESS}:${__APP_ENV__.APP_API_PORT}/login/`, { method: "POST", body: JSON.stringify({ email: email, From c49a28be837151fb5a8598eb76adcf6831be08da Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Thu, 22 Dec 2022 03:19:38 +0100 Subject: [PATCH 22/28] Now using CORS everytime, but only frontend origin --- cmd/main.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 10a73fc..a886200 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -10,6 +10,9 @@ import ( ) var ginMode = os.Getenv("APP_GIN_MODE") +var apiPort = os.Getenv("APP_API_PORT") +var frontPort = os.Getenv("APP_FRONT_PORT") +var hostAddress = os.Getenv("APP_HOST_ADDRESS") func initEnvVariables() { if godotenv.Load() != nil { @@ -30,7 +33,7 @@ func initBasicRoutes(r *gin.Engine) { } func corsMiddleware(c *gin.Context) { - c.Writer.Header().Set("Access-Control-Allow-Origin", "*") + c.Writer.Header().Set("Access-Control-Allow-Origin", fmt.Sprintf("http://%v:%v", hostAddress, frontPort)) c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT") @@ -43,10 +46,7 @@ func corsMiddleware(c *gin.Context) { func initArticlesRoutes(r *gin.Engine) { articlesRouter := r.Group("/articles") - articlesRouter.Use(internal.AuthMiddleware.MiddlewareFunc()) - if ginMode != "release" { - articlesRouter.Use(corsMiddleware) - } + articlesRouter.Use(corsMiddleware, internal.AuthMiddleware.MiddlewareFunc()) articlesRouter.GET("/", internal.GetAllArticlesHandler) articlesRouter.GET("/:id", internal.GetArticleHandler) @@ -56,18 +56,16 @@ func initArticlesRoutes(r *gin.Engine) { func initGin() { r := gin.Default() - r.SetTrustedProxies([]string{"localhost"}) + r.Use(corsMiddleware) if ginMode == "release" { gin.SetMode(ginMode) - } else { - r.Use(corsMiddleware) } initBasicRoutes(r) initArticlesRoutes(r) - r.Run(":" + os.Getenv("APP_API_PORT")) + r.Run(":" + apiPort) } func main() { From eee7c1e0670ed6fff78a051df2e810bd4b1d6d70 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Fri, 23 Dec 2022 20:35:20 +0100 Subject: [PATCH 23/28] Added API PORT to devServer --- web/admin-gui/vite.config.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/web/admin-gui/vite.config.ts b/web/admin-gui/vite.config.ts index 56e8c42..11f0df9 100644 --- a/web/admin-gui/vite.config.ts +++ b/web/admin-gui/vite.config.ts @@ -3,7 +3,10 @@ import { defineConfig, loadEnv } from 'vite' import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ -export default defineConfig(({command, mode}) => { +export default defineConfig(({ command, mode }) => { + const env1 = loadEnv(mode, "./../../", "") + const env2 = loadEnv(mode, process.cwd(), "") + return { plugins: [vue()], resolve: { @@ -13,9 +16,12 @@ export default defineConfig(({command, mode}) => { }, define: { __APP_ENV__: { - ...loadEnv(mode, "./../../", ""), // when running directly | access .env from ./web/admin-gui/ - ...loadEnv(mode, process.cwd(), ""), // when running from docker + ...env1, + ...env2, } + }, + server: { + port: env1.APP_FRONT_PORT, } } }) From 96c3f596ae399a9c4930a6db6d1ac1faeac8f201 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Fri, 23 Dec 2022 20:35:55 +0100 Subject: [PATCH 24/28] Added cookies managment for Auth purpose --- web/admin-gui/src/assets/base.css | 50 ++++++++++++++++++----- web/admin-gui/src/router/index.ts | 54 ++++++++++++++++--------- web/admin-gui/src/stores/AuthStore.ts | 38 +++++++++++++++-- web/admin-gui/src/stores/ErrorsStore.ts | 14 +++++++ web/admin-gui/src/utils/cookies.ts | 13 ++++++ web/admin-gui/src/views/Login.vue | 42 +++++++++++++++---- 6 files changed, 171 insertions(+), 40 deletions(-) create mode 100644 web/admin-gui/src/stores/ErrorsStore.ts create mode 100644 web/admin-gui/src/utils/cookies.ts diff --git a/web/admin-gui/src/assets/base.css b/web/admin-gui/src/assets/base.css index dcce1a6..64cdbbb 100644 --- a/web/admin-gui/src/assets/base.css +++ b/web/admin-gui/src/assets/base.css @@ -6,7 +6,11 @@ --semibold-weight: 600; --bold-weight: 700; - --radius: 10px; + --radius: 15px; + + --font-body: 16px; + --font-small: 14px; + --font-verysmall: 12px; --primary: #2CD358; --primary-dark: #00BA2A; @@ -15,6 +19,7 @@ --secondary-dark: #BA0094; --secondary-light: #E88DCA; --neutral-dark: #121212; + --neutral-medium: #707070; --neutral-light: #aaaaaa; } @@ -24,8 +29,11 @@ body { h1 { font-family: 'Frank Ruhl Libre', serif; + font-size: 40px; } - +h2 { font-size: 32px; } +h3 { font-size: 24px; } +h4 { font-size: 18px; } h2, h3, h4, h5, h6 { font-family: 'Nunito', sans-serif; } @@ -37,33 +45,53 @@ h2, h3, h4, h5, h6 { color: var(--neutral-dark); } -.label-input { +.label-input, +.label-input-error { display: flex; flex-direction: column; } -.label-input label { - font-weight: var(--medium-weight); +.label-input label, +.label-input-error label { + font-size: var(--font-body); + font-weight: var(--semibold-weight); } -.label-input input { - height: 32px; - padding: 0 8px; +.label-input p, +.label-input-error p { + color: var(--neutral-medium); + font-size: var(--font-body); + font-weight: var(--medium-weight); + margin: 0; +} + +.label-input input, +.label-input-error input { + padding: 3px 16px; + font-size: var(--font-body); border: solid 1.25px var(--neutral-light); border-radius: var(--radius); } +.label-input-error input { + border: solid 1.75px red; +} + +.label-input-error p { + color: red; +} + .button-primary { border-radius: var(--radius); border: none; - height: 32px; + padding: 3px 16px; + font-size: var(--font-body); + font-weight: var(--medium-weight); background-color: var(--primary); - font-weight: var(--medium-weight); - cursor: pointer; } diff --git a/web/admin-gui/src/router/index.ts b/web/admin-gui/src/router/index.ts index 3feda3c..cacb985 100644 --- a/web/admin-gui/src/router/index.ts +++ b/web/admin-gui/src/router/index.ts @@ -1,27 +1,43 @@ -import { createRouter, createWebHistory } from 'vue-router' +import { createRouter, createWebHistory, type NavigationGuard } from 'vue-router' import Home from '@/views/Home.vue' import Debug from '@/views/Debug.vue' import Login from '@/views/Login.vue' +import { useAuthStore } from '@/stores/AuthStore' const router = createRouter({ - history: createWebHistory(import.meta.env.BASE_URL), - routes: [ - { - path: '/', - name: 'login', - component: Login - }, - { - path: '/debug', - name: 'debug', - component: Debug - }, - { - path: '/home', - name: 'home', - component: Home - }, - ] + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'login', + component: Login, + }, + { + path: '/debug', + name: 'debug', + component: Debug + }, + { + path: '/home', + name: 'home', + component: Home + }, + ] +}) + +router.beforeEach(async (to, from) => { + const isTokenValid = useAuthStore().isValid() + if (to.name === 'login') { + if (isTokenValid) return { + name: 'home' + } + } else { + if (!isTokenValid) { + return { + name: 'login', + } + } + } }) export default router diff --git a/web/admin-gui/src/stores/AuthStore.ts b/web/admin-gui/src/stores/AuthStore.ts index 387723d..3071fc9 100644 --- a/web/admin-gui/src/stores/AuthStore.ts +++ b/web/admin-gui/src/stores/AuthStore.ts @@ -1,5 +1,7 @@ +import { getCookie } from "@/utils/cookies"; import { defineStore } from "pinia"; import { ref } from "vue"; +import { useErrorsStore } from "./ErrorsStore"; export interface jwtFormat { code: number, @@ -8,8 +10,38 @@ export interface jwtFormat { } export const useAuthStore = defineStore("AuthStore", () => { - const expire = ref("") - const token = ref("") + const expire = ref("") + const token = ref("") + + function isSet(): boolean { + return token.value !== undefined && token.value !== "" + } + + function isExpired(): boolean { + const tokenDate = new Date(expire.value) + const currentDate = new Date() - return { expire, token } + if (currentDate.getTime() > tokenDate.getTime()) { + useErrorsStore().sessionExpired = true + return true + } + return false + } + + function isValid(): boolean { + return isSet() && !isExpired() + } + + function initStore(): void { + const JWTtoken = getCookie('JWTtoken') + const JWTexpire = getCookie('JWTexpire') + if (JWTtoken !== "" && JWTexpire !== "") { + token.value = JWTtoken + expire.value = JWTexpire + } + } + + initStore() + + return { expire, token, isValid } }) \ No newline at end of file diff --git a/web/admin-gui/src/stores/ErrorsStore.ts b/web/admin-gui/src/stores/ErrorsStore.ts new file mode 100644 index 0000000..b72f392 --- /dev/null +++ b/web/admin-gui/src/stores/ErrorsStore.ts @@ -0,0 +1,14 @@ +import { defineStore } from "pinia"; +import { ref, type Ref } from "vue"; + +interface storeErrors { + sessionExpired: boolean +} + +export const useErrorsStore = defineStore("ErrorsStore", () => { + const errors: Ref = ref({ + sessionExpired: false + }) + + return errors +}) \ No newline at end of file diff --git a/web/admin-gui/src/utils/cookies.ts b/web/admin-gui/src/utils/cookies.ts new file mode 100644 index 0000000..08ffbd8 --- /dev/null +++ b/web/admin-gui/src/utils/cookies.ts @@ -0,0 +1,13 @@ +export interface cookie { + key: string, + value: string, + expire: string +} + +export function setCookie(cookieData: cookie): void { + document.cookie = `${cookieData.key}=${cookieData.value}; SameSite=Strict; Expires=${cookieData.expire};Secure` +} + +export function getCookie(cookieName: string): string { + return document.cookie.match('(^|;)\\s*' + cookieName + '\\s*=\\s*([^;]+)')?.pop() || '' +} \ No newline at end of file diff --git a/web/admin-gui/src/views/Login.vue b/web/admin-gui/src/views/Login.vue index b9f0929..67c508a 100644 --- a/web/admin-gui/src/views/Login.vue +++ b/web/admin-gui/src/views/Login.vue @@ -1,22 +1,48 @@